sha512.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. /* sha512.c - SHA384 and SHA512 hash functions
  2. * Copyright (C) 2003, 2008, 2009 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. /* Test vectors from FIPS-180-2:
  20. *
  21. * "abc"
  22. * 384:
  23. * CB00753F 45A35E8B B5A03D69 9AC65007 272C32AB 0EDED163
  24. * 1A8B605A 43FF5BED 8086072B A1E7CC23 58BAECA1 34C825A7
  25. * 512:
  26. * DDAF35A1 93617ABA CC417349 AE204131 12E6FA4E 89A97EA2 0A9EEEE6 4B55D39A
  27. * 2192992A 274FC1A8 36BA3C23 A3FEEBBD 454D4423 643CE80E 2A9AC94F A54CA49F
  28. *
  29. * "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
  30. * 384:
  31. * 09330C33 F71147E8 3D192FC7 82CD1B47 53111B17 3B3B05D2
  32. * 2FA08086 E3B0F712 FCC7C71A 557E2DB9 66C3E9FA 91746039
  33. * 512:
  34. * 8E959B75 DAE313DA 8CF4F728 14FC143F 8F7779C6 EB9F7FA1 7299AEAD B6889018
  35. * 501D289E 4900F7E4 331B99DE C4B5433A C7D329EE B6DD2654 5E96E55B 874BE909
  36. *
  37. * "a" x 1000000
  38. * 384:
  39. * 9D0E1809 716474CB 086E834E 310A4A1C ED149E9C 00F24852
  40. * 7972CEC5 704C2A5B 07B8B3DC 38ECC4EB AE97DDD8 7F3D8985
  41. * 512:
  42. * E718483D 0CE76964 4E2E42C7 BC15B463 8E1F98B1 3B204428 5632A803 AFA973EB
  43. * DE0FF244 877EA60A 4CB0432C E577C31B EB009C5C 2C49AA2E 4EADB217 AD8CC09B
  44. */
  45. #include <config.h>
  46. #include <string.h>
  47. #include "g10lib.h"
  48. #include "bithelp.h"
  49. #include "cipher.h"
  50. #include "hash-common.h"
  51. typedef struct
  52. {
  53. u64 h0, h1, h2, h3, h4, h5, h6, h7;
  54. u64 nblocks;
  55. byte buf[128];
  56. int count;
  57. } SHA512_CONTEXT;
  58. static void
  59. sha512_init (void *context)
  60. {
  61. SHA512_CONTEXT *hd = context;
  62. hd->h0 = U64_C(0x6a09e667f3bcc908);
  63. hd->h1 = U64_C(0xbb67ae8584caa73b);
  64. hd->h2 = U64_C(0x3c6ef372fe94f82b);
  65. hd->h3 = U64_C(0xa54ff53a5f1d36f1);
  66. hd->h4 = U64_C(0x510e527fade682d1);
  67. hd->h5 = U64_C(0x9b05688c2b3e6c1f);
  68. hd->h6 = U64_C(0x1f83d9abfb41bd6b);
  69. hd->h7 = U64_C(0x5be0cd19137e2179);
  70. hd->nblocks = 0;
  71. hd->count = 0;
  72. }
  73. static void
  74. sha384_init (void *context)
  75. {
  76. SHA512_CONTEXT *hd = context;
  77. hd->h0 = U64_C(0xcbbb9d5dc1059ed8);
  78. hd->h1 = U64_C(0x629a292a367cd507);
  79. hd->h2 = U64_C(0x9159015a3070dd17);
  80. hd->h3 = U64_C(0x152fecd8f70e5939);
  81. hd->h4 = U64_C(0x67332667ffc00b31);
  82. hd->h5 = U64_C(0x8eb44a8768581511);
  83. hd->h6 = U64_C(0xdb0c2e0d64f98fa7);
  84. hd->h7 = U64_C(0x47b5481dbefa4fa4);
  85. hd->nblocks = 0;
  86. hd->count = 0;
  87. }
  88. static inline u64
  89. ROTR (u64 x, u64 n)
  90. {
  91. return ((x >> n) | (x << (64 - n)));
  92. }
  93. static inline u64
  94. Ch (u64 x, u64 y, u64 z)
  95. {
  96. return ((x & y) ^ ( ~x & z));
  97. }
  98. static inline u64
  99. Maj (u64 x, u64 y, u64 z)
  100. {
  101. return ((x & y) ^ (x & z) ^ (y & z));
  102. }
  103. static inline u64
  104. Sum0 (u64 x)
  105. {
  106. return (ROTR (x, 28) ^ ROTR (x, 34) ^ ROTR (x, 39));
  107. }
  108. static inline u64
  109. Sum1 (u64 x)
  110. {
  111. return (ROTR (x, 14) ^ ROTR (x, 18) ^ ROTR (x, 41));
  112. }
  113. /****************
  114. * Transform the message W which consists of 16 64-bit-words
  115. */
  116. static void
  117. transform (SHA512_CONTEXT *hd, const unsigned char *data)
  118. {
  119. u64 a, b, c, d, e, f, g, h;
  120. u64 w[80];
  121. int t;
  122. static const u64 k[] =
  123. {
  124. U64_C(0x428a2f98d728ae22), U64_C(0x7137449123ef65cd),
  125. U64_C(0xb5c0fbcfec4d3b2f), U64_C(0xe9b5dba58189dbbc),
  126. U64_C(0x3956c25bf348b538), U64_C(0x59f111f1b605d019),
  127. U64_C(0x923f82a4af194f9b), U64_C(0xab1c5ed5da6d8118),
  128. U64_C(0xd807aa98a3030242), U64_C(0x12835b0145706fbe),
  129. U64_C(0x243185be4ee4b28c), U64_C(0x550c7dc3d5ffb4e2),
  130. U64_C(0x72be5d74f27b896f), U64_C(0x80deb1fe3b1696b1),
  131. U64_C(0x9bdc06a725c71235), U64_C(0xc19bf174cf692694),
  132. U64_C(0xe49b69c19ef14ad2), U64_C(0xefbe4786384f25e3),
  133. U64_C(0x0fc19dc68b8cd5b5), U64_C(0x240ca1cc77ac9c65),
  134. U64_C(0x2de92c6f592b0275), U64_C(0x4a7484aa6ea6e483),
  135. U64_C(0x5cb0a9dcbd41fbd4), U64_C(0x76f988da831153b5),
  136. U64_C(0x983e5152ee66dfab), U64_C(0xa831c66d2db43210),
  137. U64_C(0xb00327c898fb213f), U64_C(0xbf597fc7beef0ee4),
  138. U64_C(0xc6e00bf33da88fc2), U64_C(0xd5a79147930aa725),
  139. U64_C(0x06ca6351e003826f), U64_C(0x142929670a0e6e70),
  140. U64_C(0x27b70a8546d22ffc), U64_C(0x2e1b21385c26c926),
  141. U64_C(0x4d2c6dfc5ac42aed), U64_C(0x53380d139d95b3df),
  142. U64_C(0x650a73548baf63de), U64_C(0x766a0abb3c77b2a8),
  143. U64_C(0x81c2c92e47edaee6), U64_C(0x92722c851482353b),
  144. U64_C(0xa2bfe8a14cf10364), U64_C(0xa81a664bbc423001),
  145. U64_C(0xc24b8b70d0f89791), U64_C(0xc76c51a30654be30),
  146. U64_C(0xd192e819d6ef5218), U64_C(0xd69906245565a910),
  147. U64_C(0xf40e35855771202a), U64_C(0x106aa07032bbd1b8),
  148. U64_C(0x19a4c116b8d2d0c8), U64_C(0x1e376c085141ab53),
  149. U64_C(0x2748774cdf8eeb99), U64_C(0x34b0bcb5e19b48a8),
  150. U64_C(0x391c0cb3c5c95a63), U64_C(0x4ed8aa4ae3418acb),
  151. U64_C(0x5b9cca4f7763e373), U64_C(0x682e6ff3d6b2b8a3),
  152. U64_C(0x748f82ee5defb2fc), U64_C(0x78a5636f43172f60),
  153. U64_C(0x84c87814a1f0ab72), U64_C(0x8cc702081a6439ec),
  154. U64_C(0x90befffa23631e28), U64_C(0xa4506cebde82bde9),
  155. U64_C(0xbef9a3f7b2c67915), U64_C(0xc67178f2e372532b),
  156. U64_C(0xca273eceea26619c), U64_C(0xd186b8c721c0c207),
  157. U64_C(0xeada7dd6cde0eb1e), U64_C(0xf57d4f7fee6ed178),
  158. U64_C(0x06f067aa72176fba), U64_C(0x0a637dc5a2c898a6),
  159. U64_C(0x113f9804bef90dae), U64_C(0x1b710b35131c471b),
  160. U64_C(0x28db77f523047d84), U64_C(0x32caab7b40c72493),
  161. U64_C(0x3c9ebe0a15c9bebc), U64_C(0x431d67c49c100d4c),
  162. U64_C(0x4cc5d4becb3e42b6), U64_C(0x597f299cfc657e2a),
  163. U64_C(0x5fcb6fab3ad6faec), U64_C(0x6c44198c4a475817)
  164. };
  165. /* get values from the chaining vars */
  166. a = hd->h0;
  167. b = hd->h1;
  168. c = hd->h2;
  169. d = hd->h3;
  170. e = hd->h4;
  171. f = hd->h5;
  172. g = hd->h6;
  173. h = hd->h7;
  174. #ifdef WORDS_BIGENDIAN
  175. memcpy (w, data, 128);
  176. #else
  177. {
  178. int i;
  179. byte *p2;
  180. for (i = 0, p2 = (byte *) w; i < 16; i++, p2 += 8)
  181. {
  182. p2[7] = *data++;
  183. p2[6] = *data++;
  184. p2[5] = *data++;
  185. p2[4] = *data++;
  186. p2[3] = *data++;
  187. p2[2] = *data++;
  188. p2[1] = *data++;
  189. p2[0] = *data++;
  190. }
  191. }
  192. #endif
  193. #define S0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7))
  194. #define S1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
  195. for (t = 16; t < 80; t++)
  196. w[t] = S1 (w[t - 2]) + w[t - 7] + S0 (w[t - 15]) + w[t - 16];
  197. for (t = 0; t < 80; )
  198. {
  199. u64 t1, t2;
  200. /* Performance on a AMD Athlon(tm) Dual Core Processor 4050e
  201. with gcc 4.3.3 using gcry_md_hash_buffer of each 10000 bytes
  202. initialized to 0,1,2,3...255,0,... and 1000 iterations:
  203. Not unrolled with macros: 440ms
  204. Unrolled with macros: 350ms
  205. Unrolled with inline: 330ms
  206. */
  207. #if 0 /* Not unrolled. */
  208. t1 = h + Sum1 (e) + Ch (e, f, g) + k[t] + w[t];
  209. t2 = Sum0 (a) + Maj (a, b, c);
  210. h = g;
  211. g = f;
  212. f = e;
  213. e = d + t1;
  214. d = c;
  215. c = b;
  216. b = a;
  217. a = t1 + t2;
  218. t++;
  219. #else /* Unrolled to interweave the chain variables. */
  220. t1 = h + Sum1 (e) + Ch (e, f, g) + k[t] + w[t];
  221. t2 = Sum0 (a) + Maj (a, b, c);
  222. d += t1;
  223. h = t1 + t2;
  224. t1 = g + Sum1 (d) + Ch (d, e, f) + k[t+1] + w[t+1];
  225. t2 = Sum0 (h) + Maj (h, a, b);
  226. c += t1;
  227. g = t1 + t2;
  228. t1 = f + Sum1 (c) + Ch (c, d, e) + k[t+2] + w[t+2];
  229. t2 = Sum0 (g) + Maj (g, h, a);
  230. b += t1;
  231. f = t1 + t2;
  232. t1 = e + Sum1 (b) + Ch (b, c, d) + k[t+3] + w[t+3];
  233. t2 = Sum0 (f) + Maj (f, g, h);
  234. a += t1;
  235. e = t1 + t2;
  236. t1 = d + Sum1 (a) + Ch (a, b, c) + k[t+4] + w[t+4];
  237. t2 = Sum0 (e) + Maj (e, f, g);
  238. h += t1;
  239. d = t1 + t2;
  240. t1 = c + Sum1 (h) + Ch (h, a, b) + k[t+5] + w[t+5];
  241. t2 = Sum0 (d) + Maj (d, e, f);
  242. g += t1;
  243. c = t1 + t2;
  244. t1 = b + Sum1 (g) + Ch (g, h, a) + k[t+6] + w[t+6];
  245. t2 = Sum0 (c) + Maj (c, d, e);
  246. f += t1;
  247. b = t1 + t2;
  248. t1 = a + Sum1 (f) + Ch (f, g, h) + k[t+7] + w[t+7];
  249. t2 = Sum0 (b) + Maj (b, c, d);
  250. e += t1;
  251. a = t1 + t2;
  252. t += 8;
  253. #endif
  254. }
  255. /* Update chaining vars. */
  256. hd->h0 += a;
  257. hd->h1 += b;
  258. hd->h2 += c;
  259. hd->h3 += d;
  260. hd->h4 += e;
  261. hd->h5 += f;
  262. hd->h6 += g;
  263. hd->h7 += h;
  264. }
  265. /* Update the message digest with the contents
  266. * of INBUF with length INLEN.
  267. */
  268. static void
  269. sha512_write (void *context, const void *inbuf_arg, size_t inlen)
  270. {
  271. const unsigned char *inbuf = inbuf_arg;
  272. SHA512_CONTEXT *hd = context;
  273. if (hd->count == 128)
  274. { /* flush the buffer */
  275. transform (hd, hd->buf);
  276. _gcry_burn_stack (768);
  277. hd->count = 0;
  278. hd->nblocks++;
  279. }
  280. if (!inbuf)
  281. return;
  282. if (hd->count)
  283. {
  284. for (; inlen && hd->count < 128; inlen--)
  285. hd->buf[hd->count++] = *inbuf++;
  286. sha512_write (context, NULL, 0);
  287. if (!inlen)
  288. return;
  289. }
  290. while (inlen >= 128)
  291. {
  292. transform (hd, inbuf);
  293. hd->count = 0;
  294. hd->nblocks++;
  295. inlen -= 128;
  296. inbuf += 128;
  297. }
  298. _gcry_burn_stack (768);
  299. for (; inlen && hd->count < 128; inlen--)
  300. hd->buf[hd->count++] = *inbuf++;
  301. }
  302. /* The routine final terminates the computation and
  303. * returns the digest.
  304. * The handle is prepared for a new cycle, but adding bytes to the
  305. * handle will the destroy the returned buffer.
  306. * Returns: 64 bytes representing the digest. When used for sha384,
  307. * we take the leftmost 48 of those bytes.
  308. */
  309. static void
  310. sha512_final (void *context)
  311. {
  312. SHA512_CONTEXT *hd = context;
  313. u64 t, msb, lsb;
  314. byte *p;
  315. sha512_write (context, NULL, 0); /* flush */ ;
  316. t = hd->nblocks;
  317. /* multiply by 128 to make a byte count */
  318. lsb = t << 7;
  319. msb = t >> 57;
  320. /* add the count */
  321. t = lsb;
  322. if ((lsb += hd->count) < t)
  323. msb++;
  324. /* multiply by 8 to make a bit count */
  325. t = lsb;
  326. lsb <<= 3;
  327. msb <<= 3;
  328. msb |= t >> 61;
  329. if (hd->count < 112)
  330. { /* enough room */
  331. hd->buf[hd->count++] = 0x80; /* pad */
  332. while (hd->count < 112)
  333. hd->buf[hd->count++] = 0; /* pad */
  334. }
  335. else
  336. { /* need one extra block */
  337. hd->buf[hd->count++] = 0x80; /* pad character */
  338. while (hd->count < 128)
  339. hd->buf[hd->count++] = 0;
  340. sha512_write (context, NULL, 0); /* flush */ ;
  341. memset (hd->buf, 0, 112); /* fill next block with zeroes */
  342. }
  343. /* append the 128 bit count */
  344. hd->buf[112] = msb >> 56;
  345. hd->buf[113] = msb >> 48;
  346. hd->buf[114] = msb >> 40;
  347. hd->buf[115] = msb >> 32;
  348. hd->buf[116] = msb >> 24;
  349. hd->buf[117] = msb >> 16;
  350. hd->buf[118] = msb >> 8;
  351. hd->buf[119] = msb;
  352. hd->buf[120] = lsb >> 56;
  353. hd->buf[121] = lsb >> 48;
  354. hd->buf[122] = lsb >> 40;
  355. hd->buf[123] = lsb >> 32;
  356. hd->buf[124] = lsb >> 24;
  357. hd->buf[125] = lsb >> 16;
  358. hd->buf[126] = lsb >> 8;
  359. hd->buf[127] = lsb;
  360. transform (hd, hd->buf);
  361. _gcry_burn_stack (768);
  362. p = hd->buf;
  363. #ifdef WORDS_BIGENDIAN
  364. #define X(a) do { *(u64*)p = hd->h##a ; p += 8; } while (0)
  365. #else /* little endian */
  366. #define X(a) do { *p++ = hd->h##a >> 56; *p++ = hd->h##a >> 48; \
  367. *p++ = hd->h##a >> 40; *p++ = hd->h##a >> 32; \
  368. *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16; \
  369. *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while (0)
  370. #endif
  371. X (0);
  372. X (1);
  373. X (2);
  374. X (3);
  375. X (4);
  376. X (5);
  377. /* Note that these last two chunks are included even for SHA384.
  378. We just ignore them. */
  379. X (6);
  380. X (7);
  381. #undef X
  382. }
  383. static byte *
  384. sha512_read (void *context)
  385. {
  386. SHA512_CONTEXT *hd = (SHA512_CONTEXT *) context;
  387. return hd->buf;
  388. }
  389. /*
  390. Self-test section.
  391. */
  392. static gpg_err_code_t
  393. selftests_sha384 (int extended, selftest_report_func_t report)
  394. {
  395. const char *what;
  396. const char *errtxt;
  397. what = "short string";
  398. errtxt = _gcry_hash_selftest_check_one
  399. (GCRY_MD_SHA384, 0,
  400. "abc", 3,
  401. "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b\xb5\xa0\x3d\x69\x9a\xc6\x50\x07"
  402. "\x27\x2c\x32\xab\x0e\xde\xd1\x63\x1a\x8b\x60\x5a\x43\xff\x5b\xed"
  403. "\x80\x86\x07\x2b\xa1\xe7\xcc\x23\x58\xba\xec\xa1\x34\xc8\x25\xa7", 48);
  404. if (errtxt)
  405. goto failed;
  406. if (extended)
  407. {
  408. what = "long string";
  409. errtxt = _gcry_hash_selftest_check_one
  410. (GCRY_MD_SHA384, 0,
  411. "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
  412. "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 112,
  413. "\x09\x33\x0C\x33\xF7\x11\x47\xE8\x3D\x19\x2F\xC7\x82\xCD\x1B\x47"
  414. "\x53\x11\x1B\x17\x3B\x3B\x05\xD2\x2F\xA0\x80\x86\xE3\xB0\xF7\x12"
  415. "\xFC\xC7\xC7\x1A\x55\x7E\x2D\xB9\x66\xC3\xE9\xFA\x91\x74\x60\x39",
  416. 48);
  417. if (errtxt)
  418. goto failed;
  419. what = "one million \"a\"";
  420. errtxt = _gcry_hash_selftest_check_one
  421. (GCRY_MD_SHA384, 1,
  422. NULL, 0,
  423. "\x9D\x0E\x18\x09\x71\x64\x74\xCB\x08\x6E\x83\x4E\x31\x0A\x4A\x1C"
  424. "\xED\x14\x9E\x9C\x00\xF2\x48\x52\x79\x72\xCE\xC5\x70\x4C\x2A\x5B"
  425. "\x07\xB8\xB3\xDC\x38\xEC\xC4\xEB\xAE\x97\xDD\xD8\x7F\x3D\x89\x85",
  426. 48);
  427. if (errtxt)
  428. goto failed;
  429. }
  430. return 0; /* Succeeded. */
  431. failed:
  432. if (report)
  433. report ("digest", GCRY_MD_SHA384, what, errtxt);
  434. return GPG_ERR_SELFTEST_FAILED;
  435. }
  436. static gpg_err_code_t
  437. selftests_sha512 (int extended, selftest_report_func_t report)
  438. {
  439. const char *what;
  440. const char *errtxt;
  441. what = "short string";
  442. errtxt = _gcry_hash_selftest_check_one
  443. (GCRY_MD_SHA512, 0,
  444. "abc", 3,
  445. "\xDD\xAF\x35\xA1\x93\x61\x7A\xBA\xCC\x41\x73\x49\xAE\x20\x41\x31"
  446. "\x12\xE6\xFA\x4E\x89\xA9\x7E\xA2\x0A\x9E\xEE\xE6\x4B\x55\xD3\x9A"
  447. "\x21\x92\x99\x2A\x27\x4F\xC1\xA8\x36\xBA\x3C\x23\xA3\xFE\xEB\xBD"
  448. "\x45\x4D\x44\x23\x64\x3C\xE8\x0E\x2A\x9A\xC9\x4F\xA5\x4C\xA4\x9F", 64);
  449. if (errtxt)
  450. goto failed;
  451. if (extended)
  452. {
  453. what = "long string";
  454. errtxt = _gcry_hash_selftest_check_one
  455. (GCRY_MD_SHA512, 0,
  456. "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
  457. "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 112,
  458. "\x8E\x95\x9B\x75\xDA\xE3\x13\xDA\x8C\xF4\xF7\x28\x14\xFC\x14\x3F"
  459. "\x8F\x77\x79\xC6\xEB\x9F\x7F\xA1\x72\x99\xAE\xAD\xB6\x88\x90\x18"
  460. "\x50\x1D\x28\x9E\x49\x00\xF7\xE4\x33\x1B\x99\xDE\xC4\xB5\x43\x3A"
  461. "\xC7\xD3\x29\xEE\xB6\xDD\x26\x54\x5E\x96\xE5\x5B\x87\x4B\xE9\x09",
  462. 64);
  463. if (errtxt)
  464. goto failed;
  465. what = "one million \"a\"";
  466. errtxt = _gcry_hash_selftest_check_one
  467. (GCRY_MD_SHA512, 1,
  468. NULL, 0,
  469. "\xE7\x18\x48\x3D\x0C\xE7\x69\x64\x4E\x2E\x42\xC7\xBC\x15\xB4\x63"
  470. "\x8E\x1F\x98\xB1\x3B\x20\x44\x28\x56\x32\xA8\x03\xAF\xA9\x73\xEB"
  471. "\xDE\x0F\xF2\x44\x87\x7E\xA6\x0A\x4C\xB0\x43\x2C\xE5\x77\xC3\x1B"
  472. "\xEB\x00\x9C\x5C\x2C\x49\xAA\x2E\x4E\xAD\xB2\x17\xAD\x8C\xC0\x9B",
  473. 64);
  474. if (errtxt)
  475. goto failed;
  476. }
  477. return 0; /* Succeeded. */
  478. failed:
  479. if (report)
  480. report ("digest", GCRY_MD_SHA512, what, errtxt);
  481. return GPG_ERR_SELFTEST_FAILED;
  482. }
  483. /* Run a full self-test for ALGO and return 0 on success. */
  484. static gpg_err_code_t
  485. run_selftests (int algo, int extended, selftest_report_func_t report)
  486. {
  487. gpg_err_code_t ec;
  488. switch (algo)
  489. {
  490. case GCRY_MD_SHA384:
  491. ec = selftests_sha384 (extended, report);
  492. break;
  493. case GCRY_MD_SHA512:
  494. ec = selftests_sha512 (extended, report);
  495. break;
  496. default:
  497. ec = GPG_ERR_DIGEST_ALGO;
  498. break;
  499. }
  500. return ec;
  501. }
  502. static byte sha512_asn[] = /* Object ID is 2.16.840.1.101.3.4.2.3 */
  503. {
  504. 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
  505. 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05,
  506. 0x00, 0x04, 0x40
  507. };
  508. static gcry_md_oid_spec_t oid_spec_sha512[] =
  509. {
  510. { "2.16.840.1.101.3.4.2.3" },
  511. /* PKCS#1 sha512WithRSAEncryption */
  512. { "1.2.840.113549.1.1.13" },
  513. { NULL }
  514. };
  515. gcry_md_spec_t _gcry_digest_spec_sha512 =
  516. {
  517. "SHA512", sha512_asn, DIM (sha512_asn), oid_spec_sha512, 64,
  518. sha512_init, sha512_write, sha512_final, sha512_read,
  519. sizeof (SHA512_CONTEXT),
  520. };
  521. md_extra_spec_t _gcry_digest_extraspec_sha512 =
  522. {
  523. run_selftests
  524. };
  525. static byte sha384_asn[] = /* Object ID is 2.16.840.1.101.3.4.2.2 */
  526. {
  527. 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
  528. 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05,
  529. 0x00, 0x04, 0x30
  530. };
  531. static gcry_md_oid_spec_t oid_spec_sha384[] =
  532. {
  533. { "2.16.840.1.101.3.4.2.2" },
  534. /* PKCS#1 sha384WithRSAEncryption */
  535. { "1.2.840.113549.1.1.12" },
  536. { NULL },
  537. };
  538. gcry_md_spec_t _gcry_digest_spec_sha384 =
  539. {
  540. "SHA384", sha384_asn, DIM (sha384_asn), oid_spec_sha384, 48,
  541. sha384_init, sha512_write, sha512_final, sha512_read,
  542. sizeof (SHA512_CONTEXT),
  543. };
  544. md_extra_spec_t _gcry_digest_extraspec_sha384 =
  545. {
  546. run_selftests
  547. };