Hex Artifact Content
Not logged in

Artifact 50c09fd2dc3936c143ca3b6564eb50f44999a49a:


0000: 2f 2a 20 74 65 73 74 5f 68 61 73 68 65 73 2e 63  /* test_hashes.c
0010: 20 2d 20 75 6e 69 74 20 74 65 73 74 73 20 61 6e   - unit tests an
0020: 64 20 62 65 6e 63 68 6d 61 72 6b 20 66 6f 72 20  d benchmark for 
0030: 4c 69 62 52 48 61 73 68 20 61 6c 67 6f 72 69 74  LibRHash algorit
0040: 68 6d 73 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69  hms. *. * Copyri
0050: 67 68 74 3a 20 32 30 30 38 2d 32 30 31 32 20 41  ght: 2008-2012 A
0060: 6c 65 6b 73 65 79 20 4b 72 61 76 63 68 65 6e 6b  leksey Kravchenk
0070: 6f 20 3c 72 68 61 73 68 2e 61 64 6d 69 6e 40 67  o <rhash.admin@g
0080: 6d 61 69 6c 2e 63 6f 6d 3e 0a 20 2a 0a 20 2a 20  mail.com>. *. * 
0090: 50 65 72 6d 69 73 73 69 6f 6e 20 69 73 20 68 65  Permission is he
00a0: 72 65 62 79 20 67 72 61 6e 74 65 64 2c 20 20 66  reby granted,  f
00b0: 72 65 65 20 6f 66 20 63 68 61 72 67 65 2c 20 20  ree of charge,  
00c0: 74 6f 20 61 6e 79 20 70 65 72 73 6f 6e 20 20 6f  to any person  o
00d0: 62 74 61 69 6e 69 6e 67 20 61 0a 20 2a 20 63 6f  btaining a. * co
00e0: 70 79 20 6f 66 20 74 68 69 73 20 73 6f 66 74 77  py of this softw
00f0: 61 72 65 20 61 6e 64 20 61 73 73 6f 63 69 61 74  are and associat
0100: 65 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ed documentation
0110: 20 66 69 6c 65 73 20 28 74 68 65 20 22 53 6f 66   files (the "Sof
0120: 74 77 61 72 65 22 29 2c 0a 20 2a 20 74 6f 20 64  tware"),. * to d
0130: 65 61 6c 20 69 6e 20 74 68 65 20 53 6f 66 74 77  eal in the Softw
0140: 61 72 65 20 77 69 74 68 6f 75 74 20 72 65 73 74  are without rest
0150: 72 69 63 74 69 6f 6e 2c 20 20 69 6e 63 6c 75 64  riction,  includ
0160: 69 6e 67 20 77 69 74 68 6f 75 74 20 6c 69 6d 69  ing without limi
0170: 74 61 74 69 6f 6e 0a 20 2a 20 74 68 65 20 72 69  tation. * the ri
0180: 67 68 74 73 20 74 6f 20 20 75 73 65 2c 20 63 6f  ghts to  use, co
0190: 70 79 2c 20 6d 6f 64 69 66 79 2c 20 20 6d 65 72  py, modify,  mer
01a0: 67 65 2c 20 70 75 62 6c 69 73 68 2c 20 64 69 73  ge, publish, dis
01b0: 74 72 69 62 75 74 65 2c 20 73 75 62 6c 69 63 65  tribute, sublice
01c0: 6e 73 65 2c 0a 20 2a 20 61 6e 64 2f 6f 72 20 73  nse,. * and/or s
01d0: 65 6c 6c 20 63 6f 70 69 65 73 20 20 6f 66 20 20  ell copies  of  
01e0: 74 68 65 20 53 6f 66 74 77 61 72 65 2c 20 20 61  the Software,  a
01f0: 6e 64 20 74 6f 20 70 65 72 6d 69 74 20 20 70 65  nd to permit  pe
0200: 72 73 6f 6e 73 20 20 74 6f 20 77 68 6f 6d 20 74  rsons  to whom t
0210: 68 65 0a 20 2a 20 53 6f 66 74 77 61 72 65 20 69  he. * Software i
0220: 73 20 66 75 72 6e 69 73 68 65 64 20 74 6f 20 64  s furnished to d
0230: 6f 20 73 6f 2e 0a 20 2a 0a 20 2a 20 54 68 69 73  o so.. *. * This
0240: 20 70 72 6f 67 72 61 6d 20 20 69 73 20 20 64 69   program  is  di
0250: 73 74 72 69 62 75 74 65 64 20 20 69 6e 20 20 74  stributed  in  t
0260: 68 65 20 20 68 6f 70 65 20 20 74 68 61 74 20 69  he  hope  that i
0270: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c  t will be useful
0280: 2c 20 20 62 75 74 0a 20 2a 20 57 49 54 48 4f 55  ,  but. * WITHOU
0290: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
02a0: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
02b0: 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74   implied warrant
02c0: 79 20 6f 66 20 4d 45 52 43 48 41 4e 54 41 42 49  y of MERCHANTABI
02d0: 4c 49 54 59 0a 20 2a 20 6f 72 20 46 49 54 4e 45  LITY. * or FITNE
02e0: 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 55  SS FOR A PARTICU
02f0: 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 55 73  LAR PURPOSE.  Us
0300: 65 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 20  e this program  
0310: 61 74 20 20 79 6f 75 72 20 6f 77 6e 20 72 69 73  at  your own ris
0320: 6b 21 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  k!. */..#include
0330: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63   <unistd.h>.#inc
0340: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0350: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e  include <stdarg.
0360: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
0370: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0380: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
0390: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23  ude <ctype.h>..#
03a0: 69 6e 63 6c 75 64 65 20 22 62 79 74 65 5f 6f 72  include "byte_or
03b0: 64 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  der.h".#include 
03c0: 22 72 68 61 73 68 5f 74 69 6d 69 6e 67 2e 68 22  "rhash_timing.h"
03d0: 0a 23 69 6e 63 6c 75 64 65 20 22 72 68 61 73 68  .#include "rhash
03e0: 5f 74 6f 72 72 65 6e 74 2e 68 22 0a 0a 23 69 66  _torrent.h"..#if
03f0: 64 65 66 20 55 53 45 5f 52 48 41 53 48 5f 44 4c  def USE_RHASH_DL
0400: 4c 0a 23 20 64 65 66 69 6e 65 20 52 48 41 53 48  L.# define RHASH
0410: 5f 41 50 49 20 5f 5f 64 65 63 6c 73 70 65 63 28  _API __declspec(
0420: 64 6c 6c 69 6d 70 6f 72 74 29 0a 23 65 6e 64 69  dllimport).#endi
0430: 66 0a 23 69 6e 63 6c 75 64 65 20 22 72 68 61 73  f.#include "rhas
0440: 68 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74  h.h".#include "t
0450: 65 73 74 5f 68 61 73 68 65 73 2e 68 22 0a 0a 2f  est_hashes.h"../
0460: 2a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  *===============
0470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
04a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 2a 0a 20 2a 20 20  ==========*. *  
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 54 65 73 74              Test
04d0: 20 76 65 63 74 6f 72 73 20 20 20 20 20 20 20 20   vectors        
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04f0: 20 20 20 20 20 20 20 2a 0a 20 2a 3d 3d 3d 3d 3d         *. *=====
0500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0540: 3d 3d 3d 3d 2a 2f 0a 0a 20 2f 2a 20 76 65 72 69  ====*/.. /* veri
0550: 66 69 65 64 20 62 79 20 63 6b 73 66 76 20 2a 2f  fied by cksfv */
0560: 0a 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 72  . const char* cr
0570: 63 33 32 5f 74 65 73 74 73 5b 5d 20 3d 20 7b 0a  c32_tests[] = {.
0580: 09 22 22 2c 20 22 30 30 30 30 30 30 30 30 22 2c  ."", "00000000",
0590: 0a 09 22 61 22 2c 20 22 45 38 42 37 42 45 34 33  .."a", "E8B7BE43
05a0: 22 2c 0a 09 22 61 62 63 22 2c 20 22 33 35 32 34  ",.."abc", "3524
05b0: 34 31 43 32 22 2c 0a 09 22 6d 65 73 73 61 67 65  41C2",.."message
05c0: 20 64 69 67 65 73 74 22 2c 20 22 32 30 31 35 39   digest", "20159
05d0: 44 37 46 22 2c 0a 09 22 61 62 63 64 65 66 67 68  D7F",.."abcdefgh
05e0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
05f0: 79 7a 22 2c 20 22 34 43 32 37 35 30 42 44 22 2c  yz", "4C2750BD",
0600: 0a 09 22 54 68 65 20 71 75 69 63 6b 20 62 72 6f  .."The quick bro
0610: 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65  wn fox jumps ove
0620: 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 22 2c  r the lazy dog",
0630: 20 22 34 31 34 46 41 33 33 39 22 2c 0a 09 22 41   "414FA339",.."A
0640: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
0650: 52 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67  RSTUVWXYZabcdefg
0660: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
0670: 78 79 7a 30 31 32 33 34 35 36 37 38 39 22 2c 20  xyz0123456789", 
0680: 22 31 46 43 32 45 36 44 32 22 2c 0a 09 22 31 32  "1FC2E6D2",.."12
0690: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
06a0: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
06b0: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
06c0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
06d0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 22 2c  78901234567890",
06e0: 20 22 37 43 41 39 34 41 37 32 22 2c 0a 09 30 0a   "7CA94A72",..0.
06f0: 7d 3b 0a 0a 63 6f 6e 73 74 20 63 68 61 72 2a 20  };..const char* 
0700: 6d 64 34 5f 74 65 73 74 73 5b 5d 20 3d 20 7b 0a  md4_tests[] = {.
0710: 09 22 22 2c 20 22 33 31 44 36 43 46 45 30 44 31  ."", "31D6CFE0D1
0720: 36 41 45 39 33 31 42 37 33 43 35 39 44 37 45 30  6AE931B73C59D7E0
0730: 43 30 38 39 43 30 22 2c 0a 09 22 61 22 2c 20 22  C089C0",.."a", "
0740: 42 44 45 35 32 43 42 33 31 44 45 33 33 45 34 36  BDE52CB31DE33E46
0750: 32 34 35 45 30 35 46 42 44 42 44 36 46 42 32 34  245E05FBDBD6FB24
0760: 22 2c 0a 09 22 61 62 63 22 2c 20 22 41 34 34 38  ",.."abc", "A448
0770: 30 31 37 41 41 46 32 31 44 38 35 32 35 46 43 31  017AAF21D8525FC1
0780: 30 41 45 38 37 41 41 36 37 32 39 44 22 2c 0a 09  0AE87AA6729D",..
0790: 22 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 22  "message digest"
07a0: 2c 20 22 44 39 31 33 30 41 38 31 36 34 35 34 39  , "D9130A8164549
07b0: 46 45 38 31 38 38 37 34 38 30 36 45 31 43 37 30  FE818874806E1C70
07c0: 31 34 42 22 2c 0a 09 22 61 62 63 64 65 66 67 68  14B",.."abcdefgh
07d0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
07e0: 79 7a 22 2c 20 22 44 37 39 45 31 43 33 30 38 41  yz", "D79E1C308A
07f0: 41 35 42 42 43 44 45 45 41 38 45 44 36 33 44 46  A5BBCDEEA8ED63DF
0800: 34 31 32 44 41 39 22 2c 0a 09 22 54 68 65 20 71  412DA9",.."The q
0810: 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20 6a  uick brown fox j
0820: 75 6d 70 73 20 6f 76 65 72 20 74 68 65 20 6c 61  umps over the la
0830: 7a 79 20 64 6f 67 22 2c 20 22 31 42 45 45 36 39  zy dog", "1BEE69
0840: 41 34 36 42 41 38 31 31 31 38 35 43 31 39 34 37  A46BA811185C1947
0850: 36 32 41 42 41 45 41 45 39 30 22 2c 0a 09 22 41  62ABAEAE90",.."A
0860: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
0870: 52 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67  RSTUVWXYZabcdefg
0880: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
0890: 78 79 7a 30 31 32 33 34 35 36 37 38 39 22 2c 20  xyz0123456789", 
08a0: 22 30 34 33 46 38 35 38 32 46 32 34 31 44 42 33  "043F8582F241DB3
08b0: 35 31 43 45 36 32 37 45 31 35 33 45 37 46 30 45  51CE627E153E7F0E
08c0: 34 22 2c 0a 09 22 31 32 33 34 35 36 37 38 39 30  4",.."1234567890
08d0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
08e0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
08f0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
0900: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
0910: 35 36 37 38 39 30 22 2c 20 22 45 33 33 42 34 44  567890", "E33B4D
0920: 44 43 39 43 33 38 46 32 31 39 39 43 33 45 37 42  DC9C38F2199C3E7B
0930: 31 36 34 46 43 43 30 35 33 36 22 2c 0a 09 30 0a  164FCC0536",..0.
0940: 7d 3b 0a 0a 2f 2a 20 66 6f 72 20 73 68 6f 72 74  };../* for short
0950: 20 6d 65 73 73 61 67 65 73 20 65 64 32 6b 20 74   messages ed2k t
0960: 65 73 74 20 76 65 63 74 6f 72 73 20 63 6f 69 6e  est vectors coin
0970: 63 69 64 65 20 77 69 74 68 20 6d 64 34 20 2a 2f  cide with md4 */
0980: 0a 23 64 65 66 69 6e 65 20 65 64 32 6b 5f 74 65  .#define ed2k_te
0990: 73 74 73 20 6d 64 34 5f 74 65 73 74 73 0a 0a 2f  sts md4_tests../
09a0: 2a 20 74 65 73 74 20 76 65 63 74 6f 72 73 20 66  * test vectors f
09b0: 72 6f 6d 20 73 70 65 63 20 2a 2f 0a 63 6f 6e 73  rom spec */.cons
09c0: 74 20 63 68 61 72 2a 20 6d 64 35 5f 74 65 73 74  t char* md5_test
09d0: 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20 22 44 34  s[] = {.."", "D4
09e0: 31 44 38 43 44 39 38 46 30 30 42 32 30 34 45 39  1D8CD98F00B204E9
09f0: 38 30 30 39 39 38 45 43 46 38 34 32 37 45 22 2c  800998ECF8427E",
0a00: 0a 09 22 61 22 2c 20 22 30 43 43 31 37 35 42 39  .."a", "0CC175B9
0a10: 43 30 46 31 42 36 41 38 33 31 43 33 39 39 45 32  C0F1B6A831C399E2
0a20: 36 39 37 37 32 36 36 31 22 2c 0a 09 22 61 62 63  69772661",.."abc
0a30: 22 2c 20 22 39 30 30 31 35 30 39 38 33 43 44 32  ", "900150983CD2
0a40: 34 46 42 30 44 36 39 36 33 46 37 44 32 38 45 31  4FB0D6963F7D28E1
0a50: 37 46 37 32 22 2c 0a 09 22 6d 65 73 73 61 67 65  7F72",.."message
0a60: 20 64 69 67 65 73 74 22 2c 20 22 46 39 36 42 36   digest", "F96B6
0a70: 39 37 44 37 43 42 37 39 33 38 44 35 32 35 41 32  97D7CB7938D525A2
0a80: 46 33 31 41 41 46 31 36 31 44 30 22 2c 0a 09 22  F31AAF161D0",.."
0a90: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
0aa0: 71 72 73 74 75 76 77 78 79 7a 22 2c 20 22 43 33  qrstuvwxyz", "C3
0ab0: 46 43 44 33 44 37 36 31 39 32 45 34 30 30 37 44  FCD3D76192E4007D
0ac0: 46 42 34 39 36 43 43 41 36 37 45 31 33 42 22 2c  FB496CCA67E13B",
0ad0: 0a 09 22 54 68 65 20 71 75 69 63 6b 20 62 72 6f  .."The quick bro
0ae0: 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65  wn fox jumps ove
0af0: 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 22 2c  r the lazy dog",
0b00: 20 22 39 45 31 30 37 44 39 44 33 37 32 42 42 36   "9E107D9D372BB6
0b10: 38 32 36 42 44 38 31 44 33 35 34 32 41 34 31 39  826BD81D3542A419
0b20: 44 36 22 2c 0a 09 22 41 42 43 44 45 46 47 48 49  D6",.."ABCDEFGHI
0b30: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
0b40: 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  Zabcdefghijklmno
0b50: 70 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34  pqrstuvwxyz01234
0b60: 35 36 37 38 39 22 2c 20 22 44 31 37 34 41 42 39  56789", "D174AB9
0b70: 38 44 32 37 37 44 39 46 35 41 35 36 31 31 43 32  8D277D9F5A5611C2
0b80: 43 39 46 34 31 39 44 39 46 22 2c 0a 09 22 31 32  C9F419D9F",.."12
0b90: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
0ba0: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
0bb0: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
0bc0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
0bd0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 22 2c  78901234567890",
0be0: 20 22 35 37 45 44 46 34 41 32 32 42 45 33 43 39   "57EDF4A22BE3C9
0bf0: 35 35 41 43 34 39 44 41 32 45 32 31 30 37 42 36  55AC49DA2E2107B6
0c00: 37 41 22 2c 0a 09 30 0a 7d 3b 0a 0a 2f 2a 20 74  7A",..0.};../* t
0c10: 65 73 74 20 76 65 63 74 6f 72 73 20 66 72 6f 6d  est vectors from
0c20: 20 73 70 65 63 20 2a 2f 0a 63 6f 6e 73 74 20 63   spec */.const c
0c30: 68 61 72 2a 20 73 68 61 31 5f 74 65 73 74 73 5b  har* sha1_tests[
0c40: 5d 20 3d 20 7b 0a 09 22 22 2c 20 22 44 41 33 39  ] = {.."", "DA39
0c50: 41 33 45 45 35 45 36 42 34 42 30 44 33 32 35 35  A3EE5E6B4B0D3255
0c60: 42 46 45 46 39 35 36 30 31 38 39 30 41 46 44 38  BFEF95601890AFD8
0c70: 30 37 30 39 22 2c 0a 09 22 61 22 2c 20 22 38 36  0709",.."a", "86
0c80: 46 37 45 34 33 37 46 41 41 35 41 37 46 43 45 31  F7E437FAA5A7FCE1
0c90: 35 44 31 44 44 43 42 39 45 41 45 41 45 41 33 37  5D1DDCB9EAEAEA37
0ca0: 37 36 36 37 42 38 22 2c 0a 09 22 61 62 63 22 2c  7667B8",.."abc",
0cb0: 20 22 41 39 39 39 33 45 33 36 34 37 30 36 38 31   "A9993E36470681
0cc0: 36 41 42 41 33 45 32 35 37 31 37 38 35 30 43 32  6ABA3E25717850C2
0cd0: 36 43 39 43 44 30 44 38 39 44 22 2c 0a 09 22 6d  6C9CD0D89D",.."m
0ce0: 65 73 73 61 67 65 20 64 69 67 65 73 74 22 2c 20  essage digest", 
0cf0: 22 43 31 32 32 35 32 43 45 44 41 38 42 45 38 39  "C12252CEDA8BE89
0d00: 39 34 44 35 46 41 30 32 39 30 41 34 37 32 33 31  94D5FA0290A47231
0d10: 43 31 44 31 36 41 41 45 33 22 2c 0a 09 22 54 68  C1D16AAE3",.."Th
0d20: 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f  e quick brown fo
0d30: 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65  x jumps over the
0d40: 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22 32 46 44   lazy dog", "2FD
0d50: 34 45 31 43 36 37 41 32 44 32 38 46 43 45 44 38  4E1C67A2D28FCED8
0d60: 34 39 45 45 31 42 42 37 36 45 37 33 39 31 42 39  49EE1BB76E7391B9
0d70: 33 45 42 31 32 22 2c 0a 09 22 41 42 43 44 45 46  3EB12",.."ABCDEF
0d80: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
0d90: 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c  WXYZabcdefghijkl
0da0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31  mnopqrstuvwxyz01
0db0: 32 33 34 35 36 37 38 39 22 2c 20 22 37 36 31 43  23456789", "761C
0dc0: 34 35 37 42 46 37 33 42 31 34 44 32 37 45 39 45  457BF73B14D27E9E
0dd0: 39 32 36 35 43 34 36 46 34 42 34 44 44 41 31 31  9265C46F4B4DDA11
0de0: 46 39 34 30 22 2c 0a 09 22 31 32 33 34 35 36 37  F940",.."1234567
0df0: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
0e00: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
0e10: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
0e20: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
0e30: 32 33 34 35 36 37 38 39 30 22 2c 20 22 35 30 41  234567890", "50A
0e40: 42 46 35 37 30 36 41 31 35 30 39 39 30 41 30 38  BF5706A150990A08
0e50: 42 32 43 35 45 41 34 30 46 41 30 45 35 38 35 35  B2C5EA40FA0E5855
0e60: 35 34 37 33 32 22 2c 0a 09 30 0a 7d 3b 0a 0a 2f  54732",..0.};../
0e70: 2a 20 74 65 73 74 73 20 66 72 6f 6d 20 73 70 65  * tests from spe
0e80: 63 20 61 6e 64 20 4e 45 53 53 49 45 20 74 65 73  c and NESSIE tes
0e90: 74 20 76 65 63 74 6f 72 73 20 2a 2f 0a 63 6f 6e  t vectors */.con
0ea0: 73 74 20 63 68 61 72 2a 20 74 69 67 65 72 5f 68  st char* tiger_h
0eb0: 61 73 68 65 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c  ashes[] = {.."",
0ec0: 20 22 33 32 39 33 41 43 36 33 30 43 31 33 46 30   "3293AC630C13F0
0ed0: 32 34 35 46 39 32 42 42 42 31 37 36 36 45 31 36  245F92BBB1766E16
0ee0: 31 36 37 41 34 45 35 38 34 39 32 44 44 45 37 33  167A4E58492DDE73
0ef0: 46 33 22 2c 0a 09 22 61 22 2c 20 22 37 37 42 45  F3",.."a", "77BE
0f00: 46 42 45 46 32 45 37 45 46 38 41 42 32 45 43 38  FBEF2E7EF8AB2EC8
0f10: 46 39 33 42 46 35 38 37 41 37 46 43 36 31 33 45  F93BF587A7FC613E
0f20: 32 34 37 46 35 46 32 34 37 38 30 39 22 2c 0a 09  247F5F247809",..
0f30: 22 61 62 63 22 2c 20 22 32 41 41 42 31 34 38 34  "abc", "2AAB1484
0f40: 45 38 43 31 35 38 46 32 42 46 42 38 43 35 46 46  E8C158F2BFB8C5FF
0f50: 34 31 42 35 37 41 35 32 35 31 32 39 31 33 31 43  41B57A525129131C
0f60: 39 35 37 42 35 46 39 33 22 2c 0a 09 22 54 69 67  957B5F93",.."Tig
0f70: 65 72 22 2c 20 22 44 44 30 30 32 33 30 37 39 39  er", "DD00230799
0f80: 46 35 30 30 39 46 45 43 36 44 45 42 43 38 33 38  F5009FEC6DEBC838
0f90: 42 42 36 41 32 37 44 46 32 42 39 44 36 46 31 31  BB6A27DF2B9D6F11
0fa0: 30 43 37 39 33 37 22 2c 0a 09 22 54 68 65 20 71  0C7937",.."The q
0fb0: 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20 6a  uick brown fox j
0fc0: 75 6d 70 73 20 6f 76 65 72 20 74 68 65 20 6c 61  umps over the la
0fd0: 7a 79 20 64 6f 67 22 2c 20 22 36 44 31 32 41 34  zy dog", "6D12A4
0fe0: 31 45 37 32 45 36 34 34 46 30 31 37 42 36 46 30  1E72E644F017B6F0
0ff0: 45 32 46 37 42 34 34 43 36 32 38 35 46 30 36 44  E2F7B44C6285F06D
1000: 44 35 44 32 43 35 42 30 37 35 22 2c 0a 09 22 41  D5D2C5B075",.."A
1010: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
1020: 52 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67  RSTUVWXYZabcdefg
1030: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
1040: 78 79 7a 30 31 32 33 34 35 36 37 38 39 2b 2d 22  xyz0123456789+-"
1050: 2c 20 22 46 37 31 43 38 35 38 33 39 30 32 41 46  , "F71C8583902AF
1060: 42 38 37 39 45 44 46 45 36 31 30 46 38 32 43 30  B879EDFE610F82C0
1070: 44 34 37 38 36 41 33 41 35 33 34 35 30 34 34 38  D4786A3A53450448
1080: 36 42 35 22 2c 0a 09 22 41 42 43 44 45 46 47 48  6B5",.."ABCDEFGH
1090: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
10a0: 59 5a 3d 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  YZ=abcdefghijklm
10b0: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 2b 30 31  nopqrstuvwxyz+01
10c0: 32 33 34 35 36 37 38 39 22 2c 20 22 34 38 43 45  23456789", "48CE
10d0: 45 42 36 33 30 38 42 38 37 44 34 36 45 39 35 44  EB6308B87D46E95D
10e0: 36 35 36 31 31 32 43 44 46 31 38 44 39 37 39 31  656112CDF18D9791
10f0: 35 46 39 37 36 35 36 35 38 39 35 37 22 2c 0a 09  5F9765658957",..
1100: 22 54 69 67 65 72 20 2d 20 41 20 46 61 73 74 20  "Tiger - A Fast 
1110: 4e 65 77 20 48 61 73 68 20 46 75 6e 63 74 69 6f  New Hash Functio
1120: 6e 2c 20 62 79 20 52 6f 73 73 20 41 6e 64 65 72  n, by Ross Ander
1130: 73 6f 6e 20 61 6e 64 20 45 6c 69 20 42 69 68 61  son and Eli Biha
1140: 6d 22 2c 20 22 38 41 38 36 36 38 32 39 30 34 30  m", "8A866829040
1150: 41 34 31 30 43 37 32 39 41 44 32 33 46 35 41 44  A410C729AD23F5AD
1160: 41 37 31 31 36 30 33 42 33 43 44 44 33 35 37 45  A711603B3CDD357E
1170: 34 43 31 35 45 22 2c 0a 09 22 54 69 67 65 72 20  4C15E",.."Tiger 
1180: 2d 20 41 20 46 61 73 74 20 4e 65 77 20 48 61 73  - A Fast New Has
1190: 68 20 46 75 6e 63 74 69 6f 6e 2c 20 62 79 20 52  h Function, by R
11a0: 6f 73 73 20 41 6e 64 65 72 73 6f 6e 20 61 6e 64  oss Anderson and
11b0: 20 45 6c 69 20 42 69 68 61 6d 2c 20 70 72 6f 63   Eli Biham, proc
11c0: 65 65 64 69 6e 67 73 20 6f 66 20 46 61 73 74 20  eedings of Fast 
11d0: 53 6f 66 74 77 61 72 65 20 45 6e 63 72 79 70 74  Software Encrypt
11e0: 69 6f 6e 20 33 2c 20 43 61 6d 62 72 69 64 67 65  ion 3, Cambridge
11f0: 2e 22 2c 20 22 43 45 35 35 41 36 41 46 44 35 39  .", "CE55A6AFD59
1200: 31 46 35 45 42 41 43 35 34 37 46 46 38 34 46 38  1F5EBAC547FF84F8
1210: 39 32 32 37 46 39 33 33 31 44 41 42 30 42 36 31  9227F9331DAB0B61
1220: 31 43 38 38 39 22 2c 0a 09 22 41 42 43 44 45 46  1C889",.."ABCDEF
1230: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
1240: 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c  WXYZabcdefghijkl
1250: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31  mnopqrstuvwxyz01
1260: 32 33 34 35 36 37 38 39 2b 2d 41 42 43 44 45 46  23456789+-ABCDEF
1270: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
1280: 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c  WXYZabcdefghijkl
1290: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31  mnopqrstuvwxyz01
12a0: 32 33 34 35 36 37 38 39 2b 2d 22 2c 20 22 43 35  23456789+-", "C5
12b0: 34 30 33 34 45 35 42 34 33 45 42 38 30 30 35 38  4034E5B43EB80058
12c0: 34 38 41 37 45 30 41 45 36 41 41 43 37 36 45 34  48A7E0AE6AAC76E4
12d0: 46 46 35 39 30 41 45 37 31 35 46 44 32 35 22 2c  FF590AE715FD25",
12e0: 0a 09 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  .."ABCDEFGHIJKLM
12f0: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62 63  NOPQRSTUVWXYZabc
1300: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
1310: 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37 38  tuvwxyz012345678
1320: 39 22 2c 20 22 38 44 43 45 41 36 38 30 41 31 37  9", "8DCEA680A17
1330: 35 38 33 45 45 35 30 32 42 41 33 38 41 33 43 33  583EE502BA38A3C3
1340: 36 38 36 35 31 38 39 30 46 46 42 43 43 44 43 34  68651890FFBCCDC4
1350: 39 41 38 43 43 22 2c 0a 0a 09 22 6d 65 73 73 61  9A8CC",..."messa
1360: 67 65 20 64 69 67 65 73 74 22 2c 20 22 44 39 38  ge digest", "D98
1370: 31 46 38 43 42 37 38 32 30 31 41 39 35 30 44 43  1F8CB78201A950DC
1380: 46 33 30 34 38 37 35 31 45 34 34 31 43 35 31 37  F3048751E441C517
1390: 46 43 41 31 41 41 35 35 41 32 39 46 36 22 2c 0a  FCA1AA55A29F6",.
13a0: 09 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  ."abcdefghijklmn
13b0: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 2c 20 22  opqrstuvwxyz", "
13c0: 31 37 31 34 41 34 37 32 45 45 45 35 37 44 33 30  1714A472EEE57D30
13d0: 30 34 30 34 31 32 42 46 43 43 35 35 30 33 32 41  040412BFCC55032A
13e0: 30 42 31 31 36 30 32 46 46 33 37 42 45 45 45 39  0B11602FF37BEEE9
13f0: 22 2c 0a 09 22 61 62 63 64 62 63 64 65 63 64 65  ",.."abcdbcdecde
1400: 66 64 65 66 67 65 66 67 68 66 67 68 69 67 68 69  fdefgefghfghighi
1410: 6a 68 69 6a 6b 69 6a 6b 6c 6a 6b 6c 6d 6b 6c 6d  jhijkijkljklmklm
1420: 6e 6c 6d 6e 6f 6d 6e 6f 70 6e 6f 70 71 22 2c 20  nlmnomnopnopq", 
1430: 22 30 46 37 42 46 39 41 31 39 42 39 43 35 38 46  "0F7BF9A19B9C58F
1440: 32 42 37 36 31 30 44 46 37 45 38 34 46 30 41 43  2B7610DF7E84F0AC
1450: 33 41 37 31 43 36 33 31 45 37 42 35 33 46 37 38  3A71C631E7B53F78
1460: 45 22 2c 0a 09 22 41 42 43 44 45 46 47 48 49 4a  E",.."ABCDEFGHIJ
1470: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
1480: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
1490: 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35  qrstuvwxyz012345
14a0: 36 37 38 39 22 2c 20 22 38 44 43 45 41 36 38 30  6789", "8DCEA680
14b0: 41 31 37 35 38 33 45 45 35 30 32 42 41 33 38 41  A17583EE502BA38A
14c0: 33 43 33 36 38 36 35 31 38 39 30 46 46 42 43 43  3C368651890FFBCC
14d0: 44 43 34 39 41 38 43 43 22 2c 0a 09 22 31 32 33  DC49A8CC",.."123
14e0: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
14f0: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
1500: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
1510: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
1520: 38 39 30 31 32 33 34 35 36 37 38 39 30 22 2c 20  8901234567890", 
1530: 22 31 43 31 34 37 39 35 35 32 39 46 44 39 46 32  "1C14795529FD9F2
1540: 30 37 41 39 35 38 46 38 34 43 35 32 46 31 31 45  07A958F84C52F11E
1550: 38 38 37 46 41 30 43 41 42 44 46 44 39 31 42 46  887FA0CABDFD91BF
1560: 44 22 2c 0a 09 30 0a 7d 3b 0a 0a 2f 2a 20 76 65  D",..0.};../* ve
1570: 72 69 66 69 65 64 20 62 79 20 73 74 72 6f 6e 67  rified by strong
1580: 20 64 63 2b 2b 20 2a 2f 0a 63 6f 6e 73 74 20 63   dc++ */.const c
1590: 68 61 72 2a 20 74 74 68 5f 74 65 73 74 73 5b 5d  har* tth_tests[]
15a0: 20 3d 20 7b 0a 09 22 22 2c 20 22 4c 57 50 4e 41   = {.."", "LWPNA
15b0: 43 51 44 42 5a 52 59 58 57 33 56 48 4a 56 43 4a  CQDBZRYXW3VHJVCJ
15c0: 36 34 51 42 5a 4e 47 48 4f 48 48 48 5a 57 43 4c  64QBZNGHOHHHZWCL
15d0: 4e 51 22 2c 0a 09 22 61 22 2c 20 22 43 5a 51 55  NQ",.."a", "CZQU
15e0: 57 48 33 49 59 58 42 46 35 4c 33 42 47 59 55 47  WH3IYXBF5L3BGYUG
15f0: 5a 48 41 53 53 4d 58 55 36 34 37 49 50 32 49 4b  ZHASSMXU647IP2IK
1600: 45 34 59 22 2c 0a 09 22 61 62 63 22 2c 20 22 41  E4Y",.."abc", "A
1610: 53 44 34 55 4a 53 45 48 35 4d 34 37 50 44 59 42  SD4UJSEH5M47PDYB
1620: 34 36 4b 42 54 53 51 54 53 47 44 4b 4c 42 48 59  46KBTSQTSGDKLBHY
1630: 58 4f 4d 55 49 41 22 2c 0a 09 22 6d 65 73 73 61  XOMUIA",.."messa
1640: 67 65 20 64 69 67 65 73 74 22 2c 20 22 59 4d 34  ge digest", "YM4
1650: 33 32 4d 53 4f 58 35 51 49 4c 49 48 32 4c 34 54  32MSOX5QILIH2L4T
1660: 4e 4f 36 32 45 33 4f 33 35 57 59 47 57 53 42 53  NO62E3O35WYGWSBS
1670: 4a 4f 42 41 22 2c 0a 09 22 61 62 63 64 65 66 67  JOBA",.."abcdefg
1680: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
1690: 78 79 7a 22 2c 20 22 4c 4d 48 4e 41 32 56 59 4f  xyz", "LMHNA2VYO
16a0: 34 36 35 50 32 52 44 4f 47 54 52 32 43 4c 36 58  465P2RDOGTR2CL6X
16b0: 4b 48 5a 4e 49 32 58 34 43 43 55 59 35 59 22 2c  KHZNI2X4CCUY5Y",
16c0: 0a 09 22 54 68 65 20 71 75 69 63 6b 20 62 72 6f  .."The quick bro
16d0: 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65  wn fox jumps ove
16e0: 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 22 2c  r the lazy dog",
16f0: 20 22 57 4c 4d 32 4d 49 54 58 46 54 43 51 58 45   "WLM2MITXFTCQXE
1700: 4f 59 4f 33 4d 34 45 4c 35 41 50 45 53 33 35 33  OYO3M4EL5APES353
1710: 4e 51 4c 49 36 36 4f 52 59 22 2c 0a 09 22 41 42  NQLI66ORY",.."AB
1720: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
1730: 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68  STUVWXYZabcdefgh
1740: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
1750: 79 7a 30 31 32 33 34 35 36 37 38 39 22 2c 20 22  yz0123456789", "
1760: 54 46 37 34 45 4e 46 37 4d 46 32 57 50 44 45 33  TF74ENF7MF2WPDE3
1770: 35 4d 32 33 4e 52 53 56 4b 4a 49 52 4b 59 52 4d  5M23NRSVKJIRKYRM
1780: 54 4c 57 41 48 57 51 22 2c 0a 09 22 31 32 33 34  TLWAHWQ",.."1234
1790: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
17a0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
17b0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
17c0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
17d0: 39 30 31 32 33 34 35 36 37 38 39 30 22 2c 20 22  901234567890", "
17e0: 4e 42 4b 43 41 4e 51 32 4f 44 4e 54 53 56 34 43  NBKCANQ2ODNTSV4C
17f0: 37 59 4a 46 46 33 4a 52 41 56 37 4c 4b 54 46 49  7YJFF3JRAV7LKTFI
1800: 50 48 51 4e 42 4a 59 22 2c 0a 09 30 0a 7d 3b 0a  PHQNBJY",..0.};.
1810: 0a 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 69 63  .const char* aic
1820: 68 5f 74 65 73 74 73 5b 5d 20 3d 20 7b 0a 09 22  h_tests[] = {.."
1830: 22 2c 20 22 33 49 34 32 48 33 53 36 4e 4e 46 51  ", "3I42H3S6NNFQ
1840: 32 4d 53 56 58 37 58 5a 4b 59 41 59 53 43 58 35  2MSVX7XZKYAYSCX5
1850: 51 42 59 4a 22 2c 0a 09 22 61 22 2c 20 22 51 33  QBYJ",.."a", "Q3
1860: 33 36 49 4e 37 32 55 57 54 37 5a 59 4b 35 44 58  36IN72UWT7ZYK5DX
1870: 4f 4c 54 32 58 4b 35 49 33 58 4d 5a 35 59 22 2c  OLT2XK5I3XMZ5Y",
1880: 0a 09 22 61 62 63 22 2c 20 22 56 47 4d 54 34 4e  .."abc", "VGMT4N
1890: 53 48 41 32 41 57 56 4f 52 36 45 56 59 58 51 55  SHA2AWVOR6EVYXQU
18a0: 47 43 4e 53 4f 4e 42 57 45 35 22 2c 0a 09 22 6d  GCNSONBWE5",.."m
18b0: 65 73 73 61 67 65 20 64 69 67 65 73 74 22 2c 20  essage digest", 
18c0: 22 59 45 52 46 46 54 57 32 52 50 55 4a 53 54 4b  "YERFFTW2RPUJSTK
18d0: 37 55 41 55 51 55 52 5a 44 44 51 4f 52 4e 4b 58  7UAUQURZDDQORNKX
18e0: 44 22 2c 0a 09 22 61 62 63 64 65 66 67 68 69 6a  D",.."abcdefghij
18f0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
1900: 22 2c 20 22 47 4c 49 51 59 36 34 4d 37 46 53 58  ", "GLIQY64M7FSX
1910: 42 53 51 45 5a 59 33 37 46 49 4d 35 51 51 53 41  BSQEZY37FIM5QQSA
1920: 32 4f 55 4a 22 2c 0a 09 22 54 68 65 20 71 75 69  2OUJ",.."The qui
1930: 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20 6a 75 6d  ck brown fox jum
1940: 70 73 20 6f 76 65 72 20 74 68 65 20 6c 61 7a 79  ps over the lazy
1950: 20 64 6f 67 22 2c 20 22 46 37 4b 4f 44 52 54 32   dog", "F7KODRT2
1960: 46 55 55 50 5a 33 4d 45 54 33 51 33 57 35 58 48  FUUPZ3MET3Q3W5XH
1970: 48 45 4e 5a 48 32 59 53 22 2c 0a 09 22 41 42 43  HENZH2YS",.."ABC
1980: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1990: 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68 69  TUVWXYZabcdefghi
19a0: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
19b0: 7a 30 31 32 33 34 35 36 37 38 39 22 2c 20 22 4f  z0123456789", "O
19c0: 59 4f 45 4b 36 37 58 48 4d 4b 4e 45 37 55 36 53  YOEK67XHMKNE7U6S
19d0: 4a 53 34 49 33 32 4c 4a 58 4e 42 44 36 4b 41 22  JS4I32LJXNBD6KA"
19e0: 2c 0a 09 22 31 32 33 34 35 36 37 38 39 30 31 32  ,.."123456789012
19f0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
1a00: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
1a10: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
1a20: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
1a30: 37 38 39 30 22 2c 20 22 4b 43 56 37 4b 34 44 4b  7890", "KCV7K4DK
1a40: 43 55 45 5a 42 49 45 4c 46 52 50 4b 49 44 35 41  CUEZBIELFRPKID5A
1a50: 34 57 43 56 4b 52 5a 53 22 2c 0a 09 30 0a 7d 3b  4WCVKRZS",..0.};
1a60: 0a 0a 63 6f 6e 73 74 20 63 68 61 72 2a 20 77 68  ..const char* wh
1a70: 69 72 6c 70 6f 6f 6c 5f 74 65 73 74 73 5b 5d 20  irlpool_tests[] 
1a80: 3d 20 7b 0a 09 22 22 2c 20 22 31 39 46 41 36 31  = {.."", "19FA61
1a90: 44 37 35 35 32 32 41 34 36 36 39 42 34 34 45 33  D75522A4669B44E3
1aa0: 39 43 31 44 32 45 31 37 32 36 43 35 33 30 32 33  9C1D2E1726C53023
1ab0: 32 31 33 30 44 34 30 37 46 38 39 41 46 45 45 30  2130D407F89AFEE0
1ac0: 39 36 34 39 39 37 46 37 41 37 33 45 38 33 42 45  964997F7A73E83BE
1ad0: 36 39 38 42 32 38 38 46 45 42 43 46 38 38 45 33  698B288FEBCF88E3
1ae0: 45 30 33 43 34 46 30 37 35 37 45 41 38 39 36 34  E03C4F0757EA8964
1af0: 45 35 39 42 36 33 44 39 33 37 30 38 42 31 33 38  E59B63D93708B138
1b00: 43 43 34 32 41 36 36 45 42 33 22 2c 0a 09 22 61  CC42A66EB3",.."a
1b10: 22 2c 20 22 38 41 43 41 32 36 30 32 37 39 32 41  ", "8ACA2602792A
1b20: 45 43 36 46 31 31 41 36 37 32 30 36 35 33 31 46  EC6F11A67206531F
1b30: 42 37 44 37 46 30 44 46 46 35 39 34 31 33 31 34  B7D7F0DFF5941314
1b40: 35 45 36 39 37 33 43 34 35 30 30 31 44 30 30 38  5E6973C45001D008
1b50: 37 42 34 32 44 31 31 42 43 36 34 35 34 31 33 41  7B42D11BC645413A
1b60: 45 46 46 36 33 41 34 32 33 39 31 41 33 39 31 34  EFF63A42391A3914
1b70: 35 41 35 39 31 41 39 32 32 30 30 44 35 36 30 31  5A591A92200D5601
1b80: 39 35 45 35 33 42 34 37 38 35 38 34 46 44 41 45  95E53B478584FDAE
1b90: 32 33 31 41 22 2c 0a 09 22 61 62 63 22 2c 20 22  231A",.."abc", "
1ba0: 34 45 32 34 34 38 41 34 43 36 46 34 38 36 42 42  4E2448A4C6F486BB
1bb0: 31 36 42 36 35 36 32 43 37 33 42 34 30 32 30 42  16B6562C73B4020B
1bc0: 46 33 30 34 33 45 33 41 37 33 31 42 43 45 37 32  F3043E3A731BCE72
1bd0: 31 41 45 31 42 33 30 33 44 39 37 45 36 44 34 43  1AE1B303D97E6D4C
1be0: 37 31 38 31 45 45 42 44 42 36 43 35 37 45 32 37  7181EEBDB6C57E27
1bf0: 37 44 30 45 33 34 39 35 37 31 31 34 43 42 44 36  7D0E34957114CBD6
1c00: 43 37 39 37 46 43 39 44 39 35 44 38 42 35 38 32  C797FC9D95D8B582
1c10: 44 32 32 35 32 39 32 30 37 36 44 34 45 45 46 35  D225292076D4EEF5
1c20: 22 2c 0a 09 22 6d 65 73 73 61 67 65 20 64 69 67  ",.."message dig
1c30: 65 73 74 22 2c 20 22 33 37 38 43 38 34 41 34 31  est", "378C84A41
1c40: 32 36 45 32 44 43 36 45 35 36 44 43 43 37 34 35  26E2DC6E56DCC745
1c50: 38 33 37 37 41 41 43 38 33 38 44 30 30 30 33 32  8377AAC838D00032
1c60: 32 33 30 46 35 33 43 45 31 46 35 37 30 30 43 30  230F53CE1F5700C0
1c70: 46 46 42 34 44 33 42 38 34 32 31 35 35 37 36 35  FFB4D3B842155765
1c80: 39 45 46 35 35 43 31 30 36 42 34 42 35 32 41 43  9EF55C106B4B52AC
1c90: 35 41 34 41 41 41 36 39 32 45 44 39 32 30 30 35  5A4AAA692ED92005
1ca0: 32 38 33 38 46 33 33 36 32 45 38 36 44 42 44 33  2838F3362E86DBD3
1cb0: 37 41 38 39 30 33 45 22 2c 0a 09 22 61 62 63 64  7A8903E",.."abcd
1cc0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1cd0: 75 76 77 78 79 7a 22 2c 20 22 46 31 44 37 35 34  uvwxyz", "F1D754
1ce0: 36 36 32 36 33 36 46 46 45 39 32 43 38 32 45 42  662636FFE92C82EB
1cf0: 42 39 32 31 32 41 34 38 34 41 38 44 33 38 36 33  B9212A484A8D3863
1d00: 31 45 41 44 34 32 33 38 46 35 34 34 32 45 45 31  1EAD4238F5442EE1
1d10: 33 42 38 30 35 34 45 34 31 42 30 38 42 46 32 41  3B8054E41B08BF2A
1d20: 39 32 35 31 43 33 30 42 36 41 30 42 38 41 41 45  9251C30B6A0B8AAE
1d30: 38 36 31 37 37 41 42 34 41 36 46 36 38 46 36 37  86177AB4A6F68F67
1d40: 33 45 37 32 30 37 38 36 35 44 35 44 39 38 31 39  3E7207865D5D9819
1d50: 41 33 44 42 41 34 45 42 33 42 22 2c 0a 09 22 54  A3DBA4EB3B",.."T
1d60: 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66  he quick brown f
1d70: 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68  ox jumps over th
1d80: 65 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22 42 39  e lazy dog", "B9
1d90: 37 44 45 35 31 32 45 39 31 45 33 38 32 38 42 34  7DE512E91E3828B4
1da0: 30 44 32 42 30 46 44 43 45 39 43 45 42 33 43 34  0D2B0FDCE9CEB3C4
1db0: 41 37 31 46 39 42 45 41 38 44 38 38 45 37 35 43  A71F9BEA8D88E75C
1dc0: 34 46 41 38 35 34 44 46 33 36 37 32 35 46 44 32  4FA854DF36725FD2
1dd0: 42 35 32 45 42 36 35 34 34 45 44 43 41 43 44 36  B52EB6544EDCACD6
1de0: 46 38 42 45 44 44 46 45 41 34 30 33 43 42 35 35  F8BEDDFEA403CB55
1df0: 41 45 33 31 46 30 33 41 44 36 32 41 35 45 46 35  AE31F03AD62A5EF5
1e00: 34 45 34 32 45 45 38 32 43 33 46 42 33 35 22 2c  4E42EE82C3FB35",
1e10: 0a 09 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  .."ABCDEFGHIJKLM
1e20: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62 63  NOPQRSTUVWXYZabc
1e30: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
1e40: 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37 38  tuvwxyz012345678
1e50: 39 22 2c 0a 09 22 44 43 33 37 45 30 30 38 43 46  9",.."DC37E008CF
1e60: 39 45 45 36 39 42 46 31 31 46 30 30 45 44 39 41  9EE69BF11F00ED9A
1e70: 42 41 32 36 39 30 31 44 44 37 43 32 38 43 44 45  BA26901DD7C28CDE
1e80: 43 30 36 36 43 43 36 41 46 34 32 45 34 30 46 38  C066CC6AF42E40F8
1e90: 32 46 33 41 31 45 30 38 45 42 41 32 36 36 32 39  2F3A1E08EBA26629
1ea0: 31 32 39 44 38 46 42 37 43 42 35 37 32 31 31 42  129D8FB7CB57211B
1eb0: 39 32 38 31 41 36 35 35 31 37 43 43 38 37 39 44  9281A65517CC879D
1ec0: 37 42 39 36 32 31 34 32 43 36 35 46 35 41 37 41  7B962142C65F5A7A
1ed0: 46 30 31 34 36 37 22 2c 0a 09 22 31 32 33 34 35  F01467",.."12345
1ee0: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
1ef0: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
1f00: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
1f10: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
1f20: 30 31 32 33 34 35 36 37 38 39 30 22 2c 0a 09 22  01234567890",.."
1f30: 34 36 36 45 46 31 38 42 41 42 42 30 31 35 34 44  466EF18BABB0154D
1f40: 32 35 42 39 44 33 38 41 36 34 31 34 46 35 43 30  25B9D38A6414F5C0
1f50: 38 37 38 34 33 37 32 42 43 43 42 32 30 34 44 36  8784372BCCB204D6
1f60: 35 34 39 43 34 41 46 41 44 42 36 30 31 34 32 39  549C4AFADB601429
1f70: 34 44 35 42 44 38 44 46 32 41 36 43 34 34 45 35  4D5BD8DF2A6C44E5
1f80: 33 38 43 44 30 34 37 42 32 36 38 31 41 35 31 41  38CD047B2681A51A
1f90: 32 43 36 30 34 38 31 45 38 38 43 35 41 32 30 42  2C60481E88C5A20B
1fa0: 32 43 32 41 38 30 43 46 33 41 39 41 30 38 33 42  2C2A80CF3A9A083B
1fb0: 22 2c 0a 09 22 61 62 63 64 62 63 64 65 63 64 65  ",.."abcdbcdecde
1fc0: 66 64 65 66 67 65 66 67 68 66 67 68 69 67 68 69  fdefgefghfghighi
1fd0: 6a 68 69 6a 6b 22 2c 0a 09 22 32 41 39 38 37 45  jhijk",.."2A987E
1fe0: 41 34 30 46 39 31 37 30 36 31 46 35 44 36 46 30  A40F917061F5D6F0
1ff0: 41 30 45 34 36 34 34 46 34 38 38 41 37 41 35 41  A0E4644F488A7A5A
2000: 35 32 44 45 45 45 36 35 36 32 30 37 43 35 36 32  52DEEE656207C562
2010: 46 39 38 38 45 39 35 43 36 39 31 36 42 44 43 38  F988E95C6916BDC8
2020: 30 33 31 42 43 35 42 45 31 42 37 42 39 34 37 36  031BC5BE1B7B9476
2030: 33 39 46 45 30 35 30 42 35 36 39 33 39 42 41 41  39FE050B56939BAA
2040: 41 30 41 44 46 46 39 41 45 36 37 34 35 42 37 42  A0ADFF9AE6745B7B
2050: 31 38 31 43 33 42 45 33 46 44 22 2c 0a 09 30 0a  181C3BE3FD",..0.
2060: 7d 3b 0a 0a 2f 2a 20 74 65 73 74 20 76 65 63 74  };../* test vect
2070: 6f 72 73 20 66 72 6f 6d 20 52 49 50 45 4d 44 2d  ors from RIPEMD-
2080: 31 36 30 20 73 70 65 63 20 2a 2f 0a 63 6f 6e 73  160 spec */.cons
2090: 74 20 63 68 61 72 2a 20 72 69 70 65 6d 64 5f 74  t char* ripemd_t
20a0: 65 73 74 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20  ests[] = {.."", 
20b0: 22 39 43 31 31 38 35 41 35 43 35 45 39 46 43 35  "9C1185A5C5E9FC5
20c0: 34 36 31 32 38 30 38 39 37 37 45 45 38 46 35 34  4612808977EE8F54
20d0: 38 42 32 32 35 38 44 33 31 22 2c 0a 09 22 61 22  8B2258D31",.."a"
20e0: 2c 20 22 30 42 44 43 39 44 32 44 32 35 36 42 33  , "0BDC9D2D256B3
20f0: 45 45 39 44 41 41 45 33 34 37 42 45 36 46 34 44  EE9DAAE347BE6F4D
2100: 43 38 33 35 41 34 36 37 46 46 45 22 2c 0a 09 22  C835A467FFE",.."
2110: 61 62 63 22 2c 20 22 38 45 42 32 30 38 46 37 45  abc", "8EB208F7E
2120: 30 35 44 39 38 37 41 39 42 30 34 34 41 38 45 39  05D987A9B044A8E9
2130: 38 43 36 42 30 38 37 46 31 35 41 30 42 46 43 22  8C6B087F15A0BFC"
2140: 2c 0a 09 22 6d 65 73 73 61 67 65 20 64 69 67 65  ,.."message dige
2150: 73 74 22 2c 20 22 35 44 30 36 38 39 45 46 34 39  st", "5D0689EF49
2160: 44 32 46 41 45 35 37 32 42 38 38 31 42 31 32 33  D2FAE572B881B123
2170: 41 38 35 46 46 41 32 31 35 39 35 46 33 36 22 2c  A85FFA21595F36",
2180: 0a 09 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  .."abcdefghijklm
2190: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 2c 20  nopqrstuvwxyz", 
21a0: 22 46 37 31 43 32 37 31 30 39 43 36 39 32 43 31  "F71C27109C692C1
21b0: 42 35 36 42 42 44 43 45 42 35 42 39 44 32 38 36  B56BBDCEB5B9D286
21c0: 35 42 33 37 30 38 44 42 43 22 2c 0a 09 22 54 68  5B3708DBC",.."Th
21d0: 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f  e quick brown fo
21e0: 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65  x jumps over the
21f0: 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22 33 37 46   lazy dog", "37F
2200: 33 33 32 46 36 38 44 42 37 37 42 44 39 44 37 45  332F68DB77BD9D7E
2210: 44 44 34 39 36 39 35 37 31 41 44 36 37 31 43 46  DD4969571AD671CF
2220: 39 44 44 33 42 22 2c 0a 09 22 61 62 63 64 62 63  9DD3B",.."abcdbc
2230: 64 65 63 64 65 66 64 65 66 67 65 66 67 68 66 67  decdefdefgefghfg
2240: 68 69 67 68 69 6a 68 69 6a 6b 69 6a 6b 6c 6a 6b  highijhijkijkljk
2250: 6c 6d 6b 6c 6d 6e 6c 6d 6e 6f 6d 6e 6f 70 6e 6f  lmklmnlmnomnopno
2260: 70 71 22 2c 20 22 31 32 41 30 35 33 33 38 34 41  pq", "12A053384A
2270: 39 43 30 43 38 38 45 34 30 35 41 30 36 43 32 37  9C0C88E405A06C27
2280: 44 43 46 34 39 41 44 41 36 32 45 42 32 42 22 2c  DCF49ADA62EB2B",
2290: 0a 09 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  .."ABCDEFGHIJKLM
22a0: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62 63  NOPQRSTUVWXYZabc
22b0: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
22c0: 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37 38  tuvwxyz012345678
22d0: 39 22 2c 20 22 42 30 45 32 30 42 36 45 33 31 31  9", "B0E20B6E311
22e0: 36 36 34 30 32 38 36 45 44 33 41 38 37 41 35 37  6640286ED3A87A57
22f0: 31 33 30 37 39 42 32 31 46 35 31 38 39 22 2c 0a  13079B21F5189",.
2300: 09 22 31 32 33 34 35 36 37 38 39 30 31 32 33 34  ."12345678901234
2310: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
2320: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
2330: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
2340: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
2350: 39 30 22 2c 20 22 39 42 37 35 32 45 34 35 35 37  90", "9B752E4557
2360: 33 44 34 42 33 39 46 34 44 42 44 33 33 32 33 43  3D4B39F4DBD3323C
2370: 41 42 38 32 42 46 36 33 33 32 36 42 46 42 22 2c  AB82BF63326BFB",
2380: 0a 09 30 0a 7d 3b 0a 0a 2f 2a 0a 2a 20 54 77 6f  ..0.};../*.* Two
2390: 20 69 6d 70 6f 72 74 61 6e 74 20 74 65 73 74 2d   important test-
23a0: 63 61 73 65 73 20 28 73 6f 6d 65 20 6c 69 62 72  cases (some libr
23b0: 61 72 69 65 73 20 63 61 6c 63 75 6c 61 74 65 20  aries calculate 
23c0: 74 68 65 6d 20 69 6e 63 6f 72 72 65 63 74 6c 79  them incorrectly
23d0: 29 3a 0a 2a 20 47 4f 53 54 28 20 3c 31 30 30 30  ):.* GOST( <1000
23e0: 30 30 20 63 68 61 72 61 63 74 65 72 73 20 6f 66  00 characters of
23f0: 20 27 61 27 3e 20 29 20 3d 20 35 43 30 30 43 43   'a'> ) = 5C00CC
2400: 43 32 37 33 34 43 44 44 33 33 33 32 44 33 44 34  C2734CDD3332D3D4
2410: 37 34 39 35 37 36 45 33 43 31 41 37 44 42 41 46  749576E3C1A7DBAF
2420: 30 45 37 45 41 37 34 45 39 46 41 36 30 32 34 31  0E7EA74E9FA60241
2430: 33 43 39 30 41 31 32 39 46 41 0a 2a 20 47 4f 53  3C90A129FA.* GOS
2440: 54 28 20 3c 31 32 38 20 63 68 61 72 61 63 74 65  T( <128 characte
2450: 72 73 20 6f 66 20 27 55 27 3e 20 29 20 3d 20 35  rs of 'U'> ) = 5
2460: 33 41 33 41 33 45 44 32 35 31 38 30 43 45 46 30  3A3A3ED25180CEF0
2470: 43 31 44 38 35 41 30 37 34 32 37 33 45 35 35 31  C1D85A074273E551
2480: 43 32 35 36 36 30 41 38 37 30 36 32 41 35 32 44  C25660A87062A52D
2490: 39 32 36 41 39 45 38 46 45 35 37 33 33 41 34 0a  926A9E8FE5733A4.
24a0: 2a 2f 0a 0a 2f 2a 20 74 65 73 74 20 76 65 63 74  */../* test vect
24b0: 6f 72 73 20 66 72 6f 6d 20 69 6e 74 65 72 6e 65  ors from interne
24c0: 74 2c 20 76 65 72 69 66 69 65 64 20 62 79 20 4f  t, verified by O
24d0: 70 65 6e 53 53 4c 20 61 6e 64 20 73 6f 6d 65 20  penSSL and some 
24e0: 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 73 20 2a  other programs *
24f0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 2a 20 67 6f  /.const char* go
2500: 73 74 5f 74 65 73 74 73 5b 5d 20 3d 20 7b 0a 09  st_tests[] = {..
2510: 22 22 2c 20 22 43 45 38 35 42 39 39 43 43 34 36  "", "CE85B99CC46
2520: 37 35 32 46 46 46 45 45 33 35 43 41 42 39 41 37  752FFFEE35CAB9A7
2530: 42 30 32 37 38 41 42 42 34 43 32 44 32 30 35 35  B0278ABB4C2D2055
2540: 43 46 46 36 38 35 41 46 34 39 31 32 43 34 39 34  CFF685AF4912C494
2550: 39 30 46 38 44 22 2c 0a 09 22 61 22 2c 20 22 44  90F8D",.."a", "D
2560: 34 32 43 35 33 39 45 33 36 37 43 36 36 45 39 43  42C539E367C66E9C
2570: 38 38 41 38 30 31 46 36 36 34 39 33 34 39 43 32  88A801F6649349C2
2580: 31 38 37 31 42 34 33 34 34 43 36 41 35 37 33 46  1871B4344C6A573F
2590: 38 34 39 46 44 43 45 36 32 46 33 31 34 44 44 22  849FDCE62F314DD"
25a0: 2c 0a 09 22 61 62 63 22 2c 20 22 46 33 31 33 34  ,.."abc", "F3134
25b0: 33 34 38 43 34 34 46 42 31 42 32 41 32 37 37 37  348C44FB1B2A2777
25c0: 32 39 45 32 32 38 35 45 42 42 35 43 42 35 45 30  29E2285EBB5CB5E0
25d0: 46 32 39 43 39 37 35 42 43 37 35 33 42 37 30 34  F29C975BC753B704
25e0: 39 37 43 30 36 41 34 44 35 31 44 22 2c 0a 09 22  97C06A4D51D",.."
25f0: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 22 2c  message digest",
2600: 20 22 41 44 34 34 33 34 45 43 42 31 38 46 32 43   "AD4434ECB18F2C
2610: 39 39 42 36 30 43 42 45 35 39 45 43 33 44 32 34  99B60CBE59EC3D24
2620: 36 39 35 38 32 42 36 35 32 37 33 46 34 38 44 45  69582B65273F48DE
2630: 37 32 44 42 32 46 44 45 31 36 41 34 38 38 39 41  72DB2FDE16A4889A
2640: 34 44 22 2c 0a 09 22 54 68 65 20 71 75 69 63 6b  4D",.."The quick
2650: 20 62 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73   brown fox jumps
2660: 20 6f 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64   over the lazy d
2670: 6f 67 22 2c 20 22 37 37 42 37 46 41 34 31 30 43  og", "77B7FA410C
2680: 39 41 43 35 38 41 32 35 46 34 39 42 43 41 37 44  9AC58A25F49BCA7D
2690: 30 34 36 38 43 39 32 39 36 35 32 39 33 31 35 45  0468C9296529315E
26a0: 41 43 41 37 36 42 44 31 41 31 30 46 33 37 36 44  ACA76BD1A10F376D
26b0: 31 46 34 32 39 34 22 2c 0a 09 22 41 42 43 44 45  1F4294",.."ABCDE
26c0: 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
26d0: 56 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b  VWXYZabcdefghijk
26e0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30  lmnopqrstuvwxyz0
26f0: 31 32 33 34 35 36 37 38 39 22 2c 20 22 39 35 43  123456789", "95C
2700: 31 41 46 36 32 37 43 33 35 36 34 39 36 44 38 30  1AF627C356496D80
2710: 32 37 34 33 33 30 42 32 43 46 46 36 41 31 30 43  274330B2CFF6A10C
2720: 36 37 42 35 46 35 39 37 30 38 37 32 30 32 46 39  67B5F597087202F9
2730: 34 44 30 36 44 32 33 33 38 43 46 38 45 22 2c 0a  4D06D2338CF8E",.
2740: 09 22 31 32 33 34 35 36 37 38 39 30 31 32 33 34  ."12345678901234
2750: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
2760: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
2770: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
2780: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
2790: 39 30 22 2c 20 22 43 43 31 37 38 44 43 41 44 34  90", "CC178DCAD4
27a0: 44 46 36 31 39 44 43 41 41 30 30 41 41 43 37 39  DF619DCAA00AAC79
27b0: 43 41 33 35 35 43 30 30 31 34 34 45 34 41 44 41  CA355C00144E4ADA
27c0: 32 37 39 33 44 37 42 44 39 42 33 35 31 38 45 41  2793D7BD9B3518EA
27d0: 44 33 43 43 44 33 22 2c 0a 09 22 55 55 55 55 55  D3CCD3",.."UUUUU
27e0: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
27f0: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2800: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2810: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2820: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2830: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2840: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2850: 55 55 55 55 55 55 55 55 55 55 55 22 2c 20 22 35  UUUUUUUUUUU", "5
2860: 33 41 33 41 33 45 44 32 35 31 38 30 43 45 46 30  3A3A3ED25180CEF0
2870: 43 31 44 38 35 41 30 37 34 32 37 33 45 35 35 31  C1D85A074273E551
2880: 43 32 35 36 36 30 41 38 37 30 36 32 41 35 32 44  C25660A87062A52D
2890: 39 32 36 41 39 45 38 46 45 35 37 33 33 41 34 22  926A9E8FE5733A4"
28a0: 2c 0a 09 2f 2a 20 74 77 6f 20 74 65 73 74 20 73  ,../* two test s
28b0: 74 72 69 6e 67 73 20 66 72 6f 6d 20 47 4f 53 54  trings from GOST
28c0: 20 73 74 61 6e 64 61 72 64 20 2a 2f 0a 09 22 54   standard */.."T
28d0: 68 69 73 20 69 73 20 6d 65 73 73 61 67 65 2c 20  his is message, 
28e0: 6c 65 6e 67 74 68 3d 33 32 20 62 79 74 65 73 22  length=32 bytes"
28f0: 2c 20 22 42 31 43 34 36 36 44 33 37 35 31 39 42  , "B1C466D37519B
2900: 38 32 45 38 33 31 39 38 31 39 46 46 33 32 35 39  82E8319819FF3259
2910: 35 45 30 34 37 41 32 38 43 42 36 46 38 33 45 46  5E047A28CB6F83EF
2920: 46 31 43 36 39 31 36 41 38 31 35 41 36 33 37 46  F1C6916A815A637F
2930: 46 46 41 22 2c 0a 09 22 53 75 70 70 6f 73 65 20  FFA",.."Suppose 
2940: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 65 73  the original mes
2950: 73 61 67 65 20 68 61 73 20 6c 65 6e 67 74 68 20  sage has length 
2960: 3d 20 35 30 20 62 79 74 65 73 22 2c 20 22 34 37  = 50 bytes", "47
2970: 31 41 42 41 35 37 41 36 30 41 37 37 30 44 33 41  1ABA57A60A770D3A
2980: 37 36 31 33 30 36 33 35 43 31 46 42 45 41 34 45  76130635C1FBEA4E
2990: 46 31 34 44 45 35 31 46 37 38 42 34 41 45 35 37  F14DE51F78B4AE57
29a0: 44 44 38 39 33 42 36 32 46 35 35 32 30 38 22 2c  DD893B62F55208",
29b0: 0a 09 22 54 68 65 20 71 75 69 63 6b 20 62 72 6f  .."The quick bro
29c0: 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65  wn fox jumps ove
29d0: 72 20 74 68 65 20 6c 61 7a 79 20 63 6f 67 22 2c  r the lazy cog",
29e0: 20 22 41 33 45 42 43 34 44 41 41 41 42 37 38 42   "A3EBC4DAAAB78B
29f0: 30 42 45 31 33 31 44 41 42 35 37 33 37 41 37 46  0BE131DAB5737A7F
2a00: 36 37 45 36 30 32 36 37 30 44 35 34 33 35 32 31  67E602670D543521
2a10: 33 31 39 31 35 30 44 32 45 31 34 45 45 45 43 34  319150D2E14EEEC4
2a20: 34 35 22 2c 20 2f 2a 20 74 65 73 74 20 66 72 6f  45", /* test fro
2a30: 6d 20 57 69 6b 69 70 65 64 69 61 20 2a 2f 0a 09  m Wikipedia */..
2a40: 30 0a 7d 3b 0a 0a 2f 2a 20 74 65 73 74 65 64 20  0.};../* tested 
2a50: 77 69 74 68 20 6f 70 65 6e 73 73 6c 20 2a 2f 0a  with openssl */.
2a60: 63 6f 6e 73 74 20 63 68 61 72 2a 20 67 6f 73 74  const char* gost
2a70: 5f 63 72 79 70 74 6f 70 72 6f 5f 74 65 73 74 73  _cryptopro_tests
2a80: 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20 22 39 38 31  [] = {.."", "981
2a90: 45 35 46 33 43 41 33 30 43 38 34 31 34 38 37 38  E5F3CA30C8414878
2aa0: 33 30 46 38 34 46 42 34 33 33 45 31 33 41 43 31  30F84FB433E13AC1
2ab0: 31 30 31 35 36 39 42 39 43 31 33 35 38 34 41 43  101569B9C13584AC
2ac0: 34 38 33 32 33 34 43 44 36 35 36 43 30 22 2c 0a  483234CD656C0",.
2ad0: 09 22 61 22 2c 20 22 45 37 34 43 35 32 44 44 32  ."a", "E74C52DD2
2ae0: 38 32 31 38 33 42 46 33 37 41 46 30 30 37 39 43  82183BF37AF0079C
2af0: 39 46 37 38 30 35 35 37 31 35 41 31 30 33 46 31  9F78055715A103F1
2b00: 37 45 33 31 33 33 43 45 46 46 31 41 41 43 46 32  7E3133CEFF1AACF2
2b10: 46 34 30 33 30 31 31 22 2c 0a 09 22 61 62 63 22  F403011",.."abc"
2b20: 2c 20 22 42 32 38 35 30 35 36 44 42 46 31 38 44  , "B285056DBF18D
2b30: 37 33 39 32 44 37 36 37 37 33 36 39 35 32 34 44  7392D7677369524D
2b40: 44 31 34 37 34 37 34 35 39 45 44 38 31 34 33 39  D14747459ED81439
2b50: 39 37 45 31 36 33 42 32 39 38 36 46 39 32 46 44  97E163B2986F92FD
2b60: 34 32 43 22 2c 0a 09 22 6d 65 73 73 61 67 65 20  42C",.."message 
2b70: 64 69 67 65 73 74 22 2c 20 22 42 43 36 30 34 31  digest", "BC6041
2b80: 44 44 32 41 41 34 30 31 45 42 46 41 36 45 39 38  DD2AA401EBFA6E98
2b90: 38 36 37 33 34 31 37 34 46 45 42 44 42 34 37 32  86734174FEBDB472
2ba0: 39 41 41 39 37 32 44 36 30 46 35 34 39 41 43 33  9AA972D60F549AC3
2bb0: 39 42 32 39 37 32 31 42 41 30 22 2c 0a 09 22 54  9B29721BA0",.."T
2bc0: 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66  he quick brown f
2bd0: 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68  ox jumps over th
2be0: 65 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22 39 30  e lazy dog", "90
2bf0: 30 34 32 39 34 41 33 36 31 41 35 30 38 43 35 38  04294A361A508C58
2c00: 36 46 45 35 33 44 31 46 31 42 30 32 37 34 36 37  6FE53D1F1B027467
2c10: 36 35 45 37 31 42 37 36 35 34 37 32 37 38 36 45  65E71B765472786E
2c20: 34 37 37 30 44 35 36 35 38 33 30 41 37 36 22 2c  4770D565830A76",
2c30: 0a 09 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  .."ABCDEFGHIJKLM
2c40: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62 63  NOPQRSTUVWXYZabc
2c50: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
2c60: 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37 38  tuvwxyz012345678
2c70: 39 22 2c 20 22 37 33 42 37 30 41 33 39 34 39 37  9", "73B70A39497
2c80: 44 45 35 33 41 36 45 30 38 43 36 37 42 36 44 34  DE53A6E08C67B6D4
2c90: 44 42 38 35 33 35 34 30 46 30 33 45 39 33 38 39  DB853540F03E9389
2ca0: 32 39 39 44 39 42 30 31 35 36 45 46 37 45 38 35  299D9B0156EF7E85
2cb0: 44 30 46 36 31 22 2c 0a 09 22 31 32 33 34 35 36  D0F61",.."123456
2cc0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
2cd0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
2ce0: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
2cf0: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
2d00: 31 32 33 34 35 36 37 38 39 30 22 2c 20 22 36 42  1234567890", "6B
2d10: 43 37 42 33 38 39 38 39 42 32 38 43 46 39 33 41  C7B38989B28CF93A
2d20: 45 38 38 34 32 42 46 39 44 37 35 32 39 30 35 39  E8842BF9D7529059
2d30: 31 30 41 37 35 32 38 41 36 31 45 35 42 43 45 30  10A7528A61E5BCE0
2d40: 37 38 32 44 45 34 33 45 36 31 30 43 39 30 22 2c  782DE43E610C90",
2d50: 0a 09 22 55 55 55 55 55 55 55 55 55 55 55 55 55  .."UUUUUUUUUUUUU
2d60: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2d70: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2d80: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2d90: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2da0: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2db0: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2dc0: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55  UUUUUUUUUUUUUUUU
2dd0: 55 55 55 22 2c 20 22 31 43 34 41 43 37 36 31 34  UUU", "1C4AC7614
2de0: 36 39 31 42 42 46 34 32 37 46 41 32 33 31 36 32  691BBF427FA23162
2df0: 31 36 42 45 38 46 31 30 44 39 32 45 44 46 44 33  16BE8F10D92EDFD3
2e00: 37 43 44 31 30 32 37 35 31 34 43 31 30 30 38 46  7CD1027514C1008F
2e10: 36 34 39 43 34 45 38 22 2c 0a 09 22 54 68 69 73  649C4E8",.."This
2e20: 20 69 73 20 6d 65 73 73 61 67 65 2c 20 6c 65 6e   is message, len
2e30: 67 74 68 3d 33 32 20 62 79 74 65 73 22 2c 20 22  gth=32 bytes", "
2e40: 32 43 45 46 43 32 46 37 42 37 42 44 43 35 31 34  2CEFC2F7B7BDC514
2e50: 45 31 38 45 41 35 37 46 41 37 34 46 46 33 35 37  E18EA57FA74FF357
2e60: 45 37 46 41 31 37 44 36 35 32 43 37 35 46 36 39  E7FA17D652C75F69
2e70: 43 42 31 42 45 37 38 39 33 45 44 45 34 38 45 42  CB1BE7893EDE48EB
2e80: 22 2c 0a 09 22 53 75 70 70 6f 73 65 20 74 68 65  ",.."Suppose the
2e90: 20 6f 72 69 67 69 6e 61 6c 20 6d 65 73 73 61 67   original messag
2ea0: 65 20 68 61 73 20 6c 65 6e 67 74 68 20 3d 20 35  e has length = 5
2eb0: 30 20 62 79 74 65 73 22 2c 20 22 43 33 37 33 30  0 bytes", "C3730
2ec0: 43 35 43 42 43 43 41 43 46 39 31 35 41 43 32 39  C5CBCCACF915AC29
2ed0: 32 36 37 36 46 32 31 45 38 42 44 34 45 46 37 35  2676F21E8BD4EF75
2ee0: 33 33 31 44 39 34 30 35 45 35 46 31 41 36 31 44  331D9405E5F1A61D
2ef0: 43 33 31 33 30 41 36 35 30 31 31 22 2c 0a 09 30  C3130A65011",..0
2f00: 0a 7d 3b 0a 0a 2f 2a 20 74 65 73 74 20 76 65 63  .};../* test vec
2f10: 74 6f 72 73 20 76 65 72 69 66 69 65 64 20 62 79  tors verified by
2f20: 20 6d 68 61 73 68 20 2a 2f 0a 63 6f 6e 73 74 20   mhash */.const 
2f30: 63 68 61 72 2a 20 73 6e 65 66 72 75 32 35 36 5f  char* snefru256_
2f40: 74 65 73 74 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c  tests[] = {.."",
2f50: 20 22 38 36 31 37 46 33 36 36 35 36 36 41 30 31   "8617F366566A01
2f60: 31 38 33 37 46 34 46 42 34 42 41 35 42 45 44 45  1837F4FB4BA5BEDE
2f70: 41 32 42 38 39 32 46 33 45 44 38 42 38 39 34 30  A2B892F3ED8B8940
2f80: 32 33 44 31 36 41 45 33 34 34 42 32 42 45 35 38  23D16AE344B2BE58
2f90: 38 31 22 2c 0a 09 22 61 22 2c 20 22 34 35 31 36  81",.."a", "4516
2fa0: 31 35 38 39 41 43 33 31 37 42 45 30 43 45 42 41  1589AC317BE0CEBA
2fb0: 37 30 44 42 32 35 37 33 44 44 44 41 36 45 36 36  70DB2573DDDA6E66
2fc0: 38 41 33 31 39 38 34 42 33 39 42 46 36 35 45 34  8A31984B39BF65E4
2fd0: 42 36 36 34 42 35 38 34 43 36 33 44 22 2c 0a 09  B664B584C63D",..
2fe0: 22 61 62 63 22 2c 20 22 37 44 30 33 33 32 30 35  "abc", "7D033205
2ff0: 36 34 37 41 32 41 46 33 44 43 38 33 33 39 46 36  647A2AF3DC8339F6
3000: 43 42 32 35 36 34 33 43 33 33 45 42 43 36 32 32  CB25643C33EBC622
3010: 44 33 32 39 37 39 43 34 42 36 31 32 42 30 32 43  D32979C4B612B02C
3020: 34 39 30 33 30 33 31 42 22 2c 0a 09 22 6d 65 73  4903031B",.."mes
3030: 73 61 67 65 20 64 69 67 65 73 74 22 2c 20 22 43  sage digest", "C
3040: 35 44 34 43 45 33 38 44 41 41 30 34 33 42 44 44  5D4CE38DAA043BDD
3050: 35 39 45 44 31 35 44 42 35 37 37 35 30 30 43 30  59ED15DB577500C0
3060: 37 31 42 39 31 37 43 31 41 34 36 43 44 37 42 34  71B917C1A46CD7B4
3070: 44 33 30 42 34 34 41 34 34 43 38 36 44 46 38 22  D30B44A44C86DF8"
3080: 2c 0a 09 22 61 62 63 64 65 66 67 68 69 6a 6b 6c  ,.."abcdefghijkl
3090: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 2c  mnopqrstuvwxyz",
30a0: 20 22 39 33 30 34 42 42 32 46 38 37 36 44 39 43   "9304BB2F876D9C
30b0: 34 46 35 34 35 34 36 43 46 37 45 43 35 39 45 30  4F54546CF7EC59E0
30c0: 41 30 30 36 42 45 41 44 37 34 35 46 30 38 43 36  A006BEAD745F08C6
30d0: 34 32 46 32 35 41 37 43 38 30 38 45 30 42 46 38  42F25A7C808E0BF8
30e0: 36 45 22 2c 0a 09 22 54 68 65 20 71 75 69 63 6b  6E",.."The quick
30f0: 20 62 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73   brown fox jumps
3100: 20 6f 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64   over the lazy d
3110: 6f 67 22 2c 20 22 36 37 34 43 41 41 37 35 46 39  og", "674CAA75F9
3120: 44 38 46 44 32 30 38 39 38 35 36 42 39 35 45 39  D8FD2089856B95E9
3130: 33 41 34 46 42 34 32 46 41 36 43 38 37 30 32 46  3A4FB42FA6C8702F
3140: 38 39 38 30 45 31 31 44 39 37 41 31 34 32 44 37  8980E11D97A142D7
3150: 36 43 42 33 35 38 22 2c 0a 09 22 41 42 43 44 45  6CB358",.."ABCDE
3160: 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
3170: 56 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b  VWXYZabcdefghijk
3180: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30  lmnopqrstuvwxyz0
3190: 31 32 33 34 35 36 37 38 39 22 2c 20 22 38 33 41  123456789", "83A
31a0: 41 39 31 39 33 42 36 32 46 46 44 32 36 39 46 41  A9193B62FFD269FA
31b0: 41 34 33 44 33 31 45 36 41 43 32 36 37 38 42 33  A43D31E6AC2678B3
31c0: 34 30 45 32 41 38 35 38 34 39 34 37 30 33 32 38  40E2A85849470328
31d0: 42 45 39 37 37 33 41 39 45 35 37 32 38 22 2c 0a  BE9773A9E5728",.
31e0: 09 22 31 32 33 34 35 36 37 38 39 30 31 32 33 34  ."12345678901234
31f0: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
3200: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
3210: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
3220: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
3230: 39 30 22 2c 20 22 44 35 46 43 45 33 38 41 31 35  90", "D5FCE38A15
3240: 32 41 32 44 39 42 38 33 41 42 34 34 43 32 39 33  2A2D9B83AB44C293
3250: 30 36 45 45 34 35 41 42 30 41 45 44 30 45 33 38  06EE45AB0AED0E38
3260: 43 39 35 37 45 43 34 33 31 44 41 42 36 45 44 36  C957EC431DAB6ED6
3270: 42 42 37 31 42 38 22 2c 0a 09 30 0a 7d 3b 0a 0a  BB71B8",..0.};..
3280: 2f 2a 20 74 65 73 74 20 76 65 63 74 6f 72 73 20  /* test vectors 
3290: 76 65 72 69 66 69 65 64 20 62 79 20 6d 68 61 73  verified by mhas
32a0: 68 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 2a  h */.const char*
32b0: 20 73 6e 65 66 72 75 31 32 38 5f 74 65 73 74 73   snefru128_tests
32c0: 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20 22 38 36 31  [] = {.."", "861
32d0: 37 46 33 36 36 35 36 36 41 30 31 31 38 33 37 46  7F366566A011837F
32e0: 34 46 42 34 42 41 35 42 45 44 45 41 32 22 2c 0a  4FB4BA5BEDEA2",.
32f0: 09 22 61 22 2c 20 22 42 46 35 43 45 35 34 30 41  ."a", "BF5CE540A
3300: 45 35 31 42 43 35 30 33 39 39 46 39 36 37 34 36  E51BC50399F96746
3310: 43 35 41 31 35 42 44 22 2c 0a 09 22 61 62 63 22  C5A15BD",.."abc"
3320: 2c 20 22 35 35 33 44 30 36 34 38 39 32 38 32 39  , "553D064892829
3330: 39 41 30 46 32 32 41 32 37 35 41 30 32 43 38 33  9A0F22A275A02C83
3340: 42 31 30 22 2c 0a 09 22 6d 65 73 73 61 67 65 20  B10",.."message 
3350: 64 69 67 65 73 74 22 2c 20 22 39 36 44 36 46 32  digest", "96D6F2
3360: 46 34 31 31 32 43 34 42 41 46 32 39 46 36 35 33  F4112C4BAF29F653
3370: 46 31 35 39 34 45 32 44 35 44 22 2c 0a 09 22 61  F1594E2D5D",.."a
3380: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
3390: 72 73 74 75 76 77 78 79 7a 22 2c 20 22 37 38 34  rstuvwxyz", "784
33a0: 30 31 34 38 41 36 36 42 39 31 43 32 31 39 43 33  0148A66B91C219C3
33b0: 36 46 31 32 37 41 30 39 32 39 36 30 36 22 2c 0a  6F127A0929606",.
33c0: 09 22 54 68 65 20 71 75 69 63 6b 20 62 72 6f 77  ."The quick brow
33d0: 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72  n fox jumps over
33e0: 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 22 2c 20   the lazy dog", 
33f0: 22 35 39 44 39 35 33 39 44 30 44 44 39 36 44 36  "59D9539D0DD96D6
3400: 33 35 42 35 42 44 42 44 31 33 39 35 42 42 38 36  35B5BDBD1395BB86
3410: 43 22 2c 0a 09 22 41 42 43 44 45 46 47 48 49 4a  C",.."ABCDEFGHIJ
3420: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
3430: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
3440: 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35  qrstuvwxyz012345
3450: 36 37 38 39 22 2c 20 22 30 45 46 44 37 46 39 33  6789", "0EFD7F93
3460: 41 35 34 39 46 30 32 33 42 37 39 37 38 31 30 39  A549F023B7978109
3470: 30 34 35 38 39 32 33 45 22 2c 0a 09 22 31 32 33  0458923E",.."123
3480: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
3490: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
34a0: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
34b0: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
34c0: 38 39 30 31 32 33 34 35 36 37 38 39 30 22 2c 20  8901234567890", 
34d0: 22 44 39 32 30 34 45 44 38 30 42 42 38 34 33 30  "D9204ED80BB8430
34e0: 43 30 42 39 43 32 34 34 46 45 34 38 35 38 31 34  C0B9C244FE485814
34f0: 41 22 2c 0a 09 30 0a 7d 3b 0a 0a 2f 2a 20 63 68  A",..0.};../* ch
3500: 65 63 6b 65 64 20 61 67 61 69 6e 73 74 20 74 65  ecked against te
3510: 73 74 20 76 65 63 74 6f 72 73 3a 20 68 74 74 70  st vectors: http
3520: 3a 2f 2f 77 77 77 2e 72 61 6e 64 6f 6d 62 69 74  ://www.randombit
3530: 2e 6e 65 74 2f 74 65 78 74 2f 68 61 73 31 36 30  .net/text/has160
3540: 2e 68 74 6d 6c 20 2a 2f 0a 63 6f 6e 73 74 20 63  .html */.const c
3550: 68 61 72 2a 20 68 61 73 31 36 30 5f 74 65 73 74  har* has160_test
3560: 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20 22 33 30  s[] = {.."", "30
3570: 37 39 36 34 45 46 33 34 31 35 31 44 33 37 43 38  7964EF34151D37C8
3580: 30 34 37 41 44 45 43 37 41 42 35 30 46 34 46 46  047ADEC7AB50F4FF
3590: 38 39 37 36 32 44 22 2c 0a 09 22 61 22 2c 20 22  89762D",.."a", "
35a0: 34 38 37 32 42 43 42 43 34 43 44 30 46 30 41 39  4872BCBC4CD0F0A9
35b0: 44 43 37 43 32 46 37 30 34 35 45 35 42 34 33 42  DC7C2F7045E5B43B
35c0: 36 43 38 33 30 44 42 38 22 2c 0a 09 22 61 62 63  6C830DB8",.."abc
35d0: 22 2c 20 22 39 37 35 45 38 31 30 34 38 38 43 46  ", "975E810488CF
35e0: 32 41 33 44 34 39 38 33 38 34 37 38 31 32 34 41  2A3D49838478124A
35f0: 46 43 45 34 42 31 43 37 38 38 30 34 22 2c 0a 09  FCE4B1C78804",..
3600: 22 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 22  "message digest"
3610: 2c 20 22 32 33 33 38 44 42 43 38 36 33 38 44 33  , "2338DBC8638D3
3620: 31 32 32 35 46 37 33 30 38 36 32 34 36 42 41 35  1225F73086246BA5
3630: 32 39 46 39 36 37 31 30 42 43 36 22 2c 0a 09 22  29F96710BC6",.."
3640: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
3650: 71 72 73 74 75 76 77 78 79 7a 22 2c 20 22 35 39  qrstuvwxyz", "59
3660: 36 31 38 35 43 39 41 42 36 37 30 33 44 30 44 30  6185C9AB6703D0D0
3670: 44 42 42 39 38 37 30 32 42 43 30 46 35 37 32 39  DBB98702BC0F5729
3680: 43 44 31 44 33 43 22 2c 0a 09 22 54 68 65 20 71  CD1D3C",.."The q
3690: 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20 6a  uick brown fox j
36a0: 75 6d 70 73 20 6f 76 65 72 20 74 68 65 20 6c 61  umps over the la
36b0: 7a 79 20 64 6f 67 22 2c 20 22 41 42 45 32 42 38  zy dog", "ABE2B8
36c0: 43 37 31 31 46 39 45 38 35 37 39 41 41 38 45 42  C711F9E8579AA8EB
36d0: 34 30 37 35 37 41 32 37 42 34 45 46 31 34 41 37  40757A27B4EF14A7
36e0: 45 41 22 2c 0a 09 22 41 42 43 44 45 46 47 48 49  EA",.."ABCDEFGHI
36f0: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
3700: 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  Zabcdefghijklmno
3710: 70 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34  pqrstuvwxyz01234
3720: 35 36 37 38 39 22 2c 20 22 43 42 35 44 37 45 46  56789", "CB5D7EF
3730: 42 43 41 32 46 30 32 45 30 46 42 37 31 36 37 43  BCA2F02E0FB7167C
3740: 41 42 42 31 32 33 41 46 35 37 39 35 37 36 34 45  ABB123AF5795764E
3750: 35 22 2c 0a 09 22 31 32 33 34 35 36 37 38 39 30  5",.."1234567890
3760: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
3770: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
3780: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
3790: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
37a0: 35 36 37 38 39 30 22 2c 20 22 30 37 46 30 35 43  567890", "07F05C
37b0: 38 43 30 37 37 33 43 35 35 43 41 33 41 35 41 36  8C0773C55CA3A5A6
37c0: 39 35 43 45 36 41 43 41 34 43 34 33 38 39 31 31  95CE6ACA4C438911
37d0: 42 35 22 2c 0a 09 30 0a 7d 3b 0a 0a 2f 2a 20 75  B5",..0.};../* u
37e0: 6e 63 6f 6e 66 69 72 6d 65 64 20 74 65 73 74 20  nconfirmed test 
37f0: 76 65 63 74 6f 72 73 20 2a 2f 0a 63 6f 6e 73 74  vectors */.const
3800: 20 63 68 61 72 2a 20 73 68 61 32 32 34 5f 74 65   char* sha224_te
3810: 73 74 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20 22  sts[] = {.."", "
3820: 44 31 34 41 30 32 38 43 32 41 33 41 32 42 43 39  D14A028C2A3A2BC9
3830: 34 37 36 31 30 32 42 42 32 38 38 32 33 34 43 34  476102BB288234C4
3840: 31 35 41 32 42 30 31 46 38 32 38 45 41 36 32 41  15A2B01F828EA62A
3850: 43 35 42 33 45 34 32 46 22 2c 0a 09 22 61 22 2c  C5B3E42F",.."a",
3860: 20 22 41 42 44 33 37 35 33 34 43 37 44 39 41 32   "ABD37534C7D9A2
3870: 45 46 42 39 34 36 35 44 45 39 33 31 43 44 37 30  EFB9465DE931CD70
3880: 35 35 46 46 44 42 38 38 37 39 35 36 33 41 45 39  55FFDB8879563AE9
3890: 38 30 37 38 44 36 44 36 44 35 22 2c 0a 09 22 61  8078D6D6D5",.."a
38a0: 62 63 22 2c 20 22 32 33 30 39 37 44 32 32 33 34  bc", "23097D2234
38b0: 30 35 44 38 32 32 38 36 34 32 41 34 37 37 42 44  05D8228642A477BD
38c0: 41 32 35 35 42 33 32 41 41 44 42 43 45 34 42 44  A255B32AADBCE4BD
38d0: 41 30 42 33 46 37 45 33 36 43 39 44 41 37 22 2c  A0B3F7E36C9DA7",
38e0: 0a 09 22 6d 65 73 73 61 67 65 20 64 69 67 65 73  .."message diges
38f0: 74 22 2c 20 22 32 43 42 32 31 43 38 33 41 45 32  t", "2CB21C83AE2
3900: 46 30 30 34 44 45 37 45 38 31 43 33 43 37 30 31  F004DE7E81C3C701
3910: 39 43 42 43 42 36 35 42 37 31 41 42 36 35 36 42  9CBCB65B71AB656B
3920: 32 32 44 36 44 30 43 33 39 42 38 45 42 22 2c 0a  22D6D0C39B8EB",.
3930: 09 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  ."abcdefghijklmn
3940: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 2c 20 22  opqrstuvwxyz", "
3950: 34 35 41 35 46 37 32 43 33 39 43 35 43 46 46 32  45A5F72C39C5CFF2
3960: 35 32 32 45 42 33 34 32 39 37 39 39 45 34 39 45  522EB3429799E49E
3970: 35 46 34 34 42 33 35 36 45 46 39 32 36 42 43 46  5F44B356EF926BCF
3980: 33 39 30 44 43 43 43 32 22 2c 0a 09 22 54 68 65  390DCCC2",.."The
3990: 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78   quick brown fox
39a0: 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65 20   jumps over the 
39b0: 6c 61 7a 79 20 64 6f 67 22 2c 20 22 37 33 30 45  lazy dog", "730E
39c0: 31 30 39 42 44 37 41 38 41 33 32 42 31 43 42 39  109BD7A8A32B1CB9
39d0: 44 39 41 30 39 41 41 32 33 32 35 44 32 34 33 30  D9A09AA2325D2430
39e0: 35 38 37 44 44 42 43 30 43 33 38 42 41 44 39 31  587DDBC0C38BAD91
39f0: 31 35 32 35 22 2c 0a 09 22 61 62 63 64 62 63 64  1525",.."abcdbcd
3a00: 65 63 64 65 66 64 65 66 67 65 66 67 68 66 67 68  ecdefdefgefghfgh
3a10: 69 67 68 69 6a 68 69 6a 6b 69 6a 6b 6c 6a 6b 6c  ighijhijkijkljkl
3a20: 6d 6b 6c 6d 6e 6c 6d 6e 6f 6d 6e 6f 70 6e 6f 70  mklmnlmnomnopnop
3a30: 71 22 2c 20 22 37 35 33 38 38 42 31 36 35 31 32  q", "75388B16512
3a40: 37 37 36 43 43 35 44 42 41 35 44 41 31 46 44 38  776CC5DBA5DA1FD8
3a50: 39 30 31 35 30 42 30 43 36 34 35 35 43 42 34 46  90150B0C6455CB4F
3a60: 35 38 42 31 39 35 32 35 32 32 35 32 35 22 2c 0a  58B1952522525",.
3a70: 09 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e  ."ABCDEFGHIJKLMN
3a80: 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64  OPQRSTUVWXYZabcd
3a90: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
3aa0: 75 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39  uvwxyz0123456789
3ab0: 22 2c 20 22 42 46 46 37 32 42 34 46 43 42 37 44  ", "BFF72B4FCB7D
3ac0: 37 35 45 35 36 33 32 39 30 30 41 43 35 46 39 30  75E5632900AC5F90
3ad0: 44 32 31 39 45 30 35 45 39 37 41 37 42 44 45 37  D219E05E97A7BDE7
3ae0: 32 45 37 34 30 44 42 33 39 33 44 39 22 2c 0a 09  2E740DB393D9",..
3af0: 22 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  "123456789012345
3b00: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
3b10: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
3b20: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
3b30: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
3b40: 30 22 2c 20 22 42 35 30 41 45 43 42 45 34 45 39  0", "B50AECBE4E9
3b50: 42 42 30 42 35 37 42 43 35 46 33 41 45 37 36 30  BB0B57BC5F3AE760
3b60: 41 38 45 30 31 44 42 32 34 46 32 30 33 46 42 33  A8E01DB24F203FB3
3b70: 43 44 43 44 31 33 31 34 38 30 34 36 45 22 2c 0a  CDCD13148046E",.
3b80: 09 30 0a 7d 3b 0a 0a 2f 2a 20 74 65 73 74 20 76  .0.};../* test v
3b90: 65 63 74 6f 72 73 20 66 72 6f 6d 20 74 68 65 20  ectors from the 
3ba0: 4e 45 53 53 49 45 20 70 72 6f 6a 65 63 74 20 2a  NESSIE project *
3bb0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 2a 20 73 68  /.const char* sh
3bc0: 61 32 35 36 5f 74 65 73 74 73 5b 5d 20 3d 20 7b  a256_tests[] = {
3bd0: 0a 09 22 22 2c 20 22 45 33 42 30 43 34 34 32 39  .."", "E3B0C4429
3be0: 38 46 43 31 43 31 34 39 41 46 42 46 34 43 38 39  8FC1C149AFBF4C89
3bf0: 39 36 46 42 39 32 34 32 37 41 45 34 31 45 34 36  96FB92427AE41E46
3c00: 34 39 42 39 33 34 43 41 34 39 35 39 39 31 42 37  49B934CA495991B7
3c10: 38 35 32 42 38 35 35 22 2c 0a 09 22 61 22 2c 20  852B855",.."a", 
3c20: 22 43 41 39 37 38 31 31 32 43 41 31 42 42 44 43  "CA978112CA1BBDC
3c30: 41 46 41 43 32 33 31 42 33 39 41 32 33 44 43 34  AFAC231B39A23DC4
3c40: 44 41 37 38 36 45 46 46 38 31 34 37 43 34 45 37  DA786EFF8147C4E7
3c50: 32 42 39 38 30 37 37 38 35 41 46 45 45 34 38 42  2B9807785AFEE48B
3c60: 42 22 2c 0a 09 22 61 62 63 22 2c 20 22 42 41 37  B",.."abc", "BA7
3c70: 38 31 36 42 46 38 46 30 31 43 46 45 41 34 31 34  816BF8F01CFEA414
3c80: 31 34 30 44 45 35 44 41 45 32 32 32 33 42 30 30  140DE5DAE2223B00
3c90: 33 36 31 41 33 39 36 31 37 37 41 39 43 42 34 31  361A396177A9CB41
3ca0: 30 46 46 36 31 46 32 30 30 31 35 41 44 22 2c 0a  0FF61F20015AD",.
3cb0: 09 22 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  ."message digest
3cc0: 22 2c 20 22 46 37 38 34 36 46 35 35 43 46 32 33  ", "F7846F55CF23
3cd0: 45 31 34 45 45 42 45 41 42 35 42 34 45 31 35 35  E14EEBEAB5B4E155
3ce0: 30 43 41 44 35 42 35 30 39 45 33 33 34 38 46 42  0CAD5B509E3348FB
3cf0: 43 34 45 46 41 33 41 31 34 31 33 44 33 39 33 43  C4EFA3A1413D393C
3d00: 42 36 35 30 22 2c 0a 09 22 61 62 63 64 65 66 67  B650",.."abcdefg
3d10: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
3d20: 78 79 7a 22 2c 20 22 37 31 43 34 38 30 44 46 39  xyz", "71C480DF9
3d30: 33 44 36 41 45 32 46 31 45 46 41 44 31 34 34 37  3D6AE2F1EFAD1447
3d40: 43 36 36 43 39 35 32 35 45 33 31 36 32 31 38 43  C66C9525E316218C
3d50: 46 35 31 46 43 38 44 39 45 44 38 33 32 46 32 44  F51FC8D9ED832F2D
3d60: 41 46 31 38 42 37 33 22 2c 0a 09 22 54 68 65 20  AF18B73",.."The 
3d70: 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20  quick brown fox 
3d80: 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65 20 6c  jumps over the l
3d90: 61 7a 79 20 64 6f 67 22 2c 20 22 44 37 41 38 46  azy dog", "D7A8F
3da0: 42 42 33 30 37 44 37 38 30 39 34 36 39 43 41 39  BB307D7809469CA9
3db0: 41 42 43 42 30 30 38 32 45 34 46 38 44 35 36 35  ABCB0082E4F8D565
3dc0: 31 45 34 36 44 33 43 44 42 37 36 32 44 30 32 44  1E46D3CDB762D02D
3dd0: 30 42 46 33 37 43 39 45 35 39 32 22 2c 0a 09 22  0BF37C9E592",.."
3de0: 61 62 63 64 62 63 64 65 63 64 65 66 64 65 66 67  abcdbcdecdefdefg
3df0: 65 66 67 68 66 67 68 69 67 68 69 6a 68 69 6a 6b  efghfghighijhijk
3e00: 69 6a 6b 6c 6a 6b 6c 6d 6b 6c 6d 6e 6c 6d 6e 6f  ijkljklmklmnlmno
3e10: 6d 6e 6f 70 6e 6f 70 71 22 2c 20 22 32 34 38 44  mnopnopq", "248D
3e20: 36 41 36 31 44 32 30 36 33 38 42 38 45 35 43 30  6A61D20638B8E5C0
3e30: 32 36 39 33 30 43 33 45 36 30 33 39 41 33 33 43  26930C3E6039A33C
3e40: 45 34 35 39 36 34 46 46 32 31 36 37 46 36 45 43  E45964FF2167F6EC
3e50: 45 44 44 34 31 39 44 42 30 36 43 31 22 2c 0a 09  EDD419DB06C1",..
3e60: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
3e70: 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64 65  PQRSTUVWXYZabcde
3e80: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
3e90: 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39 22  vwxyz0123456789"
3ea0: 2c 20 22 44 42 34 42 46 43 42 44 34 44 41 30 43  , "DB4BFCBD4DA0C
3eb0: 44 38 35 41 36 30 43 33 43 33 37 44 33 46 42 44  D85A60C3C37D3FBD
3ec0: 38 38 30 35 43 37 37 46 31 35 46 43 36 42 31 46  8805C77F15FC6B1F
3ed0: 44 46 45 36 31 34 45 45 30 41 37 43 38 46 44 42  DFE614EE0A7C8FDB
3ee0: 34 43 30 22 2c 0a 09 22 31 32 33 34 35 36 37 38  4C0",.."12345678
3ef0: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
3f00: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
3f10: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
3f20: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
3f30: 33 34 35 36 37 38 39 30 22 2c 20 22 46 33 37 31  34567890", "F371
3f40: 42 43 34 41 33 31 31 46 32 42 30 30 39 45 45 46  BC4A311F2B009EEF
3f50: 39 35 32 44 44 38 33 43 41 38 30 45 32 42 36 30  952DD83CA80E2B60
3f60: 30 32 36 43 38 45 39 33 35 35 39 32 44 30 46 39  026C8E935592D0F9
3f70: 43 33 30 38 34 35 33 43 38 31 33 45 22 2c 0a 09  C308453C813E",..
3f80: 30 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 63 68 61 72  0.};..const char
3f90: 2a 20 73 68 61 33 38 34 5f 74 65 73 74 73 5b 5d  * sha384_tests[]
3fa0: 20 3d 20 7b 0a 09 22 22 2c 20 22 33 38 42 30 36   = {.."", "38B06
3fb0: 30 41 37 35 31 41 43 39 36 33 38 34 43 44 39 33  0A751AC96384CD93
3fc0: 32 37 45 42 31 42 31 45 33 36 41 32 31 46 44 42  27EB1B1E36A21FDB
3fd0: 37 31 31 31 34 42 45 30 37 34 33 34 43 30 43 43  71114BE07434C0CC
3fe0: 37 42 46 36 33 46 36 45 31 44 41 32 37 34 45 44  7BF63F6E1DA274ED
3ff0: 45 42 46 45 37 36 46 36 35 46 42 44 35 31 41 44  EBFE76F65FBD51AD
4000: 32 46 31 34 38 39 38 42 39 35 42 22 2c 0a 09 22  2F14898B95B",.."
4010: 61 22 2c 20 22 35 34 41 35 39 42 39 46 32 32 42  a", "54A59B9F22B
4020: 30 42 38 30 38 38 30 44 38 34 32 37 45 35 34 38  0B80880D8427E548
4030: 42 37 43 32 33 41 42 44 38 37 33 34 38 36 45 31  B7C23ABD873486E1
4040: 46 30 33 35 44 43 45 39 43 44 36 39 37 45 38 35  F035DCE9CD697E85
4050: 31 37 35 30 33 33 43 41 41 38 38 45 36 44 35 37  175033CAA88E6D57
4060: 42 43 33 35 45 46 41 45 30 42 35 41 46 44 33 31  BC35EFAE0B5AFD31
4070: 34 35 46 33 31 22 2c 0a 09 22 61 62 63 22 2c 20  45F31",.."abc", 
4080: 22 43 42 30 30 37 35 33 46 34 35 41 33 35 45 38  "CB00753F45A35E8
4090: 42 42 35 41 30 33 44 36 39 39 41 43 36 35 30 30  BB5A03D699AC6500
40a0: 37 32 37 32 43 33 32 41 42 30 45 44 45 44 31 36  7272C32AB0EDED16
40b0: 33 31 41 38 42 36 30 35 41 34 33 46 46 35 42 45  31A8B605A43FF5BE
40c0: 44 38 30 38 36 30 37 32 42 41 31 45 37 43 43 32  D8086072BA1E7CC2
40d0: 33 35 38 42 41 45 43 41 31 33 34 43 38 32 35 41  358BAECA134C825A
40e0: 37 22 2c 0a 09 22 6d 65 73 73 61 67 65 20 64 69  7",.."message di
40f0: 67 65 73 74 22 2c 20 22 34 37 33 45 44 33 35 31  gest", "473ED351
4100: 36 37 45 43 31 46 35 44 38 45 35 35 30 33 36 38  67EC1F5D8E550368
4110: 41 33 44 42 33 39 42 45 35 34 36 33 39 46 38 32  A3DB39BE54639F82
4120: 38 38 36 38 45 39 34 35 34 43 32 33 39 46 43 38  8868E9454C239FC8
4130: 42 35 32 45 33 43 36 31 44 42 44 30 44 38 42 34  B52E3C61DBD0D8B4
4140: 44 45 31 33 39 30 43 32 35 36 44 43 42 42 35 44  DE1390C256DCBB5D
4150: 35 46 44 39 39 43 44 35 22 2c 0a 09 22 61 62 63  5FD99CD5",.."abc
4160: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
4170: 74 75 76 77 78 79 7a 22 2c 20 22 46 45 42 36 37  tuvwxyz", "FEB67
4180: 33 34 39 44 46 33 44 42 36 46 35 39 32 34 38 31  349DF3DB6F592481
4190: 35 44 36 43 33 44 43 31 33 33 46 30 39 31 38 30  5D6C3DC133F09180
41a0: 39 32 31 33 37 33 31 46 45 35 43 37 42 35 46 34  9213731FE5C7B5F4
41b0: 39 39 39 45 34 36 33 34 37 39 46 46 32 38 37 37  999E463479FF2877
41c0: 46 35 46 32 39 33 36 46 41 36 33 42 42 34 33 37  F5F2936FA63BB437
41d0: 38 34 42 31 32 46 33 45 42 42 34 22 2c 0a 09 22  84B12F3EBB4",.."
41e0: 61 62 63 64 62 63 64 65 63 64 65 66 64 65 66 67  abcdbcdecdefdefg
41f0: 65 66 67 68 66 67 68 69 67 68 69 6a 68 69 6a 6b  efghfghighijhijk
4200: 69 6a 6b 6c 6a 6b 6c 6d 6b 6c 6d 6e 6c 6d 6e 6f  ijkljklmklmnlmno
4210: 6d 6e 6f 70 6e 6f 70 71 22 2c 20 22 33 33 39 31  mnopnopq", "3391
4220: 46 44 44 44 46 43 38 44 43 37 33 39 33 37 30 37  FDDDFC8DC7393707
4230: 41 36 35 42 31 42 34 37 30 39 33 39 37 43 46 38  A65B1B4709397CF8
4240: 42 31 44 31 36 32 41 46 30 35 41 42 46 45 38 46  B1D162AF05ABFE8F
4250: 34 35 30 44 45 35 46 33 36 42 43 36 42 30 34 35  450DE5F36BC6B045
4260: 35 41 38 35 32 30 42 43 34 45 36 46 35 46 45 39  5A8520BC4E6F5FE9
4270: 35 42 31 46 45 33 43 38 34 35 32 42 22 2c 0a 09  5B1FE3C8452B",..
4280: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
4290: 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64 65  PQRSTUVWXYZabcde
42a0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
42b0: 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39 22  vwxyz0123456789"
42c0: 2c 20 22 31 37 36 31 33 33 36 45 33 46 37 43 42  , "1761336E3F7CB
42d0: 46 45 35 31 44 45 42 31 33 37 46 30 32 36 46 38  FE51DEB137F026F8
42e0: 39 45 30 31 41 34 34 38 45 33 42 31 46 41 46 41  9E01A448E3B1FAFA
42f0: 36 34 30 33 39 43 31 34 36 34 45 45 38 37 33 32  64039C1464EE8732
4300: 46 31 31 41 35 33 34 31 41 36 46 34 31 45 30 43  F11A5341A6F41E0C
4310: 32 30 32 32 39 34 37 33 36 45 44 36 34 44 42 31  202294736ED64DB1
4320: 41 38 34 22 2c 0a 09 22 31 32 33 34 35 36 37 38  A84",.."12345678
4330: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
4340: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
4350: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4360: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
4370: 33 34 35 36 37 38 39 30 22 2c 20 22 42 31 32 39  34567890", "B129
4380: 33 32 42 30 36 32 37 44 31 43 30 36 30 39 34 32  32B0627D1C060942
4390: 46 35 34 34 37 37 36 34 31 35 35 36 35 35 42 44  F5447764155655BD
43a0: 34 44 41 30 43 39 41 46 41 36 44 44 39 42 39 45  4DA0C9AFA6DD9B9E
43b0: 46 35 33 31 32 39 41 46 31 42 38 46 42 30 31 39  F53129AF1B8FB019
43c0: 35 39 39 36 44 32 44 45 39 43 41 30 44 46 39 44  5996D2DE9CA0DF9D
43d0: 38 32 31 46 46 45 45 36 37 30 32 36 22 2c 0a 09  821FFEE67026",..
43e0: 30 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 63 68 61 72  0.};..const char
43f0: 2a 20 73 68 61 35 31 32 5f 74 65 73 74 73 5b 5d  * sha512_tests[]
4400: 20 3d 20 7b 0a 09 22 22 2c 20 22 43 46 38 33 45   = {.."", "CF83E
4410: 31 33 35 37 45 45 46 42 38 42 44 46 31 35 34 32  1357EEFB8BDF1542
4420: 38 35 30 44 36 36 44 38 30 30 37 44 36 32 30 45  850D66D8007D620E
4430: 34 30 35 30 42 35 37 31 35 44 43 38 33 46 34 41  4050B5715DC83F4A
4440: 39 32 31 44 33 36 43 45 39 43 45 34 37 44 30 44  921D36CE9CE47D0D
4450: 31 33 43 35 44 38 35 46 32 42 30 46 46 38 33 31  13C5D85F2B0FF831
4460: 38 44 32 38 37 37 45 45 43 32 46 36 33 42 39 33  8D2877EEC2F63B93
4470: 31 42 44 34 37 34 31 37 41 38 31 41 35 33 38 33  1BD47417A81A5383
4480: 32 37 41 46 39 32 37 44 41 33 45 22 2c 0a 09 22  27AF927DA3E",.."
4490: 61 22 2c 20 22 31 46 34 30 46 43 39 32 44 41 32  a", "1F40FC92DA2
44a0: 34 31 36 39 34 37 35 30 39 37 39 45 45 36 43 46  41694750979EE6CF
44b0: 35 38 32 46 32 44 35 44 37 44 32 38 45 31 38 33  582F2D5D7D28E183
44c0: 33 35 44 45 30 35 41 42 43 35 34 44 30 35 36 30  35DE05ABC54D0560
44d0: 45 30 46 35 33 30 32 38 36 30 43 36 35 32 42 46  E0F5302860C652BF
44e0: 30 38 44 35 36 30 32 35 32 41 41 35 45 37 34 32  08D560252AA5E742
44f0: 31 30 35 34 36 46 33 36 39 46 42 42 42 43 45 38  10546F369FBBBCE8
4500: 43 31 32 43 46 43 37 39 35 37 42 32 36 35 32 46  C12CFC7957B2652F
4510: 45 39 41 37 35 22 2c 0a 09 22 61 62 63 22 2c 20  E9A75",.."abc", 
4520: 22 44 44 41 46 33 35 41 31 39 33 36 31 37 41 42  "DDAF35A193617AB
4530: 41 43 43 34 31 37 33 34 39 41 45 32 30 34 31 33  ACC417349AE20413
4540: 31 31 32 45 36 46 41 34 45 38 39 41 39 37 45 41  112E6FA4E89A97EA
4550: 32 30 41 39 45 45 45 45 36 34 42 35 35 44 33 39  20A9EEEE64B55D39
4560: 41 32 31 39 32 39 39 32 41 32 37 34 46 43 31 41  A2192992A274FC1A
4570: 38 33 36 42 41 33 43 32 33 41 33 46 45 45 42 42  836BA3C23A3FEEBB
4580: 44 34 35 34 44 34 34 32 33 36 34 33 43 45 38 30  D454D4423643CE80
4590: 45 32 41 39 41 43 39 34 46 41 35 34 43 41 34 39  E2A9AC94FA54CA49
45a0: 46 22 2c 0a 09 22 6d 65 73 73 61 67 65 20 64 69  F",.."message di
45b0: 67 65 73 74 22 2c 20 22 31 30 37 44 42 46 33 38  gest", "107DBF38
45c0: 39 44 39 45 39 46 37 31 41 33 41 39 35 46 36 43  9D9E9F71A3A95F6C
45d0: 30 35 35 42 39 32 35 31 42 43 35 32 36 38 43 32  055B9251BC5268C2
45e0: 42 45 31 36 44 36 43 31 33 34 39 32 45 41 34 35  BE16D6C13492EA45
45f0: 42 30 31 39 39 46 33 33 30 39 45 31 36 34 35 35  B0199F3309E16455
4600: 41 42 31 45 39 36 31 31 38 45 38 41 39 30 35 44  AB1E96118E8A905D
4610: 35 35 39 37 42 37 32 30 33 38 44 44 42 33 37 32  5597B72038DDB372
4620: 41 38 39 38 32 36 30 34 36 44 45 36 36 36 38 37  A89826046DE66687
4630: 42 42 34 32 30 45 37 43 22 2c 0a 09 22 61 62 63  BB420E7C",.."abc
4640: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
4650: 74 75 76 77 78 79 7a 22 2c 20 22 34 44 42 46 46  tuvwxyz", "4DBFF
4660: 38 36 43 43 32 43 41 31 42 41 45 31 45 31 36 34  86CC2CA1BAE1E164
4670: 36 38 41 30 35 43 42 39 38 38 31 43 39 37 46 31  68A05CB9881C97F1
4680: 37 35 33 42 43 45 33 36 31 39 30 33 34 38 39 38  753BCE3619034898
4690: 46 41 41 31 41 41 42 45 34 32 39 39 35 35 41 31  FAA1AABE429955A1
46a0: 42 46 38 45 43 34 38 33 44 37 34 32 31 46 45 33  BF8EC483D7421FE3
46b0: 43 31 36 34 36 36 31 33 41 35 39 45 44 35 34 34  C1646613A59ED544
46c0: 31 46 42 30 46 33 32 31 33 38 39 46 37 37 46 34  1FB0F321389F77F4
46d0: 38 41 38 37 39 43 37 42 31 46 31 22 2c 0a 09 22  8A879C7B1F1",.."
46e0: 61 62 63 64 62 63 64 65 63 64 65 66 64 65 66 67  abcdbcdecdefdefg
46f0: 65 66 67 68 66 67 68 69 67 68 69 6a 68 69 6a 6b  efghfghighijhijk
4700: 69 6a 6b 6c 6a 6b 6c 6d 6b 6c 6d 6e 6c 6d 6e 6f  ijkljklmklmnlmno
4710: 6d 6e 6f 70 6e 6f 70 71 22 2c 20 22 32 30 34 41  mnopnopq", "204A
4720: 38 46 43 36 44 44 41 38 32 46 30 41 30 43 45 44  8FC6DDA82F0A0CED
4730: 37 42 45 42 38 45 30 38 41 34 31 36 35 37 43 31  7BEB8E08A41657C1
4740: 36 45 46 34 36 38 42 32 32 38 41 38 32 37 39 42  6EF468B228A8279B
4750: 45 33 33 31 41 37 30 33 43 33 33 35 39 36 46 44  E331A703C33596FD
4760: 31 35 43 31 33 42 31 42 30 37 46 39 41 41 31 44  15C13B1B07F9AA1D
4770: 33 42 45 41 35 37 37 38 39 43 41 30 33 31 41 44  3BEA57789CA031AD
4780: 38 35 43 37 41 37 31 44 44 37 30 33 35 34 45 43  85C7A71DD70354EC
4790: 36 33 31 32 33 38 43 41 33 34 34 35 22 2c 0a 09  631238CA3445",..
47a0: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
47b0: 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64 65  PQRSTUVWXYZabcde
47c0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
47d0: 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39 22  vwxyz0123456789"
47e0: 2c 20 22 31 45 30 37 42 45 32 33 43 32 36 41 38  , "1E07BE23C26A8
47f0: 36 45 41 33 37 45 41 38 31 30 43 38 45 43 37 38  6EA37EA810C8EC78
4800: 30 39 33 35 32 35 31 35 41 39 37 30 45 39 32 35  09352515A970E925
4810: 33 43 32 36 46 35 33 36 43 46 43 37 41 39 39 39  3C26F536CFC7A999
4820: 36 43 34 35 43 38 33 37 30 35 38 33 45 30 41 37  6C45C8370583E0A7
4830: 38 46 41 34 41 39 30 30 34 31 44 37 31 41 34 43  8FA4A90041D71A4C
4840: 45 41 42 37 34 32 33 46 31 39 43 37 31 42 39 44  EAB7423F19C71B9D
4850: 35 41 33 45 30 31 32 34 39 46 30 42 45 42 44 35  5A3E01249F0BEBD5
4860: 38 39 34 22 2c 0a 09 22 31 32 33 34 35 36 37 38  894",.."12345678
4870: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
4880: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
4890: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
48a0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
48b0: 33 34 35 36 37 38 39 30 22 2c 20 22 37 32 45 43  34567890", "72EC
48c0: 31 45 46 31 31 32 34 41 34 35 42 30 34 37 45 38  1EF1124A45B047E8
48d0: 42 37 43 37 35 41 39 33 32 31 39 35 31 33 35 42  B7C75A932195135B
48e0: 42 36 31 44 45 32 34 45 43 30 44 31 39 31 34 30  B61DE24EC0D19140
48f0: 34 32 32 34 36 45 30 41 45 43 33 41 32 33 35 34  42246E0AEC3A2354
4900: 45 30 39 33 44 37 36 46 33 30 34 38 42 34 35 36  E093D76F3048B456
4910: 37 36 34 33 34 36 39 30 30 43 42 31 33 30 44 32  764346900CB130D2
4920: 41 34 46 44 35 44 44 31 36 41 42 42 35 45 33 30  A4FD5DD16ABB5E30
4930: 42 43 42 38 35 30 44 45 45 38 34 33 22 2c 0a 09  BCB850DEE843",..
4940: 30 0a 7d 3b 0a 0a 2f 2a 20 53 48 41 33 20 74 65  0.};../* SHA3 te
4950: 73 74 20 76 65 63 74 6f 72 73 20 77 65 72 65 20  st vectors were 
4960: 76 65 72 69 66 69 65 64 20 62 79 20 74 68 65 20  verified by the 
4970: 72 65 66 65 72 65 6e 63 65 20 69 6d 70 6c 65 6d  reference implem
4980: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 4b 65 63 63  entation of Kecc
4990: 61 6b 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  ak */.const char
49a0: 2a 20 73 68 61 33 5f 32 32 34 5f 74 65 73 74 73  * sha3_224_tests
49b0: 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20 22 36 42 34  [] = {.."", "6B4
49c0: 45 30 33 34 32 33 36 36 37 44 42 42 37 33 42 36  E03423667DBB73B6
49d0: 45 31 35 34 35 34 46 30 45 42 31 41 42 44 34 35  E15454F0EB1ABD45
49e0: 39 37 46 39 41 31 42 30 37 38 45 33 46 35 42 35  97F9A1B078E3F5B5
49f0: 41 36 42 43 37 22 2c 0a 09 22 61 22 2c 20 22 39  A6BC7",.."a", "9
4a00: 45 38 36 46 46 36 39 35 35 37 43 41 39 35 46 34  E86FF69557CA95F4
4a10: 30 35 46 30 38 31 32 36 39 36 38 35 42 33 38 45  05F081269685B38E
4a20: 33 41 38 31 39 42 33 30 39 45 45 39 34 32 46 34  3A819B309EE942F4
4a30: 38 32 42 36 41 38 42 22 2c 0a 09 22 61 62 63 22  82B6A8B",.."abc"
4a40: 2c 20 22 45 36 34 32 38 32 34 43 33 46 38 43 46  , "E642824C3F8CF
4a50: 32 34 41 44 30 39 32 33 34 45 45 37 44 33 43 37  24AD09234EE7D3C7
4a60: 36 36 46 43 39 41 33 41 35 31 36 38 44 30 43 39  66FC9A3A5168D0C9
4a70: 34 41 44 37 33 42 34 36 46 44 46 22 2c 0a 09 22  4AD73B46FDF",.."
4a80: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 22 2c  message digest",
4a90: 20 22 31 38 37 36 38 42 42 34 43 34 38 45 42 37   "18768BB4C48EB7
4aa0: 46 43 38 38 45 35 44 44 42 31 37 45 46 43 46 32  FC88E5DDB17EFCF2
4ab0: 39 36 34 41 42 44 37 37 39 38 41 33 39 44 38 36  964ABD7798A39D86
4ac0: 41 34 42 34 41 31 45 34 43 38 22 2c 0a 09 22 61  A4B4A1E4C8",.."a
4ad0: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
4ae0: 72 73 74 75 76 77 78 79 7a 22 2c 20 22 35 43 44  rstuvwxyz", "5CD
4af0: 45 43 41 38 31 45 31 32 33 46 38 37 43 41 44 39  ECA81E123F87CAD9
4b00: 36 42 39 43 42 41 39 39 39 46 31 36 46 36 44 34  6B9CBA999F16F6D4
4b10: 31 35 34 39 36 30 38 44 34 45 30 46 34 36 38 31  1549608D4E0F4681
4b20: 42 38 32 33 39 22 2c 0a 09 22 41 42 43 44 45 46  B8239",.."ABCDEF
4b30: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
4b40: 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c  WXYZabcdefghijkl
4b50: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31  mnopqrstuvwxyz01
4b60: 32 33 34 35 36 37 38 39 22 2c 20 22 41 36 37 43  23456789", "A67C
4b70: 32 38 39 42 38 32 35 30 41 36 46 34 33 37 41 32  289B8250A6F437A2
4b80: 30 31 33 37 39 38 35 44 36 30 35 35 38 39 41 38  0137985D605589A8
4b90: 43 31 36 33 44 34 35 32 36 31 42 31 35 34 31 39  C163D45261B15419
4ba0: 35 35 36 45 22 2c 0a 09 22 31 32 33 34 35 36 37  556E",.."1234567
4bb0: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
4bc0: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
4bd0: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
4be0: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
4bf0: 32 33 34 35 36 37 38 39 30 22 2c 20 22 30 35 32  234567890", "052
4c00: 36 38 39 38 45 31 38 35 38 36 39 46 39 31 42 33  6898E185869F91B3
4c10: 45 32 41 37 36 44 44 37 32 41 31 35 44 43 36 39  E2A76DD72A15DC69
4c20: 34 30 41 36 37 43 38 31 36 34 41 30 34 34 43 44  40A67C8164A044CD
4c30: 32 35 43 43 38 22 2c 0a 09 22 54 68 65 20 71 75  25CC8",.."The qu
4c40: 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20 6a 75  ick brown fox ju
4c50: 6d 70 73 20 6f 76 65 72 20 74 68 65 20 6c 61 7a  mps over the laz
4c60: 79 20 64 6f 67 22 2c 20 22 44 31 35 44 41 44 43  y dog", "D15DADC
4c70: 45 41 41 34 44 35 44 37 42 42 33 42 34 38 46 34  EAA4D5D7BB3B48F4
4c80: 34 36 34 32 31 44 35 34 32 45 30 38 41 44 38 38  46421D542E08AD88
4c90: 38 37 33 30 35 45 32 38 44 35 38 33 33 35 37 39  87305E28D5833579
4ca0: 35 22 2c 0a 09 30 0a 7d 3b 0a 63 6f 6e 73 74 20  5",..0.};.const 
4cb0: 63 68 61 72 2a 20 73 68 61 33 5f 32 35 36 5f 74  char* sha3_256_t
4cc0: 65 73 74 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20  ests[] = {.."", 
4cd0: 22 41 37 46 46 43 36 46 38 42 46 31 45 44 37 36  "A7FFC6F8BF1ED76
4ce0: 36 35 31 43 31 34 37 35 36 41 30 36 31 44 36 36  651C14756A061D66
4cf0: 32 46 35 38 30 46 46 34 44 45 34 33 42 34 39 46  2F580FF4DE43B49F
4d00: 41 38 32 44 38 30 41 34 42 38 30 46 38 34 33 34  A82D80A4B80F8434
4d10: 41 22 2c 0a 09 22 61 22 2c 20 22 38 30 30 38 34  A",.."a", "80084
4d20: 42 46 32 46 42 41 30 32 34 37 35 37 32 36 46 45  BF2FBA02475726FE
4d30: 42 32 43 41 42 32 44 38 32 31 35 45 41 42 31 34  B2CAB2D8215EAB14
4d40: 42 43 36 42 44 44 38 42 46 42 32 43 38 31 35 31  BC6BDD8BFB2C8151
4d50: 32 35 37 30 33 32 45 43 44 38 42 22 2c 0a 09 22  257032ECD8B",.."
4d60: 61 62 63 22 2c 20 22 33 41 39 38 35 44 41 37 34  abc", "3A985DA74
4d70: 46 45 32 32 35 42 32 30 34 35 43 31 37 32 44 36  FE225B2045C172D6
4d80: 42 44 33 39 30 42 44 38 35 35 46 30 38 36 45 33  BD390BD855F086E3
4d90: 45 39 44 35 32 35 42 34 36 42 46 45 32 34 35 31  E9D525B46BFE2451
4da0: 31 34 33 31 35 33 32 22 2c 0a 09 22 6d 65 73 73  1431532",.."mess
4db0: 61 67 65 20 64 69 67 65 73 74 22 2c 20 22 45 44  age digest", "ED
4dc0: 43 44 42 32 30 36 39 33 36 36 45 37 35 32 34 33  CDB2069366E75243
4dd0: 38 36 30 43 31 38 43 33 41 31 31 34 36 35 45 43  860C18C3A11465EC
4de0: 41 33 34 42 43 45 36 31 34 33 44 33 30 43 38 36  A34BCE6143D30C86
4df0: 36 35 43 45 46 43 46 44 33 32 42 46 46 44 22 2c  65CEFCFD32BFFD",
4e00: 0a 09 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  .."abcdefghijklm
4e10: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 2c 20  nopqrstuvwxyz", 
4e20: 22 37 43 41 42 32 44 43 37 36 35 45 32 31 42 32  "7CAB2DC765E21B2
4e30: 34 31 44 42 43 31 43 32 35 35 43 45 36 32 30 42  41DBC1C255CE620B
4e40: 32 39 46 35 32 37 43 36 44 35 45 37 46 35 46 38  29F527C6D5E7F5F8
4e50: 34 33 45 35 36 32 38 38 46 30 44 37 30 37 35 32  43E56288F0D70752
4e60: 31 22 2c 0a 09 22 41 42 43 44 45 46 47 48 49 4a  1",.."ABCDEFGHIJ
4e70: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
4e80: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
4e90: 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35  qrstuvwxyz012345
4ea0: 36 37 38 39 22 2c 20 22 41 37 39 44 36 41 39 44  6789", "A79D6A9D
4eb0: 41 34 37 46 30 34 41 33 42 39 41 39 33 32 33 45  A47F04A3B9A9323E
4ec0: 43 39 39 39 31 46 32 31 30 35 44 34 43 37 38 41  C9991F2105D4C78A
4ed0: 37 42 43 37 42 45 45 42 31 30 33 38 35 35 41 37  7BC7BEEB103855A7
4ee0: 41 31 31 44 46 42 39 46 22 2c 0a 09 22 31 32 33  A11DFB9F",.."123
4ef0: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
4f00: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
4f10: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
4f20: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
4f30: 38 39 30 31 32 33 34 35 36 37 38 39 30 22 2c 20  8901234567890", 
4f40: 22 32 39 33 45 35 43 45 34 43 45 35 34 45 45 37  "293E5CE4CE54EE7
4f50: 31 39 39 30 41 42 30 36 45 35 31 31 42 37 43 43  1990AB06E511B7CC
4f60: 44 36 32 37 32 32 42 31 42 45 42 34 31 34 46 35  D62722B1BEB414F5
4f70: 46 46 36 35 43 38 32 37 34 45 30 46 35 42 45 31  FF65C8274E0F5BE1
4f80: 44 22 2c 0a 09 22 54 68 65 20 71 75 69 63 6b 20  D",.."The quick 
4f90: 62 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20  brown fox jumps 
4fa0: 6f 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f  over the lazy do
4fb0: 67 22 2c 20 22 36 39 30 37 30 44 44 41 30 31 39  g", "69070DDA019
4fc0: 37 35 43 38 43 31 32 30 43 33 41 41 44 41 31 42  75C8C120C3AADA1B
4fd0: 32 38 32 33 39 34 45 37 46 30 33 32 46 41 39 43  282394E7F032FA9C
4fe0: 46 33 32 46 34 43 42 32 32 35 39 41 30 38 39 37  F32F4CB2259A0897
4ff0: 44 46 43 30 34 22 2c 0a 09 30 0a 7d 3b 0a 63 6f  DFC04",..0.};.co
5000: 6e 73 74 20 63 68 61 72 2a 20 73 68 61 33 5f 33  nst char* sha3_3
5010: 38 34 5f 74 65 73 74 73 5b 5d 20 3d 20 7b 0a 09  84_tests[] = {..
5020: 22 22 2c 20 22 30 43 36 33 41 37 35 42 38 34 35  "", "0C63A75B845
5030: 45 34 46 37 44 30 31 31 30 37 44 38 35 32 45 34  E4F7D01107D852E4
5040: 43 32 34 38 35 43 35 31 41 35 30 41 41 41 41 39  C2485C51A50AAAA9
5050: 34 46 43 36 31 39 39 35 45 37 31 42 42 45 45 39  4FC61995E71BBEE9
5060: 38 33 41 32 41 43 33 37 31 33 38 33 31 32 36 34  83A2AC3713831264
5070: 41 44 42 34 37 46 42 36 42 44 31 45 30 35 38 44  ADB47FB6BD1E058D
5080: 35 46 30 30 34 22 2c 0a 09 22 61 22 2c 20 22 31  5F004",.."a", "1
5090: 38 31 35 46 37 37 34 46 33 32 30 34 39 31 42 34  815F774F320491B4
50a0: 38 35 36 39 45 46 45 43 37 39 34 44 32 34 39 45  8569EFEC794D249E
50b0: 45 42 35 39 41 41 45 34 36 44 32 32 42 46 37 37  EB59AAE46D22BF77
50c0: 44 41 46 45 32 35 43 35 45 44 43 32 38 44 37 45  DAFE25C5EDC28D7E
50d0: 41 34 34 46 39 33 45 45 31 32 33 34 41 41 38 38  A44F93EE1234AA88
50e0: 46 36 31 43 39 31 39 31 32 41 34 43 43 44 39 22  F61C91912A4CCD9"
50f0: 2c 0a 09 22 61 62 63 22 2c 20 22 45 43 30 31 34  ,.."abc", "EC014
5100: 39 38 32 38 38 35 31 36 46 43 39 32 36 34 35 39  98288516FC926459
5110: 46 35 38 45 32 43 36 41 44 38 44 46 39 42 34 37  F58E2C6AD8DF9B47
5120: 33 43 42 30 46 43 30 38 43 32 35 39 36 44 41 37  3CB0FC08C2596DA7
5130: 43 46 30 45 34 39 42 45 34 42 32 39 38 44 38 38  CF0E49BE4B298D88
5140: 43 45 41 39 32 37 41 43 37 46 35 33 39 46 31 45  CEA927AC7F539F1E
5150: 44 46 32 32 38 33 37 36 44 32 35 22 2c 0a 09 22  DF228376D25",.."
5160: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 22 2c  message digest",
5170: 20 22 44 39 35 31 39 37 30 39 46 34 34 41 46 37   "D9519709F44AF7
5180: 33 45 32 43 38 45 32 39 31 31 30 39 41 39 37 39  3E2C8E291109A979
5190: 44 45 33 44 36 31 44 43 30 32 42 46 36 39 44 45  DE3D61DC02BF69DE
51a0: 46 37 46 42 46 46 44 46 46 46 45 36 36 32 37 35  F7FBFFDFFFE66275
51b0: 31 35 31 33 46 31 39 41 44 35 37 45 31 37 44 34  1513F19AD57E17D4
51c0: 42 39 33 42 41 31 45 34 38 34 46 43 31 39 38 30  B93BA1E484FC1980
51d0: 44 35 22 2c 0a 09 22 61 62 63 64 65 66 67 68 69  D5",.."abcdefghi
51e0: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
51f0: 7a 22 2c 20 22 46 45 44 33 39 39 44 32 32 31 37  z", "FED399D2217
5200: 41 41 46 34 43 37 31 37 41 44 30 43 35 31 30 32  AAF4C717AD0C5102
5210: 43 31 35 35 38 39 45 31 43 39 39 30 43 43 32 42  C15589E1C990CC2B
5220: 39 41 35 30 32 39 30 35 36 41 37 46 37 34 38 35  9A5029056A7F7485
5230: 38 38 38 44 36 41 42 36 35 44 42 32 33 37 30 30  888D6AB65DB23700
5240: 37 37 41 35 43 41 44 42 35 33 46 43 39 32 38 30  77A5CADB53FC9280
5250: 44 32 37 38 46 22 2c 0a 09 22 41 42 43 44 45 46  D278F",.."ABCDEF
5260: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
5270: 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c  WXYZabcdefghijkl
5280: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31  mnopqrstuvwxyz01
5290: 32 33 34 35 36 37 38 39 22 2c 20 22 44 35 42 39  23456789", "D5B9
52a0: 37 32 33 30 32 46 35 30 38 30 44 30 38 33 30 45  72302F5080D0830E
52b0: 30 44 45 37 42 36 42 32 43 46 33 38 33 36 36 35  0DE7B6B2CF383665
52c0: 41 30 30 38 46 34 43 34 46 33 38 36 41 36 31 31  A008F4C4F386A611
52d0: 31 32 36 35 32 43 37 34 32 44 32 30 43 42 34 35  12652C742D20CB45
52e0: 41 41 35 31 42 44 34 46 35 34 32 46 43 37 33 33  AA51BD4F542FC733
52f0: 45 32 37 31 39 45 39 39 39 32 39 31 22 2c 0a 09  E2719E999291",..
5300: 22 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  "123456789012345
5310: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
5320: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
5330: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
5340: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
5350: 30 22 2c 20 22 33 43 32 31 33 41 31 37 46 35 31  0", "3C213A17F51
5360: 34 36 33 38 41 43 42 33 42 46 31 37 46 31 30 39  4638ACB3BF17F109
5370: 46 33 45 32 34 43 31 36 46 39 46 31 34 46 30 38  F3E24C16F9F14F08
5380: 35 42 35 32 41 32 46 32 42 38 31 41 44 43 30 44  5B52A2F2B81ADC0D
5390: 42 38 33 44 46 31 41 35 38 44 42 32 43 45 30 31  B83DF1A58DB2CE01
53a0: 33 31 39 31 42 38 42 41 37 32 44 38 46 41 45 37  3191B8BA72D8FAE7
53b0: 45 32 41 35 45 22 2c 0a 09 22 54 68 65 20 71 75  E2A5E",.."The qu
53c0: 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20 6a 75  ick brown fox ju
53d0: 6d 70 73 20 6f 76 65 72 20 74 68 65 20 6c 61 7a  mps over the laz
53e0: 79 20 64 6f 67 22 2c 20 22 37 30 36 33 34 36 35  y dog", "7063465
53f0: 45 30 38 41 39 33 42 43 45 33 31 43 44 38 39 44  E08A93BCE31CD89D
5400: 32 45 33 43 41 38 46 36 30 32 34 39 38 36 39 36  2E3CA8F602498696
5410: 45 32 35 33 35 39 32 45 44 32 36 46 30 37 42 46  E253592ED26F07BF
5420: 37 45 37 30 33 43 46 33 32 38 35 38 31 45 31 34  7E703CF328581E14
5430: 37 31 41 37 42 41 37 41 42 31 31 39 42 31 41 39  71A7BA7AB119B1A9
5440: 45 42 44 46 38 42 45 34 31 22 2c 0a 09 30 0a 7d  EBDF8BE41",..0.}
5450: 3b 0a 63 6f 6e 73 74 20 63 68 61 72 2a 20 73 68  ;.const char* sh
5460: 61 33 5f 35 31 32 5f 74 65 73 74 73 5b 5d 20 3d  a3_512_tests[] =
5470: 20 7b 0a 09 22 22 2c 20 22 41 36 39 46 37 33 43   {.."", "A69F73C
5480: 43 41 32 33 41 39 41 43 35 43 38 42 35 36 37 44  CA23A9AC5C8B567D
5490: 43 31 38 35 41 37 35 36 45 39 37 43 39 38 32 31  C185A756E97C9821
54a0: 36 34 46 45 32 35 38 35 39 45 30 44 31 44 43 43  64FE25859E0D1DCC
54b0: 31 34 37 35 43 38 30 41 36 31 35 42 32 31 32 33  1475C80A615B2123
54c0: 41 46 31 46 35 46 39 34 43 31 31 45 33 45 39 34  AF1F5F94C11E3E94
54d0: 30 32 43 33 41 43 35 35 38 46 35 30 30 31 39 39  02C3AC558F500199
54e0: 44 39 35 42 36 44 33 45 33 30 31 37 35 38 35 38  D95B6D3E30175858
54f0: 36 32 38 31 44 43 44 32 36 22 2c 0a 09 22 61 22  6281DCD26",.."a"
5500: 2c 20 22 36 39 37 46 32 44 38 35 36 31 37 32 43  , "697F2D856172C
5510: 42 38 33 30 39 44 36 42 38 42 39 37 44 41 43 34  B8309D6B8B97DAC4
5520: 44 45 33 34 34 42 35 34 39 44 34 44 45 45 36 31  DE344B549D4DEE61
5530: 45 44 46 42 34 39 36 32 44 38 36 39 38 42 37 46  EDFB4962D8698B7F
5540: 41 38 30 33 46 34 46 39 33 46 46 32 34 33 39 33  A803F4F93FF24393
5550: 35 38 36 45 32 38 42 35 42 39 35 37 41 43 33 44  586E28B5B957AC3D
5560: 31 44 33 36 39 34 32 30 43 45 35 33 33 33 32 37  1D369420CE533327
5570: 31 32 46 39 39 37 42 44 33 33 36 44 30 39 41 42  12F997BD336D09AB
5580: 30 32 41 22 2c 0a 09 22 61 62 63 22 2c 20 22 42  02A",.."abc", "B
5590: 37 35 31 38 35 30 42 31 41 35 37 31 36 38 41 35  751850B1A57168A5
55a0: 36 39 33 43 44 39 32 34 42 36 42 30 39 36 45 30  693CD924B6B096E0
55b0: 38 46 36 32 31 38 32 37 34 34 34 46 37 30 44 38  8F621827444F70D8
55c0: 38 34 46 35 44 30 32 34 30 44 32 37 31 32 45 31  84F5D0240D2712E1
55d0: 30 45 31 31 36 45 39 31 39 32 41 46 33 43 39 31  0E116E9192AF3C91
55e0: 41 37 45 43 35 37 36 34 37 45 33 39 33 34 30 35  A7EC57647E393405
55f0: 37 33 34 30 42 34 43 46 34 30 38 44 35 41 35 36  7340B4CF408D5A56
5600: 35 39 32 46 38 32 37 34 45 45 43 35 33 46 30 22  592F8274EEC53F0"
5610: 2c 0a 09 22 6d 65 73 73 61 67 65 20 64 69 67 65  ,.."message dige
5620: 73 74 22 2c 20 22 33 34 34 34 45 31 35 35 38 38  st", "3444E15588
5630: 31 46 41 31 35 35 31 31 46 35 37 37 32 36 43 37  1FA15511F57726C7
5640: 44 37 43 46 45 38 30 33 30 32 41 37 34 33 33 30  D7CFE80302A74330
5650: 36 37 42 32 39 44 35 39 41 37 31 34 31 35 43 41  67B29D59A71415CA
5660: 39 44 44 31 34 31 41 43 38 39 32 44 33 31 30 42  9DD141AC892D310B
5670: 43 34 44 37 38 31 32 38 43 39 38 46 44 41 38 33  C4D78128C98FDA83
5680: 39 44 31 38 44 37 46 30 35 35 36 46 32 46 45 37  9D18D7F0556F2FE7
5690: 41 43 42 33 43 30 43 44 41 34 42 46 46 33 41 32  ACB3C0CDA4BFF3A2
56a0: 35 46 35 46 35 39 22 2c 0a 09 22 61 62 63 64 65  5F5F59",.."abcde
56b0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
56c0: 76 77 78 79 7a 22 2c 20 22 41 46 33 32 38 44 31  vwxyz", "AF328D1
56d0: 37 46 41 32 38 37 35 33 41 33 43 39 46 35 43 42  7FA28753A3C9F5CB
56e0: 37 32 45 33 37 36 42 39 30 34 34 30 42 39 36 46  72E376B90440B96F
56f0: 30 32 38 39 45 35 37 30 33 42 37 32 39 33 32 34  0289E5703B729324
5700: 41 39 37 35 41 42 33 38 34 45 44 41 35 36 35 46  A975AB384EDA565F
5710: 43 39 32 41 41 44 45 44 31 34 33 36 36 39 39 30  C92AADED14366990
5720: 30 44 37 36 31 38 36 31 36 38 37 41 43 44 43 30  0D761861687ACDC0
5730: 41 35 46 46 41 33 35 38 42 44 30 35 37 31 41 41  A5FFA358BD0571AA
5740: 41 44 38 30 41 43 41 36 38 22 2c 0a 09 22 41 42  AD80ACA68",.."AB
5750: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
5760: 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68  STUVWXYZabcdefgh
5770: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
5780: 79 7a 30 31 32 33 34 35 36 37 38 39 22 2c 20 22  yz0123456789", "
5790: 44 31 44 42 31 37 42 34 37 34 35 42 32 35 35 45  D1DB17B4745B255E
57a0: 35 45 42 31 35 39 46 36 36 35 39 33 43 43 39 43  5EB159F66593CC9C
57b0: 31 34 33 38 35 30 39 37 39 46 43 37 41 33 39 35  143850979FC7A395
57c0: 31 37 39 36 41 42 41 38 30 31 36 35 41 41 42 35  1796ABA80165AAB5
57d0: 33 36 42 34 36 31 37 34 43 45 31 39 45 33 46 37  36B46174CE19E3F7
57e0: 30 37 46 30 45 35 43 36 34 38 37 46 35 46 30 33  07F0E5C6487F5F03
57f0: 30 38 34 42 43 30 45 43 39 34 36 31 36 39 31 45  084BC0EC9461691E
5800: 46 32 30 31 31 33 45 34 32 41 44 32 38 31 36 33  F20113E42AD28163
5810: 22 2c 0a 09 22 31 32 33 34 35 36 37 38 39 30 31  ",.."12345678901
5820: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
5830: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
5840: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
5850: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
5860: 36 37 38 39 30 22 2c 20 22 39 35 32 34 42 39 41  67890", "9524B9A
5870: 35 35 33 36 42 39 31 30 36 39 35 32 36 42 34 46  5536B91069526B4F
5880: 36 31 39 36 42 37 45 39 34 37 35 42 34 44 41 36  6196B7E9475B4DA6
5890: 39 45 30 31 46 30 43 38 35 35 37 39 37 46 32 32  9E01F0C855797F22
58a0: 34 43 44 37 33 33 35 44 44 42 32 38 36 46 44 39  4CD7335DDB286FD9
58b0: 39 42 39 42 33 32 46 46 45 33 33 42 35 39 41 44  9B9B32FFE33B59AD
58c0: 34 32 34 43 43 31 37 34 34 46 36 45 42 35 39 31  424CC1744F6EB591
58d0: 33 37 46 35 46 42 38 36 30 31 39 33 32 45 38 41  37F5FB8601932E8A
58e0: 38 41 46 30 41 45 39 33 30 22 2c 0a 09 22 54 68  8AF0AE930",.."Th
58f0: 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f  e quick brown fo
5900: 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65  x jumps over the
5910: 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22 30 31 44   lazy dog", "01D
5920: 45 44 44 35 44 45 34 45 46 31 34 36 34 32 34 34  EDD5DE4EF1464244
5930: 35 42 41 35 46 35 42 39 37 43 31 35 45 34 37 42  5BA5F5B97C15E47B
5940: 39 41 44 39 33 31 33 32 36 45 34 42 30 37 32 37  9AD931326E4B0727
5950: 43 44 39 34 43 45 46 43 34 34 46 46 46 32 33 46  CD94CEFC44FFF23F
5960: 30 37 42 46 35 34 33 31 33 39 39 33 39 42 34 39  07BF543139939B49
5970: 31 32 38 43 41 46 34 33 36 44 43 31 42 44 45 45  128CAF436DC1BDEE
5980: 35 34 46 43 42 32 34 30 32 33 41 30 38 44 39 34  54FCB24023A08D94
5990: 30 33 46 39 42 34 42 46 30 44 34 35 30 22 2c 0a  03F9B4BF0D450",.
59a0: 09 30 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 55 53  .0.};..#ifdef US
59b0: 45 5f 4b 45 43 43 41 4b 0a 63 6f 6e 73 74 20 63  E_KECCAK.const c
59c0: 68 61 72 2a 20 6b 65 63 63 61 6b 5f 32 32 34 5f  har* keccak_224_
59d0: 74 65 73 74 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c  tests[] = {.."",
59e0: 20 22 46 37 31 38 33 37 35 30 32 42 41 38 45 31   "F71837502BA8E1
59f0: 30 38 33 37 42 44 44 38 44 33 36 35 41 44 42 38  0837BDD8D365ADB8
5a00: 35 35 39 31 38 39 35 36 30 32 46 43 35 35 32 42  5591895602FC552B
5a10: 34 38 42 37 33 39 30 41 42 44 22 2c 0a 09 22 61  48B7390ABD",.."a
5a20: 22 2c 20 22 37 43 46 38 37 44 39 31 32 45 45 37  ", "7CF87D912EE7
5a30: 30 38 38 44 33 30 45 43 32 33 46 38 45 37 31 30  088D30EC23F8E710
5a40: 30 44 39 33 31 39 42 46 46 30 39 30 36 31 38 42  0D9319BFF090618B
5a50: 34 33 39 44 33 46 45 39 31 33 30 38 22 2c 0a 09  439D3FE91308",..
5a60: 22 61 62 63 22 2c 20 22 43 33 30 34 31 31 37 36  "abc", "C3041176
5a70: 38 35 30 36 45 42 45 31 43 32 38 37 31 42 31 45  8506EBE1C2871B1E
5a80: 45 32 45 38 37 44 33 38 44 46 33 34 32 33 31 37  E2E87D38DF342317
5a90: 33 30 30 41 39 42 39 37 41 39 35 45 43 36 41 38  300A9B97A95EC6A8
5aa0: 22 2c 0a 09 22 6d 65 73 73 61 67 65 20 64 69 67  ",.."message dig
5ab0: 65 73 74 22 2c 20 22 42 35 33 42 32 43 44 36 33  est", "B53B2CD63
5ac0: 38 46 34 34 30 46 41 34 39 39 31 36 30 33 36 41  8F440FA49916036A
5ad0: 43 44 42 32 32 32 34 35 36 37 33 39 39 32 46 42  CDB22245673992FB
5ae0: 31 42 31 39 36 33 42 39 36 46 42 39 45 39 33 22  1B1963B96FB9E93"
5af0: 2c 0a 09 22 61 62 63 64 65 66 67 68 69 6a 6b 6c  ,.."abcdefghijkl
5b00: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 2c  mnopqrstuvwxyz",
5b10: 20 22 31 36 32 42 41 42 36 34 44 43 33 42 41 35   "162BAB64DC3BA5
5b20: 39 34 42 44 33 42 34 33 46 44 38 41 42 45 43 34  94BD3B43FD8ABEC4
5b30: 41 41 30 33 42 33 36 43 32 37 38 34 43 41 43 35  AA03B36C2784CAC5
5b40: 33 41 35 38 46 39 42 30 37 36 22 2c 0a 09 22 41  3A58F9B076",.."A
5b50: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
5b60: 52 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67  RSTUVWXYZabcdefg
5b70: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
5b80: 78 79 7a 30 31 32 33 34 35 36 37 38 39 22 2c 20  xyz0123456789", 
5b90: 22 34 46 42 37 32 44 37 42 36 42 32 34 42 44 31  "4FB72D7B6B24BD1
5ba0: 46 35 44 34 42 38 45 46 35 35 39 46 44 39 31 38  F5D4B8EF559FD918
5bb0: 38 45 42 36 36 43 41 41 30 31 42 43 45 33 34 43  8EB66CAA01BCE34C
5bc0: 36 32 31 41 30 35 34 31 32 22 2c 0a 09 22 31 32  621A05412",.."12
5bd0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
5be0: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
5bf0: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
5c00: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
5c10: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 22 2c  78901234567890",
5c20: 20 22 37 34 34 43 31 37 36 35 41 35 33 30 34 33   "744C1765A53043
5c30: 45 31 38 36 42 43 33 30 42 41 42 30 37 46 41 33  E186BC30BAB07FA3
5c40: 37 39 42 34 32 31 43 46 30 42 43 41 38 32 32 34  79B421CF0BCA8224
5c50: 43 42 38 33 45 35 44 34 35 42 22 2c 0a 09 22 54  CB83E5D45B",.."T
5c60: 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66  he quick brown f
5c70: 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68  ox jumps over th
5c80: 65 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22 33 31  e lazy dog", "31
5c90: 30 41 45 45 36 42 33 30 43 34 37 33 35 30 35 37  0AEE6B30C4735057
5ca0: 36 41 43 32 38 37 33 46 41 38 39 46 44 31 39 30  6AC2873FA89FD190
5cb0: 43 44 43 34 38 38 34 34 32 46 33 45 46 36 35 34  CDC488442F3EF654
5cc0: 43 46 32 33 46 45 22 2c 0a 09 30 0a 7d 3b 0a 0a  CF23FE",..0.};..
5cd0: 63 6f 6e 73 74 20 63 68 61 72 2a 20 6b 65 63 63  const char* kecc
5ce0: 61 6b 5f 32 35 36 5f 74 65 73 74 73 5b 5d 20 3d  ak_256_tests[] =
5cf0: 20 7b 0a 09 22 22 2c 20 22 43 35 44 32 34 36 30   {.."", "C5D2460
5d00: 31 38 36 46 37 32 33 33 43 39 32 37 45 37 44 42  186F7233C927E7DB
5d10: 32 44 43 43 37 30 33 43 30 45 35 30 30 42 36 35  2DCC703C0E500B65
5d20: 33 43 41 38 32 32 37 33 42 37 42 46 41 44 38 30  3CA82273B7BFAD80
5d30: 34 35 44 38 35 41 34 37 30 22 2c 0a 09 22 61 22  45D85A470",.."a"
5d40: 2c 20 22 33 41 43 32 32 35 31 36 38 44 46 35 34  , "3AC225168DF54
5d50: 32 31 32 41 32 35 43 31 43 30 31 46 44 33 35 42  212A25C1C01FD35B
5d60: 45 42 46 45 41 34 30 38 46 44 41 43 32 45 33 31  EBFEA408FDAC2E31
5d70: 44 44 44 36 46 38 30 41 34 42 42 46 39 41 35 46  DDD6F80A4BBF9A5F
5d80: 31 43 42 22 2c 0a 09 22 61 62 63 22 2c 20 22 34  1CB",.."abc", "4
5d90: 45 30 33 36 35 37 41 45 41 34 35 41 39 34 46 43  E03657AEA45A94FC
5da0: 37 44 34 37 42 41 38 32 36 43 38 44 36 36 37 43  7D47BA826C8D667C
5db0: 30 44 31 45 36 45 33 33 41 36 34 41 30 33 36 45  0D1E6E33A64A036E
5dc0: 43 34 34 46 35 38 46 41 31 32 44 36 43 34 35 22  C44F58FA12D6C45"
5dd0: 2c 0a 09 22 6d 65 73 73 61 67 65 20 64 69 67 65  ,.."message dige
5de0: 73 74 22 2c 20 22 38 35 36 41 42 38 41 33 41 44  st", "856AB8A3AD
5df0: 30 46 36 31 36 38 41 34 44 30 42 41 38 44 37 37  0F6168A4D0BA8D77
5e00: 34 38 37 32 34 33 46 33 36 35 35 44 42 36 46 43  487243F3655DB6FC
5e10: 35 42 30 45 31 36 36 39 42 43 30 35 42 31 32 38  5B0E1669BC05B128
5e20: 37 45 30 31 34 37 22 2c 0a 09 22 61 62 63 64 65  7E0147",.."abcde
5e30: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
5e40: 76 77 78 79 7a 22 2c 20 22 39 32 33 30 31 37 35  vwxyz", "9230175
5e50: 42 31 33 39 38 31 44 41 31 34 44 32 46 33 33 33  B13981DA14D2F333
5e60: 34 46 33 32 31 45 42 37 38 46 41 30 34 37 33 31  4F321EB78FA04731
5e70: 33 33 46 36 44 41 33 44 45 38 39 36 46 45 42 32  33F6DA3DE896FEB2
5e80: 32 46 42 32 35 38 39 33 36 22 2c 0a 09 22 41 42  2FB258936",.."AB
5e90: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
5ea0: 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68  STUVWXYZabcdefgh
5eb0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
5ec0: 79 7a 30 31 32 33 34 35 36 37 38 39 22 2c 20 22  yz0123456789", "
5ed0: 36 45 36 31 43 30 31 33 41 45 46 34 43 36 37 36  6E61C013AEF4C676
5ee0: 35 33 38 39 46 46 43 44 34 30 36 44 44 37 32 45  5389FFCD406DD72E
5ef0: 37 45 30 36 31 39 39 31 46 34 41 33 41 38 30 31  7E061991F4A3A801
5f00: 38 31 39 30 44 42 38 36 42 44 32 31 45 42 42 34  8190DB86BD21EBB4
5f10: 22 2c 0a 09 22 31 32 33 34 35 36 37 38 39 30 31  ",.."12345678901
5f20: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
5f30: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
5f40: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
5f50: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
5f60: 36 37 38 39 30 22 2c 20 22 31 35 32 33 41 30 43  67890", "1523A0C
5f70: 44 30 45 37 45 31 46 41 41 42 41 31 37 45 31 43  D0E7E1FAABA17E1C
5f80: 31 32 32 31 30 46 41 42 43 34 39 46 41 39 39 41  12210FABC49FA99A
5f90: 37 41 42 43 30 36 31 45 33 44 36 43 39 37 38 45  7ABC061E3D6C978E
5fa0: 45 46 34 46 37 34 38 43 34 22 2c 0a 09 22 54 68  EF4F748C4",.."Th
5fb0: 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f  e quick brown fo
5fc0: 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65  x jumps over the
5fd0: 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22 34 44 37   lazy dog", "4D7
5fe0: 34 31 42 36 46 31 45 42 32 39 43 42 32 41 39 42  41B6F1EB29CB2A9B
5ff0: 39 39 31 31 43 38 32 46 35 36 46 41 38 44 37 33  9911C82F56FA8D73
6000: 42 30 34 39 35 39 44 33 44 39 44 32 32 32 38 39  B04959D3D9D22289
6010: 35 44 46 36 43 30 42 32 38 41 41 31 35 22 2c 0a  5DF6C0B28AA15",.
6020: 09 30 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 63 68 61  .0.};..const cha
6030: 72 2a 20 6b 65 63 63 61 6b 5f 33 38 34 5f 74 65  r* keccak_384_te
6040: 73 74 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20 22  sts[] = {.."", "
6050: 32 43 32 33 31 34 36 41 36 33 41 32 39 41 43 46  2C23146A63A29ACF
6060: 39 39 45 37 33 42 38 38 46 38 43 32 34 45 41 41  99E73B88F8C24EAA
6070: 37 44 43 36 30 41 41 37 37 31 37 38 30 43 43 43  7DC60AA771780CCC
6080: 30 30 36 41 46 42 46 41 38 46 45 32 34 37 39 42  006AFBFA8FE2479B
6090: 32 44 44 32 42 32 31 33 36 32 33 33 37 34 34 31  2DD2B21362337441
60a0: 41 43 31 32 42 35 31 35 39 31 31 39 35 37 46 46  AC12B515911957FF
60b0: 22 2c 0a 09 22 61 22 2c 20 22 38 35 45 39 36 34  ",.."a", "85E964
60c0: 43 30 38 34 33 41 37 45 45 33 32 45 36 42 35 38  C0843A7EE32E6B58
60d0: 38 39 44 35 30 45 31 33 30 45 36 34 38 35 43 46  89D50E130E6485CF
60e0: 46 43 38 32 36 41 33 30 31 36 37 44 31 44 43 32  FC826A30167D1DC2
60f0: 42 33 41 30 43 43 37 39 43 42 41 33 30 33 35 30  B3A0CC79CBA30350
6100: 31 41 31 45 45 41 42 41 33 39 39 31 35 46 31 33  1A1EEABA39915F13
6110: 42 41 41 42 35 41 42 41 43 46 22 2c 0a 09 22 61  BAAB5ABACF",.."a
6120: 62 63 22 2c 20 22 46 37 44 46 31 31 36 35 46 30  bc", "F7DF1165F0
6130: 33 33 33 33 37 42 45 30 39 38 45 37 44 32 38 38  33337BE098E7D288
6140: 41 44 36 41 32 46 37 34 34 30 39 44 37 41 36 30  AD6A2F74409D7A60
6150: 42 34 39 43 33 36 36 34 32 32 31 38 44 45 31 36  B49C36642218DE16
6160: 31 42 31 46 39 39 46 38 43 36 38 31 45 34 41 46  1B1F99F8C681E4AF
6170: 41 46 33 31 41 33 34 44 42 32 39 46 42 37 36 33  AF31A34DB29FB763
6180: 45 33 43 32 38 45 22 2c 0a 09 22 6d 65 73 73 61  E3C28E",.."messa
6190: 67 65 20 64 69 67 65 73 74 22 2c 20 22 38 41 33  ge digest", "8A3
61a0: 37 37 44 42 30 38 38 43 34 33 45 34 34 30 34 30  77DB088C43E44040
61b0: 41 32 42 46 42 32 36 36 37 36 37 30 34 39 39 39  A2BFB26676704999
61c0: 44 39 30 35 32 37 39 31 33 43 41 42 46 46 30 41  D90527913CABFF0A
61d0: 33 34 38 34 38 32 35 44 41 41 35 34 44 33 30 36  3484825DAA54D306
61e0: 31 45 36 37 44 41 37 44 38 33 36 41 30 38 30 35  1E67DA7D836A0805
61f0: 33 35 36 39 36 32 41 46 33 31 30 45 38 22 2c 0a  356962AF310E8",.
6200: 09 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  ."abcdefghijklmn
6210: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 2c 20 22  opqrstuvwxyz", "
6220: 43 35 41 37 30 38 45 43 32 31 37 38 44 38 43 33  C5A708EC2178D8C3
6230: 39 38 34 36 31 35 34 37 34 33 35 45 34 38 32 43  98461547435E482C
6240: 45 45 30 44 38 35 44 45 33 44 37 35 44 44 42 46  EE0D85DE3D75DDBF
6250: 46 35 34 45 36 36 30 36 41 37 45 39 46 39 39 34  F54E6606A7E9F994
6260: 46 30 32 33 41 36 30 33 33 42 32 42 46 34 43 35  F023A6033B2BF4C5
6270: 31 36 41 35 46 37 31 46 43 37 34 37 30 44 31 41  16A5F71FC7470D1A
6280: 22 2c 0a 09 22 41 42 43 44 45 46 47 48 49 4a 4b  ",.."ABCDEFGHIJK
6290: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61  LMNOPQRSTUVWXYZa
62a0: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
62b0: 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36  rstuvwxyz0123456
62c0: 37 38 39 22 2c 20 22 37 33 37 37 43 35 37 30 37  789", "7377C5707
62d0: 35 30 36 35 37 35 43 32 36 39 33 37 46 33 44 46  506575C26937F3DF
62e0: 30 44 34 34 41 37 37 33 46 38 43 37 34 35 32 43  0D44A773F8C7452C
62f0: 30 37 34 45 45 31 37 32 35 43 31 41 42 36 32 46  074EE1725C1AB62F
6300: 37 34 31 46 39 35 30 35 39 34 35 39 44 36 34 43  741F95059459D64C
6310: 41 45 42 46 33 35 41 37 43 32 34 37 46 45 32 38  AEBF35A7C247FE28
6320: 36 31 36 43 41 42 36 22 2c 0a 09 22 31 32 33 34  616CAB6",.."1234
6330: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
6340: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
6350: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
6360: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
6370: 39 30 31 32 33 34 35 36 37 38 39 30 22 2c 20 22  901234567890", "
6380: 46 44 36 45 38 39 43 42 45 33 32 37 31 35 34 35  FD6E89CBE3271545
6390: 46 39 34 43 33 45 36 37 38 36 38 30 33 32 36 30  F94C3E6786803260
63a0: 46 39 32 39 43 31 35 38 39 45 33 30 39 31 41 46  F929C1589E3091AF
63b0: 44 35 38 43 46 33 32 45 46 35 33 41 34 46 32 39  D58CF32EF53A4F29
63c0: 42 36 39 43 31 31 36 36 43 42 32 39 38 32 45 32  B69C1166CB2982E2
63d0: 43 42 36 35 43 46 35 45 42 39 30 33 45 36 36 39  CB65CF5EB903E669
63e0: 22 2c 0a 09 22 54 68 65 20 71 75 69 63 6b 20 62  ",.."The quick b
63f0: 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f  rown fox jumps o
6400: 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67  ver the lazy dog
6410: 22 2c 20 22 32 38 33 39 39 30 46 41 39 44 35 46  ", "283990FA9D5F
6420: 42 37 33 31 44 37 38 36 43 35 42 42 45 45 39 34  B731D786C5BBEE94
6430: 45 41 34 44 42 34 39 31 30 46 31 38 43 36 32 43  EA4DB4910F18C62C
6440: 30 33 44 31 37 33 46 43 30 41 35 45 34 39 34 34  03D173FC0A5E4944
6450: 32 32 45 38 41 30 42 33 44 41 37 35 37 34 44 41  22E8A0B3DA7574DA
6460: 45 37 46 41 30 42 41 46 30 30 35 45 35 30 34 30  E7FA0BAF005E5040
6470: 36 33 42 33 22 2c 0a 09 30 0a 7d 3b 0a 0a 63 6f  63B3",..0.};..co
6480: 6e 73 74 20 63 68 61 72 2a 20 6b 65 63 63 61 6b  nst char* keccak
6490: 5f 35 31 32 5f 74 65 73 74 73 5b 5d 20 3d 20 7b  _512_tests[] = {
64a0: 0a 09 22 22 2c 20 22 30 45 41 42 34 32 44 45 34  .."", "0EAB42DE4
64b0: 43 33 43 45 42 39 32 33 35 46 43 39 31 41 43 46  C3CEB9235FC91ACF
64c0: 46 45 37 34 36 42 32 39 43 32 39 41 38 43 33 36  FE746B29C29A8C36
64d0: 36 42 37 43 36 30 45 34 45 36 37 43 34 36 36 46  6B7C60E4E67C466F
64e0: 33 36 41 34 33 30 34 43 30 30 46 41 39 43 41 46  36A4304C00FA9CAF
64f0: 39 44 38 37 39 37 36 42 41 34 36 39 42 43 42 45  9D87976BA469BCBE
6500: 30 36 37 31 33 42 34 33 35 46 30 39 31 45 46 32  06713B435F091EF2
6510: 37 36 39 46 42 31 36 30 43 44 41 42 33 33 44 33  769FB160CDAB33D3
6520: 36 37 30 36 38 30 45 22 2c 0a 09 22 61 22 2c 20  670680E",.."a", 
6530: 22 39 43 34 36 44 42 45 43 35 44 30 33 46 37 34  "9C46DBEC5D03F74
6540: 33 35 32 43 43 34 41 34 44 41 33 35 34 42 34 45  352CC4A4DA354B4E
6550: 39 37 39 36 38 38 37 45 45 42 36 36 41 43 32 39  9796887EEB66AC29
6560: 32 36 31 37 36 39 32 45 37 36 35 44 42 45 34 30  2617692E765DBE40
6570: 30 33 35 32 35 35 39 42 31 36 32 32 39 46 39 37  0352559B16229F97
6580: 42 32 37 36 31 34 42 35 31 44 42 46 42 42 42 31  B27614B51DBFBBB1
6590: 34 36 31 33 46 32 43 31 30 33 35 30 34 33 35 41  4613F2C10350435A
65a0: 38 46 45 41 46 35 33 46 37 33 42 41 30 31 43 37  8FEAF53F73BA01C7
65b0: 43 22 2c 0a 09 22 61 62 63 22 2c 20 22 31 38 35  C",.."abc", "185
65c0: 38 37 44 43 32 45 41 31 30 36 42 39 41 31 35 36  87DC2EA106B9A156
65d0: 33 45 33 32 42 33 33 31 32 34 32 31 43 41 31 36  3E32B3312421CA16
65e0: 34 43 37 46 31 46 30 37 42 43 39 32 32 41 39 43  4C7F1F07BC922A9C
65f0: 38 33 44 37 37 43 45 41 33 41 31 45 35 44 30 43  83D77CEA3A1E5D0C
6600: 36 39 39 31 30 37 33 39 30 32 35 33 37 32 44 43  69910739025372DC
6610: 31 34 41 43 39 36 34 32 36 32 39 33 37 39 35 34  14AC964262937954
6620: 30 43 31 37 45 32 41 36 35 42 31 39 44 37 37 41  0C17E2A65B19D77A
6630: 41 35 31 31 41 39 44 30 30 42 42 39 36 22 2c 0a  A511A9D00BB96",.
6640: 09 22 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  ."message digest
6650: 22 2c 20 22 43 43 43 43 34 39 46 41 36 33 38 32  ", "CCCC49FA6382
6660: 32 42 30 30 30 30 34 43 46 36 43 38 38 39 42 32  2B00004CF6C889B2
6670: 38 41 30 33 35 34 34 30 46 46 42 33 45 46 35 30  8A035440FFB3EF50
6680: 45 37 39 30 35 39 39 39 33 35 35 31 38 45 32 41  E790599935518E2A
6690: 45 46 42 30 45 32 46 31 38 33 39 31 37 30 37 39  EFB0E2F183917079
66a0: 37 46 37 37 36 33 41 35 43 34 33 42 32 44 43 46  7F7763A5C43B2DCF
66b0: 30 32 41 42 46 35 37 39 39 35 30 45 33 36 33 35  02ABF579950E3635
66c0: 38 44 36 44 30 34 44 46 44 44 43 32 41 42 41 43  8D6D04DFDDC2ABAC
66d0: 37 35 34 35 22 2c 0a 09 22 61 62 63 64 65 66 67  7545",.."abcdefg
66e0: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
66f0: 78 79 7a 22 2c 20 22 45 35 35 42 44 43 41 36 34  xyz", "E55BDCA64
6700: 44 46 45 33 33 46 33 36 41 45 33 31 35 33 43 37  DFE33F36AE3153C7
6710: 32 37 38 33 33 46 39 39 34 37 44 39 32 39 35 38  27833F9947D92958
6720: 30 37 33 46 34 44 44 30 32 45 33 38 41 38 32 44  073F4DD02E38A82D
6730: 38 41 43 42 32 38 32 42 31 45 45 31 33 33 30 41  8ACB282B1EE1330A
6740: 36 38 32 35 32 41 35 34 43 36 44 33 44 32 37 33  68252A54C6D3D273
6750: 30 36 35 30 38 43 41 37 36 35 41 43 44 34 35 36  06508CA765ACD456
6760: 30 36 43 41 45 41 46 35 31 44 36 42 44 43 34 35  06CAEAF51D6BDC45
6770: 39 46 35 35 31 46 31 22 2c 0a 09 22 41 42 43 44  9F551F1",.."ABCD
6780: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
6790: 55 56 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a  UVWXYZabcdefghij
67a0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
67b0: 30 31 32 33 34 35 36 37 38 39 22 2c 20 22 44 35  0123456789", "D5
67c0: 46 41 36 42 39 33 44 35 34 41 38 37 42 42 44 45  FA6B93D54A87BBDE
67d0: 35 32 44 42 42 34 34 44 41 46 39 36 41 33 34 35  52DBB44DAF96A345
67e0: 35 44 41 45 46 39 44 36 30 43 44 42 39 32 32 42  5DAEF9D60CDB922B
67f0: 43 34 42 37 32 41 35 42 42 42 41 39 37 43 35 42  C4B72A5BBBA97C5B
6800: 46 38 43 35 39 38 31 36 46 45 44 45 33 30 32 46  F8C59816FEDE302F
6810: 43 36 34 45 39 38 43 45 31 42 38 36 34 44 46 37  C64E98CE1B864DF7
6820: 42 45 36 37 31 43 39 36 38 45 34 33 44 31 42 41  BE671C968E43D1BA
6830: 45 32 33 41 44 37 36 41 33 45 37 30 32 44 22 2c  E23AD76A3E702D",
6840: 0a 09 22 31 32 33 34 35 36 37 38 39 30 31 32 33  .."1234567890123
6850: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
6860: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
6870: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
6880: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
6890: 38 39 30 22 2c 20 22 42 43 30 38 41 39 41 32 34  890", "BC08A9A24
68a0: 35 45 39 39 46 36 32 37 35 33 31 36 36 41 33 32  5E99F62753166A32
68b0: 32 36 45 38 37 34 38 39 36 44 45 30 39 31 34 35  26E874896DE09145
68c0: 36 35 42 45 45 30 46 38 42 45 32 39 44 36 37 38  65BEE0F8BE29D678
68d0: 45 30 44 41 36 36 43 35 30 38 43 43 39 39 34 38  E0DA66C508CC9948
68e0: 45 38 41 44 37 42 45 37 38 45 41 41 34 45 44 43  E8AD7BE78EAA4EDC
68f0: 45 44 34 38 32 32 35 33 46 38 41 42 32 45 36 37  ED482253F8AB2E67
6900: 36 38 43 39 43 38 46 32 41 32 46 30 41 46 46 46  68C9C8F2A2F0AFFF
6910: 30 38 33 44 35 31 43 22 2c 0a 09 22 54 68 65 20  083D51C",.."The 
6920: 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20  quick brown fox 
6930: 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65 20 6c  jumps over the l
6940: 61 7a 79 20 64 6f 67 22 2c 20 22 44 31 33 35 42  azy dog", "D135B
6950: 42 38 34 44 30 34 33 39 44 42 41 43 34 33 32 32  B84D0439DBAC4322
6960: 34 37 45 45 35 37 33 41 32 33 45 41 37 44 33 43  47EE573A23EA7D3C
6970: 39 44 45 42 32 41 39 36 38 45 42 33 31 44 34 37  9DEB2A968EB31D47
6980: 43 34 46 42 34 35 46 31 45 46 34 34 32 32 44 36  C4FB45F1EF4422D6
6990: 43 35 33 31 42 35 42 39 42 44 36 46 34 34 39 45  C531B5B9BD6F449E
69a0: 42 43 43 34 34 39 45 41 39 34 44 30 41 38 46 30  BCC449EA94D0A8F0
69b0: 35 46 36 32 31 33 30 46 44 41 36 31 32 44 41 35  5F62130FDA612DA5
69c0: 33 43 37 39 36 35 39 46 36 30 39 22 2c 0a 09 30  3C79659F609",..0
69d0: 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 55 53  .};.#endif /* US
69e0: 45 5f 4b 45 43 43 41 4b 20 2a 2f 0a 0a 2f 2a 20  E_KECCAK */../* 
69f0: 76 65 72 69 66 69 65 64 20 62 79 20 65 42 41 53  verified by eBAS
6a00: 48 20 53 55 50 45 52 43 4f 50 20 69 6d 70 6c 65  H SUPERCOP imple
6a10: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 63 6f 6e  mentation */.con
6a20: 73 74 20 63 68 61 72 2a 20 65 64 6f 6e 72 32 35  st char* edonr25
6a30: 36 5f 74 65 73 74 73 5b 5d 20 3d 20 7b 0a 09 22  6_tests[] = {.."
6a40: 22 2c 20 22 38 36 45 37 43 38 34 30 32 34 43 35  ", "86E7C84024C5
6a50: 35 44 42 44 43 39 33 33 39 42 33 39 35 43 39 35  5DBDC9339B395C95
6a60: 45 38 38 44 42 38 46 37 38 31 37 31 39 38 35 31  E88DB8F781719851
6a70: 41 44 31 44 32 33 37 43 36 45 36 41 38 45 33 37  AD1D237C6E6A8E37
6a80: 30 42 38 30 22 2c 0a 09 22 61 22 2c 20 22 39 34  0B80",.."a", "94
6a90: 33 41 41 39 32 32 35 41 32 43 46 31 35 34 45 43  3AA9225A2CF154EC
6aa0: 32 45 34 44 44 38 31 32 33 37 37 32 30 42 41 35  2E4DD81237720BA5
6ab0: 33 38 43 41 38 44 46 32 46 44 38 33 43 30 42 38  38CA8DF2FD83C0B8
6ac0: 39 33 43 35 44 32 36 35 46 33 35 33 41 30 22 2c  93C5D265F353A0",
6ad0: 0a 09 22 61 62 63 22 2c 20 22 30 33 36 30 46 36  .."abc", "0360F6
6ae0: 35 44 39 37 43 32 31 35 32 45 41 36 45 42 45 33  5D97C2152EA6EBE3
6af0: 44 34 36 32 42 46 34 39 38 33 31 45 32 44 35 46  D462BF49831E2D5F
6b00: 36 37 42 36 31 34 30 39 39 32 33 32 30 35 38 35  67B6140992320585
6b10: 44 38 39 46 44 32 37 31 43 45 22 2c 0a 09 22 6d  D89FD271CE",.."m
6b20: 65 73 73 61 67 65 20 64 69 67 65 73 74 22 2c 20  essage digest", 
6b30: 22 38 44 32 37 35 35 38 46 34 44 44 39 33 30 37  "8D27558F4DD9307
6b40: 36 31 34 41 38 31 36 36 43 41 44 42 31 33 36 39  614A8166CADB1369
6b50: 32 37 44 31 45 37 39 41 30 43 30 34 42 44 38 45  27D1E79A0C04BD8E
6b60: 46 37 37 43 33 46 41 46 43 30 39 31 37 45 32 38  F77C3FAFC0917E28
6b70: 41 22 2c 0a 09 22 61 62 63 64 65 66 67 68 69 6a  A",.."abcdefghij
6b80: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
6b90: 22 2c 20 22 35 34 31 35 37 33 37 41 46 30 44 38  ", "5415737AF0D8
6ba0: 32 37 34 35 39 45 46 41 43 42 37 46 45 33 33 43  27459EFACB7FE33C
6bb0: 30 45 38 39 43 46 38 30 37 45 36 45 36 30 38 41  0E89CF807E6E608A
6bc0: 34 44 37 30 45 46 39 44 45 42 30 37 42 46 33 42  4D70EF9DEB07BF3B
6bd0: 46 36 42 46 22 2c 0a 09 22 54 68 65 20 71 75 69  F6BF",.."The qui
6be0: 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20 6a 75 6d  ck brown fox jum
6bf0: 70 73 20 6f 76 65 72 20 74 68 65 20 6c 61 7a 79  ps over the lazy
6c00: 20 64 6f 67 22 2c 20 22 45 37 37 41 35 41 43 30   dog", "E77A5AC0
6c10: 30 39 32 33 42 38 36 43 31 38 31 31 44 34 32 46  0923B86C1811D42F
6c20: 31 43 42 31 31 39 38 46 34 33 34 31 32 41 36 44  1CB1198F43412A6D
6c30: 39 38 37 44 43 39 38 42 44 41 45 31 31 45 36 44  987DC98BDAE11E6D
6c40: 39 31 33 39 39 36 30 39 22 2c 0a 09 22 61 62 63  91399609",.."abc
6c50: 64 62 63 64 65 63 64 65 66 64 65 66 67 65 66 67  dbcdecdefdefgefg
6c60: 68 66 67 68 69 67 68 69 6a 68 69 6a 6b 69 6a 6b  hfghighijhijkijk
6c70: 6c 6a 6b 6c 6d 6b 6c 6d 6e 6c 6d 6e 6f 6d 6e 6f  ljklmklmnlmnomno
6c80: 70 6e 6f 70 71 22 2c 20 22 31 39 44 45 38 36 42  pnopq", "19DE86B
6c90: 43 33 46 30 34 38 31 30 39 38 41 33 45 36 32 33  C3F0481098A3E623
6ca0: 41 41 31 33 33 30 39 39 35 30 34 33 33 30 30 41  AA1330995043300A
6cb0: 39 41 35 44 36 43 32 41 44 35 38 34 37 30 35 46  9A5D6C2AD584705F
6cc0: 36 32 36 38 36 34 31 37 46 22 2c 0a 09 22 41 42  62686417F",.."AB
6cd0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
6ce0: 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68  STUVWXYZabcdefgh
6cf0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
6d00: 79 7a 30 31 32 33 34 35 36 37 38 39 22 2c 20 22  yz0123456789", "
6d10: 33 42 35 37 46 39 35 34 34 32 30 46 34 39 46 41  3B57F954420F49FA
6d20: 43 36 41 38 30 43 45 36 43 45 30 31 33 46 44 42  C6A80CE6CE013FDB
6d30: 34 37 45 37 31 43 45 38 32 34 44 41 37 38 41 38  47E71CE824DA78A8
6d40: 46 36 36 38 36 34 32 30 33 44 38 45 46 32 35 32  F66864203D8EF252
6d50: 22 2c 0a 09 22 31 32 33 34 35 36 37 38 39 30 31  ",.."12345678901
6d60: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
6d70: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
6d80: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
6d90: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
6da0: 36 37 38 39 30 22 2c 20 22 32 38 36 46 33 39 44  67890", "286F39D
6db0: 35 31 36 38 37 37 35 43 38 45 35 34 31 45 44 32  5168775C8E541ED2
6dc0: 46 30 46 45 33 45 43 46 33 31 34 36 33 38 30 42  F0FE3ECF3146380B
6dd0: 39 43 34 37 39 44 45 34 31 42 44 38 34 37 45 38  9C479DE41BD847E8
6de0: 36 36 34 32 30 41 37 37 36 22 2c 0a 09 30 0a 7d  66420A776",..0.}
6df0: 3b 0a 0a 2f 2a 20 76 65 72 69 66 69 65 64 20 62  ;../* verified b
6e00: 79 20 65 42 41 53 48 20 53 55 50 45 52 43 4f 50  y eBASH SUPERCOP
6e10: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6e20: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 2a 20 65  */.const char* e
6e30: 64 6f 6e 72 35 31 32 5f 74 65 73 74 73 5b 5d 20  donr512_tests[] 
6e40: 3d 20 7b 0a 09 22 22 2c 20 22 43 37 41 46 42 44  = {.."", "C7AFBD
6e50: 46 33 45 35 42 34 35 39 30 45 42 30 42 32 35 30  F3E5B4590EB0B250
6e60: 30 30 42 46 38 33 46 42 31 36 44 34 46 39 42 37  00BF83FB16D4F9B7
6e70: 32 32 45 45 37 46 39 41 32 44 43 32 42 44 33 38  22EE7F9A2DC2BD38
6e80: 32 30 33 35 45 38 45 45 33 38 44 36 46 36 46 31  2035E8EE38D6F6F1
6e90: 35 43 37 42 38 45 45 43 38 35 33 35 35 41 43 35  5C7B8EEC85355AC5
6ea0: 39 41 46 39 38 39 37 39 39 39 35 30 43 36 34 35  9AF989799950C645
6eb0: 35 37 45 41 42 30 45 36 38 37 44 30 46 43 42 44  57EAB0E687D0FCBD
6ec0: 42 41 39 30 41 45 39 37 30 34 22 2c 0a 09 22 61  BA90AE9704",.."a
6ed0: 22 2c 20 22 42 35 39 45 43 34 34 46 37 42 45 45  ", "B59EC44F7BEE
6ee0: 46 38 41 30 34 43 45 45 44 33 38 41 39 37 33 44  F8A04CEED38A973D
6ef0: 37 37 43 36 35 45 32 32 45 39 34 35 38 44 35 46  77C65E22E9458D5F
6f00: 36 37 42 34 39 37 39 34 38 44 41 33 34 39 38 36  67B497948DA34986
6f10: 43 30 39 33 42 35 45 46 43 35 34 38 33 46 42 45  C093B5EFC5483FBE
6f20: 45 35 35 46 32 46 37 34 30 46 43 41 44 33 31 46  E55F2F740FCAD31F
6f30: 31 38 44 38 30 44 42 34 34 42 42 36 42 38 38 34  18D80DB44BB6B884
6f40: 33 45 37 46 44 35 39 39 31 38 38 45 37 43 30 37  3E7FD599188E7C07
6f50: 32 33 33 42 22 2c 0a 09 22 61 62 63 22 2c 20 22  233B",.."abc", "
6f60: 46 45 37 39 42 43 46 41 33 31 30 32 34 35 44 39  FE79BCFA310245D9
6f70: 31 33 39 44 41 38 42 43 39 31 42 39 39 46 44 30  139DA8BC91B99FD0
6f80: 32 32 33 32 36 46 37 46 33 41 43 41 31 44 46 44  22326F7F3ACA1DFD
6f90: 46 42 36 43 38 34 45 34 31 32 35 44 37 31 46 45  FB6C84E4125D71FE
6fa0: 39 42 42 36 41 31 44 34 31 41 46 43 45 33 35 38  9BB6A1D41AFCE358
6fb0: 46 38 34 37 32 38 33 35 32 32 30 41 37 38 32 39  F8472835220A7829
6fc0: 44 35 31 34 36 42 32 42 42 46 43 38 45 35 43 32  D5146B2BBFC8E5C2
6fd0: 36 32 37 46 36 30 41 39 42 35 31 37 43 31 41 34  627F60A9B517C1A4
6fe0: 22 2c 0a 09 22 6d 65 73 73 61 67 65 20 64 69 67  ",.."message dig
6ff0: 65 73 74 22 2c 20 22 41 37 36 42 36 43 35 43 41  est", "A76B6C5CA
7000: 38 37 37 38 46 33 39 45 43 31 46 38 35 44 36 34  8778F39EC1F85D64
7010: 42 41 44 42 44 42 46 33 32 39 37 32 35 43 39 41  BADBDBF329725C9A
7020: 36 46 42 39 32 36 35 36 44 39 34 41 38 32 39 32  6FB92656D94A8292
7030: 32 41 32 36 46 44 35 31 44 32 37 31 41 36 46 31  2A26FD51D271A6F1
7040: 33 35 46 33 33 31 35 37 31 34 33 42 39 36 30 43  35F33157143B960C
7050: 44 38 44 37 44 32 30 44 43 39 39 35 30 33 41 41  D8D7D20DC99503AA
7060: 33 39 38 37 31 46 44 36 34 30 35 30 45 30 36 31  39871FD64050E061
7070: 36 38 39 45 34 45 33 22 2c 0a 09 22 61 62 63 64  689E4E3",.."abcd
7080: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
7090: 75 76 77 78 79 7a 22 2c 20 22 37 35 34 36 34 30  uvwxyz", "754640
70a0: 42 37 42 30 31 37 38 32 43 31 46 33 34 35 41 33  B7B01782C1F345A3
70b0: 38 36 34 42 34 35 36 44 42 38 30 35 45 33 39 31  864B456DB805E391
70c0: 36 33 46 41 31 41 30 36 31 31 33 41 33 37 43 42  63FA1A06113A37CB
70d0: 38 46 42 31 38 44 33 30 46 38 44 43 34 33 43 37  8FB18D30F8DC43C7
70e0: 43 33 46 44 42 34 30 37 38 34 39 43 41 44 34 33  C3FDB407849CAD43
70f0: 37 43 39 30 44 42 44 32 38 45 32 38 41 45 46 45  7C90DBD28E28AEFE
7100: 46 38 38 39 38 35 38 39 42 33 38 38 41 44 45 42  F8898589B388ADEB
7110: 41 31 35 33 42 33 44 45 30 42 22 2c 0a 09 22 54  A153B3DE0B",.."T
7120: 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66  he quick brown f
7130: 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68  ox jumps over th
7140: 65 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22 42 39  e lazy dog", "B9
7150: 38 36 41 44 41 42 46 41 39 41 44 42 31 45 35 42  86ADABFA9ADB1E5B
7160: 31 35 32 42 36 44 36 34 43 37 33 33 33 38 39 30  152B6D64C7333890
7170: 38 32 45 33 35 34 46 44 45 32 46 44 39 37 34 30  82E354FDE2FD9740
7180: 46 41 45 41 36 37 36 36 46 34 34 30 45 41 34 33  FAEA6766F440EA43
7190: 39 31 46 43 37 34 35 42 42 39 42 31 31 41 38 32  91FC745BB9B11A82
71a0: 31 37 35 36 39 34 34 30 37 37 42 42 33 30 37 32  1756944077BB3072
71b0: 33 46 36 31 36 36 34 35 34 39 32 43 37 30 46 41  3F616645492C70FA
71c0: 34 43 36 31 34 44 42 37 45 39 44 34 35 42 22 2c  4C614DB7E9D45B",
71d0: 0a 09 22 61 62 63 64 62 63 64 65 63 64 65 66 64  .."abcdbcdecdefd
71e0: 65 66 67 65 66 67 68 66 67 68 69 67 68 69 6a 68  efgefghfghighijh
71f0: 69 6a 6b 69 6a 6b 6c 6a 6b 6c 6d 6b 6c 6d 6e 6c  ijkijkljklmklmnl
7200: 6d 6e 6f 6d 6e 6f 70 6e 6f 70 71 22 2c 20 22 45  mnomnopnopq", "E
7210: 45 35 45 46 39 37 34 45 38 36 37 37 36 33 36 39  E5EF974E86776369
7220: 37 30 41 35 30 45 37 36 33 36 45 43 33 34 45 46  70A50E7636EC34EF
7230: 42 31 46 39 44 38 30 32 33 43 37 31 35 41 32 36  B1F9D8023C715A26
7240: 37 34 37 44 37 33 44 33 36 36 35 44 37 38 44 32  747D73D3665D78D2
7250: 42 42 34 39 36 32 33 38 31 39 30 31 46 37 36 38  BB4962381901F768
7260: 39 32 41 36 33 30 31 33 33 44 34 37 36 41 32 37  92A630133D476A27
7270: 38 45 34 45 33 43 36 32 31 37 36 46 43 45 31 35  8E4E3C62176FCE15
7280: 36 33 39 30 34 36 33 36 32 38 34 34 31 35 42 22  63904636284415B"
7290: 2c 0a 09 22 41 42 43 44 45 46 47 48 49 4a 4b 4c  ,.."ABCDEFGHIJKL
72a0: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62  MNOPQRSTUVWXYZab
72b0: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
72c0: 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37  stuvwxyz01234567
72d0: 38 39 22 2c 20 22 30 37 35 35 46 38 34 36 34 35  89", "0755F84645
72e0: 30 41 36 46 38 34 30 30 31 38 34 36 45 31 30 36  0A6F84001846E106
72f0: 36 38 32 38 37 32 37 42 46 35 39 37 35 33 38 33  6828727BF5975383
7300: 38 36 37 42 38 37 45 30 31 32 30 46 32 37 42 37  867B87E0120F27B7
7310: 39 34 38 32 35 32 34 45 42 30 31 31 33 37 34 35  9482524EB0113745
7320: 39 31 38 35 46 37 33 43 32 34 43 32 33 42 44 44  9185F73C24C23BDD
7330: 39 44 39 30 31 41 44 31 35 37 37 43 33 45 41 31  9D901AD1577C3EA1
7340: 41 38 32 34 45 36 41 43 45 33 34 42 42 42 41 31  A824E6ACE34BBBA1
7350: 31 39 45 39 32 46 22 2c 0a 09 22 31 32 33 34 35  19E92F",.."12345
7360: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
7370: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
7380: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
7390: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
73a0: 30 31 32 33 34 35 36 37 38 39 30 22 2c 20 22 30  01234567890", "0
73b0: 39 39 38 39 31 32 44 41 35 42 31 33 46 43 35 44  998912DA5B13FC5D
73c0: 37 33 33 32 43 42 43 33 42 32 34 30 45 34 34 35  7332CBC3B240E445
73d0: 34 37 43 45 39 43 38 36 31 38 36 37 44 39 30 31  47CE9C861867D901
73e0: 44 44 33 39 44 35 41 34 33 44 32 45 45 38 30 36  DD39D5A43D2EE806
73f0: 38 36 42 43 34 41 44 37 30 44 46 46 39 31 35 39  86BC4AD70DFF9159
7400: 46 45 31 32 43 45 39 34 32 35 35 41 44 35 34 36  FE12CE94255AD546
7410: 37 42 32 42 35 39 44 33 31 35 36 32 46 43 30 38  7B2B59D31562FC08
7420: 42 33 36 39 37 42 36 37 33 32 33 30 37 35 46 22  B3697B67323075F"
7430: 2c 0a 09 30 0a 7d 3b 0a 0a 2f 2a 20 42 54 49 48  ,..0.};../* BTIH
7440: 20 63 61 6c 63 75 6c 61 74 65 64 20 77 69 74 68   calculated with
7450: 20 66 69 6c 65 6e 61 6d 65 20 3d 20 22 74 65 73   filename = "tes
7460: 74 2e 74 78 74 22 2c 20 76 65 72 69 66 69 65 64  t.txt", verified
7470: 20 75 73 69 6e 67 20 75 54 6f 72 72 65 6e 74 20   using uTorrent 
7480: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 2a 20 62  */.const char* b
7490: 74 69 68 5f 77 69 74 68 5f 66 69 6c 65 6e 61 6d  tih_with_filenam
74a0: 65 5f 74 65 73 74 73 5b 5d 20 3d 20 7b 0a 09 22  e_tests[] = {.."
74b0: 22 2c 20 22 30 34 32 43 38 45 32 44 32 37 38 30  ", "042C8E2D2780
74c0: 42 30 41 46 41 45 36 35 39 39 41 30 32 39 31 34  B0AFAE6599A02914
74d0: 44 36 43 33 46 31 35 31 35 42 31 32 22 2c 0a 09  D6C3F1515B12",..
74e0: 22 61 22 2c 20 22 37 35 32 37 41 39 30 33 31 39  "a", "7527A90319
74f0: 33 43 38 37 30 39 33 43 30 35 44 45 30 46 30 46  3C87093C05DE0F0F
7500: 38 31 31 32 36 41 34 42 39 38 45 45 31 41 22 2c  81126A4B98EE1A",
7510: 0a 09 22 61 62 63 22 2c 20 22 43 42 46 34 46 36  .."abc", "CBF4F6
7520: 44 35 43 43 44 45 30 45 36 44 44 36 42 43 38 46  D5CCDE0E6DD6BC8F
7530: 30 31 33 41 41 37 46 39 32 30 39 30 30 43 31 31  013AA7F920900C11
7540: 41 32 22 2c 0a 09 22 6d 65 73 73 61 67 65 20 64  A2",.."message d
7550: 69 67 65 73 74 22 2c 20 22 46 46 46 43 45 38 39  igest", "FFFCE89
7560: 37 43 32 44 35 46 42 38 45 44 34 42 36 41 44 37  7C2D5FB8ED4B6AD7
7570: 37 33 43 43 30 46 46 41 30 37 31 41 45 43 33 39  73CC0FFA071AEC39
7580: 33 22 2c 0a 09 22 61 62 63 64 65 66 67 68 69 6a  3",.."abcdefghij
7590: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
75a0: 22 2c 20 22 36 30 36 41 33 31 42 30 36 42 31 37  ", "606A31B06B17
75b0: 35 34 37 43 32 32 36 43 39 45 41 38 45 45 30 30  547C226C9EA8EE00
75c0: 45 45 42 41 36 45 30 45 35 42 46 43 22 2c 0a 09  EEBA6E0E5BFC",..
75d0: 22 54 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e  "The quick brown
75e0: 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72 20   fox jumps over 
75f0: 74 68 65 20 6c 61 7a 79 20 64 6f 67 22 2c 20 22  the lazy dog", "
7600: 31 45 45 44 31 42 34 43 35 36 31 38 36 34 35 36  1EED1B4C56186456
7610: 45 33 44 45 34 32 30 46 45 36 39 41 36 37 46 35  E3DE420FE69A67F5
7620: 33 43 41 36 41 35 32 41 22 2c 0a 09 22 61 62 63  3CA6A52A",.."abc
7630: 64 62 63 64 65 63 64 65 66 64 65 66 67 65 66 67  dbcdecdefdefgefg
7640: 68 66 67 68 69 67 68 69 6a 68 69 6a 6b 69 6a 6b  hfghighijhijkijk
7650: 6c 6a 6b 6c 6d 6b 6c 6d 6e 6c 6d 6e 6f 6d 6e 6f  ljklmklmnlmnomno
7660: 70 6e 6f 70 71 22 2c 20 22 36 42 44 36 46 30 42  pnopq", "6BD6F0B
7670: 31 39 46 41 33 46 35 34 43 45 30 33 31 31 42 46  19FA3F54CE0311BF
7680: 36 44 32 44 36 44 33 39 35 35 42 31 42 44 32 30  6D2D6D3955B1BD20
7690: 43 22 2c 0a 09 22 41 42 43 44 45 46 47 48 49 4a  C",.."ABCDEFGHIJ
76a0: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
76b0: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
76c0: 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35  qrstuvwxyz012345
76d0: 36 37 38 39 22 2c 20 22 39 35 38 38 30 43 35 41  6789", "95880C5A
76e0: 38 45 42 30 36 43 31 41 43 32 38 42 41 36 41 35  8EB06C1AC28BA6A5
76f0: 33 31 35 30 35 45 30 46 32 42 43 44 37 37 41 45  31505E0F2BCD77AE
7700: 22 2c 0a 09 22 31 32 33 34 35 36 37 38 39 30 31  ",.."12345678901
7710: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
7720: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
7730: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
7740: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
7750: 36 37 38 39 30 22 2c 20 22 36 37 34 45 31 37 41  67890", "674E17A
7760: 41 32 31 39 38 31 41 33 33 38 39 32 31 31 39 45  A21981A33892119E
7770: 36 30 31 44 46 33 45 32 45 36 38 39 43 34 45 36  601DF3E2E689C4E6
7780: 32 22 2c 0a 09 30 0a 7d 3b 0a 0a 2f 2a 20 42 54  2",..0.};../* BT
7790: 49 48 20 63 61 6c 63 75 6c 61 74 65 64 20 77 69  IH calculated wi
77a0: 74 68 6f 75 74 20 61 20 66 69 6c 65 6e 61 6d 65  thout a filename
77b0: 2c 20 63 61 6e 27 74 20 62 65 20 76 65 72 69 66  , can't be verif
77c0: 69 65 64 20 62 79 20 74 6f 72 72 65 6e 74 20 74  ied by torrent t
77d0: 6f 6f 6c 73 20 2a 2f 0a 63 6f 6e 73 74 20 63 68  ools */.const ch
77e0: 61 72 2a 20 62 74 69 68 5f 77 69 74 68 6f 75 74  ar* btih_without
77f0: 5f 61 5f 66 69 6c 65 6e 61 6d 65 5f 74 65 73 74  _a_filename_test
7800: 73 5b 5d 20 3d 20 7b 0a 09 22 22 2c 20 22 41 34  s[] = {.."", "A4
7810: 41 36 36 37 38 42 33 41 39 33 33 44 31 44 39 41  A6678B3A933D1D9A
7820: 31 38 32 43 43 33 38 45 37 33 31 32 34 46 37 36  182CC38E73124F76
7830: 37 32 43 37 45 42 22 2c 0a 09 22 61 22 2c 20 22  72C7EB",.."a", "
7840: 38 32 37 43 44 38 39 38 34 36 46 43 31 33 32 45  827CD89846FC132E
7850: 32 45 36 37 45 32 39 43 32 37 38 34 43 36 35 34  2E67E29C2784C654
7860: 34 33 42 42 34 44 43 31 22 2c 0a 09 22 61 62 63  43BB4DC1",.."abc
7870: 22 2c 20 22 38 38 37 31 33 37 30 34 36 30 38 31  ", "887137046081
7880: 34 31 46 34 45 38 36 46 35 38 43 38 36 32 34 37  41F4E86F58C86247
7890: 43 41 31 45 33 44 39 31 44 38 36 34 22 2c 0a 09  CA1E3D91D864",..
78a0: 22 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 22  "message digest"
78b0: 2c 20 22 43 36 35 34 39 30 31 45 38 32 41 38 46  , "C654901E82A8F
78c0: 43 31 33 43 33 34 33 32 37 31 35 32 30 46 41 46  C13C343271520FAF
78d0: 35 32 45 42 45 45 46 32 31 38 33 22 2c 0a 09 22  52EBEEF2183",.."
78e0: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
78f0: 71 72 73 74 75 76 77 78 79 7a 22 2c 20 22 34 41  qrstuvwxyz", "4A
7900: 45 37 32 45 44 31 38 36 44 31 39 36 44 38 46 31  E72ED186D196D8F1
7910: 31 37 45 34 34 39 44 33 34 45 32 31 36 42 30 39  17E449D34E216B09
7920: 34 31 46 46 36 31 22 2c 0a 09 22 54 68 65 20 71  41FF61",.."The q
7930: 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 20 6a  uick brown fox j
7940: 75 6d 70 73 20 6f 76 65 72 20 74 68 65 20 6c 61  umps over the la
7950: 7a 79 20 64 6f 67 22 2c 20 22 41 39 33 32 38 30  zy dog", "A93280
7960: 32 30 32 32 39 43 31 36 33 42 42 46 30 37 31 38  20229C163BBF0718
7970: 31 43 38 44 46 33 37 43 45 38 34 46 43 36 36 35  1C8DF37CE84FC665
7980: 38 39 22 2c 0a 09 22 61 62 63 64 62 63 64 65 63  89",.."abcdbcdec
7990: 64 65 66 64 65 66 67 65 66 67 68 66 67 68 69 67  defdefgefghfghig
79a0: 68 69 6a 68 69 6a 6b 69 6a 6b 6c 6a 6b 6c 6d 6b  hijhijkijkljklmk
79b0: 6c 6d 6e 6c 6d 6e 6f 6d 6e 6f 70 6e 6f 70 71 22  lmnlmnomnopnopq"
79c0: 2c 20 22 44 42 39 41 37 45 35 37 37 41 33 34 36  , "DB9A7E577A346
79d0: 46 46 30 35 38 44 37 38 35 37 36 31 30 32 46 32  FF058D78576102F2
79e0: 45 42 39 44 43 38 34 39 30 31 38 22 2c 0a 09 22  EB9DC849018",.."
79f0: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
7a00: 51 52 53 54 55 56 57 58 59 5a 61 62 63 64 65 66  QRSTUVWXYZabcdef
7a10: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
7a20: 77 78 79 7a 30 31 32 33 34 35 36 37 38 39 22 2c  wxyz0123456789",
7a30: 20 22 37 46 38 46 45 45 44 39 35 39 45 38 39 42   "7F8FEED959E89B
7a40: 42 30 39 37 42 35 46 37 34 31 43 30 33 34 32 42  B097B5F741C0342B
7a50: 36 44 46 30 41 37 38 36 34 44 22 2c 0a 09 22 31  6DF0A7864D",.."1
7a60: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
7a70: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
7a80: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
7a90: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
7aa0: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 22  678901234567890"
7ab0: 2c 20 22 39 32 44 36 46 30 31 32 38 35 46 44 41  , "92D6F01285FDA
7ac0: 37 44 34 33 45 37 44 30 39 41 35 41 46 46 30 31  7D43E7D09A5AFF01
7ad0: 43 33 38 33 43 45 45 45 36 31 30 22 2c 0a 09 30  C383CEEE610",..0
7ae0: 0a 7d 3b 0a 0a 2f 2a 2a 20 53 65 74 20 6f 66 20  .};../** Set of 
7af0: 74 65 73 74 20 76 65 63 74 6f 72 73 20 66 6f 72  test vectors for
7b00: 20 6f 6e 65 20 68 61 73 68 20 66 75 6e 63 74 69   one hash functi
7b10: 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 74 65 73  on */.struct tes
7b20: 74 5f 76 65 63 74 6f 72 73 5f 74 20 7b 0a 09 2f  t_vectors_t {../
7b30: 2a 2a 20 48 61 73 68 20 66 75 6e 63 74 69 6f 6e  ** Hash function
7b40: 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64   id */..unsigned
7b50: 20 68 61 73 68 5f 69 64 3b 0a 09 2f 2a 2a 20 41   hash_id;../** A
7b60: 72 72 61 79 20 6f 66 20 70 61 69 72 73 20 28 6d  rray of pairs (m
7b70: 65 73 73 61 67 65 2c 20 6d 65 73 73 61 67 65 5f  essage, message_
7b80: 64 69 67 65 73 74 29 20 2a 2f 0a 09 63 6f 6e 73  digest) */..cons
7b90: 74 20 63 68 61 72 2a 2a 20 74 65 73 74 73 3b 0a  t char** tests;.
7ba0: 7d 3b 0a 0a 2f 2a 2a 0a 20 2a 20 41 72 72 61 79  };../**. * Array
7bb0: 20 6f 66 20 74 65 73 74 20 76 65 63 74 6f 72 73   of test vectors
7bc0: 20 66 6f 72 20 73 68 6f 72 74 20 6d 65 73 73 61   for short messa
7bd0: 67 65 73 0a 20 2a 2f 0a 73 74 72 75 63 74 20 74  ges. */.struct t
7be0: 65 73 74 5f 76 65 63 74 6f 72 73 5f 74 20 73 68  est_vectors_t sh
7bf0: 6f 72 74 5f 74 65 73 74 5f 76 65 63 74 6f 72 73  ort_test_vectors
7c00: 5b 5d 20 3d 20 7b 0a 09 7b 20 52 48 41 53 48 5f  [] = {..{ RHASH_
7c10: 43 52 43 33 32 2c 20 63 72 63 33 32 5f 74 65 73  CRC32, crc32_tes
7c20: 74 73 20 7d 2c 0a 09 7b 20 52 48 41 53 48 5f 4d  ts },..{ RHASH_M
7c30: 44 34 2c 20 6d 64 34 5f 74 65 73 74 73 20 7d 2c  D4, md4_tests },
7c40: 0a 09 7b 20 52 48 41 53 48 5f 4d 44 35 2c 20 6d  ..{ RHASH_MD5, m
7c50: 64 35 5f 74 65 73 74 73 20 7d 2c 0a 09 7b 20 52  d5_tests },..{ R
7c60: 48 41 53 48 5f 53 48 41 31 2c 20 73 68 61 31 5f  HASH_SHA1, sha1_
7c70: 74 65 73 74 73 20 7d 2c 0a 09 7b 20 52 48 41 53  tests },..{ RHAS
7c80: 48 5f 54 49 47 45 52 2c 20 74 69 67 65 72 5f 68  H_TIGER, tiger_h
7c90: 61 73 68 65 73 20 7d 2c 0a 09 7b 20 52 48 41 53  ashes },..{ RHAS
7ca0: 48 5f 54 54 48 2c 20 74 74 68 5f 74 65 73 74 73  H_TTH, tth_tests
7cb0: 20 7d 2c 0a 09 7b 20 52 48 41 53 48 5f 42 54 49   },..{ RHASH_BTI
7cc0: 48 2c 20 62 74 69 68 5f 77 69 74 68 5f 66 69 6c  H, btih_with_fil
7cd0: 65 6e 61 6d 65 5f 74 65 73 74 73 20 7d 2c 0a 09  ename_tests },..
7ce0: 7b 20 52 48 41 53 48 5f 42 54 49 48 2c 20 62 74  { RHASH_BTIH, bt
7cf0: 69 68 5f 77 69 74 68 6f 75 74 5f 61 5f 66 69 6c  ih_without_a_fil
7d00: 65 6e 61 6d 65 5f 74 65 73 74 73 20 7d 2c 0a 09  ename_tests },..
7d10: 7b 20 52 48 41 53 48 5f 45 44 32 4b 2c 20 65 64  { RHASH_ED2K, ed
7d20: 32 6b 5f 74 65 73 74 73 20 7d 2c 0a 09 7b 20 52  2k_tests },..{ R
7d30: 48 41 53 48 5f 41 49 43 48 2c 20 61 69 63 68 5f  HASH_AICH, aich_
7d40: 74 65 73 74 73 20 7d 2c 0a 09 7b 20 52 48 41 53  tests },..{ RHAS
7d50: 48 5f 57 48 49 52 4c 50 4f 4f 4c 2c 20 77 68 69  H_WHIRLPOOL, whi
7d60: 72 6c 70 6f 6f 6c 5f 74 65 73 74 73 20 7d 2c 0a  rlpool_tests },.
7d70: 09 7b 20 52 48 41 53 48 5f 52 49 50 45 4d 44 31  .{ RHASH_RIPEMD1
7d80: 36 30 2c 20 72 69 70 65 6d 64 5f 74 65 73 74 73  60, ripemd_tests
7d90: 20 7d 2c 0a 09 7b 20 52 48 41 53 48 5f 47 4f 53   },..{ RHASH_GOS
7da0: 54 2c 20 67 6f 73 74 5f 74 65 73 74 73 20 7d 2c  T, gost_tests },
7db0: 0a 09 7b 20 52 48 41 53 48 5f 47 4f 53 54 5f 43  ..{ RHASH_GOST_C
7dc0: 52 59 50 54 4f 50 52 4f 2c 20 67 6f 73 74 5f 63  RYPTOPRO, gost_c
7dd0: 72 79 70 74 6f 70 72 6f 5f 74 65 73 74 73 20 7d  ryptopro_tests }
7de0: 2c 0a 09 7b 20 52 48 41 53 48 5f 48 41 53 31 36  ,..{ RHASH_HAS16
7df0: 30 2c 20 68 61 73 31 36 30 5f 74 65 73 74 73 20  0, has160_tests 
7e00: 7d 2c 0a 09 7b 20 52 48 41 53 48 5f 53 4e 45 46  },..{ RHASH_SNEF
7e10: 52 55 31 32 38 2c 20 73 6e 65 66 72 75 31 32 38  RU128, snefru128
7e20: 5f 74 65 73 74 73 20 7d 2c 0a 09 7b 20 52 48 41  _tests },..{ RHA
7e30: 53 48 5f 53 4e 45 46 52 55 32 35 36 2c 20 73 6e  SH_SNEFRU256, sn
7e40: 65 66 72 75 32 35 36 5f 74 65 73 74 73 20 7d 2c  efru256_tests },
7e50: 0a 09 7b 20 52 48 41 53 48 5f 53 48 41 32 32 34  ..{ RHASH_SHA224
7e60: 2c 20 73 68 61 32 32 34 5f 74 65 73 74 73 20 7d  , sha224_tests }
7e70: 2c 0a 09 7b 20 52 48 41 53 48 5f 53 48 41 32 35  ,..{ RHASH_SHA25
7e80: 36 2c 20 73 68 61 32 35 36 5f 74 65 73 74 73 20  6, sha256_tests 
7e90: 7d 2c 0a 09 7b 20 52 48 41 53 48 5f 53 48 41 33  },..{ RHASH_SHA3
7ea0: 38 34 2c 20 73 68 61 33 38 34 5f 74 65 73 74 73  84, sha384_tests
7eb0: 20 7d 2c 0a 09 7b 20 52 48 41 53 48 5f 53 48 41   },..{ RHASH_SHA
7ec0: 35 31 32 2c 20 73 68 61 35 31 32 5f 74 65 73 74  512, sha512_test
7ed0: 73 20 7d 2c 0a 09 7b 20 52 48 41 53 48 5f 53 48  s },..{ RHASH_SH
7ee0: 41 33 5f 32 32 34 2c 20 73 68 61 33 5f 32 32 34  A3_224, sha3_224
7ef0: 5f 74 65 73 74 73 20 7d 2c 0a 09 7b 20 52 48 41  _tests },..{ RHA
7f00: 53 48 5f 53 48 41 33 5f 32 35 36 2c 20 73 68 61  SH_SHA3_256, sha
7f10: 33 5f 32 35 36 5f 74 65 73 74 73 20 7d 2c 0a 09  3_256_tests },..
7f20: 7b 20 52 48 41 53 48 5f 53 48 41 33 5f 33 38 34  { RHASH_SHA3_384
7f30: 2c 20 73 68 61 33 5f 33 38 34 5f 74 65 73 74 73  , sha3_384_tests
7f40: 20 7d 2c 0a 09 7b 20 52 48 41 53 48 5f 53 48 41   },..{ RHASH_SHA
7f50: 33 5f 35 31 32 2c 20 73 68 61 33 5f 35 31 32 5f  3_512, sha3_512_
7f60: 74 65 73 74 73 20 7d 2c 0a 09 7b 20 52 48 41 53  tests },..{ RHAS
7f70: 48 5f 45 44 4f 4e 52 32 35 36 2c 20 65 64 6f 6e  H_EDONR256, edon
7f80: 72 32 35 36 5f 74 65 73 74 73 20 7d 2c 0a 09 7b  r256_tests },..{
7f90: 20 52 48 41 53 48 5f 45 44 4f 4e 52 35 31 32 2c   RHASH_EDONR512,
7fa0: 20 65 64 6f 6e 72 35 31 32 5f 74 65 73 74 73 20   edonr512_tests 
7fb0: 7d 2c 0a 09 7b 20 30 2c 20 30 20 7d 0a 7d 3b 0a  },..{ 0, 0 }.};.
7fc0: 0a 2f 2a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ./*=============
7fd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7fe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7ff0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 2a 0a 20 2a  ============*. *
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
8020: 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 63 61 6c  unctions for cal
8030: 63 75 6c 61 74 69 6e 67 20 61 20 6d 65 73 73 61  culating a messa
8040: 67 65 20 64 69 67 65 73 74 20 20 20 20 20 20 20  ge digest       
8050: 20 20 20 20 20 20 20 20 20 2a 0a 20 2a 3d 3d 3d           *. *===
8060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8090: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
80a0: 3d 3d 3d 3d 3d 3d 2a 2f 0a 0a 2f 2a 2a 0a 20 2a  ======*/../**. *
80b0: 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
80c0: 72 20 6f 66 20 65 72 72 6f 72 73 0a 20 2a 2f 0a  r of errors. */.
80d0: 73 74 61 74 69 63 20 69 6e 74 20 67 5f 65 72 72  static int g_err
80e0: 6f 72 73 20 3d 20 30 3b 0a 0a 2f 2a 2a 0a 20 2a  ors = 0;../**. *
80f0: 20 50 72 69 6e 74 20 61 20 66 6f 72 6d 61 74 74   Print a formatt
8100: 65 64 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68  ed message to th
8110: 65 20 6d 65 73 73 61 67 65 20 6c 6f 67 2e 0a 20  e message log.. 
8120: 2a 20 40 70 61 72 61 6d 20 66 6f 72 6d 61 74 20  * @param format 
8130: 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  the format of th
8140: 65 20 6d 65 73 73 61 67 65 0a 20 2a 2f 0a 73 74  e message. */.st
8150: 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 5f 6d 65  atic void log_me
8160: 73 73 61 67 65 28 63 68 61 72 2a 20 66 6f 72 6d  ssage(char* form
8170: 61 74 2c 20 2e 2e 2e 29 0a 7b 0a 09 76 61 5f 6c  at, ...).{..va_l
8180: 69 73 74 20 76 6c 3b 0a 09 76 61 5f 73 74 61 72  ist vl;..va_star
8190: 74 28 76 6c 2c 20 66 6f 72 6d 61 74 29 3b 0a 09  t(vl, format);..
81a0: 76 70 72 69 6e 74 66 28 66 6f 72 6d 61 74 2c 20  vprintf(format, 
81b0: 76 6c 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 64  vl);..fflush(std
81c0: 6f 75 74 29 3b 0a 09 76 61 5f 65 6e 64 28 76 6c  out);..va_end(vl
81d0: 29 3b 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 43 61 6c  );.}../**. * Cal
81e0: 63 75 6c 61 74 65 20 68 61 73 68 20 6f 66 20 74  culate hash of t
81f0: 68 65 20 6d 65 73 73 61 67 65 20 73 70 65 63 69  he message speci
8200: 66 69 65 64 20 62 79 20 63 68 75 6e 6b 20 73 74  fied by chunk st
8210: 72 69 6e 67 2c 20 72 65 70 65 61 74 65 64 20 75  ring, repeated u
8220: 6e 74 69 6c 0a 20 2a 20 74 68 65 20 67 69 76 65  ntil. * the give
8230: 6e 20 6c 65 6e 67 74 68 20 69 73 20 72 65 61 63  n length is reac
8240: 68 65 64 2e 0a 20 2a 0a 20 2a 20 40 70 61 72 61  hed.. *. * @para
8250: 6d 20 68 61 73 68 5f 69 64 20 69 64 20 6f 66 20  m hash_id id of 
8260: 74 68 65 20 68 61 73 68 20 61 6c 67 6f 72 69 74  the hash algorit
8270: 68 6d 20 74 6f 20 75 73 65 0a 20 2a 20 40 70 61  hm to use. * @pa
8280: 72 61 6d 20 6d 73 67 5f 63 68 75 6e 6b 20 74 68  ram msg_chunk th
8290: 65 20 6d 65 73 73 61 67 65 20 63 68 75 6e 6b 20  e message chunk 
82a0: 61 73 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  as a null-termin
82b0: 61 74 65 64 20 73 74 72 69 6e 67 0a 20 2a 20 40  ated string. * @
82c0: 70 61 72 61 6d 20 63 68 75 6e 6b 5f 73 69 7a 65  param chunk_size
82d0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
82e0: 20 63 68 75 6e 6b 20 69 6e 20 62 79 74 65 73 0a   chunk in bytes.
82f0: 20 2a 20 40 70 61 72 61 6d 20 63 6f 75 6e 74 20   * @param count 
8300: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
8310: 75 6e 6b 73 20 69 6e 20 74 68 65 20 6d 65 73 73  unks in the mess
8320: 61 67 65 0a 20 2a 20 40 70 61 72 61 6d 20 73 65  age. * @param se
8330: 74 5f 66 69 6c 65 6e 61 6d 65 20 62 6f 6f 6c 65  t_filename boole
8340: 61 6e 20 66 6c 61 67 3a 20 73 65 74 20 61 20 66  an flag: set a f
8350: 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ilename for the 
8360: 42 54 49 48 20 68 61 73 68 0a 20 2a 2f 0a 73 74  BTIH hash. */.st
8370: 61 74 69 63 20 63 68 61 72 2a 20 72 65 70 65 61  atic char* repea
8380: 74 5f 68 61 73 68 28 75 6e 73 69 67 6e 65 64 20  t_hash(unsigned 
8390: 68 61 73 68 5f 69 64 2c 20 63 6f 6e 73 74 20 63  hash_id, const c
83a0: 68 61 72 2a 20 63 68 75 6e 6b 2c 20 73 69 7a 65  har* chunk, size
83b0: 5f 74 20 63 68 75 6e 6b 5f 73 69 7a 65 2c 20 73  _t chunk_size, s
83c0: 69 7a 65 5f 74 20 6d 73 67 5f 73 69 7a 65 2c 20  ize_t msg_size, 
83d0: 69 6e 74 20 73 65 74 5f 66 69 6c 65 6e 61 6d 65  int set_filename
83e0: 29 0a 7b 0a 09 73 74 72 75 63 74 20 72 68 61 73  ).{..struct rhas
83f0: 68 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 3b 0a  h_context *ctx;.
8400: 09 73 69 7a 65 5f 74 20 6c 65 66 74 2c 20 73 69  .size_t left, si
8410: 7a 65 3b 0a 09 73 74 61 74 69 63 20 63 68 61 72  ze;..static char
8420: 20 6f 75 74 5b 31 33 30 5d 3b 0a 09 61 73 73 65   out[130];..asse
8430: 72 74 28 72 68 61 73 68 5f 67 65 74 5f 68 61 73  rt(rhash_get_has
8440: 68 5f 6c 65 6e 67 74 68 28 68 61 73 68 5f 69 64  h_length(hash_id
8450: 29 20 3c 20 31 33 30 29 3b 0a 0a 09 63 74 78 20  ) < 130);...ctx 
8460: 3d 20 72 68 61 73 68 5f 69 6e 69 74 28 68 61 73  = rhash_init(has
8470: 68 5f 69 64 29 3b 0a 0a 09 69 66 20 28 28 68 61  h_id);...if ((ha
8480: 73 68 5f 69 64 20 26 20 52 48 41 53 48 5f 42 54  sh_id & RHASH_BT
8490: 49 48 29 20 26 26 20 73 65 74 5f 66 69 6c 65 6e  IH) && set_filen
84a0: 61 6d 65 29 20 7b 0a 09 09 72 68 61 73 68 5f 74  ame) {...rhash_t
84b0: 6f 72 72 65 6e 74 5f 61 64 64 5f 66 69 6c 65 28  orrent_add_file(
84c0: 63 74 78 2c 20 22 74 65 73 74 2e 74 78 74 22 2c  ctx, "test.txt",
84d0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20   (unsigned long 
84e0: 6c 6f 6e 67 29 6d 73 67 5f 73 69 7a 65 29 3b 0a  long)msg_size);.
84f0: 09 7d 0a 0a 09 66 6f 72 20 28 6c 65 66 74 20 3d  .}...for (left =
8500: 20 6d 73 67 5f 73 69 7a 65 3b 20 6c 65 66 74 20   msg_size; left 
8510: 3e 20 30 3b 20 6c 65 66 74 20 2d 3d 20 73 69 7a  > 0; left -= siz
8520: 65 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20 28 6c  e) {...size = (l
8530: 65 66 74 20 3e 20 63 68 75 6e 6b 5f 73 69 7a 65  eft > chunk_size
8540: 20 3f 20 63 68 75 6e 6b 5f 73 69 7a 65 20 3a 20   ? chunk_size : 
8550: 6c 65 66 74 29 3b 0a 09 09 72 68 61 73 68 5f 75  left);...rhash_u
8560: 70 64 61 74 65 28 63 74 78 2c 20 28 63 6f 6e 73  pdate(ctx, (cons
8570: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
8580: 29 63 68 75 6e 6b 2c 20 73 69 7a 65 29 3b 0a 09  )chunk, size);..
8590: 7d 0a 09 72 68 61 73 68 5f 66 69 6e 61 6c 28 63  }..rhash_final(c
85a0: 74 78 2c 20 30 29 3b 0a 09 72 68 61 73 68 5f 70  tx, 0);..rhash_p
85b0: 72 69 6e 74 28 6f 75 74 2c 20 63 74 78 2c 20 68  rint(out, ctx, h
85c0: 61 73 68 5f 69 64 2c 20 52 48 50 52 5f 55 50 50  ash_id, RHPR_UPP
85d0: 45 52 43 41 53 45 29 3b 0a 09 72 68 61 73 68 5f  ERCASE);..rhash_
85e0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
85f0: 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 2a 0a 20  rn out;.}../**. 
8600: 2a 20 54 65 73 74 20 61 20 68 61 73 68 20 61 6c  * Test a hash al
8610: 67 6f 72 69 74 68 6d 20 61 67 61 69 6e 73 74 20  gorithm against 
8620: 61 20 6d 65 73 73 61 67 65 20 6f 66 20 67 69 76  a message of giv
8630: 65 6e 20 6c 65 6e 67 74 68 2c 20 63 6f 6e 73 69  en length, consi
8640: 73 74 69 6e 67 0a 20 2a 20 6f 66 20 72 65 70 65  sting. * of repe
8650: 61 74 65 64 20 63 68 75 6e 6b 73 2e 0a 20 2a 20  ated chunks.. * 
8660: 52 65 70 6f 72 74 20 65 72 72 6f 72 20 69 66 20  Report error if 
8670: 63 61 6c 63 75 6c 61 74 65 64 20 68 61 73 68 20  calculated hash 
8680: 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
8690: 20 65 78 70 65 63 74 65 64 20 76 61 6c 75 65 2e   expected value.
86a0: 0a 20 2a 0a 20 2a 20 40 70 61 72 61 6d 20 68 61  . *. * @param ha
86b0: 73 68 5f 69 64 20 69 64 20 6f 66 20 74 68 65 20  sh_id id of the 
86c0: 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 74 65 73  algorithm to tes
86d0: 74 0a 20 2a 20 40 70 61 72 61 6d 20 6d 73 67 5f  t. * @param msg_
86e0: 63 68 75 6e 6b 20 74 68 65 20 6d 65 73 73 61 67  chunk the messag
86f0: 65 20 63 68 75 6e 6b 20 61 73 20 61 20 6e 75 6c  e chunk as a nul
8700: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
8710: 69 6e 67 0a 20 2a 20 40 70 61 72 61 6d 20 63 68  ing. * @param ch
8720: 75 6e 6b 5f 73 69 7a 65 20 74 68 65 20 73 69 7a  unk_size the siz
8730: 65 20 6f 66 20 74 68 65 20 63 68 75 6e 6b 20 69  e of the chunk i
8740: 6e 20 62 79 74 65 73 0a 20 2a 20 40 70 61 72 61  n bytes. * @para
8750: 6d 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  m count the numb
8760: 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 69 6e 20  er of chunks in 
8770: 74 68 65 20 6d 65 73 73 61 67 65 0a 20 2a 20 40  the message. * @
8780: 70 61 72 61 6d 20 68 61 73 68 20 74 68 65 20 65  param hash the e
8790: 78 70 65 63 74 65 64 20 68 61 73 68 20 76 61 6c  xpected hash val
87a0: 75 65 0a 20 2a 20 40 70 61 72 61 6d 20 73 65 74  ue. * @param set
87b0: 5f 66 69 6c 65 6e 61 6d 65 20 6e 65 65 64 20 74  _filename need t
87c0: 6f 20 73 65 74 20 61 20 66 69 6c 65 6e 61 6d 65  o set a filename
87d0: 20 66 6f 72 20 42 54 49 48 20 68 61 73 68 0a 20   for BTIH hash. 
87e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
87f0: 73 73 65 72 74 5f 68 61 73 68 5f 6c 6f 6e 67 5f  ssert_hash_long_
8800: 6d 73 67 28 75 6e 73 69 67 6e 65 64 20 68 61 73  msg(unsigned has
8810: 68 5f 69 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  h_id, const char
8820: 2a 20 6d 73 67 5f 63 68 75 6e 6b 2c 20 73 69 7a  * msg_chunk, siz
8830: 65 5f 74 20 63 68 75 6e 6b 5f 73 69 7a 65 2c 20  e_t chunk_size, 
8840: 73 69 7a 65 5f 74 20 6d 73 67 5f 73 69 7a 65 2c  size_t msg_size,
8850: 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 68 61 73   const char* has
8860: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 6d  h, const char* m
8870: 73 67 5f 6e 61 6d 65 2c 20 69 6e 74 20 73 65 74  sg_name, int set
8880: 5f 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 09 63 68  _filename).{..ch
8890: 61 72 2a 20 72 65 73 75 6c 74 3b 0a 09 72 65 73  ar* result;..res
88a0: 75 6c 74 20 3d 20 72 65 70 65 61 74 5f 68 61 73  ult = repeat_has
88b0: 68 28 68 61 73 68 5f 69 64 2c 20 6d 73 67 5f 63  h(hash_id, msg_c
88c0: 68 75 6e 6b 2c 20 63 68 75 6e 6b 5f 73 69 7a 65  hunk, chunk_size
88d0: 2c 20 6d 73 67 5f 73 69 7a 65 2c 20 73 65 74 5f  , msg_size, set_
88e0: 66 69 6c 65 6e 61 6d 65 29 3b 0a 09 69 66 20 28  filename);..if (
88f0: 73 74 72 63 6d 70 28 72 65 73 75 6c 74 2c 20 68  strcmp(result, h
8900: 61 73 68 29 20 21 3d 20 30 29 20 7b 0a 09 09 63  ash) != 0) {...c
8910: 6f 6e 73 74 20 63 68 61 72 2a 20 68 61 73 68 5f  onst char* hash_
8920: 6e 61 6d 65 20 3d 20 72 68 61 73 68 5f 67 65 74  name = rhash_get
8930: 5f 6e 61 6d 65 28 68 61 73 68 5f 69 64 29 3b 20  _name(hash_id); 
8940: 2f 2a 20 74 68 65 20 68 61 73 68 20 66 75 6e 63  /* the hash func
8950: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 09 09 69  tion name */...i
8960: 66 20 28 6d 73 67 5f 6e 61 6d 65 29 20 6c 6f 67  f (msg_name) log
8970: 5f 6d 65 73 73 61 67 65 28 22 66 61 69 6c 65 64  _message("failed
8980: 3a 20 25 73 28 25 73 29 20 3d 20 25 73 2c 20 65  : %s(%s) = %s, e
8990: 78 70 65 63 74 65 64 20 25 73 5c 6e 22 2c 20 68  xpected %s\n", h
89a0: 61 73 68 5f 6e 61 6d 65 2c 20 6d 73 67 5f 6e 61  ash_name, msg_na
89b0: 6d 65 2c 20 72 65 73 75 6c 74 2c 20 68 61 73 68  me, result, hash
89c0: 29 3b 0a 09 09 65 6c 73 65 20 6c 6f 67 5f 6d 65  );...else log_me
89d0: 73 73 61 67 65 28 22 66 61 69 6c 65 64 3a 20 25  ssage("failed: %
89e0: 73 28 5c 22 25 73 5c 22 29 20 3d 20 25 73 2c 20  s(\"%s\") = %s, 
89f0: 65 78 70 65 63 74 65 64 20 25 73 5c 6e 22 2c 20  expected %s\n", 
8a00: 68 61 73 68 5f 6e 61 6d 65 2c 20 6d 73 67 5f 63  hash_name, msg_c
8a10: 68 75 6e 6b 2c 20 72 65 73 75 6c 74 2c 20 68 61  hunk, result, ha
8a20: 73 68 29 3b 0a 09 09 67 5f 65 72 72 6f 72 73 2b  sh);...g_errors+
8a30: 2b 3b 0a 09 7d 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20  +;..}.}../**. * 
8a40: 43 61 6c 63 75 6c 61 74 65 20 68 61 73 68 20 6f  Calculate hash o
8a50: 66 20 74 68 65 20 67 69 76 65 6e 20 6d 65 73 73  f the given mess
8a60: 61 67 65 2e 0a 20 2a 0a 20 2a 20 40 70 61 72 61  age.. *. * @para
8a70: 6d 20 68 61 73 68 5f 69 64 20 69 64 20 6f 66 20  m hash_id id of 
8a80: 74 68 65 20 68 61 73 68 20 61 6c 67 6f 72 69 74  the hash algorit
8a90: 68 6d 20 74 6f 20 75 73 65 0a 20 2a 20 40 70 61  hm to use. * @pa
8aa0: 72 61 6d 20 6d 73 67 20 74 68 65 20 6d 65 73 73  ram msg the mess
8ab0: 61 67 65 20 74 6f 20 68 61 73 68 0a 20 2a 20 40  age to hash. * @
8ac0: 70 61 72 61 6d 20 73 65 74 5f 66 69 6c 65 6e 61  param set_filena
8ad0: 6d 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 61  me need to set a
8ae0: 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 42 54   filename for BT
8af0: 49 48 20 68 61 73 68 0a 20 2a 2f 0a 73 74 61 74  IH hash. */.stat
8b00: 69 63 20 63 68 61 72 2a 20 68 61 73 68 5f 6d 65  ic char* hash_me
8b10: 73 73 61 67 65 28 75 6e 73 69 67 6e 65 64 20 68  ssage(unsigned h
8b20: 61 73 68 5f 69 64 2c 20 63 6f 6e 73 74 20 63 68  ash_id, const ch
8b30: 61 72 2a 20 6d 73 67 2c 20 69 6e 74 20 73 65 74  ar* msg, int set
8b40: 5f 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 09 73 69  _filename).{..si
8b50: 7a 65 5f 74 20 6d 73 67 5f 73 69 7a 65 20 3d 20  ze_t msg_size = 
8b60: 73 74 72 6c 65 6e 28 6d 73 67 29 3b 0a 09 72 65  strlen(msg);..re
8b70: 74 75 72 6e 20 72 65 70 65 61 74 5f 68 61 73 68  turn repeat_hash
8b80: 28 68 61 73 68 5f 69 64 2c 20 6d 73 67 2c 20 6d  (hash_id, msg, m
8b90: 73 67 5f 73 69 7a 65 2c 20 6d 73 67 5f 73 69 7a  sg_size, msg_siz
8ba0: 65 2c 20 73 65 74 5f 66 69 6c 65 6e 61 6d 65 29  e, set_filename)
8bb0: 3b 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 54 65 73 74  ;.}../**. * Test
8bc0: 20 61 20 68 61 73 68 20 61 6c 67 6f 72 69 74 68   a hash algorith
8bd0: 6d 20 6f 6e 20 67 69 76 65 6e 20 6d 65 73 73 61  m on given messa
8be0: 67 65 20 62 79 20 63 6f 6d 70 61 72 69 6e 67 20  ge by comparing 
8bf0: 74 68 65 20 72 65 73 75 6c 74 20 68 61 73 68 20  the result hash 
8c00: 76 61 6c 75 65 0a 20 2a 20 61 67 61 69 6e 73 74  value. * against
8c10: 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6f 6e   the expected on
8c20: 65 2e 20 52 65 70 6f 72 74 20 65 72 72 6f 72 20  e. Report error 
8c30: 6f 6e 20 66 61 69 6c 2e 0a 20 2a 0a 20 2a 20 40  on fail.. *. * @
8c40: 70 61 72 61 6d 20 68 61 73 68 5f 69 64 20 69 64  param hash_id id
8c50: 20 6f 66 20 74 68 65 20 61 6c 67 6f 72 69 74 68   of the algorith
8c60: 6d 20 74 6f 20 74 65 73 74 0a 20 2a 20 40 70 61  m to test. * @pa
8c70: 72 61 6d 20 6d 65 73 73 61 67 65 20 74 68 65 20  ram message the 
8c80: 6d 65 73 73 61 67 65 20 74 6f 20 68 61 73 68 0a  message to hash.
8c90: 20 2a 20 40 70 61 72 61 6d 20 65 78 70 65 63 74   * @param expect
8ca0: 65 64 5f 68 61 73 68 20 74 68 65 20 65 78 70 65  ed_hash the expe
8cb0: 63 74 65 64 20 68 61 73 68 20 76 61 6c 75 65 0a  cted hash value.
8cc0: 20 2a 20 40 70 61 72 61 6d 20 73 65 74 5f 66 69   * @param set_fi
8cd0: 6c 65 6e 61 6d 65 20 6e 65 65 64 20 74 6f 20 73  lename need to s
8ce0: 65 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 6f  et a filename fo
8cf0: 72 20 42 54 49 48 20 68 61 73 68 0a 20 2a 2f 0a  r BTIH hash. */.
8d00: 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
8d10: 72 74 5f 68 61 73 68 28 75 6e 73 69 67 6e 65 64  rt_hash(unsigned
8d20: 20 68 61 73 68 5f 69 64 2c 20 63 6f 6e 73 74 20   hash_id, const 
8d30: 63 68 61 72 2a 20 6d 73 67 2c 20 63 6f 6e 73 74  char* msg, const
8d40: 20 63 68 61 72 2a 20 65 78 70 65 63 74 65 64 5f   char* expected_
8d50: 68 61 73 68 2c 20 69 6e 74 20 73 65 74 5f 66 69  hash, int set_fi
8d60: 6c 65 6e 61 6d 65 29 0a 7b 0a 09 73 69 7a 65 5f  lename).{..size_
8d70: 74 20 6d 73 67 5f 73 69 7a 65 20 3d 20 73 74 72  t msg_size = str
8d80: 6c 65 6e 28 6d 73 67 29 3b 0a 09 61 73 73 65 72  len(msg);..asser
8d90: 74 5f 68 61 73 68 5f 6c 6f 6e 67 5f 6d 73 67 28  t_hash_long_msg(
8da0: 68 61 73 68 5f 69 64 2c 20 6d 73 67 2c 20 6d 73  hash_id, msg, ms
8db0: 67 5f 73 69 7a 65 2c 20 6d 73 67 5f 73 69 7a 65  g_size, msg_size
8dc0: 2c 20 65 78 70 65 63 74 65 64 5f 68 61 73 68 2c  , expected_hash,
8dd0: 20 4e 55 4c 4c 2c 20 73 65 74 5f 66 69 6c 65 6e   NULL, set_filen
8de0: 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20  ame);.}../**. * 
8df0: 54 65 73 74 20 61 20 68 61 73 68 20 61 6c 67 6f  Test a hash algo
8e00: 72 69 74 68 6d 20 75 73 69 6e 67 20 61 20 6d 65  rithm using a me
8e10: 73 73 61 67 65 20 63 6f 6e 73 69 73 74 69 6e 67  ssage consisting
8e20: 20 6f 66 20 67 69 76 65 6e 20 72 65 70 65 61 74   of given repeat
8e30: 65 64 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a  ed character.. *
8e40: 20 52 65 70 6f 72 74 20 65 72 72 6f 72 20 69 66   Report error if
8e50: 20 63 61 6c 63 75 6c 61 74 65 64 20 68 61 73 68   calculated hash
8e60: 20 64 6f 65 73 6e 27 74 20 63 6f 69 6e 63 69 64   doesn't coincid
8e70: 65 20 77 69 74 68 20 65 78 70 65 63 74 65 64 20  e with expected 
8e80: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 40 70 61  value.. *. * @pa
8e90: 72 61 6d 20 68 61 73 68 5f 69 64 20 69 64 20 6f  ram hash_id id o
8ea0: 66 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  f the algorithm 
8eb0: 74 6f 20 74 65 73 74 0a 20 2a 20 40 70 61 72 61  to test. * @para
8ec0: 6d 20 63 68 20 74 68 65 20 63 68 61 72 61 63 74  m ch the charact
8ed0: 65 72 20 74 68 65 20 6d 65 73 73 61 67 65 20 69  er the message i
8ee0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 0a 20 2a  s filled with. *
8ef0: 20 40 70 61 72 61 6d 20 6d 73 67 5f 73 69 7a 65   @param msg_size
8f00: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6d 65 73   the size of mes
8f10: 73 61 67 65 20 69 6e 20 62 79 74 65 73 0a 20 2a  sage in bytes. *
8f20: 20 40 70 61 72 61 6d 20 65 78 70 65 63 74 65 64   @param expected
8f30: 5f 68 61 73 68 20 74 68 65 20 65 78 70 65 63 74  _hash the expect
8f40: 65 64 20 68 61 73 68 20 76 61 6c 75 65 0a 20 2a  ed hash value. *
8f50: 20 40 70 61 72 61 6d 20 73 65 74 5f 66 69 6c 65   @param set_file
8f60: 6e 61 6d 65 20 6e 65 65 64 20 74 6f 20 73 65 74  name need to set
8f70: 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20   a filename for 
8f80: 42 54 49 48 20 68 61 73 68 0a 20 2a 2f 0a 73 74  BTIH hash. */.st
8f90: 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
8fa0: 5f 72 65 70 5f 68 61 73 68 28 75 6e 73 69 67 6e  _rep_hash(unsign
8fb0: 65 64 20 68 61 73 68 5f 69 64 2c 20 63 68 61 72  ed hash_id, char
8fc0: 20 63 68 2c 20 73 69 7a 65 5f 74 20 6d 73 67 5f   ch, size_t msg_
8fd0: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
8fe0: 2a 20 68 61 73 68 2c 20 69 6e 74 20 73 65 74 5f  * hash, int set_
8ff0: 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 09 63 68 61  filename).{..cha
9000: 72 20 41 4c 49 47 4e 5f 41 54 54 52 28 31 36 29  r ALIGN_ATTR(16)
9010: 20 6d 73 67 5f 63 68 75 6e 6b 5b 38 31 39 32 5d   msg_chunk[8192]
9020: 3b 20 2f 2a 20 38 20 4b 69 42 20 2a 2f 0a 09 63  ; /* 8 KiB */..c
9030: 68 61 72 20 6d 73 67 5f 6e 61 6d 65 5b 32 30 5d  har msg_name[20]
9040: 3b 0a 09 6d 65 6d 73 65 74 28 6d 73 67 5f 63 68  ;..memset(msg_ch
9050: 75 6e 6b 2c 20 63 68 2c 20 38 31 39 32 29 3b 0a  unk, ch, 8192);.
9060: 09 69 66 20 28 63 68 20 3e 3d 20 33 32 29 20 73  .if (ch >= 32) s
9070: 70 72 69 6e 74 66 28 6d 73 67 5f 6e 61 6d 65 2c  printf(msg_name,
9080: 20 22 5c 22 25 63 5c 22 78 25 64 22 2c 20 63 68   "\"%c\"x%d", ch
9090: 2c 20 28 69 6e 74 29 6d 73 67 5f 73 69 7a 65 29  , (int)msg_size)
90a0: 3b 0a 09 65 6c 73 65 20 73 70 72 69 6e 74 66 28  ;..else sprintf(
90b0: 6d 73 67 5f 6e 61 6d 65 2c 20 22 5c 22 5c 5c 25  msg_name, "\"\\%
90c0: 6f 5c 22 78 25 64 22 2c 20 28 75 6e 73 69 67 6e  o\"x%d", (unsign
90d0: 65 64 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ed)(unsigned cha
90e0: 72 29 63 68 2c 20 28 69 6e 74 29 6d 73 67 5f 73  r)ch, (int)msg_s
90f0: 69 7a 65 29 3b 0a 09 61 73 73 65 72 74 5f 68 61  ize);..assert_ha
9100: 73 68 5f 6c 6f 6e 67 5f 6d 73 67 28 68 61 73 68  sh_long_msg(hash
9110: 5f 69 64 2c 20 6d 73 67 5f 63 68 75 6e 6b 2c 20  _id, msg_chunk, 
9120: 38 31 39 32 2c 20 6d 73 67 5f 73 69 7a 65 2c 20  8192, msg_size, 
9130: 68 61 73 68 2c 20 6d 73 67 5f 6e 61 6d 65 2c 20  hash, msg_name, 
9140: 73 65 74 5f 66 69 6c 65 6e 61 6d 65 29 3b 0a 7d  set_filename);.}
9150: 0a 0a 2f 2a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ../*============
9160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 2a 0a 20  =============*. 
91a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 65                Te
91c0: 73 74 20 66 75 6e 63 74 69 6f 6e 73 20 20 20 20  st functions    
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 20 20 20 20 20 20 20 20 20 2a 0a 20 2a 3d 3d            *. *==
91f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9230: 3d 3d 3d 3d 3d 3d 3d 2a 2f 0a 0a 2f 2a 2a 0a 20  =======*/../**. 
9240: 2a 20 54 65 73 74 20 61 20 68 61 73 68 20 61 6c  * Test a hash al
9250: 67 6f 72 69 74 68 6d 20 6f 6e 20 61 72 72 61 79  gorithm on array
9260: 20 6f 66 20 6b 6e 6f 77 6e 20 73 68 6f 72 74 20   of known short 
9270: 6d 65 73 73 61 67 65 73 2e 0a 20 2a 0a 20 2a 20  messages.. *. * 
9280: 40 70 61 72 61 6d 20 68 61 73 68 5f 69 64 20 69  @param hash_id i
9290: 64 20 6f 66 20 74 68 65 20 61 6c 67 6f 72 69 74  d of the algorit
92a0: 68 6d 20 74 6f 20 74 65 73 74 0a 20 2a 20 40 70  hm to test. * @p
92b0: 61 72 61 6d 20 70 74 72 20 70 6f 69 6e 74 65 72  aram ptr pointer
92c0: 20 74 6f 20 61 72 72 61 79 20 6f 66 20 70 61 69   to array of pai
92d0: 72 73 20 3c 6d 65 73 73 61 67 65 2c 65 78 70 65  rs <message,expe
92e0: 63 74 65 64 2d 68 61 73 68 3e 0a 20 2a 20 40 70  cted-hash>. * @p
92f0: 61 72 61 6d 20 73 65 74 5f 66 69 6c 65 6e 61 6d  aram set_filenam
9300: 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 61 20  e need to set a 
9310: 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 42 54 49  filename for BTI
9320: 48 20 68 61 73 68 0a 20 2a 2f 0a 73 74 61 74 69  H hash. */.stati
9330: 63 20 76 6f 69 64 20 74 65 73 74 5f 6b 6e 6f 77  c void test_know
9340: 6e 5f 73 74 72 69 6e 67 73 5f 70 61 69 72 73 28  n_strings_pairs(
9350: 75 6e 73 69 67 6e 65 64 20 68 61 73 68 5f 69 64  unsigned hash_id
9360: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 20 70  , const char** p
9370: 74 72 2c 20 69 6e 74 20 73 65 74 5f 66 69 6c 65  tr, int set_file
9380: 6e 61 6d 65 29 0a 7b 0a 09 66 6f 72 20 28 3b 20  name).{..for (; 
9390: 70 74 72 5b 30 5d 20 26 26 20 70 74 72 5b 31 5d  ptr[0] && ptr[1]
93a0: 3b 20 70 74 72 20 2b 3d 20 32 29 20 7b 0a 09 09  ; ptr += 2) {...
93b0: 61 73 73 65 72 74 5f 68 61 73 68 28 68 61 73 68  assert_hash(hash
93c0: 5f 69 64 2c 20 70 74 72 5b 30 5d 2c 20 70 74 72  _id, ptr[0], ptr
93d0: 5b 31 5d 2c 20 73 65 74 5f 66 69 6c 65 6e 61 6d  [1], set_filenam
93e0: 65 29 3b 0a 09 7d 0a 7d 0a 0a 2f 2a 2a 0a 20 2a  e);..}.}../**. *
93f0: 20 54 65 73 74 20 61 20 68 61 73 68 20 61 6c 67   Test a hash alg
9400: 6f 72 69 74 68 6d 20 6f 6e 20 6b 6e 6f 77 6e 20  orithm on known 
9410: 73 68 6f 72 74 20 6d 65 73 73 61 67 65 73 2e 0a  short messages..
9420: 20 2a 0a 20 2a 20 40 70 61 72 61 6d 20 68 61 73   *. * @param has
9430: 68 5f 69 64 20 69 64 20 6f 66 20 74 68 65 20 61  h_id id of the a
9440: 6c 67 6f 72 69 74 68 6d 20 74 6f 20 74 65 73 74  lgorithm to test
9450: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
9460: 20 74 65 73 74 5f 6b 6e 6f 77 6e 5f 73 74 72 69   test_known_stri
9470: 6e 67 73 28 75 6e 73 69 67 6e 65 64 20 68 61 73  ngs(unsigned has
9480: 68 5f 69 64 29 0a 7b 0a 09 69 6e 74 20 69 3b 0a  h_id).{..int i;.
9490: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 73 68 6f  .for (i = 0; sho
94a0: 72 74 5f 74 65 73 74 5f 76 65 63 74 6f 72 73 5b  rt_test_vectors[
94b0: 69 5d 2e 74 65 73 74 73 20 21 3d 20 30 3b 20 69  i].tests != 0; i
94c0: 2b 2b 29 20 7b 0a 09 09 69 66 20 28 68 61 73 68  ++) {...if (hash
94d0: 5f 69 64 20 3d 3d 20 73 68 6f 72 74 5f 74 65 73  _id == short_tes
94e0: 74 5f 76 65 63 74 6f 72 73 5b 69 5d 2e 68 61 73  t_vectors[i].has
94f0: 68 5f 69 64 29 20 7b 0a 09 09 09 69 6e 74 20 73  h_id) {....int s
9500: 65 74 5f 66 69 6c 65 6e 61 6d 65 20 3d 20 28 73  et_filename = (s
9510: 68 6f 72 74 5f 74 65 73 74 5f 76 65 63 74 6f 72  hort_test_vector
9520: 73 5b 69 5d 2e 74 65 73 74 73 20 3d 3d 20 62 74  s[i].tests == bt
9530: 69 68 5f 77 69 74 68 5f 66 69 6c 65 6e 61 6d 65  ih_with_filename
9540: 5f 74 65 73 74 73 29 3b 0a 09 09 09 74 65 73 74  _tests);....test
9550: 5f 6b 6e 6f 77 6e 5f 73 74 72 69 6e 67 73 5f 70  _known_strings_p
9560: 61 69 72 73 28 68 61 73 68 5f 69 64 2c 20 73 68  airs(hash_id, sh
9570: 6f 72 74 5f 74 65 73 74 5f 76 65 63 74 6f 72 73  ort_test_vectors
9580: 5b 69 5d 2e 74 65 73 74 73 2c 20 73 65 74 5f 66  [i].tests, set_f
9590: 69 6c 65 6e 61 6d 65 29 3b 0a 09 09 09 62 72 65  ilename);....bre
95a0: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 7d 0a 0a 2f 2a  ak;...}..}.}../*
95b0: 2a 0a 20 2a 20 56 65 72 69 66 79 20 68 61 73 68  *. * Verify hash
95c0: 20 61 6c 67 6f 72 69 74 68 6d 73 20 62 79 20 74   algorithms by t
95d0: 65 73 74 69 6e 67 20 74 68 65 6d 20 61 67 61 69  esting them agai
95e0: 6e 73 74 20 6b 6e 6f 77 6e 20 73 68 6f 72 74 20  nst known short 
95f0: 6d 65 73 73 61 67 65 73 2e 0a 20 2a 2f 0a 73 74  messages.. */.st
9600: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
9610: 6c 6c 5f 6b 6e 6f 77 6e 5f 73 74 72 69 6e 67 73  ll_known_strings
9620: 28 76 6f 69 64 29 0a 7b 0a 09 69 6e 74 20 69 3b  (void).{..int i;
9630: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 73 68  ..for (i = 0; sh
9640: 6f 72 74 5f 74 65 73 74 5f 76 65 63 74 6f 72 73  ort_test_vectors
9650: 5b 69 5d 2e 74 65 73 74 73 20 21 3d 20 30 3b 20  [i].tests != 0; 
9660: 69 2b 2b 29 20 7b 0a 09 09 69 6e 74 20 73 65 74  i++) {...int set
9670: 5f 66 69 6c 65 6e 61 6d 65 20 3d 20 28 73 68 6f  _filename = (sho
9680: 72 74 5f 74 65 73 74 5f 76 65 63 74 6f 72 73 5b  rt_test_vectors[
9690: 69 5d 2e 74 65 73 74 73 20 3d 3d 20 62 74 69 68  i].tests == btih
96a0: 5f 77 69 74 68 5f 66 69 6c 65 6e 61 6d 65 5f 74  _with_filename_t
96b0: 65 73 74 73 29 3b 0a 09 09 74 65 73 74 5f 6b 6e  ests);...test_kn
96c0: 6f 77 6e 5f 73 74 72 69 6e 67 73 5f 70 61 69 72  own_strings_pair
96d0: 73 28 73 68 6f 72 74 5f 74 65 73 74 5f 76 65 63  s(short_test_vec
96e0: 74 6f 72 73 5b 69 5d 2e 68 61 73 68 5f 69 64 2c  tors[i].hash_id,
96f0: 20 73 68 6f 72 74 5f 74 65 73 74 5f 76 65 63 74   short_test_vect
9700: 6f 72 73 5b 69 5d 2e 74 65 73 74 73 2c 20 73 65  ors[i].tests, se
9710: 74 5f 66 69 6c 65 6e 61 6d 65 29 3b 0a 09 7d 0a  t_filename);..}.
9720: 7d 0a 0a 2f 2a 2a 0a 20 2a 20 41 20 70 61 69 72  }../**. * A pair
9730: 20 3c 61 6c 67 6f 72 69 74 68 6d 2d 69 64 2c 20   <algorithm-id, 
9740: 65 78 70 65 63 74 65 64 2d 68 61 73 68 2d 76 61  expected-hash-va
9750: 6c 75 65 3e 2e 0a 20 2a 2f 0a 74 79 70 65 64 65  lue>.. */.typede
9760: 66 20 73 74 72 75 63 74 20 69 64 5f 74 6f 5f 68  f struct id_to_h
9770: 61 73 68 5f 74 20 7b 0a 09 69 6e 74 20 68 61 73  ash_t {..int has
9780: 68 5f 69 64 3b 0a 09 63 6f 6e 73 74 20 63 68 61  h_id;..const cha
9790: 72 2a 20 65 78 70 65 63 74 65 64 5f 68 61 73 68  r* expected_hash
97a0: 3b 0a 7d 20 69 64 5f 74 6f 5f 68 61 73 68 5f 74  ;.} id_to_hash_t
97b0: 3b 0a 0a 2f 2a 2a 0a 20 2a 20 56 65 72 69 66 79  ;../**. * Verify
97c0: 20 68 61 73 68 20 61 6c 67 6f 72 69 74 68 6d 73   hash algorithms
97d0: 20 62 79 20 74 65 73 74 69 6e 67 20 74 68 65 6d   by testing them
97e0: 20 6f 6e 20 6c 6f 6e 67 20 6d 65 73 73 61 67 65   on long message
97f0: 73 2c 20 6c 69 6b 65 0a 20 2a 20 31 2c 30 30 30  s, like. * 1,000
9800: 2c 30 30 30 20 63 68 61 72 61 74 65 72 73 20 6f  ,000 charaters o
9810: 66 20 27 61 27 2e 0a 20 2a 2f 0a 73 74 61 74 69  f 'a'.. */.stati
9820: 63 20 76 6f 69 64 20 74 65 73 74 5f 6c 6f 6e 67  c void test_long
9830: 5f 73 74 72 69 6e 67 73 28 76 6f 69 64 29 0a 7b  _strings(void).{
9840: 0a 09 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74  ..unsigned count
9850: 3b 0a 0a 09 73 74 72 75 63 74 20 69 64 5f 74 6f  ;...struct id_to
9860: 5f 68 61 73 68 5f 74 20 74 65 73 74 73 5b 5d 20  _hash_t tests[] 
9870: 3d 20 7b 0a 09 09 7b 20 52 48 41 53 48 5f 43 52  = {...{ RHASH_CR
9880: 43 33 32 2c 20 22 44 43 32 35 42 46 42 43 22 20  C32, "DC25BFBC" 
9890: 7d 2c 20 2f 2a 20 76 65 72 69 66 69 65 64 20 77  }, /* verified w
98a0: 69 74 68 20 63 6b 73 66 76 20 2a 2f 0a 09 09 7b  ith cksfv */...{
98b0: 20 52 48 41 53 48 5f 4d 44 34 2c 20 22 42 42 43   RHASH_MD4, "BBC
98c0: 45 38 30 43 43 36 42 42 36 35 45 35 43 36 37 34  E80CC6BB65E5C674
98d0: 35 45 33 30 44 34 45 45 43 41 39 41 34 22 20 7d  5E30D4EECA9A4" }
98e0: 2c 20 2f 2a 20 63 68 65 63 6b 65 64 20 62 79 20  , /* checked by 
98f0: 6d 64 34 73 75 6d 20 2a 2f 0a 09 09 7b 20 52 48  md4sum */...{ RH
9900: 41 53 48 5f 4d 44 35 2c 20 22 37 37 30 37 44 36  ASH_MD5, "7707D6
9910: 41 45 34 45 30 32 37 43 37 30 45 45 41 32 41 39  AE4E027C70EEA2A9
9920: 33 35 43 32 32 39 36 46 32 31 22 20 7d 2c 20 2f  35C2296F21" }, /
9930: 2a 20 63 68 65 63 6b 65 64 20 62 79 20 6d 64 35  * checked by md5
9940: 73 75 6d 20 2a 2f 0a 09 09 7b 20 52 48 41 53 48  sum */...{ RHASH
9950: 5f 53 48 41 31 2c 20 22 33 34 41 41 39 37 33 43  _SHA1, "34AA973C
9960: 44 34 43 34 44 41 41 34 46 36 31 45 45 42 32 42  D4C4DAA4F61EEB2B
9970: 44 42 41 44 32 37 33 31 36 35 33 34 30 31 36 46  DBAD27316534016F
9980: 22 20 7d 2c 20 2f 2a 20 63 68 65 63 6b 65 64 20  " }, /* checked 
9990: 62 79 20 73 68 61 31 73 75 6d 20 2a 2f 0a 09 09  by sha1sum */...
99a0: 7b 20 52 48 41 53 48 5f 45 44 32 4b 2c 20 22 42  { RHASH_ED2K, "B
99b0: 42 43 45 38 30 43 43 36 42 42 36 35 45 35 43 36  BCE80CC6BB65E5C6
99c0: 37 34 35 45 33 30 44 34 45 45 43 41 39 41 34 22  745E30D4EECA9A4"
99d0: 20 7d 2c 20 2f 2a 20 63 68 65 63 6b 65 64 20 62   }, /* checked b
99e0: 79 20 65 4d 75 6c 65 27 20 4c 69 6e 6b 20 43 72  y eMule' Link Cr
99f0: 65 61 74 6f 72 20 28 75 73 65 73 20 65 4d 75 6c  eator (uses eMul
9a00: 65 20 61 6c 67 6f 72 69 74 68 6d 29 20 2a 2f 0a  e algorithm) */.
9a10: 09 09 7b 20 52 48 41 53 48 5f 41 49 43 48 2c 20  ..{ RHASH_AICH, 
9a20: 22 4b 53 59 50 41 54 45 56 33 4b 50 32 36 46 4a  "KSYPATEV3KP26FJ
9a30: 59 55 45 45 42 43 50 4c 35 4c 51 4a 35 46 47 55  YUEEBCPL5LQJ5FGU
9a40: 4b 22 20 7d 2c 20 2f 2a 20 63 68 65 63 6b 65 64  K" }, /* checked
9a50: 20 62 79 20 65 4d 75 6c 65 27 20 4c 69 6e 6b 20   by eMule' Link 
9a60: 43 72 65 61 74 6f 72 20 2a 2f 0a 09 09 7b 20 52  Creator */...{ R
9a70: 48 41 53 48 5f 54 49 47 45 52 2c 20 22 36 44 42  HASH_TIGER, "6DB
9a80: 30 45 32 37 32 39 43 42 45 41 44 39 33 44 37 31  0E2729CBEAD93D71
9a90: 35 43 36 41 37 44 33 36 33 30 32 45 39 42 33 43  5C6A7D36302E9B3C
9aa0: 45 45 30 44 32 42 43 33 31 34 42 34 31 22 20 7d  EE0D2BC314B41" }
9ab0: 2c 20 2f 2a 20 66 72 6f 6d 20 54 69 67 65 72 20  , /* from Tiger 
9ac0: 61 75 74 68 6f 72 27 73 20 70 61 67 65 20 28 4e  author's page (N
9ad0: 45 53 53 49 45 20 74 65 73 74 20 76 65 63 74 6f  ESSIE test vecto
9ae0: 72 29 20 2a 2f 0a 09 09 7b 20 52 48 41 53 48 5f  r) */...{ RHASH_
9af0: 54 54 48 2c 20 22 4b 45 50 54 49 47 54 34 43 51  TTH, "KEPTIGT4CQ
9b00: 4b 46 37 53 35 45 55 56 4e 4a 5a 53 58 58 49 50  KF7S5EUVNJZSXXIP
9b10: 4e 4d 42 33 58 53 4f 41 41 51 53 34 59 22 20 7d  NMB3XSOAAQS4Y" }
9b20: 2c 20 2f 2a 20 76 65 72 69 66 69 65 64 20 77 69  , /* verified wi
9b30: 74 68 20 53 74 72 6f 6e 67 20 44 43 2b 2b 20 2a  th Strong DC++ *
9b40: 2f 0a 09 09 7b 20 52 48 41 53 48 5f 57 48 49 52  /...{ RHASH_WHIR
9b50: 4c 50 4f 4f 4c 2c 20 22 30 43 39 39 30 30 35 42  LPOOL, "0C99005B
9b60: 45 42 35 37 45 46 46 35 30 41 37 43 46 30 30 35  EB57EFF50A7CF005
9b70: 35 36 30 44 44 46 35 44 32 39 30 35 37 46 44 38  560DDF5D29057FD8
9b80: 36 42 32 30 42 46 44 36 32 44 45 43 41 30 46 31  6B20BFD62DECA0F1
9b90: 43 43 45 41 34 41 46 35 31 46 43 31 35 34 39 30  CCEA4AF51FC15490
9ba0: 45 44 44 43 34 37 41 46 33 32 42 42 32 42 36 36  EDDC47AF32BB2B66
9bb0: 43 33 34 46 46 39 41 44 38 43 36 30 30 38 41 44  C34FF9AD8C6008AD
9bc0: 36 37 37 46 37 37 31 32 36 39 35 33 42 32 32 36  677F77126953B226
9bd0: 45 34 45 44 38 42 30 31 22 20 7d 2c 20 2f 2a 20  E4ED8B01" }, /* 
9be0: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 61  taken from the a
9bf0: 6c 67 6f 72 69 74 68 6d 20 72 65 66 65 72 65 6e  lgorithm referen
9c00: 63 65 20 2a 2f 0a 09 09 7b 20 52 48 41 53 48 5f  ce */...{ RHASH_
9c10: 52 49 50 45 4d 44 31 36 30 2c 20 22 35 32 37 38  RIPEMD160, "5278
9c20: 33 32 34 33 43 31 36 39 37 42 44 42 45 31 36 44  3243C1697BDBE16D
9c30: 33 37 46 39 37 46 36 38 46 30 38 33 32 35 44 43  37F97F68F08325DC
9c40: 31 35 32 38 22 20 7d 2c 20 2f 2a 20 74 61 6b 65  1528" }, /* take
9c50: 6e 20 66 72 6f 6d 20 74 68 65 20 61 6c 67 6f 72  n from the algor
9c60: 69 74 68 6d 20 72 65 66 65 72 65 6e 63 65 20 2a  ithm reference *
9c70: 2f 0a 09 09 7b 20 52 48 41 53 48 5f 47 4f 53 54  /...{ RHASH_GOST
9c80: 5f 43 52 59 50 54 4f 50 52 4f 2c 20 22 38 36 39  _CRYPTOPRO, "869
9c90: 33 32 38 37 41 41 36 32 46 39 34 37 38 46 37 43  3287AA62F9478F7C
9ca0: 42 33 31 32 45 43 30 38 36 36 42 36 43 34 45 34  B312EC0866B6C4E4
9cb0: 41 30 46 31 31 31 36 30 34 34 31 45 38 46 34 46  A0F11160441E8F4F
9cc0: 46 43 44 32 37 31 35 44 44 35 35 34 46 22 20 7d  FCD2715DD554F" }
9cd0: 2c 20 2f 2a 20 76 65 72 69 66 69 65 64 20 77 69  , /* verified wi
9ce0: 74 68 20 6f 70 65 6e 73 73 6c 20 2a 2f 0a 09 09  th openssl */...
9cf0: 7b 20 52 48 41 53 48 5f 47 4f 53 54 2c 20 22 35  { RHASH_GOST, "5
9d00: 43 30 30 43 43 43 32 37 33 34 43 44 44 33 33 33  C00CCC2734CDD333
9d10: 32 44 33 44 34 37 34 39 35 37 36 45 33 43 31 41  2D3D4749576E3C1A
9d20: 37 44 42 41 46 30 45 37 45 41 37 34 45 39 46 41  7DBAF0E7EA74E9FA
9d30: 36 30 32 34 31 33 43 39 30 41 31 32 39 46 41 22  602413C90A129FA"
9d40: 20 7d 2c 20 2f 2a 20 76 65 72 69 66 69 65 64 20   }, /* verified 
9d50: 77 69 74 68 20 6f 70 65 6e 73 73 6c 20 2a 2f 0a  with openssl */.
9d60: 09 09 7b 20 52 48 41 53 48 5f 48 41 53 31 36 30  ..{ RHASH_HAS160
9d70: 2c 20 22 44 36 41 44 36 46 30 36 30 38 42 38 37  , "D6AD6F0608B87
9d80: 38 44 41 39 42 38 37 39 39 39 43 32 35 32 35 43  8DA9B87999C2525C
9d90: 43 38 34 46 34 43 39 46 31 38 44 22 20 7d 2c 20  C84F4C9F18D" }, 
9da0: 2f 2a 20 76 65 72 69 66 69 65 64 20 61 67 61 69  /* verified agai
9db0: 6e 73 74 20 6a 61 63 6b 73 75 6d 20 69 6d 70 6c  nst jacksum impl
9dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 09 09  ementation */...
9dd0: 7b 20 52 48 41 53 48 5f 53 4e 45 46 52 55 31 32  { RHASH_SNEFRU12
9de0: 38 2c 20 22 35 30 37 31 46 36 34 37 42 43 35 31  8, "5071F647BC51
9df0: 43 46 44 34 38 46 39 41 38 46 32 44 32 45 44 38  CFD48F9A8F2D2ED8
9e00: 34 38 32 39 22 20 7d 2c 20 2f 2a 20 76 65 72 69  4829" }, /* veri
9e10: 66 69 65 64 20 62 79 20 6d 68 61 73 68 20 2a 2f  fied by mhash */
9e20: 0a 09 09 7b 20 52 48 41 53 48 5f 53 4e 45 46 52  ...{ RHASH_SNEFR
9e30: 55 32 35 36 2c 20 22 34 41 30 32 38 31 31 46 32  U256, "4A02811F2
9e40: 38 43 31 32 31 46 32 31 36 32 41 42 42 32 35 31  8C121F2162ABB251
9e50: 41 30 31 41 32 41 35 38 45 36 43 46 43 32 37 35  A01A2A58E6CFC275
9e60: 33 34 41 41 42 31 30 45 41 36 41 46 30 41 38 44  34AAB10EA6AF0A8D
9e70: 46 31 37 46 46 42 46 22 20 7d 2c 20 2f 2a 20 76  F17FFBF" }, /* v
9e80: 65 72 69 66 69 65 64 20 62 79 20 6d 68 61 73 68  erified by mhash
9e90: 20 2a 2f 0a 09 09 7b 20 52 48 41 53 48 5f 53 48   */...{ RHASH_SH
9ea0: 41 32 32 34 2c 20 22 32 30 37 39 34 36 35 35 39  A224, "207946559
9eb0: 38 30 43 39 31 44 38 42 42 42 34 43 31 45 41 39  80C91D8BBB4C1EA9
9ec0: 37 36 31 38 41 34 42 46 30 33 46 34 32 35 38 31  7618A4BF03F42581
9ed0: 39 34 38 42 32 45 45 34 45 45 37 41 44 36 37 22  948B2EE4EE7AD67"
9ee0: 20 7d 2c 20 2f 2a 20 76 65 72 69 66 69 65 64 20   }, /* verified 
9ef0: 61 67 61 69 6e 73 74 20 6a 61 63 6b 73 75 6d 20  against jacksum 
9f00: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
9f10: 2f 0a 09 09 7b 20 52 48 41 53 48 5f 53 48 41 32  /...{ RHASH_SHA2
9f20: 35 36 2c 20 22 43 44 43 37 36 45 35 43 39 39 31  56, "CDC76E5C991
9f30: 34 46 42 39 32 38 31 41 31 43 37 45 32 38 34 44  4FB9281A1C7E284D
9f40: 37 33 45 36 37 46 31 38 30 39 41 34 38 41 34 39  73E67F1809A48A49
9f50: 37 32 30 30 45 30 34 36 44 33 39 43 43 43 37 31  7200E046D39CCC71
9f60: 31 32 43 44 30 22 20 7d 2c 20 2f 2a 20 66 72 6f  12CD0" }, /* fro
9f70: 6d 20 4e 45 53 53 49 45 20 74 65 73 74 20 76 65  m NESSIE test ve
9f80: 63 74 6f 72 73 20 2a 2f 0a 09 09 7b 20 52 48 41  ctors */...{ RHA
9f90: 53 48 5f 53 48 41 33 38 34 2c 20 22 39 44 30 45  SH_SHA384, "9D0E
9fa0: 31 38 30 39 37 31 36 34 37 34 43 42 30 38 36 45  1809716474CB086E
9fb0: 38 33 34 45 33 31 30 41 34 41 31 43 45 44 31 34  834E310A4A1CED14
9fc0: 39 45 39 43 30 30 46 32 34 38 35 32 37 39 37 32  9E9C00F248527972
9fd0: 43 45 43 35 37 30 34 43 32 41 35 42 30 37 42 38  CEC5704C2A5B07B8
9fe0: 42 33 44 43 33 38 45 43 43 34 45 42 41 45 39 37  B3DC38ECC4EBAE97
9ff0: 44 44 44 38 37 46 33 44 38 39 38 35 22 20 7d 2c  DDD87F3D8985" },
a000: 20 2f 2a 20 66 72 6f 6d 20 4e 45 53 53 49 45 20   /* from NESSIE 
a010: 74 65 73 74 20 76 65 63 74 6f 72 73 20 2a 2f 0a  test vectors */.
a020: 09 09 7b 20 52 48 41 53 48 5f 53 48 41 35 31 32  ..{ RHASH_SHA512
a030: 2c 20 22 45 37 31 38 34 38 33 44 30 43 45 37 36  , "E718483D0CE76
a040: 39 36 34 34 45 32 45 34 32 43 37 42 43 31 35 42  9644E2E42C7BC15B
a050: 34 36 33 38 45 31 46 39 38 42 31 33 42 32 30 34  4638E1F98B13B204
a060: 34 32 38 35 36 33 32 41 38 30 33 41 46 41 39 37  4285632A803AFA97
a070: 33 45 42 44 45 30 46 46 32 34 34 38 37 37 45 41  3EBDE0FF244877EA
a080: 36 30 41 34 43 42 30 34 33 32 43 45 35 37 37 43  60A4CB0432CE577C
a090: 33 31 42 45 42 30 30 39 43 35 43 32 43 34 39 41  31BEB009C5C2C49A
a0a0: 41 32 45 34 45 41 44 42 32 31 37 41 44 38 43 43  A2E4EADB217AD8CC
a0b0: 30 39 42 22 20 7d 2c 20 2f 2a 20 66 72 6f 6d 20  09B" }, /* from 
a0c0: 4e 45 53 53 49 45 20 74 65 73 74 20 76 65 63 74  NESSIE test vect
a0d0: 6f 72 73 20 2a 2f 0a 09 09 7b 20 52 48 41 53 48  ors */...{ RHASH
a0e0: 5f 53 48 41 33 5f 32 32 34 2c 20 22 44 36 39 33  _SHA3_224, "D693
a0f0: 33 35 42 39 33 33 32 35 31 39 32 45 35 31 36 41  35B93325192E516A
a100: 39 31 32 45 36 44 31 39 41 31 35 43 42 35 31 43  912E6D19A15CB51C
a110: 36 45 44 35 43 31 35 32 34 33 45 37 41 37 46 44  6ED5C15243E7A7FD
a120: 36 35 33 43 22 20 7d 2c 0a 09 09 7b 20 52 48 41  653C" },...{ RHA
a130: 53 48 5f 53 48 41 33 5f 32 35 36 2c 20 22 35 43  SH_SHA3_256, "5C
a140: 38 38 37 35 41 45 34 37 34 41 33 36 33 34 42 41  8875AE474A3634BA
a150: 34 46 44 35 35 45 43 38 35 42 46 46 44 36 36 31  4FD55EC85BFFD661
a160: 46 33 32 41 43 41 37 35 43 36 44 36 39 39 44 30  F32ACA75C6D699D0
a170: 43 44 43 42 36 43 31 31 35 38 39 31 43 31 22 20  CDCB6C115891C1" 
a180: 7d 2c 0a 09 09 7b 20 52 48 41 53 48 5f 53 48 41  },...{ RHASH_SHA
a190: 33 5f 33 38 34 2c 20 22 45 45 45 39 45 32 34 44  3_384, "EEE9E24D
a1a0: 37 38 43 31 38 35 35 33 33 37 39 38 33 34 35 31  78C1855337983451
a1b0: 44 46 39 37 43 38 41 44 39 45 45 44 46 32 35 36  DF97C8AD9EEDF256
a1c0: 43 36 33 33 34 46 38 45 39 34 38 44 32 35 32 44  C6334F8E948D252D
a1d0: 35 45 30 45 37 36 38 34 37 41 41 30 37 37 34 44  5E0E76847AA0774D
a1e0: 44 42 39 30 41 38 34 32 31 39 30 44 32 43 35 35  DB90A842190D2C55
a1f0: 38 42 34 42 38 33 34 30 22 20 7d 2c 0a 09 09 7b  8B4B8340" },...{
a200: 20 52 48 41 53 48 5f 53 48 41 33 5f 35 31 32 2c   RHASH_SHA3_512,
a210: 20 22 33 43 33 41 38 37 36 44 41 31 34 30 33 34   "3C3A876DA14034
a220: 41 42 36 30 36 32 37 43 30 37 37 42 42 39 38 46  AB60627C077BB98F
a230: 37 45 31 32 30 41 32 41 35 33 37 30 32 31 32 44  7E120A2A5370212D
a240: 46 46 42 33 33 38 35 41 31 38 44 34 46 33 38 38  FFB3385A18D4F388
a250: 35 39 45 44 33 31 31 44 30 41 39 44 35 31 34 31  59ED311D0A9D5141
a260: 43 45 39 43 43 35 43 36 36 45 45 36 38 39 42 32  CE9CC5C66EE689B2
a270: 36 36 41 38 41 41 31 38 41 43 45 38 32 38 32 41  66A8AA18ACE8282A
a280: 30 45 30 44 42 35 39 36 43 39 30 42 30 41 37 42  0E0DB596C90B0A7B
a290: 38 37 22 20 7d 2c 0a 09 09 7b 20 52 48 41 53 48  87" },...{ RHASH
a2a0: 5f 45 44 4f 4e 52 32 35 36 2c 20 22 35 36 46 34  _EDONR256, "56F4
a2b0: 42 38 44 43 30 41 34 31 43 38 45 41 30 41 36 41  B8DC0A41C8EA0A6A
a2c0: 34 32 43 39 34 39 38 38 33 43 44 35 44 43 32 35  42C949883CD5DC25
a2d0: 44 46 38 43 46 34 45 34 33 41 44 34 37 34 46 44  DF8CF4E43AD474FD
a2e0: 34 34 39 32 41 37 41 30 37 39 36 36 22 20 7d 2c  4492A7A07966" },
a2f0: 20 2f 2a 20 76 65 72 69 66 69 65 64 20 62 79 20   /* verified by 
a300: 65 42 41 53 48 20 53 55 50 45 52 43 4f 50 20 69  eBASH SUPERCOP i
a310: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
a320: 0a 09 09 7b 20 52 48 41 53 48 5f 45 44 4f 4e 52  ...{ RHASH_EDONR
a330: 35 31 32 2c 20 22 42 34 41 35 41 32 35 35 44 36  512, "B4A5A255D6
a340: 37 38 36 39 43 39 39 30 46 45 37 39 42 35 46 43  7869C990FE79B5FC
a350: 42 44 41 36 39 39 35 38 37 39 34 42 38 30 30 33  BDA69958794B8003
a360: 46 30 31 46 44 31 31 45 39 30 46 45 46 45 43 33  F01FD11E90FEFEC3
a370: 35 46 32 32 42 44 38 34 46 46 41 32 45 32 34 38  5F22BD84FFA2E248
a380: 45 38 42 33 43 31 41 43 44 39 42 37 45 46 41 43  E8B3C1ACD9B7EFAC
a390: 35 42 43 36 36 36 31 36 45 32 33 34 41 36 45 39  5BC66616E234A6E9
a3a0: 33 38 44 33 35 32 36 44 45 45 32 36 42 44 30 44  38D3526DEE26BD0D
a3b0: 45 39 43 35 36 32 22 20 7d 2c 20 2f 2a 20 76 65  E9C562" }, /* ve
a3c0: 72 69 66 69 65 64 20 62 79 20 65 42 41 53 48 20  rified by eBASH 
a3d0: 53 55 50 45 52 43 4f 50 20 69 6d 70 6c 65 6d 65  SUPERCOP impleme
a3e0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 09 09 7b 20 52  ntation */...{ R
a3f0: 48 41 53 48 5f 42 54 49 48 2c 20 22 39 30 41 45  HASH_BTIH, "90AE
a400: 37 33 45 45 37 32 41 31 32 42 35 41 33 41 33 39  73EE72A12B5A3A39
a410: 44 43 41 34 43 35 45 32 34 42 45 31 46 33 39 42  DCA4C5E24BE1F39B
a420: 36 41 31 42 22 20 7d 20 2f 2a 20 42 54 49 48 20  6A1B" } /* BTIH 
a430: 77 69 74 68 20 66 69 6c 65 6e 61 6d 65 3d 22 74  with filename="t
a440: 65 73 74 2e 74 78 74 22 2c 20 76 65 72 69 66 69  est.txt", verifi
a450: 65 64 20 75 73 69 6e 67 20 75 54 6f 72 72 65 6e  ed using uTorren
a460: 74 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  t */.#ifdef USE_
a470: 4b 45 43 43 41 4b 0a 09 09 7b 20 52 48 41 53 48  KECCAK...{ RHASH
a480: 5f 4b 45 43 43 41 4b 5f 32 32 34 2c 20 22 31 39  _KECCAK_224, "19
a490: 46 39 31 36 37 42 45 32 41 30 34 43 34 33 41 42  F9167BE2A04C43AB
a4a0: 44 30 45 44 35 35 34 37 38 38 31 30 31 42 39 43  D0ED554788101B9C
a4b0: 33 33 39 30 33 31 41 43 43 38 45 31 34 36 38 35  339031ACC8E14685
a4c0: 33 31 33 30 33 46 22 20 7d 2c 20 2f 2a 20 76 65  31303F" }, /* ve
a4d0: 72 69 66 69 65 64 20 62 79 20 72 65 66 65 72 65  rified by refere
a4e0: 6e 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nce implementati
a4f0: 6f 6e 20 2a 2f 0a 09 09 7b 20 52 48 41 53 48 5f  on */...{ RHASH_
a500: 4b 45 43 43 41 4b 5f 32 35 36 2c 20 22 46 41 44  KECCAK_256, "FAD
a510: 41 45 36 42 34 39 46 31 32 39 42 42 42 38 31 32  AE6B49F129BBB812
a520: 42 45 38 34 30 37 42 37 42 32 38 39 34 46 33 34  BE8407B7B2894F34
a530: 41 45 43 46 36 44 42 44 31 46 39 42 30 46 30 43  AECF6DBD1F9B0F0C
a540: 37 45 39 38 35 33 30 39 38 46 43 39 36 22 20 7d  7E9853098FC96" }
a550: 2c 20 2f 2a 20 76 65 72 69 66 69 65 64 20 62 79  , /* verified by
a560: 20 72 65 66 65 72 65 6e 63 65 20 69 6d 70 6c 65   reference imple
a570: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 09 09 7b  mentation */...{
a580: 20 52 48 41 53 48 5f 4b 45 43 43 41 4b 5f 33 38   RHASH_KECCAK_38
a590: 34 2c 20 22 30 43 38 33 32 34 45 31 45 42 43 31  4, "0C8324E1EBC1
a5a0: 38 32 38 32 32 43 35 45 32 41 30 38 36 43 41 43  82822C5E2A086CAC
a5b0: 30 37 43 32 46 45 30 30 45 33 42 43 45 36 31 44  07C2FE00E3BCE61D
a5c0: 30 31 42 41 38 41 44 36 42 37 31 37 38 30 45 32  01BA8AD6B71780E2
a5d0: 44 45 43 35 46 42 38 39 45 35 41 45 39 30 43 42  DEC5FB89E5AE90CB
a5e0: 35 39 33 45 35 37 42 43 36 32 35 38 46 44 44 39  593E57BC6258FDD9
a5f0: 34 45 31 37 22 20 7d 2c 20 2f 2a 20 76 65 72 69  4E17" }, /* veri
a600: 66 69 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  fied by referenc
a610: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
a620: 20 2a 2f 0a 09 09 7b 20 52 48 41 53 48 5f 4b 45   */...{ RHASH_KE
a630: 43 43 41 4b 5f 35 31 32 2c 20 22 35 43 46 35 33  CCAK_512, "5CF53
a640: 46 32 45 35 35 36 42 45 35 41 36 32 34 34 32 35  F2E556BE5A624425
a650: 45 44 45 32 33 44 30 45 38 42 32 43 37 38 31 34  EDE23D0E8B2C7814
a660: 42 34 42 41 30 45 34 45 30 39 43 42 42 46 33 43  B4BA0E4E09CBBF3C
a670: 32 46 41 43 37 30 35 36 46 36 31 45 30 34 38 46  2FAC7056F61E048F
a680: 43 33 34 31 32 36 32 38 37 35 45 42 43 35 38 41  C341262875EBC58A
a690: 35 31 38 33 46 45 41 36 35 31 34 34 37 31 32 34  5183FEA651447124
a6a0: 33 37 30 43 31 45 42 46 34 44 36 43 38 39 42 43  370C1EBF4D6C89BC
a6b0: 39 41 37 37 33 31 30 36 33 42 42 22 20 7d 2c 20  9A7731063BB" }, 
a6c0: 2f 2a 20 76 65 72 69 66 69 65 64 20 62 79 20 72  /* verified by r
a6d0: 65 66 65 72 65 6e 63 65 20 69 6d 70 6c 65 6d 65  eference impleme
a6e0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69  ntation */.#endi
a6f0: 66 0a 09 7d 3b 0a 0a 09 2f 2a 20 74 65 73 74 20  f..};.../* test 
a700: 61 6c 6c 20 61 6c 67 6f 72 69 74 68 6d 73 20 6f  all algorithms o
a710: 6e 20 31 2c 30 30 30 2c 30 30 30 20 63 68 61 72  n 1,000,000 char
a720: 61 63 74 65 72 73 20 6f 66 20 27 61 27 20 2a 2f  acters of 'a' */
a730: 0a 09 66 6f 72 20 28 63 6f 75 6e 74 20 3d 20 30  ..for (count = 0
a740: 3b 20 63 6f 75 6e 74 20 3c 20 28 73 69 7a 65 6f  ; count < (sizeo
a750: 66 28 74 65 73 74 73 29 20 2f 20 73 69 7a 65 6f  f(tests) / sizeo
a760: 66 28 69 64 5f 74 6f 5f 68 61 73 68 5f 74 29 29  f(id_to_hash_t))
a770: 3b 20 63 6f 75 6e 74 2b 2b 29 20 7b 0a 09 09 69  ; count++) {...i
a780: 6e 74 20 73 65 74 5f 66 69 6c 65 6e 61 6d 65 20  nt set_filename 
a790: 3d 20 28 74 65 73 74 73 5b 63 6f 75 6e 74 5d 2e  = (tests[count].
a7a0: 68 61 73 68 5f 69 64 20 3d 3d 20 52 48 41 53 48  hash_id == RHASH
a7b0: 5f 42 54 49 48 29 3b 0a 09 09 61 73 73 65 72 74  _BTIH);...assert
a7c0: 5f 72 65 70 5f 68 61 73 68 28 74 65 73 74 73 5b  _rep_hash(tests[
a7d0: 63 6f 75 6e 74 5d 2e 68 61 73 68 5f 69 64 2c 20  count].hash_id, 
a7e0: 27 61 27 2c 20 31 30 30 30 30 30 30 2c 20 74 65  'a', 1000000, te
a7f0: 73 74 73 5b 63 6f 75 6e 74 5d 2e 65 78 70 65 63  sts[count].expec
a800: 74 65 64 5f 68 61 73 68 2c 20 73 65 74 5f 66 69  ted_hash, set_fi
a810: 6c 65 6e 61 6d 65 29 3b 0a 09 7d 0a 0a 09 2f 2a  lename);..}.../*
a820: 20 42 54 49 48 20 63 61 6c 63 75 6c 61 74 65 64   BTIH calculated
a830: 20 77 69 74 68 6f 75 74 20 61 20 66 69 6c 65 6e   without a filen
a840: 61 6d 65 2e 20 54 68 65 20 68 61 73 68 20 76 61  ame. The hash va
a850: 6c 75 65 20 63 61 6e 27 74 20 62 65 20 76 65 72  lue can't be ver
a860: 69 66 69 65 64 20 62 79 20 74 6f 72 72 65 6e 74  ified by torrent
a870: 20 74 6f 6f 6c 73 20 2a 2f 0a 09 61 73 73 65 72   tools */..asser
a880: 74 5f 72 65 70 5f 68 61 73 68 28 52 48 41 53 48  t_rep_hash(RHASH
a890: 5f 42 54 49 48 2c 20 27 61 27 2c 20 31 30 30 30  _BTIH, 'a', 1000
a8a0: 30 30 30 2c 20 22 32 34 37 34 32 46 39 41 45 31  000, "24742F9AE1
a8b0: 42 44 34 31 36 43 46 30 41 36 39 31 36 46 32 38  BD416CF0A6916F28
a8c0: 34 39 46 45 37 41 42 46 41 43 34 30 35 45 22 2c  49FE7ABFAC405E",
a8d0: 20 30 29 3b 0a 0a 09 2f 2a 20 6e 6f 77 20 77 65   0);.../* now we
a8e0: 20 76 65 72 69 66 79 20 73 6f 6d 65 20 73 70 65   verify some spe
a8f0: 63 69 66 69 63 20 63 61 73 65 73 2c 20 77 68 69  cific cases, whi
a900: 63 68 20 63 61 75 73 65 64 20 70 72 6f 62 6c 65  ch caused proble
a910: 6d 73 20 69 6e 20 6d 61 6e 79 20 6c 69 62 72 61  ms in many libra
a920: 72 69 65 73 20 2a 2f 0a 09 61 73 73 65 72 74 5f  ries */..assert_
a930: 72 65 70 5f 68 61 73 68 28 52 48 41 53 48 5f 47  rep_hash(RHASH_G
a940: 4f 53 54 2c 20 30 78 46 46 2c 20 36 34 2c 20 22  OST, 0xFF, 64, "
a950: 31 33 34 31 36 43 34 45 43 37 34 41 36 33 43 33  13416C4EC74A63C3
a960: 45 43 39 30 43 42 31 37 34 38 46 44 34 36 32 43  EC90CB1748FD462C
a970: 37 35 37 32 43 36 43 36 42 34 31 38 34 34 45 34  7572C6C6B41844E4
a980: 38 43 43 31 31 38 34 44 31 45 39 31 36 30 39 38  8CC1184D1E916098
a990: 22 2c 20 30 29 3b 0a 09 61 73 73 65 72 74 5f 72  ", 0);..assert_r
a9a0: 65 70 5f 68 61 73 68 28 52 48 41 53 48 5f 47 4f  ep_hash(RHASH_GO
a9b0: 53 54 5f 43 52 59 50 54 4f 50 52 4f 2c 20 30 78  ST_CRYPTOPRO, 0x
a9c0: 46 46 2c 20 36 34 2c 20 22 35 38 35 30 34 44 32  FF, 64, "58504D2
a9d0: 36 42 33 36 37 37 45 37 35 36 42 41 33 46 34 41  6B3677E756BA3F4A
a9e0: 39 46 44 32 46 31 34 42 33 42 41 35 34 35 37 30  9FD2F14B3BA54570
a9f0: 36 36 41 34 41 41 31 44 37 30 30 36 35 39 42 39  66A4AA1D700659B9
aa00: 30 44 43 44 44 44 33 43 36 22 2c 20 30 29 3b 0a  0DCDDD3C6", 0);.
aa10: 0a 09 2f 2a 20 74 68 65 73 65 20 6d 65 73 73 61  ../* these messa
aa20: 67 65 73 20 76 65 72 69 66 69 65 64 20 62 79 20  ges verified by 
aa30: 65 4d 75 6c 65 20 4c 69 6e 6b 43 72 65 61 74 6f  eMule LinkCreato
aa40: 72 20 28 77 68 69 63 68 20 75 73 65 73 20 65 4d  r (which uses eM
aa50: 75 6c 65 20 76 61 72 69 61 6e 74 20 6f 66 20 45  ule variant of E
aa60: 44 32 4b 20 68 61 73 68 29 20 2a 2f 0a 09 61 73  D2K hash) */..as
aa70: 73 65 72 74 5f 72 65 70 5f 68 61 73 68 28 52 48  sert_rep_hash(RH
aa80: 41 53 48 5f 45 44 32 4b 2c 20 30 2c 20 39 37 32  ASH_ED2K, 0, 972
aa90: 38 30 30 30 2c 20 22 46 43 32 31 44 39 41 46 38  8000, "FC21D9AF8
aaa0: 32 38 46 39 32 41 38 44 46 36 34 42 45 41 43 33  28F92A8DF64BEAC3
aab0: 33 35 37 34 32 35 44 22 2c 20 30 29 3b 0a 09 61  357425D", 0);..a
aac0: 73 73 65 72 74 5f 72 65 70 5f 68 61 73 68 28 52  ssert_rep_hash(R
aad0: 48 41 53 48 5f 45 44 32 4b 2c 20 30 2c 20 39 37  HASH_ED2K, 0, 97
aae0: 32 38 30 30 30 20 2d 20 31 2c 20 22 41 43 34 34  28000 - 1, "AC44
aaf0: 42 39 33 46 43 39 41 46 46 37 37 33 41 42 30 30  B93FC9AFF773AB00
ab00: 30 35 43 39 31 31 46 38 33 39 36 46 22 2c 20 30  05C911F8396F", 0
ab10: 29 3b 0a 09 61 73 73 65 72 74 5f 72 65 70 5f 68  );..assert_rep_h
ab20: 61 73 68 28 52 48 41 53 48 5f 45 44 32 4b 2c 20  ash(RHASH_ED2K, 
ab30: 30 2c 20 39 37 32 38 30 30 30 20 2b 20 31 2c 20  0, 9728000 + 1, 
ab40: 22 30 36 33 32 39 45 39 44 42 41 31 33 37 33 35  "06329E9DBA13735
ab50: 31 32 43 30 36 33 38 36 46 45 32 39 45 33 43 36  12C06386FE29E3C6
ab60: 35 22 2c 20 30 29 3b 20 2f 2a 20 6d 73 67 20 77  5", 0); /* msg w
ab70: 69 74 68 3a 20 39 37 32 38 30 30 30 20 3c 20 73  ith: 9728000 < s
ab80: 69 7a 65 20 3c 3d 20 39 37 33 32 30 39 36 20 2a  ize <= 9732096 *
ab90: 2f 0a 09 61 73 73 65 72 74 5f 72 65 70 5f 68 61  /..assert_rep_ha
aba0: 73 68 28 52 48 41 53 48 5f 41 49 43 48 2c 20 30  sh(RHASH_AICH, 0
abb0: 2c 20 39 37 32 38 30 30 30 2c 20 22 35 44 33 4e  , 9728000, "5D3N
abc0: 34 48 51 48 49 55 4d 51 37 49 55 37 41 35 51 4c  4HQHIUMQ7IU7A5QL
abd0: 50 4c 49 36 52 48 53 57 4f 52 37 42 22 2c 20 30  PLI6RHSWOR7B", 0
abe0: 29 3b 0a 09 61 73 73 65 72 74 5f 72 65 70 5f 68  );..assert_rep_h
abf0: 61 73 68 28 52 48 41 53 48 5f 41 49 43 48 2c 20  ash(RHASH_AICH, 
ac00: 30 2c 20 39 37 32 38 30 30 30 20 2d 20 31 2c 20  0, 9728000 - 1, 
ac10: 22 4c 36 53 50 4d 44 32 43 4d 36 50 52 5a 42 47  "L6SPMD2CM6PRZBG
ac20: 52 51 36 55 46 43 34 48 4a 46 46 4f 41 54 52 41  RQ6UFC4HJFFOATRA
ac30: 34 22 2c 20 30 29 3b 0a 09 61 73 73 65 72 74 5f  4", 0);..assert_
ac40: 72 65 70 5f 68 61 73 68 28 52 48 41 53 48 5f 41  rep_hash(RHASH_A
ac50: 49 43 48 2c 20 30 2c 20 39 37 32 38 30 30 30 20  ICH, 0, 9728000 
ac60: 2b 20 31 2c 20 22 48 4c 33 54 46 58 4f 52 49 55  + 1, "HL3TFXORIU
ac70: 45 50 58 55 57 46 50 59 33 4a 4c 52 37 53 4d 4b  EPXUWFPY3JLR7SMK
ac80: 47 54 4f 34 49 48 22 2c 20 30 29 3b 0a 23 69 66  GTO4IH", 0);.#if
ac90: 20 30 0a 09 61 73 73 65 72 74 5f 72 65 70 5f 68   0..assert_rep_h
aca0: 61 73 68 28 52 48 41 53 48 5f 45 44 32 4b 2c 20  ash(RHASH_ED2K, 
acb0: 30 2c 20 39 37 32 38 30 30 30 20 2a 20 35 2c 20  0, 9728000 * 5, 
acc0: 22 33 42 36 31 33 39 30 31 44 41 42 41 35 34 46  "3B613901DABA54F
acd0: 36 43 30 36 37 31 37 39 33 45 32 38 41 31 32 30  6C0671793E28A120
ace0: 35 22 2c 20 30 29 3b 0a 09 61 73 73 65 72 74 5f  5", 0);..assert_
acf0: 72 65 70 5f 68 61 73 68 28 52 48 41 53 48 5f 41  rep_hash(RHASH_A
ad00: 49 43 48 2c 20 30 2c 20 39 37 32 38 30 30 30 20  ICH, 0, 9728000 
ad10: 2a 20 35 2c 20 22 45 5a 43 4f 33 58 46 32 52 4a  * 5, "EZCO3XF2RJ
ad20: 34 46 45 52 52 44 45 58 47 4f 53 53 52 47 4c 35  4FERRDEXGOSSRGL5
ad30: 4e 41 35 42 42 4d 22 2c 20 30 29 3b 0a 23 65 6e  NA5BBM", 0);.#en
ad40: 64 69 66 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 56 65  dif.}../**. * Ve
ad50: 72 69 66 79 20 66 6f 72 20 61 6c 6c 20 61 6c 67  rify for all alg
ad60: 6f 72 69 74 68 6d 73 2c 20 74 68 61 74 20 72 68  orithms, that rh
ad70: 61 73 68 5f 66 69 6e 61 6c 28 29 20 72 65 74 75  ash_final() retu
ad80: 72 6e 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  rns the same res
ad90: 75 6c 74 20 61 73 0a 20 2a 20 72 68 61 73 68 5f  ult as. * rhash_
ada0: 70 72 69 6e 74 28 29 2e 0a 20 2a 2f 0a 73 74 61  print().. */.sta
adb0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 72 65  tic void test_re
adc0: 73 75 6c 74 73 5f 63 6f 6e 73 69 73 74 65 6e 63  sults_consistenc
add0: 79 28 76 6f 69 64 29 0a 7b 0a 09 63 6f 6e 73 74  y(void).{..const
ade0: 20 63 68 61 72 20 2a 20 6d 73 67 20 3d 20 22 61   char * msg = "a
adf0: 22 3b 0a 09 73 69 7a 65 5f 74 20 6d 73 67 5f 73  ";..size_t msg_s
ae00: 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 6d 73 67  ize = strlen(msg
ae10: 29 3b 0a 0a 09 73 69 7a 65 5f 74 20 64 69 67 65  );...size_t dige
ae20: 73 74 5f 73 69 7a 65 3b 0a 09 73 74 72 75 63 74  st_size;..struct
ae30: 20 72 68 61 73 68 5f 63 6f 6e 74 65 78 74 20 2a   rhash_context *
ae40: 63 74 78 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ctx;..unsigned c
ae50: 68 61 72 20 72 65 73 31 5b 37 30 5d 3b 0a 09 63  har res1[70];..c
ae60: 68 61 72 20 72 65 73 32 5b 37 30 5d 3b 0a 09 75  har res2[70];..u
ae70: 6e 73 69 67 6e 65 64 20 69 2c 20 68 61 73 68 5f  nsigned i, hash_
ae80: 69 64 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30  id;...for (i = 0
ae90: 2c 20 68 61 73 68 5f 69 64 20 3d 20 31 3b 20 28  , hash_id = 1; (
aea0: 68 61 73 68 5f 69 64 20 26 20 52 48 41 53 48 5f  hash_id & RHASH_
aeb0: 41 4c 4c 5f 48 41 53 48 45 53 29 3b 20 68 61 73  ALL_HASHES); has
aec0: 68 5f 69 64 20 3c 3c 3d 20 31 2c 20 69 2b 2b 29  h_id <<= 1, i++)
aed0: 20 7b 0a 09 09 64 69 67 65 73 74 5f 73 69 7a 65   {...digest_size
aee0: 20 3d 20 72 68 61 73 68 5f 67 65 74 5f 64 69 67   = rhash_get_dig
aef0: 65 73 74 5f 73 69 7a 65 28 68 61 73 68 5f 69 64  est_size(hash_id
af00: 29 3b 0a 09 09 61 73 73 65 72 74 28 64 69 67 65  );...assert(dige
af10: 73 74 5f 73 69 7a 65 20 3c 20 37 30 29 3b 0a 0a  st_size < 70);..
af20: 09 09 63 74 78 20 3d 20 72 68 61 73 68 5f 69 6e  ..ctx = rhash_in
af30: 69 74 28 68 61 73 68 5f 69 64 29 3b 0a 0a 23 69  it(hash_id);..#i
af40: 66 6e 64 65 66 20 55 53 45 5f 42 54 49 48 5f 57  fndef USE_BTIH_W
af50: 49 54 48 5f 54 45 53 54 5f 46 49 4c 45 4e 41 4d  ITH_TEST_FILENAM
af60: 45 0a 09 09 69 66 20 28 28 68 61 73 68 5f 69 64  E...if ((hash_id
af70: 20 26 20 52 48 41 53 48 5f 42 54 49 48 29 20 21   & RHASH_BTIH) !
af80: 3d 20 30 29 20 7b 0a 09 09 09 72 68 61 73 68 5f  = 0) {....rhash_
af90: 74 6f 72 72 65 6e 74 5f 61 64 64 5f 66 69 6c 65  torrent_add_file
afa0: 28 63 74 78 2c 20 22 74 65 73 74 2e 74 78 74 22  (ctx, "test.txt"
afb0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
afc0: 20 6c 6f 6e 67 29 6d 73 67 5f 73 69 7a 65 29 3b   long)msg_size);
afd0: 0a 09 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 09 72  ...}.#endif....r
afe0: 68 61 73 68 5f 75 70 64 61 74 65 28 63 74 78 2c  hash_update(ctx,
aff0: 20 6d 73 67 2c 20 6d 73 67 5f 73 69 7a 65 29 3b   msg, msg_size);
b000: 0a 09 09 72 68 61 73 68 5f 66 69 6e 61 6c 28 63  ...rhash_final(c
b010: 74 78 2c 20 72 65 73 31 29 3b 0a 09 09 72 68 61  tx, res1);...rha
b020: 73 68 5f 70 72 69 6e 74 28 72 65 73 32 2c 20 63  sh_print(res2, c
b030: 74 78 2c 20 68 61 73 68 5f 69 64 2c 20 52 48 50  tx, hash_id, RHP
b040: 52 5f 52 41 57 29 3b 0a 09 09 72 68 61 73 68 5f  R_RAW);...rhash_
b050: 66 72 65 65 28 63 74 78 29 3b 0a 0a 09 09 69 66  free(ctx);....if
b060: 20 28 6d 65 6d 63 6d 70 28 72 65 73 31 2c 20 72   (memcmp(res1, r
b070: 65 73 32 2c 20 64 69 67 65 73 74 5f 73 69 7a 65  es2, digest_size
b080: 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 6c 6f 67  ) != 0) {....log
b090: 5f 6d 65 73 73 61 67 65 28 22 66 61 69 6c 65 64  _message("failed
b0a0: 3a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 25  : inconsistent %
b0b0: 73 28 5c 22 25 73 5c 22 29 20 68 61 73 68 20 72  s(\"%s\") hash r
b0c0: 65 73 75 6c 74 73 5c 6e 22 2c 20 72 68 61 73 68  esults\n", rhash
b0d0: 5f 67 65 74 5f 6e 61 6d 65 28 68 61 73 68 5f 69  _get_name(hash_i
b0e0: 64 29 2c 20 6d 73 67 29 3b 0a 09 09 7d 0a 09 7d  d), msg);...}..}
b0f0: 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 56 65 72 69 66  .}../**. * Verif
b100: 79 20 74 68 61 74 20 63 61 6c 63 75 6c 61 74 65  y that calculate
b110: 64 20 68 61 73 68 20 64 6f 65 73 6e 27 74 20 64  d hash doesn't d
b120: 65 70 65 6e 64 20 6f 6e 20 6d 65 73 73 61 67 65  epend on message
b130: 20 61 6c 69 67 6e 6d 65 6e 74 2e 0a 20 2a 2f 0a   alignment.. */.
b140: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
b150: 5f 61 6c 69 67 6e 6d 65 6e 74 28 76 6f 69 64 29  _alignment(void)
b160: 0a 7b 0a 09 69 6e 74 20 69 2c 20 73 74 61 72 74  .{..int i, start
b170: 2c 20 68 61 73 68 5f 69 64 2c 20 61 6c 69 67 6e  , hash_id, align
b180: 6d 65 6e 74 5f 73 69 7a 65 3b 0a 0a 09 2f 2a 20  ment_size;.../* 
b190: 6c 6f 6f 70 20 62 79 20 73 75 6d 73 20 2a 2f 0a  loop by sums */.
b1a0: 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 68 61 73  .for (i = 0, has
b1b0: 68 5f 69 64 20 3d 20 31 3b 20 28 68 61 73 68 5f  h_id = 1; (hash_
b1c0: 69 64 20 26 20 52 48 41 53 48 5f 41 4c 4c 5f 48  id & RHASH_ALL_H
b1d0: 41 53 48 45 53 29 3b 20 68 61 73 68 5f 69 64 20  ASHES); hash_id 
b1e0: 3c 3c 3d 20 31 2c 20 69 2b 2b 29 20 7b 0a 09 09  <<= 1, i++) {...
b1f0: 63 68 61 72 20 65 78 70 65 63 74 65 64 5f 68 61  char expected_ha
b200: 73 68 5b 31 33 30 5d 3b 0a 09 09 61 73 73 65 72  sh[130];...asser
b210: 74 28 72 68 61 73 68 5f 67 65 74 5f 64 69 67 65  t(rhash_get_dige
b220: 73 74 5f 73 69 7a 65 28 68 61 73 68 5f 69 64 29  st_size(hash_id)
b230: 20 3c 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 65   < (int)sizeof(e
b240: 78 70 65 63 74 65 64 5f 68 61 73 68 29 29 3b 0a  xpected_hash));.
b250: 0a 09 09 61 6c 69 67 6e 6d 65 6e 74 5f 73 69 7a  ...alignment_siz
b260: 65 20 3d 20 28 68 61 73 68 5f 69 64 20 26 20 28  e = (hash_id & (
b270: 52 48 41 53 48 5f 54 54 48 20 7c 20 52 48 41 53  RHASH_TTH | RHAS
b280: 48 5f 54 49 47 45 52 20 7c 20 52 48 41 53 48 5f  H_TIGER | RHASH_
b290: 57 48 49 52 4c 50 4f 4f 4c 20 7c 20 52 48 41 53  WHIRLPOOL | RHAS
b2a0: 48 5f 53 48 41 35 31 32 29 20 3f 20 38 20 3a 20  H_SHA512) ? 8 : 
b2b0: 34 29 3b 0a 0a 09 09 2f 2a 20 73 74 61 72 74 20  4);..../* start 
b2c0: 6d 65 73 73 61 67 65 20 77 69 74 68 20 64 69 66  message with dif
b2d0: 66 65 72 65 6e 74 20 61 6c 69 67 6e 6d 65 6e 74  ferent alignment
b2e0: 20 2a 2f 0a 09 09 66 6f 72 20 28 73 74 61 72 74   */...for (start
b2f0: 20 3d 20 30 3b 20 73 74 61 72 74 20 3c 20 61 6c   = 0; start < al
b300: 69 67 6e 6d 65 6e 74 5f 73 69 7a 65 3b 20 73 74  ignment_size; st
b310: 61 72 74 2b 2b 29 20 7b 0a 09 09 09 63 68 61 72  art++) {....char
b320: 20 6d 65 73 73 61 67 65 5b 33 30 5d 3b 0a 09 09   message[30];...
b330: 09 69 6e 74 20 6a 2c 20 6d 73 67 5f 6c 65 6e 67  .int j, msg_leng
b340: 74 68 20 3d 20 31 31 20 2b 20 61 6c 69 67 6e 6d  th = 11 + alignm
b350: 65 6e 74 5f 73 69 7a 65 3b 0a 0a 09 09 09 2f 2a  ent_size;...../*
b360: 20 66 69 6c 6c 20 74 68 65 20 62 75 66 66 65 72   fill the buffer
b370: 20 66 69 66 74 68 20 73 68 69 66 74 65 64 20 6c   fifth shifted l
b380: 65 74 74 65 72 20 73 65 71 75 65 6e 63 65 20 2a  etter sequence *
b390: 2f 0a 09 09 09 66 6f 72 20 28 6a 20 3d 20 30 3b  /....for (j = 0;
b3a0: 20 6a 20 3c 20 6d 73 67 5f 6c 65 6e 67 74 68 3b   j < msg_length;
b3b0: 20 6a 2b 2b 29 20 6d 65 73 73 61 67 65 5b 73 74   j++) message[st
b3c0: 61 72 74 20 2b 20 6a 5d 20 3d 20 27 61 27 20 2b  art + j] = 'a' +
b3d0: 20 6a 3b 0a 09 09 09 6d 65 73 73 61 67 65 5b 73   j;....message[s
b3e0: 74 61 72 74 20 2b 20 6a 5d 20 3d 20 30 3b 0a 0a  tart + j] = 0;..
b3f0: 09 09 09 69 66 20 28 73 74 61 72 74 20 3d 3d 20  ...if (start == 
b400: 30 29 20 7b 0a 09 09 09 09 2f 2a 20 73 61 76 65  0) {...../* save
b410: 20 6f 72 69 67 69 6e 61 6c 20 68 61 73 68 20 76   original hash v
b420: 61 6c 75 65 20 2a 2f 0a 09 09 09 09 73 74 72 63  alue */.....strc
b430: 70 79 28 65 78 70 65 63 74 65 64 5f 68 61 73 68  py(expected_hash
b440: 2c 20 68 61 73 68 5f 6d 65 73 73 61 67 65 28 68  , hash_message(h
b450: 61 73 68 5f 69 64 2c 20 6d 65 73 73 61 67 65 20  ash_id, message 
b460: 2b 20 73 74 61 72 74 2c 20 30 29 29 3b 0a 09 09  + start, 0));...
b470: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 2f 2a  .} else {...../*
b480: 20 76 65 72 69 66 79 20 6f 62 74 61 69 6e 65 64   verify obtained
b490: 20 68 61 73 68 20 76 61 6c 75 65 20 2a 2f 0a 09   hash value */..
b4a0: 09 09 09 61 73 73 65 72 74 5f 68 61 73 68 28 68  ...assert_hash(h
b4b0: 61 73 68 5f 69 64 2c 20 6d 65 73 73 61 67 65 20  ash_id, message 
b4c0: 2b 20 73 74 61 72 74 2c 20 65 78 70 65 63 74 65  + start, expecte
b4d0: 64 5f 68 61 73 68 2c 20 30 29 3b 0a 09 09 09 7d  d_hash, 0);....}
b4e0: 0a 09 09 7d 0a 09 7d 0a 7d 0a 0a 2f 2a 2a 0a 20  ...}..}.}../**. 
b4f0: 2a 20 56 65 72 69 66 79 20 70 72 6f 63 65 73 73  * Verify process
b500: 6f 72 20 65 6e 64 69 61 6e 6e 65 73 73 20 64 65  or endianness de
b510: 74 65 63 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  tected at compil
b520: 65 2d 74 69 6d 65 20 61 67 61 69 6e 73 74 0a 20  e-time against. 
b530: 2a 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61  * with the actua
b540: 6c 20 43 50 55 20 65 6e 64 69 61 6e 6e 65 73 73  l CPU endianness
b550: 20 69 6e 20 72 75 6e 74 69 6d 65 2e 0a 20 2a 2f   in runtime.. */
b560: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
b570: 74 5f 65 6e 64 69 61 6e 6e 65 73 73 28 76 6f 69  t_endianness(voi
b580: 64 29 0a 7b 0a 09 75 6e 73 69 67 6e 65 64 20 74  d).{..unsigned t
b590: 6d 70 20 3d 20 31 3b 0a 09 69 66 20 28 2a 28 63  mp = 1;..if (*(c
b5a0: 68 61 72 2a 29 26 74 6d 70 20 3d 3d 20 49 53 5f  har*)&tmp == IS_
b5b0: 42 49 47 5f 45 4e 44 49 41 4e 29 20 7b 0a 09 09  BIG_ENDIAN) {...
b5c0: 6c 6f 67 5f 6d 65 73 73 61 67 65 28 22 65 72 72  log_message("err
b5d0: 6f 72 3a 20 77 72 6f 6e 67 20 65 6e 64 69 61 6e  or: wrong endian
b5e0: 6e 65 73 73 20 64 65 74 65 63 74 65 64 20 61 74  ness detected at
b5f0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 5c 6e 22   compile time\n"
b600: 29 3b 0a 09 09 67 5f 65 72 72 6f 72 73 2b 2b 3b  );...g_errors++;
b610: 0a 09 7d 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 52 75  ..}.}../**. * Ru
b620: 6e 20 76 61 72 69 6f 75 73 20 73 69 6d 70 6c 65  n various simple
b630: 20 74 65 73 74 73 2e 0a 20 2a 2f 0a 73 74 61 74   tests.. */.stat
b640: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 67 65 6e  ic void test_gen
b650: 65 72 69 63 5f 61 73 73 75 6d 70 74 69 6f 6e 73  eric_assumptions
b660: 28 76 6f 69 64 29 0a 7b 0a 09 75 6e 73 69 67 6e  (void).{..unsign
b670: 65 64 20 6d 61 73 6b 20 3d 20 28 31 20 3c 3c 20  ed mask = (1 << 
b680: 52 48 41 53 48 5f 48 41 53 48 5f 43 4f 55 4e 54  RHASH_HASH_COUNT
b690: 29 20 2d 20 31 3b 0a 09 69 66 20 28 6d 61 73 6b  ) - 1;..if (mask
b6a0: 20 21 3d 20 52 48 41 53 48 5f 41 4c 4c 5f 48 41   != RHASH_ALL_HA
b6b0: 53 48 45 53 29 20 7b 0a 09 09 6c 6f 67 5f 6d 65  SHES) {...log_me
b6c0: 73 73 61 67 65 28 22 65 72 72 6f 72 3a 20 77 72  ssage("error: wr
b6d0: 6f 6e 67 20 61 6c 67 6f 72 69 74 68 6d 73 20 63  ong algorithms c
b6e0: 6f 75 6e 74 20 25 64 20 66 6f 72 20 74 68 65 20  ount %d for the 
b6f0: 6d 61 73 6b 20 30 78 25 78 5c 6e 22 2c 20 52 48  mask 0x%x\n", RH
b700: 41 53 48 5f 48 41 53 48 5f 43 4f 55 4e 54 2c 20  ASH_HASH_COUNT, 
b710: 52 48 41 53 48 5f 41 4c 4c 5f 48 41 53 48 45 53  RHASH_ALL_HASHES
b720: 29 3b 0a 09 09 67 5f 65 72 72 6f 72 73 2b 2b 3b  );...g_errors++;
b730: 0a 09 7d 0a 0a 09 74 65 73 74 5f 65 6e 64 69 61  ..}...test_endia
b740: 6e 6e 65 73 73 28 29 3b 0a 7d 0a 0a 23 64 65 66  nness();.}..#def
b750: 69 6e 65 20 54 45 53 54 5f 50 41 54 48 20 30 78  ine TEST_PATH 0x
b760: 34 30 30 30 30 30 30 0a 0a 2f 2a 2a 0a 20 2a 20  4000000../**. * 
b770: 56 65 72 69 66 79 20 61 20 6d 61 67 6e 65 74 20  Verify a magnet 
b780: 6c 69 6e 6b 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  link.. */.static
b790: 20 76 6f 69 64 20 61 73 73 65 72 74 5f 6d 61 67   void assert_mag
b7a0: 6e 65 74 28 63 6f 6e 73 74 20 63 68 61 72 2a 20  net(const char* 
b7b0: 65 78 70 65 63 74 65 64 2c 0a 09 72 68 61 73 68  expected,..rhash
b7c0: 20 63 74 78 2c 20 75 6e 73 69 67 6e 65 64 20 6d   ctx, unsigned m
b7d0: 61 73 6b 2c 20 69 6e 74 20 66 6c 61 67 73 29 0a  ask, int flags).
b7e0: 7b 0a 09 73 74 61 74 69 63 20 63 68 61 72 20 6f  {..static char o
b7f0: 75 74 5b 32 34 30 5d 3b 0a 09 63 6f 6e 73 74 20  ut[240];..const 
b800: 63 68 61 72 2a 20 70 61 74 68 20 3d 20 28 66 6c  char* path = (fl
b810: 61 67 73 20 26 20 54 45 53 54 5f 50 41 54 48 20  ags & TEST_PATH 
b820: 3f 20 22 74 65 73 74 2e 74 78 74 22 20 3a 20 4e  ? "test.txt" : N
b830: 55 4c 4c 29 3b 0a 09 73 69 7a 65 5f 74 20 73 69  ULL);..size_t si
b840: 7a 65 3b 0a 09 66 6c 61 67 73 20 26 3d 20 7e 54  ze;..flags &= ~T
b850: 45 53 54 5f 50 41 54 48 3b 0a 09 73 69 7a 65 20  EST_PATH;..size 
b860: 3d 20 72 68 61 73 68 5f 70 72 69 6e 74 5f 6d 61  = rhash_print_ma
b870: 67 6e 65 74 28 6f 75 74 2c 20 70 61 74 68 2c 20  gnet(out, path, 
b880: 63 74 78 2c 20 6d 61 73 6b 2c 20 66 6c 61 67 73  ctx, mask, flags
b890: 29 3b 0a 0a 09 69 66 20 28 65 78 70 65 63 74 65  );...if (expecte
b8a0: 64 20 26 26 20 73 74 72 63 6d 70 28 65 78 70 65  d && strcmp(expe
b8b0: 63 74 65 64 2c 20 6f 75 74 29 20 21 3d 20 30 29  cted, out) != 0)
b8c0: 20 7b 0a 09 09 6c 6f 67 5f 6d 65 73 73 61 67 65   {...log_message
b8d0: 28 22 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 20  ("error: \"%s\" 
b8e0: 21 3d 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 65 78  != \"%s\"\n", ex
b8f0: 70 65 63 74 65 64 2c 20 6f 75 74 29 3b 0a 09 09  pected, out);...
b900: 67 5f 65 72 72 6f 72 73 2b 2b 3b 0a 09 7d 20 65  g_errors++;..} e
b910: 6c 73 65 20 7b 0a 09 09 73 69 7a 65 5f 74 20 73  lse {...size_t s
b920: 69 7a 65 32 20 3d 20 73 74 72 6c 65 6e 28 6f 75  ize2 = strlen(ou
b930: 74 29 20 2b 20 31 3b 0a 09 09 69 66 20 28 73 69  t) + 1;...if (si
b940: 7a 65 20 21 3d 20 73 69 7a 65 32 29 20 7b 0a 09  ze != size2) {..
b950: 09 09 6c 6f 67 5f 6d 65 73 73 61 67 65 28 22 65  ..log_message("e
b960: 72 72 6f 72 3a 20 72 68 61 73 68 5f 70 72 69 6e  rror: rhash_prin
b970: 74 5f 6d 61 67 6e 65 74 20 72 65 74 75 72 6e 73  t_magnet returns
b980: 20 77 72 6f 6e 67 20 6c 65 6e 67 74 68 20 25 64   wrong length %d
b990: 20 21 3d 20 25 64 20 66 6f 72 20 5c 22 25 73 5c   != %d for \"%s\
b9a0: 22 5c 6e 22 2c 20 28 69 6e 74 29 73 69 7a 65 2c  "\n", (int)size,
b9b0: 20 28 69 6e 74 29 73 69 7a 65 32 2c 20 6f 75 74   (int)size2, out
b9c0: 29 3b 0a 09 09 09 67 5f 65 72 72 6f 72 73 2b 2b  );....g_errors++
b9d0: 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73  ;...} else if (s
b9e0: 69 7a 65 20 21 3d 20 28 73 69 7a 65 32 20 3d 20  ize != (size2 = 
b9f0: 72 68 61 73 68 5f 70 72 69 6e 74 5f 6d 61 67 6e  rhash_print_magn
ba00: 65 74 28 4e 55 4c 4c 2c 20 70 61 74 68 2c 20 63  et(NULL, path, c
ba10: 74 78 2c 20 6d 61 73 6b 2c 20 66 6c 61 67 73 29  tx, mask, flags)
ba20: 29 29 20 7b 0a 09 09 09 6c 6f 67 5f 6d 65 73 73  )) {....log_mess
ba30: 61 67 65 28 22 65 72 72 6f 72 3a 20 72 68 61 73  age("error: rhas
ba40: 68 5f 70 72 69 6e 74 5f 6d 61 67 6e 65 74 28 4e  h_print_magnet(N
ba50: 55 4c 4c 2c 20 2e 2e 2e 29 20 72 65 74 75 72 6e  ULL, ...) return
ba60: 73 20 77 72 6f 6e 67 20 6c 65 6e 67 74 68 20 25  s wrong length %
ba70: 64 20 21 3d 20 25 64 20 66 6f 72 20 5c 22 25 73  d != %d for \"%s
ba80: 5c 22 5c 6e 22 2c 20 28 69 6e 74 29 73 69 7a 65  \"\n", (int)size
ba90: 32 2c 20 28 69 6e 74 29 73 69 7a 65 2c 20 6f 75  2, (int)size, ou
baa0: 74 29 3b 0a 09 09 09 67 5f 65 72 72 6f 72 73 2b  t);....g_errors+
bab0: 2b 3b 0a 09 09 7d 0a 09 7d 0a 7d 0a 0a 2f 2a 2a  +;...}..}.}../**
bac0: 0a 20 2a 20 54 65 73 74 20 70 72 69 6e 74 69 6e  . * Test printin
bad0: 67 20 6f 66 20 6d 61 67 6e 65 74 20 6c 69 6e 6b  g of magnet link
bae0: 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s.. */.static vo
baf0: 69 64 20 74 65 73 74 5f 6d 61 67 6e 65 74 28 76  id test_magnet(v
bb00: 6f 69 64 29 0a 7b 0a 09 75 6e 73 69 67 6e 65 64  oid).{..unsigned
bb10: 20 62 69 74 3b 0a 0a 09 72 68 61 73 68 20 63 74   bit;...rhash ct
bb20: 78 20 3d 20 72 68 61 73 68 5f 69 6e 69 74 28 52  x = rhash_init(R
bb30: 48 41 53 48 5f 41 4c 4c 5f 48 41 53 48 45 53 29  HASH_ALL_HASHES)
bb40: 3b 0a 09 72 68 61 73 68 5f 75 70 64 61 74 65 28  ;..rhash_update(
bb50: 63 74 78 2c 20 22 61 22 2c 20 31 29 3b 0a 09 72  ctx, "a", 1);..r
bb60: 68 61 73 68 5f 66 69 6e 61 6c 28 63 74 78 2c 20  hash_final(ctx, 
bb70: 30 29 3b 0a 0a 09 61 73 73 65 72 74 5f 6d 61 67  0);...assert_mag
bb80: 6e 65 74 28 22 6d 61 67 6e 65 74 3a 3f 78 6c 3d  net("magnet:?xl=
bb90: 31 26 64 6e 3d 74 65 73 74 2e 74 78 74 26 78 74  1&dn=test.txt&xt
bba0: 3d 75 72 6e 3a 74 72 65 65 3a 74 69 67 65 72 3a  =urn:tree:tiger:
bbb0: 63 7a 71 75 77 68 33 69 79 78 62 66 35 6c 33 62  czquwh3iyxbf5l3b
bbc0: 67 79 75 67 7a 68 61 73 73 6d 78 75 36 34 37 69  gyugzhassmxu647i
bbd0: 70 32 69 6b 65 34 79 22 2c 20 63 74 78 2c 20 52  p2ike4y", ctx, R
bbe0: 48 41 53 48 5f 54 54 48 2c 20 52 48 50 52 5f 46  HASH_TTH, RHPR_F
bbf0: 49 4c 45 53 49 5a 45 20 7c 20 54 45 53 54 5f 50  ILESIZE | TEST_P
bc00: 41 54 48 29 3b 0a 09 61 73 73 65 72 74 5f 6d 61  ATH);..assert_ma
bc10: 67 6e 65 74 28 22 6d 61 67 6e 65 74 3a 3f 78 6c  gnet("magnet:?xl
bc20: 3d 31 26 78 74 3d 75 72 6e 3a 6d 64 35 3a 30 43  =1&xt=urn:md5:0C
bc30: 43 31 37 35 42 39 43 30 46 31 42 36 41 38 33 31  C175B9C0F1B6A831
bc40: 43 33 39 39 45 32 36 39 37 37 32 36 36 31 22 2c  C399E269772661",
bc50: 20 63 74 78 2c 20 52 48 41 53 48 5f 4d 44 35 2c   ctx, RHASH_MD5,
bc60: 20 52 48 50 52 5f 46 49 4c 45 53 49 5a 45 20 7c   RHPR_FILESIZE |
bc70: 20 52 48 50 52 5f 55 50 50 45 52 43 41 53 45 29   RHPR_UPPERCASE)
bc80: 3b 0a 09 61 73 73 65 72 74 5f 6d 61 67 6e 65 74  ;..assert_magnet
bc90: 28 22 78 74 3d 75 72 6e 3a 65 64 32 6b 3a 62 64  ("xt=urn:ed2k:bd
bca0: 65 35 32 63 62 33 31 64 65 33 33 65 34 36 32 34  e52cb31de33e4624
bcb0: 35 65 30 35 66 62 64 62 64 36 66 62 32 34 26 78  5e05fbdbd6fb24&x
bcc0: 74 3d 75 72 6e 3a 61 69 63 68 3a 71 33 33 36 69  t=urn:aich:q336i
bcd0: 6e 37 32 75 77 74 37 7a 79 6b 35 64 78 6f 6c 74  n72uwt7zyk5dxolt
bce0: 32 78 6b 35 69 33 78 6d 7a 35 79 26 78 74 3d 75  2xk5i3xmz5y&xt=u
bcf0: 72 6e 3a 73 68 61 31 3a 71 33 33 36 69 6e 37 32  rn:sha1:q336in72
bd00: 75 77 74 37 7a 79 6b 35 64 78 6f 6c 74 32 78 6b  uwt7zyk5dxolt2xk
bd10: 35 69 33 78 6d 7a 35 79 26 78 74 3d 75 72 6e 3a  5i3xmz5y&xt=urn:
bd20: 62 74 69 68 3a 71 6a 36 6e 72 67 63 67 37 71 6a  btih:qj6nrgcg7qj
bd30: 73 34 6c 74 68 34 6b 6f 63 70 62 67 67 6b 72 62  s4lth4kocpbggkrb
bd40: 33 77 74 6f 62 22 2c 0a 09 09 63 74 78 2c 20 52  3wtob",...ctx, R
bd50: 48 41 53 48 5f 45 44 32 4b 20 7c 20 52 48 41 53  HASH_ED2K | RHAS
bd60: 48 5f 41 49 43 48 20 7c 20 52 48 41 53 48 5f 53  H_AICH | RHASH_S
bd70: 48 41 31 20 7c 20 52 48 41 53 48 5f 42 54 49 48  HA1 | RHASH_BTIH
bd80: 2c 20 52 48 50 52 5f 4e 4f 5f 4d 41 47 4e 45 54  , RHPR_NO_MAGNET
bd90: 29 3b 0a 0a 09 2f 2a 20 76 65 72 69 66 79 20 6c  );.../* verify l
bda0: 65 6e 67 74 68 20 63 61 6c 63 75 6c 61 74 69 6f  ength calculatio
bdb0: 6e 20 66 6f 72 20 61 6c 6c 20 68 61 73 68 65 73  n for all hashes
bdc0: 20 2a 2f 0a 09 66 6f 72 20 28 62 69 74 20 3d 20   */..for (bit = 
bdd0: 31 3b 20 62 69 74 20 3c 20 52 48 41 53 48 5f 41  1; bit < RHASH_A
bde0: 4c 4c 5f 48 41 53 48 45 53 3b 20 62 69 74 20 3c  LL_HASHES; bit <
bdf0: 3c 3d 20 31 29 20 7b 0a 09 09 61 73 73 65 72 74  <= 1) {...assert
be00: 5f 6d 61 67 6e 65 74 28 4e 55 4c 4c 2c 20 63 74  _magnet(NULL, ct
be10: 78 2c 20 62 69 74 2c 20 52 48 50 52 5f 46 49 4c  x, bit, RHPR_FIL
be20: 45 53 49 5a 45 20 7c 20 52 48 50 52 5f 4e 4f 5f  ESIZE | RHPR_NO_
be30: 4d 41 47 4e 45 54 29 3b 0a 09 7d 0a 0a 09 72 68  MAGNET);..}...rh
be40: 61 73 68 5f 66 72 65 65 28 63 74 78 29 3b 0a 7d  ash_free(ctx);.}
be50: 0a 0a 2f 2a 2a 0a 20 2a 20 46 69 6e 64 20 61 20  ../**. * Find a 
be60: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 69 64  hash function id
be70: 20 62 79 20 69 74 73 20 6e 61 6d 65 2e 0a 20 2a   by its name.. *
be80: 0a 20 2a 20 40 70 61 72 61 6d 20 6e 61 6d 65 20  . * @param name 
be90: 68 61 73 68 20 61 6c 67 6f 72 69 74 68 6d 20 6e  hash algorithm n
bea0: 61 6d 65 0a 20 2a 20 40 72 65 74 75 72 6e 20 61  ame. * @return a
beb0: 6c 67 6f 72 69 74 68 6d 20 69 64 0a 20 2a 2f 0a  lgorithm id. */.
bec0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
bed0: 66 69 6e 64 5f 68 61 73 68 28 63 6f 6e 73 74 20  find_hash(const 
bee0: 63 68 61 72 2a 20 6e 61 6d 65 29 0a 7b 0a 09 63  char* name).{..c
bef0: 68 61 72 20 62 75 66 5b 33 30 5d 3b 0a 09 75 6e  har buf[30];..un
bf00: 73 69 67 6e 65 64 20 68 61 73 68 5f 69 64 3b 0a  signed hash_id;.
bf10: 09 69 6e 74 20 69 3b 0a 0a 09 69 66 20 28 73 74  .int i;...if (st
bf20: 72 6c 65 6e 28 6e 61 6d 65 29 20 3e 20 28 73 69  rlen(name) > (si
bf30: 7a 65 6f 66 28 62 75 66 29 20 2d 20 31 29 29 20  zeof(buf) - 1)) 
bf40: 72 65 74 75 72 6e 20 30 3b 0a 09 66 6f 72 20 28  return 0;..for (
bf50: 69 20 3d 20 30 3b 20 6e 61 6d 65 5b 69 5d 3b 20  i = 0; name[i]; 
bf60: 69 2b 2b 29 20 62 75 66 5b 69 5d 20 3d 20 74 6f  i++) buf[i] = to
bf70: 75 70 70 65 72 28 6e 61 6d 65 5b 69 5d 29 3b 0a  upper(name[i]);.
bf80: 09 62 75 66 5b 69 5d 20 3d 20 30 3b 0a 0a 09 66  .buf[i] = 0;...f
bf90: 6f 72 20 28 68 61 73 68 5f 69 64 20 3d 20 31 3b  or (hash_id = 1;
bfa0: 20 28 68 61 73 68 5f 69 64 20 26 20 52 48 41 53   (hash_id & RHAS
bfb0: 48 5f 41 4c 4c 5f 48 41 53 48 45 53 29 3b 20 68  H_ALL_HASHES); h
bfc0: 61 73 68 5f 69 64 20 3c 3c 3d 20 31 29 20 7b 0a  ash_id <<= 1) {.
bfd0: 09 09 69 66 20 28 73 74 72 63 6d 70 28 62 75 66  ..if (strcmp(buf
bfe0: 2c 20 72 68 61 73 68 5f 67 65 74 5f 6e 61 6d 65  , rhash_get_name
bff0: 28 68 61 73 68 5f 69 64 29 29 20 3d 3d 20 30 29  (hash_id)) == 0)
c000: 20 72 65 74 75 72 6e 20 68 61 73 68 5f 69 64 3b   return hash_id;
c010: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d  ..}..return 0;.}
c020: 0a 0a 2f 2a 2a 0a 20 2a 20 50 72 69 6e 74 20 73  ../**. * Print s
c030: 74 61 74 75 73 20 6f 66 20 4f 70 65 6e 53 53 4c  tatus of OpenSSL
c040: 20 70 6c 75 67 69 6e 2e 0a 20 2a 2f 0a 73 74 61   plugin.. */.sta
c050: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 6f  tic void print_o
c060: 70 65 6e 73 73 6c 5f 73 74 61 74 75 73 28 76 6f  penssl_status(vo
c070: 69 64 29 0a 7b 0a 09 72 68 61 73 68 5f 75 70 74  id).{..rhash_upt
c080: 72 5f 74 20 61 76 61 69 6c 61 62 6c 65 20 3d 20  r_t available = 
c090: 72 68 61 73 68 5f 67 65 74 5f 6f 70 65 6e 73 73  rhash_get_openss
c0a0: 6c 5f 61 76 61 69 6c 61 62 6c 65 5f 6d 61 73 6b  l_available_mask
c0b0: 28 29 3b 0a 09 72 68 61 73 68 5f 75 70 74 72 5f  ();..rhash_uptr_
c0c0: 74 20 73 75 70 70 6f 72 74 65 64 20 3d 20 72 68  t supported = rh
c0d0: 61 73 68 5f 67 65 74 5f 6f 70 65 6e 73 73 6c 5f  ash_get_openssl_
c0e0: 73 75 70 70 6f 72 74 65 64 5f 6d 61 73 6b 28 29  supported_mask()
c0f0: 3b 0a 09 69 6e 74 20 68 61 73 5f 6f 70 65 6e 73  ;..int has_opens
c100: 73 6c 20 3d 20 72 68 61 73 68 5f 69 73 5f 6f 70  sl = rhash_is_op
c110: 65 6e 73 73 6c 5f 73 75 70 70 6f 72 74 65 64 28  enssl_supported(
c120: 29 3b 0a 0a 09 70 72 69 6e 74 66 28 22 4f 70 65  );...printf("Ope
c130: 6e 53 53 4c 20 25 73 22 2c 20 28 68 61 73 5f 6f  nSSL %s", (has_o
c140: 70 65 6e 73 73 6c 20 3f 20 22 73 75 70 70 6f 72  penssl ? "suppor
c150: 74 65 64 22 20 3a 20 22 6e 6f 74 20 73 75 70 70  ted" : "not supp
c160: 6f 72 74 65 64 22 29 29 3b 0a 09 69 66 20 28 68  orted"));..if (h
c170: 61 73 5f 6f 70 65 6e 73 73 6c 20 26 26 20 61 76  as_openssl && av
c180: 61 69 6c 61 62 6c 65 20 21 3d 20 52 48 41 53 48  ailable != RHASH
c190: 5f 45 52 52 4f 52 29 0a 09 7b 0a 09 09 70 72 69  _ERROR)..{...pri
c1a0: 6e 74 66 28 22 2c 20 25 73 22 2c 20 28 61 76 61  ntf(", %s", (ava
c1b0: 69 6c 61 62 6c 65 20 3f 20 22 6c 6f 61 64 65 64  ilable ? "loaded
c1c0: 22 20 3a 20 22 6e 6f 74 20 6c 6f 61 64 65 64 22  " : "not loaded"
c1d0: 29 29 3b 0a 09 09 69 66 20 28 61 76 61 69 6c 61  ));...if (availa
c1e0: 62 6c 65 29 0a 09 09 7b 0a 09 09 09 75 6e 73 69  ble)...{....unsi
c1f0: 67 6e 65 64 20 68 61 73 68 5f 69 64 3b 0a 09 09  gned hash_id;...
c200: 09 70 72 69 6e 74 66 28 22 3a 22 29 3b 0a 09 09  .printf(":");...
c210: 09 61 76 61 69 6c 61 62 6c 65 20 26 3d 20 52 48  .available &= RH
c220: 41 53 48 5f 41 4c 4c 5f 48 41 53 48 45 53 3b 0a  ASH_ALL_HASHES;.
c230: 09 09 09 66 6f 72 20 28 68 61 73 68 5f 69 64 20  ...for (hash_id 
c240: 3d 20 31 3b 20 68 61 73 68 5f 69 64 20 3c 3d 20  = 1; hash_id <= 
c250: 61 76 61 69 6c 61 62 6c 65 3b 20 68 61 73 68 5f  available; hash_
c260: 69 64 20 3c 3c 3d 20 31 29 20 7b 0a 09 09 09 09  id <<= 1) {.....
c270: 69 66 20 28 21 21 28 68 61 73 68 5f 69 64 20 26  if (!!(hash_id &
c280: 20 61 76 61 69 6c 61 62 6c 65 29 29 0a 09 09 09   available))....
c290: 09 09 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20  ..printf(" %s", 
c2a0: 72 68 61 73 68 5f 67 65 74 5f 6e 61 6d 65 28 68  rhash_get_name(h
c2b0: 61 73 68 5f 69 64 29 29 3b 0a 09 09 09 7d 0a 09  ash_id));....}..
c2c0: 09 09 73 75 70 70 6f 72 74 65 64 20 26 3d 20 28  ..supported &= (
c2d0: 7e 61 76 61 69 6c 61 62 6c 65 20 26 20 52 48 41  ~available & RHA
c2e0: 53 48 5f 41 4c 4c 5f 48 41 53 48 45 53 29 3b 0a  SH_ALL_HASHES);.
c2f0: 09 09 09 66 6f 72 20 28 68 61 73 68 5f 69 64 20  ...for (hash_id 
c300: 3d 20 31 3b 20 68 61 73 68 5f 69 64 20 3c 3d 20  = 1; hash_id <= 
c310: 73 75 70 70 6f 72 74 65 64 3b 20 68 61 73 68 5f  supported; hash_
c320: 69 64 20 3c 3c 3d 20 31 29 20 7b 0a 09 09 09 09  id <<= 1) {.....
c330: 69 66 20 28 21 21 28 68 61 73 68 5f 69 64 20 26  if (!!(hash_id &
c340: 20 73 75 70 70 6f 72 74 65 64 29 29 0a 09 09 09   supported))....
c350: 09 09 70 72 69 6e 74 66 28 22 20 2d 25 73 22 2c  ..printf(" -%s",
c360: 20 72 68 61 73 68 5f 67 65 74 5f 6e 61 6d 65 28   rhash_get_name(
c370: 68 61 73 68 5f 69 64 29 29 3b 0a 09 09 09 7d 0a  hash_id));....}.
c380: 09 09 7d 0a 09 7d 0a 09 70 72 69 6e 74 66 28 22  ..}..}..printf("
c390: 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20  \n");.}../**. * 
c3a0: 54 68 65 20 70 72 6f 67 72 61 6d 20 65 6e 74 72  The program entr
c3b0: 79 20 70 6f 69 6e 74 2e 0a 20 2a 0a 20 2a 20 40  y point.. *. * @
c3c0: 70 61 72 61 6d 20 61 72 67 63 20 6e 75 6d 62 65  param argc numbe
c3d0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
c3e0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 70 72 6f  ncluding the pro
c3f0: 67 72 61 6d 20 6e 61 6d 65 0a 20 2a 20 40 70 61  gram name. * @pa
c400: 72 61 6d 20 61 72 67 76 20 70 72 6f 67 72 61 6d  ram argv program
c410: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 63 6c 75   arguments inclu
c420: 64 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  ding the program
c430: 20 6e 61 6d 65 0a 20 2a 20 40 72 65 74 75 72 6e   name. * @return
c440: 20 70 72 6f 67 72 61 6d 20 65 78 69 74 20 63 6f   program exit co
c450: 64 65 0a 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28  de. */.int main(
c460: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
c470: 61 72 67 76 5b 5d 29 0a 7b 0a 23 69 66 6e 64 65  argv[]).{.#ifnde
c480: 66 20 55 53 45 5f 52 48 41 53 48 5f 44 4c 4c 0a  f USE_RHASH_DLL.
c490: 09 72 68 61 73 68 5f 6c 69 62 72 61 72 79 5f 69  .rhash_library_i
c4a0: 6e 69 74 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  nit();.#endif...
c4b0: 74 65 73 74 5f 67 65 6e 65 72 69 63 5f 61 73 73  test_generic_ass
c4c0: 75 6d 70 74 69 6f 6e 73 28 29 3b 0a 09 69 66 20  umptions();..if 
c4d0: 28 61 72 67 63 20 3e 20 31 29 20 7b 0a 09 09 69  (argc > 1) {...i
c4e0: 66 20 28 73 74 72 63 6d 70 28 61 72 67 76 5b 31  f (strcmp(argv[1
c4f0: 5d 2c 20 22 2d 2d 73 70 65 65 64 22 29 20 3d 3d  ], "--speed") ==
c500: 20 30 29 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65   0) {....unsigne
c510: 64 20 68 61 73 68 5f 69 64 20 3d 20 28 61 72 67  d hash_id = (arg
c520: 63 20 3e 20 32 20 3f 20 66 69 6e 64 5f 68 61 73  c > 2 ? find_has
c530: 68 28 61 72 67 76 5b 32 5d 29 20 3a 20 52 48 41  h(argv[2]) : RHA
c540: 53 48 5f 53 48 41 31 29 3b 0a 09 09 09 69 66 20  SH_SHA1);....if 
c550: 28 68 61 73 68 5f 69 64 20 3d 3d 20 30 29 20 7b  (hash_id == 0) {
c560: 0a 09 09 09 09 66 70 72 69 6e 74 66 28 73 74 64  .....fprintf(std
c570: 65 72 72 2c 20 22 65 72 72 6f 72 3a 20 75 6e 6b  err, "error: unk
c580: 6e 6f 77 6e 20 68 61 73 68 5f 69 64 3a 20 25 73  nown hash_id: %s
c590: 5c 6e 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 09  \n", argv[2]);..
c5a0: 09 09 09 72 65 74 75 72 6e 20 31 3b 0a 09 09 09  ...return 1;....
c5b0: 7d 0a 09 09 09 74 65 73 74 5f 6b 6e 6f 77 6e 5f  }....test_known_
c5c0: 73 74 72 69 6e 67 73 28 68 61 73 68 5f 69 64 29  strings(hash_id)
c5d0: 3b 0a 0a 09 09 09 72 68 61 73 68 5f 72 75 6e 5f  ;.....rhash_run_
c5e0: 62 65 6e 63 68 6d 61 72 6b 28 68 61 73 68 5f 69  benchmark(hash_i
c5f0: 64 2c 20 30 2c 20 73 74 64 6f 75 74 29 3b 0a 09  d, 0, stdout);..
c600: 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63  .} else if (strc
c610: 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 2d 2d 69  mp(argv[1], "--i
c620: 6e 66 6f 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09  nfo") == 0) {...
c630: 09 70 72 69 6e 74 66 28 22 25 73 22 2c 20 63 6f  .printf("%s", co
c640: 6d 70 69 6c 65 72 5f 66 6c 61 67 73 29 3b 0a 09  mpiler_flags);..
c650: 09 09 70 72 69 6e 74 5f 6f 70 65 6e 73 73 6c 5f  ..print_openssl_
c660: 73 74 61 74 75 73 28 29 3b 0a 09 09 7d 20 65 6c  status();...} el
c670: 73 65 20 7b 0a 09 09 09 70 72 69 6e 74 66 28 22  se {....printf("
c680: 4f 70 74 69 6f 6e 73 3a 20 5b 2d 2d 73 70 65 65  Options: [--spee
c690: 64 20 5b 48 41 53 48 5f 4e 41 4d 45 5d 7c 20 2d  d [HASH_NAME]| -
c6a0: 2d 69 6e 66 6f 5d 5c 6e 22 29 3b 0a 09 09 7d 0a  -info]\n");...}.
c6b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 65 73 74  .} else {...test
c6c0: 5f 61 6c 6c 5f 6b 6e 6f 77 6e 5f 73 74 72 69 6e  _all_known_strin
c6d0: 67 73 28 29 3b 0a 09 09 74 65 73 74 5f 6c 6f 6e  gs();...test_lon
c6e0: 67 5f 73 74 72 69 6e 67 73 28 29 3b 0a 09 09 74  g_strings();...t
c6f0: 65 73 74 5f 61 6c 69 67 6e 6d 65 6e 74 28 29 3b  est_alignment();
c700: 0a 09 09 74 65 73 74 5f 72 65 73 75 6c 74 73 5f  ...test_results_
c710: 63 6f 6e 73 69 73 74 65 6e 63 79 28 29 3b 0a 09  consistency();..
c720: 09 74 65 73 74 5f 6d 61 67 6e 65 74 28 29 3b 0a  .test_magnet();.
c730: 09 09 69 66 20 28 67 5f 65 72 72 6f 72 73 20 3d  ..if (g_errors =
c740: 3d 20 30 29 20 70 72 69 6e 74 66 28 22 41 6c 6c  = 0) printf("All
c750: 20 73 75 6d 73 20 61 72 65 20 77 6f 72 6b 69 6e   sums are workin
c760: 67 20 70 72 6f 70 65 72 6c 79 21 5c 6e 22 29 3b  g properly!\n");
c770: 0a 09 09 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ...fflush(stdout
c780: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 5f 65 72  );..}...if (g_er
c790: 72 6f 72 73 20 3e 20 30 29 20 70 72 69 6e 74 66  rors > 0) printf
c7a0: 28 22 25 73 22 2c 20 63 6f 6d 70 69 6c 65 72 5f  ("%s", compiler_
c7b0: 66 6c 61 67 73 29 3b 0a 0a 09 72 65 74 75 72 6e  flags);...return
c7c0: 20 28 67 5f 65 72 72 6f 72 73 20 3d 3d 20 30 20   (g_errors == 0 
c7d0: 3f 20 30 20 3a 20 31 29 3b 0a 7d 0a              ? 0 : 1);.}.