Add SHA512/224 and SHA512/256 algorithms
[libgcrypt.git] / cipher / mac-hmac.c
1 /* mac-hmac.c  -  HMAC glue for MAC API
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 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <errno.h>
25
26 #include "g10lib.h"
27 #include "./mac-internal.h"
28 #include "bufhelp.h"
29
30
31 static int
32 map_mac_algo_to_md (int mac_algo)
33 {
34   switch (mac_algo)
35     {
36     default:
37       return GCRY_MD_NONE;
38     case GCRY_MAC_HMAC_MD2:
39       return GCRY_MD_MD2;
40     case GCRY_MAC_HMAC_MD4:
41       return GCRY_MD_MD4;
42     case GCRY_MAC_HMAC_MD5:
43       return GCRY_MD_MD5;
44     case GCRY_MAC_HMAC_SHA1:
45       return GCRY_MD_SHA1;
46     case GCRY_MAC_HMAC_SHA224:
47       return GCRY_MD_SHA224;
48     case GCRY_MAC_HMAC_SHA256:
49       return GCRY_MD_SHA256;
50     case GCRY_MAC_HMAC_SHA384:
51       return GCRY_MD_SHA384;
52     case GCRY_MAC_HMAC_SHA512:
53       return GCRY_MD_SHA512;
54     case GCRY_MAC_HMAC_SHA512_256:
55       return GCRY_MD_SHA512_256;
56     case GCRY_MAC_HMAC_SHA512_224:
57       return GCRY_MD_SHA512_224;
58     case GCRY_MAC_HMAC_SHA3_224:
59       return GCRY_MD_SHA3_224;
60     case GCRY_MAC_HMAC_SHA3_256:
61       return GCRY_MD_SHA3_256;
62     case GCRY_MAC_HMAC_SHA3_384:
63       return GCRY_MD_SHA3_384;
64     case GCRY_MAC_HMAC_SHA3_512:
65       return GCRY_MD_SHA3_512;
66     case GCRY_MAC_HMAC_RMD160:
67       return GCRY_MD_RMD160;
68     case GCRY_MAC_HMAC_TIGER1:
69       return GCRY_MD_TIGER1;
70     case GCRY_MAC_HMAC_WHIRLPOOL:
71       return GCRY_MD_WHIRLPOOL;
72     case GCRY_MAC_HMAC_GOSTR3411_94:
73       return GCRY_MD_GOSTR3411_94;
74     case GCRY_MAC_HMAC_GOSTR3411_CP:
75       return GCRY_MD_GOSTR3411_CP;
76     case GCRY_MAC_HMAC_STRIBOG256:
77       return GCRY_MD_STRIBOG256;
78     case GCRY_MAC_HMAC_STRIBOG512:
79       return GCRY_MD_STRIBOG512;
80     case GCRY_MAC_HMAC_BLAKE2B_512:
81       return GCRY_MD_BLAKE2B_512;
82     case GCRY_MAC_HMAC_BLAKE2B_384:
83       return GCRY_MD_BLAKE2B_384;
84     case GCRY_MAC_HMAC_BLAKE2B_256:
85       return GCRY_MD_BLAKE2B_256;
86     case GCRY_MAC_HMAC_BLAKE2B_160:
87       return GCRY_MD_BLAKE2B_160;
88     case GCRY_MAC_HMAC_BLAKE2S_256:
89       return GCRY_MD_BLAKE2S_256;
90     case GCRY_MAC_HMAC_BLAKE2S_224:
91       return GCRY_MD_BLAKE2S_224;
92     case GCRY_MAC_HMAC_BLAKE2S_160:
93       return GCRY_MD_BLAKE2S_160;
94     case GCRY_MAC_HMAC_BLAKE2S_128:
95       return GCRY_MD_BLAKE2S_128;
96     case GCRY_MAC_HMAC_SM3:
97       return GCRY_MD_SM3;
98     }
99 }
100
101
102 static gcry_err_code_t
103 hmac_open (gcry_mac_hd_t h)
104 {
105   gcry_err_code_t err;
106   gcry_md_hd_t hd;
107   int secure = (h->magic == CTX_MAGIC_SECURE);
108   unsigned int flags;
109   int md_algo;
110
111   md_algo = map_mac_algo_to_md (h->spec->algo);
112
113   flags = GCRY_MD_FLAG_HMAC;
114   flags |= (secure ? GCRY_MD_FLAG_SECURE : 0);
115
116   err = _gcry_md_open (&hd, md_algo, flags);
117   if (err)
118     return err;
119
120   h->u.hmac.md_algo = md_algo;
121   h->u.hmac.md_ctx = hd;
122   return 0;
123 }
124
125
126 static void
127 hmac_close (gcry_mac_hd_t h)
128 {
129   _gcry_md_close (h->u.hmac.md_ctx);
130   h->u.hmac.md_ctx = NULL;
131 }
132
133
134 static gcry_err_code_t
135 hmac_setkey (gcry_mac_hd_t h, const unsigned char *key, size_t keylen)
136 {
137   return _gcry_md_setkey (h->u.hmac.md_ctx, key, keylen);
138 }
139
140
141 static gcry_err_code_t
142 hmac_reset (gcry_mac_hd_t h)
143 {
144   _gcry_md_reset (h->u.hmac.md_ctx);
145   return 0;
146 }
147
148
149 static gcry_err_code_t
150 hmac_write (gcry_mac_hd_t h, const unsigned char *buf, size_t buflen)
151 {
152   _gcry_md_write (h->u.hmac.md_ctx, buf, buflen);
153   return 0;
154 }
155
156
157 static gcry_err_code_t
158 hmac_read (gcry_mac_hd_t h, unsigned char *outbuf, size_t * outlen)
159 {
160   unsigned int dlen;
161   const unsigned char *digest;
162
163   dlen = _gcry_md_get_algo_dlen (h->u.hmac.md_algo);
164   digest = _gcry_md_read (h->u.hmac.md_ctx, h->u.hmac.md_algo);
165
166   if (*outlen <= dlen)
167     buf_cpy (outbuf, digest, *outlen);
168   else
169     {
170       buf_cpy (outbuf, digest, dlen);
171       *outlen = dlen;
172     }
173
174   return 0;
175 }
176
177
178 static gcry_err_code_t
179 hmac_verify (gcry_mac_hd_t h, const unsigned char *buf, size_t buflen)
180 {
181   unsigned int dlen;
182   const unsigned char *digest;
183
184   dlen = _gcry_md_get_algo_dlen (h->u.hmac.md_algo);
185   digest = _gcry_md_read (h->u.hmac.md_ctx, h->u.hmac.md_algo);
186
187   if (buflen > dlen)
188     return GPG_ERR_INV_LENGTH;
189
190   return buf_eq_const (buf, digest, buflen) ? 0 : GPG_ERR_CHECKSUM;
191 }
192
193
194 static unsigned int
195 hmac_get_maclen (int algo)
196 {
197   return _gcry_md_get_algo_dlen (map_mac_algo_to_md (algo));
198 }
199
200
201 static unsigned int
202 hmac_get_keylen (int algo)
203 {
204   /* Return blocksize for default key length. */
205   switch (algo)
206     {
207     case GCRY_MD_SHA3_224:
208       return 1152 / 8;
209     case GCRY_MD_SHA3_256:
210       return 1088 / 8;
211     case GCRY_MD_SHA3_384:
212       return 832 / 8;
213     case GCRY_MD_SHA3_512:
214       return 576 / 8;
215     case GCRY_MAC_HMAC_SHA384:
216     case GCRY_MAC_HMAC_SHA512:
217       return 128;
218     case GCRY_MAC_HMAC_GOSTR3411_94:
219       return 32;
220     default:
221       return 64;
222     }
223 }
224
225
226 static const gcry_mac_spec_ops_t hmac_ops = {
227   hmac_open,
228   hmac_close,
229   hmac_setkey,
230   NULL,
231   hmac_reset,
232   hmac_write,
233   hmac_read,
234   hmac_verify,
235   hmac_get_maclen,
236   hmac_get_keylen
237 };
238
239
240 #if USE_SHA1
241 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha1 = {
242   GCRY_MAC_HMAC_SHA1, {0, 1}, "HMAC_SHA1",
243   &hmac_ops
244 };
245 #endif
246 #if USE_SHA256
247 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha256 = {
248   GCRY_MAC_HMAC_SHA256, {0, 1}, "HMAC_SHA256",
249   &hmac_ops
250 };
251
252 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha224 = {
253   GCRY_MAC_HMAC_SHA224, {0, 1}, "HMAC_SHA224",
254   &hmac_ops
255 };
256 #endif
257 #if USE_SHA512
258 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha512 = {
259   GCRY_MAC_HMAC_SHA512, {0, 1}, "HMAC_SHA512",
260   &hmac_ops
261 };
262
263 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha384 = {
264   GCRY_MAC_HMAC_SHA384, {0, 1}, "HMAC_SHA384",
265   &hmac_ops
266 };
267
268 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha512_256 = {
269   GCRY_MAC_HMAC_SHA512_256, {0, 1}, "HMAC_SHA512_256",
270   &hmac_ops
271 };
272
273 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha512_224 = {
274   GCRY_MAC_HMAC_SHA512_224, {0, 1}, "HMAC_SHA512_224",
275   &hmac_ops
276 };
277
278 #endif
279 #if USE_SHA3
280 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_224 = {
281   GCRY_MAC_HMAC_SHA3_224, {0, 1}, "HMAC_SHA3_224",
282   &hmac_ops
283 };
284
285 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_256 = {
286   GCRY_MAC_HMAC_SHA3_256, {0, 1}, "HMAC_SHA3_256",
287   &hmac_ops
288 };
289
290 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_384 = {
291   GCRY_MAC_HMAC_SHA3_384, {0, 1}, "HMAC_SHA3_384",
292   &hmac_ops
293 };
294
295 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_512 = {
296   GCRY_MAC_HMAC_SHA3_512, {0, 1}, "HMAC_SHA3_512",
297   &hmac_ops
298 };
299 #endif
300 #ifdef USE_GOST_R_3411_94
301 gcry_mac_spec_t _gcry_mac_type_spec_hmac_gost3411_94 = {
302   GCRY_MAC_HMAC_GOSTR3411_94, {0, 0}, "HMAC_GOSTR3411_94",
303   &hmac_ops
304 };
305 gcry_mac_spec_t _gcry_mac_type_spec_hmac_gost3411_cp = {
306   GCRY_MAC_HMAC_GOSTR3411_CP, {0, 0}, "HMAC_GOSTR3411_CP",
307   &hmac_ops
308 };
309 #endif
310 #ifdef USE_GOST_R_3411_12
311 gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog256 = {
312   GCRY_MAC_HMAC_STRIBOG256, {0, 0}, "HMAC_STRIBOG256",
313   &hmac_ops
314 };
315
316 gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog512 = {
317   GCRY_MAC_HMAC_STRIBOG512, {0, 0}, "HMAC_STRIBOG512",
318   &hmac_ops
319 };
320 #endif
321 #if USE_WHIRLPOOL
322 gcry_mac_spec_t _gcry_mac_type_spec_hmac_whirlpool = {
323   GCRY_MAC_HMAC_WHIRLPOOL, {0, 0}, "HMAC_WHIRLPOOL",
324   &hmac_ops
325 };
326 #endif
327 #if USE_RMD160
328 gcry_mac_spec_t _gcry_mac_type_spec_hmac_rmd160 = {
329   GCRY_MAC_HMAC_RMD160, {0, 0}, "HMAC_RIPEMD160",
330   &hmac_ops
331 };
332 #endif
333 #if USE_TIGER
334 gcry_mac_spec_t _gcry_mac_type_spec_hmac_tiger1 = {
335   GCRY_MAC_HMAC_TIGER1, {0, 0}, "HMAC_TIGER",
336   &hmac_ops
337 };
338 #endif
339 #if USE_MD5
340 gcry_mac_spec_t _gcry_mac_type_spec_hmac_md5 = {
341   GCRY_MAC_HMAC_MD5, {0, 0}, "HMAC_MD5",
342   &hmac_ops
343 };
344 #endif
345 #if USE_MD4
346 gcry_mac_spec_t _gcry_mac_type_spec_hmac_md4 = {
347   GCRY_MAC_HMAC_MD4, {0, 0}, "HMAC_MD4",
348   &hmac_ops
349 };
350 #endif
351 #if USE_MD2
352 gcry_mac_spec_t _gcry_mac_type_spec_hmac_md2 = {
353   GCRY_MAC_HMAC_MD2, {0, 0}, "HMAC_MD2",
354   &hmac_ops
355 };
356 #endif
357 #if USE_BLAKE2
358 gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2b_512 = {
359   GCRY_MAC_HMAC_BLAKE2B_512, {0, 0}, "HMAC_BLAKE2B_512",
360   &hmac_ops
361 };
362 gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2b_384 = {
363   GCRY_MAC_HMAC_BLAKE2B_384, {0, 0}, "HMAC_BLAKE2B_384",
364   &hmac_ops
365 };
366 gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2b_256 = {
367   GCRY_MAC_HMAC_BLAKE2B_256, {0, 0}, "HMAC_BLAKE2B_256",
368   &hmac_ops
369 };
370 gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2b_160 = {
371   GCRY_MAC_HMAC_BLAKE2B_160, {0, 0}, "HMAC_BLAKE2B_160",
372   &hmac_ops
373 };
374 gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2s_256 = {
375   GCRY_MAC_HMAC_BLAKE2S_256, {0, 0}, "HMAC_BLAKE2S_256",
376   &hmac_ops
377 };
378 gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2s_224 = {
379   GCRY_MAC_HMAC_BLAKE2S_224, {0, 0}, "HMAC_BLAKE2S_224",
380   &hmac_ops
381 };
382 gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2s_160 = {
383   GCRY_MAC_HMAC_BLAKE2S_160, {0, 0}, "HMAC_BLAKE2S_160",
384   &hmac_ops
385 };
386 gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2s_128 = {
387   GCRY_MAC_HMAC_BLAKE2S_128, {0, 0}, "HMAC_BLAKE2S_128",
388   &hmac_ops
389 };
390 #endif
391 #if USE_SM3
392 gcry_mac_spec_t _gcry_mac_type_spec_hmac_sm3 = {
393   GCRY_MAC_HMAC_SM3, {0, 0}, "HMAC_SM3",
394   &hmac_ops
395 };
396 #endif