hmac-tests.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. /* hmac-tests.c - HMAC selftests.
  2. * Copyright (C) 2008 Free Software Foundation, Inc.
  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. Although algorithm self-tests are usually implemented in the module
  21. implementing the algorithm, the case for HMAC is different because
  22. HMAC is implemnetd on a higher level using a special feature of the
  23. gcry_md_ functions. It would be possible to do this also in the
  24. digest algorithm modules, but that would blow up the code too much
  25. and spread the hmac tests over several modules.
  26. Thus we implement all HMAC tests in this test module and provide a
  27. function to run the tests.
  28. */
  29. #include <config.h>
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include <string.h>
  33. #ifdef HAVE_STDINT_H
  34. # include <stdint.h>
  35. #endif
  36. #include "g10lib.h"
  37. #include "cipher.h"
  38. #include "hmac256.h"
  39. /* Check one HMAC with digest ALGO using the regualr HAMC
  40. API. (DATA,DATALEN) is the data to be MACed, (KEY,KEYLEN) the key
  41. and (EXPECT,EXPECTLEN) the expected result. Returns NULL on
  42. succdess or a string describing the failure. */
  43. static const char *
  44. check_one (int algo,
  45. const void *data, size_t datalen,
  46. const void *key, size_t keylen,
  47. const void *expect, size_t expectlen)
  48. {
  49. gcry_md_hd_t hd;
  50. const unsigned char *digest;
  51. /* printf ("HMAC algo %d\n", algo); */
  52. if (_gcry_md_get_algo_dlen (algo) != expectlen)
  53. return "invalid tests data";
  54. if (_gcry_md_open (&hd, algo, GCRY_MD_FLAG_HMAC))
  55. return "gcry_md_open failed";
  56. if (_gcry_md_setkey (hd, key, keylen))
  57. {
  58. _gcry_md_close (hd);
  59. return "gcry_md_setkey failed";
  60. }
  61. _gcry_md_write (hd, data, datalen);
  62. digest = _gcry_md_read (hd, algo);
  63. if (!digest)
  64. {
  65. _gcry_md_close (hd);
  66. return "gcry_md_read failed";
  67. }
  68. if (memcmp (digest, expect, expectlen))
  69. {
  70. /* int i; */
  71. /* fputs (" {", stdout); */
  72. /* for (i=0; i < expectlen-1; i++) */
  73. /* { */
  74. /* if (i && !(i % 8)) */
  75. /* fputs ("\n ", stdout); */
  76. /* printf (" 0x%02x,", digest[i]); */
  77. /* } */
  78. /* printf (" 0x%02x } },\n", digest[i]); */
  79. _gcry_md_close (hd);
  80. return "does not match";
  81. }
  82. _gcry_md_close (hd);
  83. return NULL;
  84. }
  85. static gpg_err_code_t
  86. selftests_sha1 (int extended, selftest_report_func_t report)
  87. {
  88. const char *what;
  89. const char *errtxt;
  90. unsigned char key[128];
  91. int i, j;
  92. what = "FIPS-198a, A.1";
  93. for (i=0; i < 64; i++)
  94. key[i] = i;
  95. errtxt = check_one (GCRY_MD_SHA1,
  96. "Sample #1", 9,
  97. key, 64,
  98. "\x4f\x4c\xa3\xd5\xd6\x8b\xa7\xcc\x0a\x12"
  99. "\x08\xc9\xc6\x1e\x9c\x5d\xa0\x40\x3c\x0a", 20);
  100. if (errtxt)
  101. goto failed;
  102. if (extended)
  103. {
  104. what = "FIPS-198a, A.2";
  105. for (i=0, j=0x30; i < 20; i++)
  106. key[i] = j++;
  107. errtxt = check_one (GCRY_MD_SHA1,
  108. "Sample #2", 9,
  109. key, 20,
  110. "\x09\x22\xd3\x40\x5f\xaa\x3d\x19\x4f\x82"
  111. "\xa4\x58\x30\x73\x7d\x5c\xc6\xc7\x5d\x24", 20);
  112. if (errtxt)
  113. goto failed;
  114. what = "FIPS-198a, A.3";
  115. for (i=0, j=0x50; i < 100; i++)
  116. key[i] = j++;
  117. errtxt = check_one (GCRY_MD_SHA1,
  118. "Sample #3", 9,
  119. key, 100,
  120. "\xbc\xf4\x1e\xab\x8b\xb2\xd8\x02\xf3\xd0"
  121. "\x5c\xaf\x7c\xb0\x92\xec\xf8\xd1\xa3\xaa", 20 );
  122. if (errtxt)
  123. goto failed;
  124. what = "FIPS-198a, A.4";
  125. for (i=0, j=0x70; i < 49; i++)
  126. key[i] = j++;
  127. errtxt = check_one (GCRY_MD_SHA1,
  128. "Sample #4", 9,
  129. key, 49,
  130. "\x9e\xa8\x86\xef\xe2\x68\xdb\xec\xce\x42"
  131. "\x0c\x75\x24\xdf\x32\xe0\x75\x1a\x2a\x26", 20 );
  132. if (errtxt)
  133. goto failed;
  134. }
  135. return 0; /* Succeeded. */
  136. failed:
  137. if (report)
  138. report ("hmac", GCRY_MD_SHA1, what, errtxt);
  139. return GPG_ERR_SELFTEST_FAILED;
  140. }
  141. static gpg_err_code_t
  142. selftests_sha224 (int extended, selftest_report_func_t report)
  143. {
  144. static struct
  145. {
  146. const char * const desc;
  147. const char * const data;
  148. const char * const key;
  149. const char expect[28];
  150. } tv[] =
  151. {
  152. { "data-28 key-4",
  153. "what do ya want for nothing?",
  154. "Jefe",
  155. { 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf,
  156. 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e, 0x6d, 0x0f,
  157. 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00,
  158. 0x8f, 0xd0, 0x5e, 0x44 } },
  159. { "data-9 key-20",
  160. "Hi There",
  161. "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  162. "\x0b\x0b\x0b\x0b",
  163. { 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19,
  164. 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d, 0xf3, 0x3f,
  165. 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f,
  166. 0x53, 0x68, 0x4b, 0x22 } },
  167. { "data-50 key-20",
  168. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  169. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  170. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  171. "\xdd\xdd",
  172. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  173. "\xaa\xaa\xaa\xaa",
  174. { 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6,
  175. 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a, 0xd2, 0x64,
  176. 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1,
  177. 0xec, 0x83, 0x33, 0xea } },
  178. { "data-50 key-26",
  179. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  180. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  181. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  182. "\xcd\xcd",
  183. "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
  184. "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
  185. { 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac,
  186. 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82, 0x62, 0x7c,
  187. 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d,
  188. 0xe7, 0xaf, 0xec, 0x5a } },
  189. { "data-54 key-131",
  190. "Test Using Larger Than Block-Size Key - Hash Key First",
  191. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  192. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  193. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  194. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  195. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  196. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  197. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  198. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  199. "\xaa\xaa\xaa",
  200. { 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad,
  201. 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d, 0xbc, 0xe2,
  202. 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27,
  203. 0x3f, 0xa6, 0x87, 0x0e } },
  204. { "data-152 key-131",
  205. "This is a test using a larger than block-size key and a larger "
  206. "than block-size data. The key needs to be hashed before being "
  207. "used by the HMAC algorithm.",
  208. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  209. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  210. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  211. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  212. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  213. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  214. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  215. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  216. "\xaa\xaa\xaa",
  217. { 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02,
  218. 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3, 0x9d, 0xbd,
  219. 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9,
  220. 0xf6, 0xf5, 0x65, 0xd1 } },
  221. { NULL }
  222. };
  223. const char *what;
  224. const char *errtxt;
  225. int tvidx;
  226. for (tvidx=0; tv[tvidx].desc; tvidx++)
  227. {
  228. what = tv[tvidx].desc;
  229. errtxt = check_one (GCRY_MD_SHA224,
  230. tv[tvidx].data, strlen (tv[tvidx].data),
  231. tv[tvidx].key, strlen (tv[tvidx].key),
  232. tv[tvidx].expect, DIM (tv[tvidx].expect) );
  233. if (errtxt)
  234. goto failed;
  235. if (!extended)
  236. break;
  237. }
  238. return 0; /* Succeeded. */
  239. failed:
  240. if (report)
  241. report ("hmac", GCRY_MD_SHA224, what, errtxt);
  242. return GPG_ERR_SELFTEST_FAILED;
  243. }
  244. static gpg_err_code_t
  245. selftests_sha256 (int extended, selftest_report_func_t report)
  246. {
  247. static struct
  248. {
  249. const char * const desc;
  250. const char * const data;
  251. const char * const key;
  252. const char expect[32];
  253. } tv[] =
  254. {
  255. { "data-28 key-4",
  256. "what do ya want for nothing?",
  257. "Jefe",
  258. { 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
  259. 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
  260. 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
  261. 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 } },
  262. { "data-9 key-20",
  263. "Hi There",
  264. "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  265. "\x0b\x0b\x0b\x0b",
  266. { 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53,
  267. 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b,
  268. 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7,
  269. 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7 } },
  270. { "data-50 key-20",
  271. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  272. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  273. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  274. "\xdd\xdd",
  275. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  276. "\xaa\xaa\xaa\xaa",
  277. { 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46,
  278. 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7,
  279. 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22,
  280. 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe } },
  281. { "data-50 key-26",
  282. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  283. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  284. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  285. "\xcd\xcd",
  286. "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
  287. "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
  288. { 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e,
  289. 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a,
  290. 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07,
  291. 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b } },
  292. { "data-54 key-131",
  293. "Test Using Larger Than Block-Size Key - Hash Key First",
  294. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  295. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  296. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  297. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  298. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  299. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  300. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  301. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  302. "\xaa\xaa\xaa",
  303. { 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f,
  304. 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f,
  305. 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14,
  306. 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54 } },
  307. { "data-152 key-131",
  308. "This is a test using a larger than block-size key and a larger "
  309. "than block-size data. The key needs to be hashed before being "
  310. "used by the HMAC algorithm.",
  311. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  312. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  313. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  314. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  315. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  316. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  317. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  318. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  319. "\xaa\xaa\xaa",
  320. { 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb,
  321. 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44,
  322. 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93,
  323. 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2 } },
  324. { NULL }
  325. };
  326. const char *what;
  327. const char *errtxt;
  328. int tvidx;
  329. for (tvidx=0; tv[tvidx].desc; tvidx++)
  330. {
  331. hmac256_context_t hmachd;
  332. const unsigned char *digest;
  333. size_t dlen;
  334. what = tv[tvidx].desc;
  335. errtxt = check_one (GCRY_MD_SHA256,
  336. tv[tvidx].data, strlen (tv[tvidx].data),
  337. tv[tvidx].key, strlen (tv[tvidx].key),
  338. tv[tvidx].expect, DIM (tv[tvidx].expect) );
  339. if (errtxt)
  340. goto failed;
  341. hmachd = _gcry_hmac256_new (tv[tvidx].key, strlen (tv[tvidx].key));
  342. if (!hmachd)
  343. {
  344. errtxt = "_gcry_hmac256_new failed";
  345. goto failed;
  346. }
  347. _gcry_hmac256_update (hmachd, tv[tvidx].data, strlen (tv[tvidx].data));
  348. digest = _gcry_hmac256_finalize (hmachd, &dlen);
  349. if (!digest)
  350. {
  351. errtxt = "_gcry_hmac256_finalize failed";
  352. _gcry_hmac256_release (hmachd);
  353. goto failed;
  354. }
  355. if (dlen != DIM (tv[tvidx].expect)
  356. || memcmp (digest, tv[tvidx].expect, DIM (tv[tvidx].expect)))
  357. {
  358. errtxt = "does not match in second implementation";
  359. _gcry_hmac256_release (hmachd);
  360. goto failed;
  361. }
  362. _gcry_hmac256_release (hmachd);
  363. if (!extended)
  364. break;
  365. }
  366. return 0; /* Succeeded. */
  367. failed:
  368. if (report)
  369. report ("hmac", GCRY_MD_SHA256, what, errtxt);
  370. return GPG_ERR_SELFTEST_FAILED;
  371. }
  372. static gpg_err_code_t
  373. selftests_sha384 (int extended, selftest_report_func_t report)
  374. {
  375. static struct
  376. {
  377. const char * const desc;
  378. const char * const data;
  379. const char * const key;
  380. const char expect[48];
  381. } tv[] =
  382. {
  383. { "data-28 key-4",
  384. "what do ya want for nothing?",
  385. "Jefe",
  386. { 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31,
  387. 0x61, 0x7f, 0x78, 0xd2, 0xb5, 0x8a, 0x6b, 0x1b,
  388. 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
  389. 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e,
  390. 0x8e, 0x22, 0x40, 0xca, 0x5e, 0x69, 0xe2, 0xc7,
  391. 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49 } },
  392. { "data-9 key-20",
  393. "Hi There",
  394. "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  395. "\x0b\x0b\x0b\x0b",
  396. { 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62,
  397. 0x6b, 0x08, 0x25, 0xf4, 0xab, 0x46, 0x90, 0x7f,
  398. 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
  399. 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c,
  400. 0xfa, 0xea, 0x9e, 0xa9, 0x07, 0x6e, 0xde, 0x7f,
  401. 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6 } },
  402. { "data-50 key-20",
  403. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  404. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  405. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  406. "\xdd\xdd",
  407. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  408. "\xaa\xaa\xaa\xaa",
  409. { 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a,
  410. 0x0a, 0xa2, 0xac, 0xe0, 0x14, 0xc8, 0xa8, 0x6f,
  411. 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
  412. 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b,
  413. 0x2a, 0x5a, 0xb3, 0x9d, 0xc1, 0x38, 0x14, 0xb9,
  414. 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27 } },
  415. { "data-50 key-26",
  416. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  417. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  418. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  419. "\xcd\xcd",
  420. "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
  421. "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
  422. { 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85,
  423. 0x19, 0x33, 0xab, 0x62, 0x90, 0xaf, 0x6c, 0xa7,
  424. 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
  425. 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e,
  426. 0x68, 0x01, 0xdd, 0x23, 0xc4, 0xa7, 0xd6, 0x79,
  427. 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb } },
  428. { "data-54 key-131",
  429. "Test Using Larger Than Block-Size Key - Hash Key First",
  430. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  431. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  432. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  433. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  434. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  435. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  436. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  437. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  438. "\xaa\xaa\xaa",
  439. { 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90,
  440. 0x88, 0xd2, 0xc6, 0x3a, 0x04, 0x1b, 0xc5, 0xb4,
  441. 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
  442. 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6,
  443. 0x0c, 0x2e, 0xf6, 0xab, 0x40, 0x30, 0xfe, 0x82,
  444. 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52 } },
  445. { "data-152 key-131",
  446. "This is a test using a larger than block-size key and a larger "
  447. "than block-size data. The key needs to be hashed before being "
  448. "used by the HMAC algorithm.",
  449. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  450. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  451. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  452. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  453. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  454. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  455. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  456. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  457. "\xaa\xaa\xaa",
  458. { 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d,
  459. 0x35, 0x1e, 0x2f, 0x25, 0x4e, 0x8f, 0xd3, 0x2c,
  460. 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
  461. 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5,
  462. 0xa6, 0x78, 0xcc, 0x31, 0xe7, 0x99, 0x17, 0x6d,
  463. 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e } },
  464. { NULL }
  465. };
  466. const char *what;
  467. const char *errtxt;
  468. int tvidx;
  469. for (tvidx=0; tv[tvidx].desc; tvidx++)
  470. {
  471. what = tv[tvidx].desc;
  472. errtxt = check_one (GCRY_MD_SHA384,
  473. tv[tvidx].data, strlen (tv[tvidx].data),
  474. tv[tvidx].key, strlen (tv[tvidx].key),
  475. tv[tvidx].expect, DIM (tv[tvidx].expect) );
  476. if (errtxt)
  477. goto failed;
  478. if (!extended)
  479. break;
  480. }
  481. return 0; /* Succeeded. */
  482. failed:
  483. if (report)
  484. report ("hmac", GCRY_MD_SHA384, what, errtxt);
  485. return GPG_ERR_SELFTEST_FAILED;
  486. }
  487. static gpg_err_code_t
  488. selftests_sha512 (int extended, selftest_report_func_t report)
  489. {
  490. static struct
  491. {
  492. const char * const desc;
  493. const char * const data;
  494. const char * const key;
  495. const char expect[64];
  496. } tv[] =
  497. {
  498. { "data-28 key-4",
  499. "what do ya want for nothing?",
  500. "Jefe",
  501. { 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2,
  502. 0xe3, 0x95, 0xfb, 0xe7, 0x3b, 0x56, 0xe0, 0xa3,
  503. 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6,
  504. 0x10, 0x27, 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54,
  505. 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99, 0x4a,
  506. 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd,
  507. 0xca, 0xea, 0xb1, 0xa3, 0x4d, 0x4a, 0x6b, 0x4b,
  508. 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37 } },
  509. { "data-9 key-20",
  510. "Hi There",
  511. "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  512. "\x0b\x0b\x0b\x0b",
  513. { 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d,
  514. 0x4f, 0xf0, 0xb4, 0x24, 0x1a, 0x1d, 0x6c, 0xb0,
  515. 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78,
  516. 0x7a, 0xd0, 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde,
  517. 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7, 0x02,
  518. 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4,
  519. 0xbe, 0x9d, 0x91, 0x4e, 0xeb, 0x61, 0xf1, 0x70,
  520. 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54 } },
  521. { "data-50 key-20",
  522. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  523. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  524. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  525. "\xdd\xdd",
  526. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  527. "\xaa\xaa\xaa\xaa",
  528. { 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84,
  529. 0xef, 0xb0, 0xf0, 0x75, 0x6c, 0x89, 0x0b, 0xe9,
  530. 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36,
  531. 0x55, 0xf8, 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39,
  532. 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22, 0xc8,
  533. 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07,
  534. 0xb9, 0x46, 0xa3, 0x37, 0xbe, 0xe8, 0x94, 0x26,
  535. 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb } },
  536. { "data-50 key-26",
  537. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  538. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  539. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  540. "\xcd\xcd",
  541. "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
  542. "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
  543. { 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69,
  544. 0x90, 0xe5, 0xa8, 0xc5, 0xf6, 0x1d, 0x4a, 0xf7,
  545. 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d,
  546. 0xe7, 0x6f, 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb,
  547. 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e, 0xb4,
  548. 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63,
  549. 0xa5, 0xf1, 0x97, 0x41, 0x12, 0x0c, 0x4f, 0x2d,
  550. 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd } },
  551. { "data-54 key-131",
  552. "Test Using Larger Than Block-Size Key - Hash Key First",
  553. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  554. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  555. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  556. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  557. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  558. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  559. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  560. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  561. "\xaa\xaa\xaa",
  562. { 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb,
  563. 0xb7, 0x14, 0x93, 0xc1, 0xdd, 0x7b, 0xe8, 0xb4,
  564. 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1,
  565. 0x12, 0x1b, 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52,
  566. 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25, 0x98,
  567. 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52,
  568. 0x95, 0xe6, 0x4f, 0x73, 0xf6, 0x3f, 0x0a, 0xec,
  569. 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98 } },
  570. { "data-152 key-131",
  571. "This is a test using a larger than block-size key and a larger "
  572. "than block-size data. The key needs to be hashed before being "
  573. "used by the HMAC algorithm.",
  574. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  575. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  576. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  577. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  578. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  579. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  580. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  581. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  582. "\xaa\xaa\xaa",
  583. { 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba,
  584. 0xa4, 0xdf, 0xa9, 0xf9, 0x6e, 0x5e, 0x3f, 0xfd,
  585. 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86,
  586. 0x5d, 0xf5, 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44,
  587. 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82, 0xb1,
  588. 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15,
  589. 0x13, 0x46, 0x76, 0xfb, 0x6d, 0xe0, 0x44, 0x60,
  590. 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58 } },
  591. { NULL }
  592. };
  593. const char *what;
  594. const char *errtxt;
  595. int tvidx;
  596. for (tvidx=0; tv[tvidx].desc; tvidx++)
  597. {
  598. what = tv[tvidx].desc;
  599. errtxt = check_one (GCRY_MD_SHA512,
  600. tv[tvidx].data, strlen (tv[tvidx].data),
  601. tv[tvidx].key, strlen (tv[tvidx].key),
  602. tv[tvidx].expect, DIM (tv[tvidx].expect) );
  603. if (errtxt)
  604. goto failed;
  605. if (!extended)
  606. break;
  607. }
  608. return 0; /* Succeeded. */
  609. failed:
  610. if (report)
  611. report ("hmac", GCRY_MD_SHA512, what, errtxt);
  612. return GPG_ERR_SELFTEST_FAILED;
  613. }
  614. /* Run a full self-test for ALGO and return 0 on success. */
  615. static gpg_err_code_t
  616. run_selftests (int algo, int extended, selftest_report_func_t report)
  617. {
  618. gpg_err_code_t ec;
  619. switch (algo)
  620. {
  621. case GCRY_MD_SHA1:
  622. ec = selftests_sha1 (extended, report);
  623. break;
  624. case GCRY_MD_SHA224:
  625. ec = selftests_sha224 (extended, report);
  626. break;
  627. case GCRY_MD_SHA256:
  628. ec = selftests_sha256 (extended, report);
  629. break;
  630. case GCRY_MD_SHA384:
  631. ec = selftests_sha384 (extended, report);
  632. break;
  633. case GCRY_MD_SHA512:
  634. ec = selftests_sha512 (extended, report);
  635. break;
  636. default:
  637. ec = GPG_ERR_DIGEST_ALGO;
  638. break;
  639. }
  640. return ec;
  641. }
  642. /* Run the selftests for HMAC with digest algorithm ALGO with optional
  643. reporting function REPORT. */
  644. gpg_error_t
  645. _gcry_hmac_selftest (int algo, int extended, selftest_report_func_t report)
  646. {
  647. gcry_err_code_t ec = 0;
  648. if (!gcry_md_test_algo (algo))
  649. {
  650. ec = run_selftests (algo, extended, report);
  651. }
  652. else
  653. {
  654. ec = GPG_ERR_DIGEST_ALGO;
  655. if (report)
  656. report ("hmac", algo, "module", "algorithm not available");
  657. }
  658. return gpg_error (ec);
  659. }