Enable AMD64 SHA512 implementations for WIN64
[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 #ifdef USE_GOST_R_3411_94
138 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_gost3411_94;
139 #endif
140 #ifdef USE_GOST_R_3411_12
141 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog256;
142 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog512;
143 #endif
144 #if USE_WHIRLPOOL
145 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_whirlpool;
146 #endif
147 #if USE_RMD160
148 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_rmd160;
149 #endif
150 #if USE_TIGER
151 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_tiger1;
152 #endif
153 #if USE_MD5
154 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_md5;
155 #endif
156 #if USE_MD4
157 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_md4;
158 #endif
159
160 /*
161  * The CMAC algorithm specifications (mac-cmac.c).
162  */
163 #if USE_BLOWFISH
164 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_blowfish;
165 #endif
166 #if USE_DES
167 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_tripledes;
168 #endif
169 #if USE_CAST5
170 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_cast5;
171 #endif
172 #if USE_AES
173 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_aes;
174 #endif
175 #if USE_TWOFISH
176 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_twofish;
177 #endif
178 #if USE_SERPENT
179 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_serpent;
180 #endif
181 #if USE_RFC2268
182 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_rfc2268;
183 #endif
184 #if USE_SEED
185 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_seed;
186 #endif
187 #if USE_CAMELLIA
188 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_camellia;
189 #endif
190 #ifdef USE_IDEA
191 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_idea;
192 #endif
193 #if USE_GOST28147
194 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_gost28147;
195 #endif
196
197 /*
198  * The GMAC algorithm specifications (mac-gmac.c).
199  */
200 #if USE_AES
201 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_aes;
202 #endif
203 #if USE_TWOFISH
204 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_twofish;
205 #endif
206 #if USE_SERPENT
207 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_serpent;
208 #endif
209 #if USE_SEED
210 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_seed;
211 #endif
212 #if USE_CAMELLIA
213 extern gcry_mac_spec_t _gcry_mac_type_spec_gmac_camellia;
214 #endif
215
216 /*
217  * The Poly1305 MAC algorithm specifications (mac-poly1305.c).
218  */
219 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac;
220 #if USE_AES
221 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_aes;
222 #endif
223 #if USE_CAMELLIA
224 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_camellia;
225 #endif
226 #if USE_TWOFISH
227 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_twofish;
228 #endif
229 #if USE_SERPENT
230 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_serpent;
231 #endif
232 #if USE_SEED
233 extern gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_seed;
234 #endif