mpi/ec: fix when 'unsigned long' is 32-bit but limb size is 64-bit
[libgcrypt.git] / cipher / mac-internal.h
1 /* mac-internal.h  -  Internal defs for mac.c
2  * Copyright (C) 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser general Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21
22 #include "g10lib.h"
23
24
25 /* The data object used to hold a handle to an encryption object.  */
26 struct gcry_mac_handle;
27
28 /* The data object used to hold poly1305-mac context.  */
29 struct poly1305mac_context_s;
30
31 \f
32 /*
33  *
34  * Message authentication code related definitions.
35  *
36  */
37
38
39 /* Magic values for the context structure.  */
40 #define CTX_MAGIC_NORMAL 0x59d9b8af
41 #define CTX_MAGIC_SECURE 0x12c27cd0
42
43
44 /* MAC module functions. */
45 typedef gcry_err_code_t (*gcry_mac_open_func_t)(gcry_mac_hd_t h);
46 typedef void (*gcry_mac_close_func_t)(gcry_mac_hd_t h);
47 typedef gcry_err_code_t (*gcry_mac_setkey_func_t)(gcry_mac_hd_t h,
48                                                   const unsigned char *key,
49                                                   size_t keylen);
50 typedef gcry_err_code_t (*gcry_mac_setiv_func_t)(gcry_mac_hd_t h,
51                                                  const unsigned char *iv,
52                                                  size_t ivlen);
53 typedef gcry_err_code_t (*gcry_mac_reset_func_t)(gcry_mac_hd_t h);
54 typedef gcry_err_code_t (*gcry_mac_write_func_t)(gcry_mac_hd_t h,
55                                                  const unsigned char *inbuf,
56                                                  size_t inlen);
57 typedef gcry_err_code_t (*gcry_mac_read_func_t)(gcry_mac_hd_t h,
58                                                 unsigned char *outbuf,
59                                                 size_t *outlen);
60 typedef gcry_err_code_t (*gcry_mac_verify_func_t)(gcry_mac_hd_t h,
61                                                   const unsigned char *inbuf,
62                                                   size_t inlen);
63 typedef unsigned int (*gcry_mac_get_maclen_func_t)(int algo);
64 typedef unsigned int (*gcry_mac_get_keylen_func_t)(int algo);
65
66
67 typedef struct gcry_mac_spec_ops
68 {
69   gcry_mac_open_func_t open;
70   gcry_mac_close_func_t close;
71   gcry_mac_setkey_func_t setkey;
72   gcry_mac_setiv_func_t setiv;
73   gcry_mac_reset_func_t reset;
74   gcry_mac_write_func_t write;
75   gcry_mac_read_func_t read;
76   gcry_mac_verify_func_t verify;
77   gcry_mac_get_maclen_func_t get_maclen;
78   gcry_mac_get_keylen_func_t get_keylen;
79 } gcry_mac_spec_ops_t;
80
81
82 /* Module specification structure for message authentication codes.  */
83 typedef struct gcry_mac_spec
84 {
85   int algo;
86   struct {
87     unsigned int disabled:1;
88     unsigned int fips:1;
89   } flags;
90   const char *name;
91   const gcry_mac_spec_ops_t *ops;
92 } gcry_mac_spec_t;
93
94
95 /* The handle structure.  */
96 struct gcry_mac_handle
97 {
98   int magic;
99   int algo;
100   const gcry_mac_spec_t *spec;
101   gcry_ctx_t gcry_ctx;
102   union {
103     struct {
104       gcry_md_hd_t md_ctx;
105       int md_algo;
106     } hmac;
107     struct {
108       gcry_cipher_hd_t ctx;
109       int cipher_algo;
110       unsigned int blklen;
111     } cmac;
112     struct {
113       gcry_cipher_hd_t ctx;
114       int cipher_algo;
115     } gmac;
116     struct {
117       struct poly1305mac_context_s *ctx;
118     } poly1305mac;
119   } u;
120 };
121
122
123 /*
124  * The HMAC algorithm specifications (mac-hmac.c).
125  */
126 #if USE_SHA1
127 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha1;
128 #endif
129 #if USE_SHA256
130 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha256;
131 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha224;
132 #endif
133 #if USE_SHA512
134 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha512;
135 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha384;
136 #endif
137 #if USE_SHA3
138 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_224;
139 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_256;
140 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_384;
141 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_512;
142 #endif
143 #ifdef USE_GOST_R_3411_94
144 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_gost3411_94;
145 #endif
146 #ifdef USE_GOST_R_3411_12
147 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog256;
148 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog512;
149 #endif
150 #if USE_WHIRLPOOL
151 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_whirlpool;
152 #endif
153 #if USE_RMD160
154 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_rmd160;
155 #endif
156 #if USE_TIGER
157 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_tiger1;
158 #endif
159 #if USE_MD5
160 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_md5;
161 #endif
162 #if USE_MD4
163 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_md4;
164 #endif
165
166 /*
167  * The CMAC algorithm specifications (mac-cmac.c).
168  */
169 #if USE_BLOWFISH
170 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_blowfish;
171 #endif
172 #if USE_DES
173 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_tripledes;
174 #endif
175 #if USE_CAST5
176 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_cast5;
177 #endif
178 #if USE_AES
179 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_aes;
180 #endif
181 #if USE_TWOFISH
182 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_twofish;
183 #endif
184 #if USE_SERPENT
185 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_serpent;
186 #endif
187 #if USE_RFC2268
188 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_rfc2268;
189 #endif
190 #if USE_SEED
191 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_seed;
192 #endif
193 #if USE_CAMELLIA
194 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_camellia;
195 #endif
196 #ifdef USE_IDEA
197 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_idea;
198 #endif
199 #if USE_GOST28147
200 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_gost28147;
201 #endif
202
203 /*
204  * The GMAC algorithm specifications (mac-gmac.c).
205  */
206 #if USE_AES
207 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_aes;
208 #endif
209 #if USE_TWOFISH
210 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_twofish;
211 #endif
212 #if USE_SERPENT
213 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_serpent;
214 #endif
215 #if USE_SEED
216 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_seed;
217 #endif
218 #if USE_CAMELLIA
219 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_camellia;
220 #endif
221
222 /*
223  * The Poly1305 MAC algorithm specifications (mac-poly1305.c).
224  */
225 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac;
226 #if USE_AES
227 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_aes;
228 #endif
229 #if USE_CAMELLIA
230 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_camellia;
231 #endif
232 #if USE_TWOFISH
233 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_twofish;
234 #endif
235 #if USE_SERPENT
236 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_serpent;
237 #endif
238 #if USE_SEED
239 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_seed;
240 #endif