utestsha512.pp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. unit utestsha512;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, sha512, hashutils;
  6. type
  7. { TTestSHA512 }
  8. TTestSHA512 = class(TTestCase)
  9. Public
  10. Procedure TestHexString(Const aString,aDigest : String);
  11. Procedure TestBase64String(Const aString,aDigest : String);
  12. Procedure TestHMACString(Const aString,aKey,aDigest : String);
  13. published
  14. procedure TestEmpty;
  15. procedure TestSmallString;
  16. procedure TestLargeString;
  17. procedure TestEmptyBase64;
  18. procedure TestSmallBase64;
  19. procedure TestSmallHMAC;
  20. procedure TestHMACStream;
  21. end;
  22. { TTestSHA384 }
  23. TTestSHA384 = class(TTestCase)
  24. Public
  25. Procedure TestHexString(Const aString,aDigest : String);
  26. Procedure TestBase64String(Const aString,aDigest : String);
  27. Procedure TestHMACString(Const aString,aKey,aDigest : String);
  28. published
  29. procedure TestEmpty;
  30. procedure TestSmallString;
  31. procedure TestLargeString;
  32. procedure TestEmptyBase64;
  33. procedure TestSmallBase64;
  34. procedure TestSmallHMAC;
  35. procedure TestHMACStream;
  36. end;
  37. implementation
  38. uses
  39. basenenc;
  40. { TTestSHA512 }
  41. procedure TTestSHA512.TestHexString(const aString, aDigest: String);
  42. var
  43. Digest : AnsiString;
  44. S : TBytes;
  45. begin
  46. S:=[];
  47. Digest:='';
  48. S:=TEncoding.UTF8.GetAnsiBytes(aString);
  49. TSHA512.DigestHexa(S, Digest);
  50. AssertEquals('Correct hex digest',aDigest, Digest);
  51. end;
  52. procedure TTestSHA512.TestBase64String(const aString, aDigest: String);
  53. var
  54. Digest : AnsiString;
  55. S : TBytes;
  56. begin
  57. S:=TEncoding.UTF8.GetAnsiBytes(aString);
  58. Digest:='';
  59. TSHA512.DigestBase64(S,False,Digest);
  60. AssertEquals('Correct base64 digest',aDigest, Digest);
  61. end;
  62. procedure TTestSHA512.TestHMACString(const aString, aKey, aDigest: String);
  63. var
  64. Digest : AnsiString;
  65. S,K : TBytes;
  66. begin
  67. S:=TEncoding.UTF8.GetAnsiBytes(aString);
  68. K:=TEncoding.UTF8.GetAnsiBytes(aKey);
  69. TSHA512.HMACHexa(K,S,Digest);
  70. AssertEquals('Correct base64 digest',aDigest, Digest);
  71. end;
  72. const
  73. Empty512Hash = 'CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E';
  74. // Taken from DCPCrypt
  75. Test1Out: array[0..63] of byte=
  76. ($dd,$af,$35,$a1,$93,$61,$7a,$ba,$cc,$41,$73,$49,$ae,$20,$41,$31,
  77. $12,$e6,$fa,$4e,$89,$a9,$7e,$a2,$0a,$9e,$ee,$e6,$4b,$55,$d3,$9a,
  78. $21,$92,$99,$2a,$27,$4f,$c1,$a8,$36,$ba,$3c,$23,$a3,$fe,$eb,$bd,
  79. $45,$4d,$44,$23,$64,$3c,$e8,$0e,$2a,$9a,$c9,$4f,$a5,$4c,$a4,$9f);
  80. Test2Out: array[0..63] of byte=
  81. ($8e,$95,$9b,$75,$da,$e3,$13,$da,$8c,$f4,$f7,$28,$14,$fc,$14,$3f,
  82. $8f,$77,$79,$c6,$eb,$9f,$7f,$a1,$72,$99,$ae,$ad,$b6,$88,$90,$18,
  83. $50,$1d,$28,$9e,$49,$00,$f7,$e4,$33,$1b,$99,$de,$c4,$b5,$43,$3a,
  84. $c7,$d3,$29,$ee,$b6,$dd,$26,$54,$5e,$96,$e5,$5b,$87,$4b,$e9,$09);
  85. procedure TTestSHA512.TestEmpty;
  86. begin
  87. TestHexString('',Empty512Hash);
  88. end;
  89. procedure TTestSHA512.TestSmallString;
  90. Var
  91. S : String;
  92. begin
  93. BytesToHexStr(S,@Test1Out,SizeOf(Test1Out));
  94. TestHexString('abc',S);
  95. end;
  96. procedure TTestSHA512.TestLargeString;
  97. Var
  98. S : String;
  99. begin
  100. BytesToHexStr(S,@Test2Out,SizeOf(Test2Out));
  101. TestHexString('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu',S);
  102. end;
  103. procedure TTestSHA512.TestEmptyBase64;
  104. begin
  105. TestBase64String('',Base64.Encode(Base16.Decode(Empty512Hash),False));
  106. end;
  107. procedure TTestSHA512.TestSmallBase64;
  108. begin
  109. TestBase64String('abc',Base64.Encode(@Test1out,SizeOf(Test1Out),False));
  110. end;
  111. procedure TTestSHA512.TestSmallHMAC;
  112. // Consts taken from HashlibTestBase
  113. Const
  114. Expected = 'DEDFCEAD40225068527D0E53B7C892226E188891D939E21A0777A40EA2E29D7233638C178C879F26088A502A887674C01DF61EAF1635D707D114097ED1D0D762';
  115. DefaultData = 'HashLib4Pascal';
  116. begin
  117. TestHMACString(DefaultData,'Hash' ,Expected);
  118. end;
  119. procedure TTestSHA512.TestHMACStream;
  120. Var
  121. S : TStringStream;
  122. res : String;
  123. begin
  124. BytesToHexStr(Res,@Test1Out,SizeOf(Test1Out));
  125. S:=TStringStream.Create('abc');
  126. try
  127. AssertEquals('Correct hash',Res,TSHA512.StreamHexa(S));
  128. finally
  129. S.Free;
  130. end;
  131. end;
  132. { TTestSHA384 }
  133. procedure TTestSHA384.TestHexString(const aString, aDigest: String);
  134. var
  135. Digest : AnsiString;
  136. S : TBytes;
  137. begin
  138. S:=[];
  139. Digest:='';
  140. S:=TEncoding.UTF8.GetAnsiBytes(aString);
  141. TSHA384.DigestHexa(S, Digest);
  142. AssertEquals('Correct hex digest',aDigest, Digest);
  143. end;
  144. procedure TTestSHA384.TestBase64String(const aString, aDigest: String);
  145. var
  146. Digest : AnsiString;
  147. S : TBytes;
  148. begin
  149. S:=TEncoding.UTF8.GetAnsiBytes(aString);
  150. Digest:='';
  151. TSHA384.DigestBase64(S,False,Digest);
  152. AssertEquals('Correct base64 digest',aDigest, Digest);
  153. end;
  154. procedure TTestSHA384.TestHMACString(const aString, aKey, aDigest: String);
  155. var
  156. Digest : AnsiString;
  157. S,K : TBytes;
  158. begin
  159. S:=TEncoding.UTF8.GetAnsiBytes(aString);
  160. K:=TEncoding.UTF8.GetAnsiBytes(aKey);
  161. TSHA384.HMACHexa(K,S,Digest);
  162. AssertEquals('Correct base64 digest',aDigest, Digest);
  163. end;
  164. const
  165. Empty384Hash = '38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B';
  166. Test1Out384: array[0..47] of byte=
  167. ($cb,$00,$75,$3f,$45,$a3,$5e,$8b,$b5,$a0,$3d,$69,$9a,$c6,$50,$07,
  168. $27,$2c,$32,$ab,$0e,$de,$d1,$63,$1a,$8b,$60,$5a,$43,$ff,$5b,$ed,
  169. $80,$86,$07,$2b,$a1,$e7,$cc,$23,$58,$ba,$ec,$a1,$34,$c8,$25,$a7);
  170. Test2Out384: array[0..47] of byte=
  171. ($09,$33,$0c,$33,$f7,$11,$47,$e8,$3d,$19,$2f,$c7,$82,$cd,$1b,$47,
  172. $53,$11,$1b,$17,$3b,$3b,$05,$d2,$2f,$a0,$80,$86,$e3,$b0,$f7,$12,
  173. $fc,$c7,$c7,$1a,$55,$7e,$2d,$b9,$66,$c3,$e9,$fa,$91,$74,$60,$39);
  174. procedure TTestSHA384.TestEmpty;
  175. begin
  176. TestHexString('',Empty384Hash);
  177. end;
  178. procedure TTestSHA384.TestSmallString;
  179. Var
  180. S : String;
  181. begin
  182. BytesToHexStr(S,@Test1Out384,SizeOf(Test1Out384));
  183. TestHexString('abc',S);
  184. end;
  185. procedure TTestSHA384.TestLargeString;
  186. Var
  187. S : String;
  188. begin
  189. BytesToHexStr(S,@Test2Out384,SizeOf(Test2Out384));
  190. TestHexString('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu',S);
  191. end;
  192. procedure TTestSHA384.TestEmptyBase64;
  193. begin
  194. TestBase64String('',Base64.Encode(Base16.Decode(Empty384Hash),False));
  195. end;
  196. procedure TTestSHA384.TestSmallBase64;
  197. begin
  198. TestBase64String('abc',Base64.Encode(@Test1out384,SizeOf(Test1Out384),False));
  199. end;
  200. procedure TTestSHA384.TestSmallHMAC;
  201. // Consts taken from HashlibTestBase
  202. Const
  203. Expected = '3D6DCED731DAF3599CC0971646C1A8B8CCC61650722F111A9EB26CE7B65189EB220EACB09152D9A09065099FE6C1FDC9';
  204. DefaultData = 'HashLib4Pascal';
  205. begin
  206. TestHMACString(DefaultData,'Hash' ,Expected);
  207. end;
  208. procedure TTestSHA384.TestHMACStream;
  209. Var
  210. S : TStringStream;
  211. res : String;
  212. begin
  213. BytesToHexStr(Res,@Test1Out384,SizeOf(Test1Out384));
  214. S:=TStringStream.Create('abc');
  215. try
  216. AssertEquals('Correct hash',Res,TSHA384.StreamHexa(S));
  217. finally
  218. S.Free;
  219. end;
  220. end;
  221. initialization
  222. RegisterTests([TTestSHA512,TTestSHA384]);
  223. end.