HlpHashFactory.pas 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212
  1. unit HlpHashFactory;
  2. {$I HashLib.inc}
  3. interface
  4. uses
  5. HlpHashRounds,
  6. HlpHashSize,
  7. HlpIHash,
  8. HlpIHashInfo,
  9. HlpHashLibTypes,
  10. // NullDigest Unit //
  11. HlpNullDigest,
  12. // Checksum Units //
  13. HlpAdler32,
  14. HlpCRC,
  15. HlpCRC16,
  16. HlpCRC32,
  17. HlpCRC64,
  18. // Hash32 Units //
  19. HlpAP,
  20. HlpBernstein,
  21. HlpBernstein1,
  22. HlpBKDR,
  23. HlpDEK,
  24. HlpDJB,
  25. HlpELF,
  26. HlpFNV,
  27. HlpFNV1a,
  28. HlpJenkins3,
  29. HlpJS,
  30. HlpMurmur2,
  31. HlpMurmurHash3_x86_32,
  32. HlpOneAtTime,
  33. HlpPJW,
  34. HlpRotating,
  35. HlpRS,
  36. HlpSDBM,
  37. HlpShiftAndXor,
  38. HlpSuperFast,
  39. HlpXXHash32,
  40. // Hash64 Units //
  41. HlpFNV64,
  42. HlpFNV1a64,
  43. HlpMurmur2_64,
  44. HlpSipHash,
  45. HlpXXHash64,
  46. // Hash128 Units //
  47. HlpMurmurHash3_x86_128,
  48. HlpMurmurHash3_x64_128,
  49. // Crypto Units
  50. HlpTiger,
  51. HlpTiger2,
  52. HlpMD2,
  53. HlpMD4,
  54. HlpMD5,
  55. HlpSHA0,
  56. HlpSHA1,
  57. HlpSHA2_224,
  58. HlpSHA2_256,
  59. HlpSHA2_384,
  60. HlpSHA2_512,
  61. HlpSHA2_512_224,
  62. HlpSHA2_512_256,
  63. HlpGrindahl256,
  64. HlpGrindahl512,
  65. HlpPanama,
  66. HlpWhirlPool,
  67. HlpRadioGatun32,
  68. HlpRadioGatun64,
  69. HlpSnefru,
  70. HlpHaval,
  71. HlpGost,
  72. HlpGOST3411_2012,
  73. HlpHAS160,
  74. HlpRIPEMD,
  75. HlpRIPEMD128,
  76. HlpRIPEMD160,
  77. HlpRIPEMD256,
  78. HlpRIPEMD320,
  79. HlpSHA3,
  80. HlpBlake2B,
  81. HlpIBlake2BConfig,
  82. HlpBlake2BConfig,
  83. HlpBlake2S,
  84. HlpBlake2SConfig,
  85. HlpIBlake2SConfig,
  86. // HMAC Unit
  87. HlpHMACNotBuildInAdapter,
  88. // PBKDF2_HMAC Unit
  89. HlpPBKDF2_HMACNotBuildInAdapter;
  90. type
  91. THashFactory = class sealed(TObject)
  92. // ====================== TNullDigestFactory ====================== //
  93. type
  94. TNullDigestFactory = class sealed(TObject)
  95. public
  96. class function CreateNullDigest(): IHash; static;
  97. end;
  98. // ====================== TChecksum ====================== //
  99. type
  100. TChecksum = class sealed(TObject)
  101. public
  102. class function CreateCRC(_Width: Int32; _poly, _Init: UInt64;
  103. _refIn, _refOut: Boolean; _XorOut, _check: UInt64;
  104. const _Names: THashLibStringArray): IHash; overload; static;
  105. class function CreateCRC(_value: TCRCStandard): IHash; overload; static;
  106. class function CreateCRC16(_poly, _Init: UInt64; _refIn, _refOut: Boolean;
  107. _XorOut, _check: UInt64; const _Names: THashLibStringArray)
  108. : IHash; static;
  109. class function CreateCRC32(_poly, _Init: UInt64; _refIn, _refOut: Boolean;
  110. _XorOut, _check: UInt64; const _Names: THashLibStringArray)
  111. : IHash; static;
  112. class function CreateCRC64(_poly, _Init: UInt64; _refIn, _refOut: Boolean;
  113. _XorOut, _check: UInt64; const _Names: THashLibStringArray)
  114. : IHash; static;
  115. /// <summary>
  116. /// BUYPASS, polynomial = $8005
  117. /// </summary>
  118. /// <returns></returns>
  119. class function CreateCRC16_BUYPASS(): IHash; static;
  120. /// <summary>
  121. /// PKZIP, polynomial = $04C11DB7
  122. /// </summary>
  123. /// <returns></returns>
  124. class function CreateCRC32_PKZIP(): IHash; static;
  125. /// <summary>
  126. /// Castagnoli, polynomial = $1EDC6F41
  127. /// </summary>
  128. /// <returns></returns>
  129. class function CreateCRC32_CASTAGNOLI(): IHash; static;
  130. /// <summary>
  131. /// ECMA-182, polynomial = $42F0E1EBA9EA3693
  132. /// </summary>
  133. /// <returns></returns>
  134. class function CreateCRC64_ECMA(): IHash; static;
  135. class function CreateAdler32: IHash; static;
  136. end;
  137. // ====================== THash32 ====================== //
  138. type
  139. THash32 = class sealed(TObject)
  140. public
  141. class function CreateAP(): IHash; static;
  142. class function CreateBernstein(): IHash; static;
  143. class function CreateBernstein1(): IHash; static;
  144. class function CreateBKDR(): IHash; static;
  145. class function CreateDEK(): IHash; static;
  146. class function CreateDJB(): IHash; static;
  147. class function CreateELF(): IHash; static;
  148. class function CreateFNV(): IHash; static;
  149. class function CreateFNV1a(): IHash; static;
  150. class function CreateJenkins3(): IHash; static;
  151. class function CreateJS(): IHash; static;
  152. class function CreateMurmur2(): IHashWithKey; static;
  153. class function CreateMurmurHash3_x86_32(): IHashWithKey; static;
  154. class function CreateOneAtTime(): IHash; static;
  155. class function CreatePJW(): IHash; static;
  156. class function CreateRotating(): IHash; static;
  157. class function CreateRS(): IHash; static;
  158. class function CreateSDBM(): IHash; static;
  159. class function CreateShiftAndXor(): IHash; static;
  160. class function CreateSuperFast(): IHash; static;
  161. class function CreateXXHash32(): IHashWithKey; static;
  162. end;
  163. // ====================== THash64 ====================== //
  164. type
  165. THash64 = class sealed(TObject)
  166. public
  167. class function CreateFNV(): IHash; static;
  168. class function CreateFNV1a(): IHash; static;
  169. class function CreateMurmur2(): IHashWithKey; static;
  170. class function CreateSipHash2_4(): IHashWithKey; static;
  171. class function CreateXXHash64(): IHashWithKey; static;
  172. end;
  173. // ====================== THash128 ====================== //
  174. type
  175. THash128 = class sealed(TObject)
  176. public
  177. class function CreateMurmurHash3_x86_128(): IHashWithKey; static;
  178. class function CreateMurmurHash3_x64_128(): IHashWithKey; static;
  179. end;
  180. // ====================== TCrypto ====================== //
  181. type
  182. TCrypto = class sealed(TObject)
  183. public
  184. /// <summary>
  185. ///
  186. /// </summary>
  187. /// <param name="a_hash_size">16, 20 or 24 bytes. </param>
  188. /// <param name="a_rounds">no of rounds (standard rounds are 3, 4 and 5)</param>
  189. /// <returns></returns>
  190. class function CreateTiger(a_hash_size: Int32; a_rounds: THashRounds)
  191. : IHash; static;
  192. class function CreateTiger_3_128(): IHash; static;
  193. class function CreateTiger_3_160(): IHash; static;
  194. class function CreateTiger_3_192(): IHash; static;
  195. class function CreateTiger_4_128(): IHash; static;
  196. class function CreateTiger_4_160(): IHash; static;
  197. class function CreateTiger_4_192(): IHash; static;
  198. class function CreateTiger_5_128(): IHash; static;
  199. class function CreateTiger_5_160(): IHash; static;
  200. class function CreateTiger_5_192(): IHash; static;
  201. /// <summary>
  202. ///
  203. /// </summary>
  204. /// <param name="a_hash_size">16, 20 or 24 bytes. </param>
  205. /// <param name="a_rounds">no of rounds (standard rounds are 3, 4 and 5)</param>
  206. /// <returns></returns>
  207. class function CreateTiger2(a_hash_size: Int32; a_rounds: THashRounds)
  208. : IHash; static;
  209. class function CreateTiger2_3_128(): IHash; static;
  210. class function CreateTiger2_3_160(): IHash; static;
  211. class function CreateTiger2_3_192(): IHash; static;
  212. class function CreateTiger2_4_128(): IHash; static;
  213. class function CreateTiger2_4_160(): IHash; static;
  214. class function CreateTiger2_4_192(): IHash; static;
  215. class function CreateTiger2_5_128(): IHash; static;
  216. class function CreateTiger2_5_160(): IHash; static;
  217. class function CreateTiger2_5_192(): IHash; static;
  218. class function CreateMD2(): IHash; static;
  219. class function CreateMD4(): IHash; static;
  220. class function CreateMD5(): IHash; static;
  221. class function CreateSHA0(): IHash; static;
  222. class function CreateSHA1(): IHash; static;
  223. class function CreateSHA2_224(): IHash; static;
  224. class function CreateSHA2_256(): IHash; static;
  225. class function CreateSHA2_384(): IHash; static;
  226. class function CreateSHA2_512(): IHash; static;
  227. class function CreateSHA2_512_224(): IHash; static;
  228. class function CreateSHA2_512_256(): IHash; static;
  229. class function CreateGrindahl256(): IHash; static;
  230. class function CreateGrindahl512(): IHash; static;
  231. class function CreatePanama(): IHash; static;
  232. class function CreateWhirlPool(): IHash; static;
  233. class function CreateRadioGatun32(): IHash; static;
  234. class function CreateRadioGatun64(): IHash; static;
  235. /// <summary>
  236. ///
  237. /// </summary>
  238. /// <param name="a_security_level">any Integer value greater than 0. Standard is 8. </param>
  239. /// <param name="a_hash_size">128bit, 256bit</param>
  240. /// <returns></returns>
  241. class function CreateSnefru(a_security_level: Int32;
  242. a_hash_size: THashSize): IHash; static;
  243. class function CreateSnefru_8_128(): IHash; static;
  244. class function CreateSnefru_8_256(): IHash; static;
  245. /// <summary>
  246. ///
  247. /// </summary>
  248. /// <param name="a_rounds">3, 4, 5</param>
  249. /// <param name="a_hash_size">128, 160, 192, 224, 256</param>
  250. /// <returns></returns>
  251. class function CreateHaval(a_rounds: THashRounds; a_hash_size: THashSize)
  252. : IHash; static;
  253. class function CreateHaval_3_128(): IHash; static;
  254. class function CreateHaval_4_128(): IHash; static;
  255. class function CreateHaval_5_128(): IHash; static;
  256. class function CreateHaval_3_160(): IHash; static;
  257. class function CreateHaval_4_160(): IHash; static;
  258. class function CreateHaval_5_160(): IHash; static;
  259. class function CreateHaval_3_192(): IHash; static;
  260. class function CreateHaval_4_192(): IHash; static;
  261. class function CreateHaval_5_192(): IHash; static;
  262. class function CreateHaval_3_224(): IHash; static;
  263. class function CreateHaval_4_224(): IHash; static;
  264. class function CreateHaval_5_224(): IHash; static;
  265. class function CreateHaval_3_256(): IHash; static;
  266. class function CreateHaval_4_256(): IHash; static;
  267. class function CreateHaval_5_256(): IHash; static;
  268. class function CreateGost(): IHash; static;
  269. // Streebog 256
  270. class function CreateGOST3411_2012_256(): IHash; static;
  271. // Streebog 512
  272. class function CreateGOST3411_2012_512(): IHash; static;
  273. class function CreateHAS160(): IHash; static;
  274. class function CreateRIPEMD(): IHash; static;
  275. class function CreateRIPEMD128(): IHash; static;
  276. class function CreateRIPEMD160(): IHash; static;
  277. class function CreateRIPEMD256(): IHash; static;
  278. class function CreateRIPEMD320(): IHash; static;
  279. class function CreateSHA3_224(): IHash; static;
  280. class function CreateSHA3_256(): IHash; static;
  281. class function CreateSHA3_384(): IHash; static;
  282. class function CreateSHA3_512(): IHash; static;
  283. class function CreateKeccak_224(): IHash; static;
  284. class function CreateKeccak_256(): IHash; static;
  285. class function CreateKeccak_384(): IHash; static;
  286. class function CreateKeccak_512(): IHash; static;
  287. class function CreateShake_128(a_xof_size_in_bits: Int32): IHash; static;
  288. class function CreateShake_256(a_xof_size_in_bits: Int32): IHash; static;
  289. class function CreateBlake2B(const config: IBlake2BConfig = Nil)
  290. : IHash; static;
  291. class function CreateBlake2B_160(): IHash; static;
  292. class function CreateBlake2B_256(): IHash; static;
  293. class function CreateBlake2B_384(): IHash; static;
  294. class function CreateBlake2B_512(): IHash; static;
  295. class function CreateBlake2S(const config: IBlake2SConfig = Nil)
  296. : IHash; static;
  297. class function CreateBlake2S_128(): IHash; static;
  298. class function CreateBlake2S_160(): IHash; static;
  299. class function CreateBlake2S_224(): IHash; static;
  300. class function CreateBlake2S_256(): IHash; static;
  301. end;
  302. // ====================== THMAC ====================== //
  303. type
  304. THMAC = class sealed(TObject)
  305. public
  306. class function CreateHMAC(const a_hash: IHash;
  307. const a_hmacKey: THashLibByteArray = Nil): IHMAC; static;
  308. end;
  309. end;
  310. type
  311. TKDF = class sealed(TObject)
  312. // ====================== TPBKDF2_HMAC ====================== //
  313. type
  314. TPBKDF2_HMAC = class sealed(TObject)
  315. public
  316. /// <summary>
  317. /// Initializes a new interface instance of the TPBKDF2_HMAC class using a password, a salt, a number of iterations and an Instance of an "IHash" to be used as an "IHMAC" hashing implementation to derive the key.
  318. /// </summary>
  319. /// <param name="a_hash">The name of the "IHash" implementation to be transformed to an "IHMAC" Instance so it can be used to derive the key.</param>
  320. /// <param name="password">The password to derive the key for.</param>
  321. /// <param name="salt">The salt to use to derive the key.</param>
  322. /// <param name="iterations">The number of iterations to use to derive the key.</param>
  323. /// <exception cref="EArgumentNilHashLibException">The password, salt or algorithm is Nil.</exception>
  324. /// <exception cref="EArgumentHashLibException">The iteration is less than 1.</exception>
  325. class function CreatePBKDF2_HMAC(const a_hash: IHash;
  326. const a_password, a_salt: THashLibByteArray; a_iterations: UInt32)
  327. : IPBKDF2_HMAC; static;
  328. end;
  329. end;
  330. implementation
  331. { THashFactory.TNullDigestFactory }
  332. class function THashFactory.TNullDigestFactory.CreateNullDigest: IHash;
  333. begin
  334. Result := TNullDigest.Create();
  335. end;
  336. { THashFactory.TChecksum }
  337. class function THashFactory.TChecksum.CreateCRC(_Width: Int32;
  338. _poly, _Init: UInt64; _refIn, _refOut: Boolean; _XorOut, _check: UInt64;
  339. const _Names: THashLibStringArray): IHash;
  340. begin
  341. Result := TCRC.Create(_Width, _poly, _Init, _refIn, _refOut, _XorOut,
  342. _check, _Names);
  343. end;
  344. class function THashFactory.TChecksum.CreateCRC(_value: TCRCStandard): IHash;
  345. begin
  346. Result := TCRC.CreateCRCObject(_value);
  347. end;
  348. class function THashFactory.TChecksum.CreateCRC16(_poly, _Init: UInt64;
  349. _refIn, _refOut: Boolean; _XorOut, _check: UInt64;
  350. const _Names: THashLibStringArray): IHash;
  351. begin
  352. Result := TCRC16.Create(_poly, _Init, _refIn, _refOut, _XorOut,
  353. _check, _Names);
  354. end;
  355. class function THashFactory.TChecksum.CreateCRC16_BUYPASS: IHash;
  356. begin
  357. Result := TCRC16_BUYPASS.Create();
  358. end;
  359. class function THashFactory.TChecksum.CreateCRC32(_poly, _Init: UInt64;
  360. _refIn, _refOut: Boolean; _XorOut, _check: UInt64;
  361. const _Names: THashLibStringArray): IHash;
  362. begin
  363. Result := TCRC32.Create(_poly, _Init, _refIn, _refOut, _XorOut,
  364. _check, _Names);
  365. end;
  366. class function THashFactory.TChecksum.CreateCRC32_CASTAGNOLI: IHash;
  367. begin
  368. Result := TCRC32_CASTAGNOLI.Create();
  369. end;
  370. class function THashFactory.TChecksum.CreateCRC32_PKZIP: IHash;
  371. begin
  372. Result := TCRC32_PKZIP.Create();
  373. end;
  374. class function THashFactory.TChecksum.CreateCRC64(_poly, _Init: UInt64;
  375. _refIn, _refOut: Boolean; _XorOut, _check: UInt64;
  376. const _Names: THashLibStringArray): IHash;
  377. begin
  378. Result := TCRC64.Create(_poly, _Init, _refIn, _refOut, _XorOut,
  379. _check, _Names);
  380. end;
  381. class function THashFactory.TChecksum.CreateCRC64_ECMA: IHash;
  382. begin
  383. Result := TCRC64_ECMA.Create();
  384. end;
  385. class function THashFactory.TChecksum.CreateAdler32: IHash;
  386. begin
  387. Result := TAdler32.Create();
  388. end;
  389. { THashFactory.THash32 }
  390. class function THashFactory.THash32.CreateAP: IHash;
  391. begin
  392. Result := TAP.Create();
  393. end;
  394. class function THashFactory.THash32.CreateBernstein: IHash;
  395. begin
  396. Result := TBernstein.Create();
  397. end;
  398. class function THashFactory.THash32.CreateBernstein1: IHash;
  399. begin
  400. Result := TBernstein1.Create();
  401. end;
  402. class function THashFactory.THash32.CreateBKDR: IHash;
  403. begin
  404. Result := TBKDR.Create();
  405. end;
  406. class function THashFactory.THash32.CreateDEK: IHash;
  407. begin
  408. Result := TDEK.Create();
  409. end;
  410. class function THashFactory.THash32.CreateDJB: IHash;
  411. begin
  412. Result := TDJB.Create();
  413. end;
  414. class function THashFactory.THash32.CreateELF: IHash;
  415. begin
  416. Result := TELF.Create();
  417. end;
  418. class function THashFactory.THash32.CreateFNV: IHash;
  419. begin
  420. Result := TFNV.Create();
  421. end;
  422. class function THashFactory.THash32.CreateFNV1a: IHash;
  423. begin
  424. Result := TFNV1a.Create();
  425. end;
  426. class function THashFactory.THash32.CreateJenkins3: IHash;
  427. begin
  428. Result := TJenkins3.Create();
  429. end;
  430. class function THashFactory.THash32.CreateJS: IHash;
  431. begin
  432. Result := TJS.Create();
  433. end;
  434. class function THashFactory.THash32.CreateMurmur2: IHashWithKey;
  435. begin
  436. Result := TMurmur2.Create();
  437. end;
  438. class function THashFactory.THash32.CreateMurmurHash3_x86_32: IHashWithKey;
  439. begin
  440. Result := TMurmurHash3_x86_32.Create();
  441. end;
  442. class function THashFactory.THash32.CreateOneAtTime: IHash;
  443. begin
  444. Result := TOneAtTime.Create();
  445. end;
  446. class function THashFactory.THash32.CreatePJW: IHash;
  447. begin
  448. Result := TPJW.Create();
  449. end;
  450. class function THashFactory.THash32.CreateRotating: IHash;
  451. begin
  452. Result := TRotating.Create();
  453. end;
  454. class function THashFactory.THash32.CreateRS: IHash;
  455. begin
  456. Result := TRS.Create();
  457. end;
  458. class function THashFactory.THash32.CreateSDBM: IHash;
  459. begin
  460. Result := TSDBM.Create();
  461. end;
  462. class function THashFactory.THash32.CreateShiftAndXor: IHash;
  463. begin
  464. Result := TShiftAndXor.Create();
  465. end;
  466. class function THashFactory.THash32.CreateSuperFast: IHash;
  467. begin
  468. Result := TSuperFast.Create();
  469. end;
  470. class function THashFactory.THash32.CreateXXHash32: IHashWithKey;
  471. begin
  472. Result := TXXHash32.Create();
  473. end;
  474. { THashFactory.THash64 }
  475. class function THashFactory.THash64.CreateFNV: IHash;
  476. begin
  477. Result := TFNV64.Create();
  478. end;
  479. class function THashFactory.THash64.CreateFNV1a: IHash;
  480. begin
  481. Result := TFNV1a64.Create();
  482. end;
  483. class function THashFactory.THash64.CreateMurmur2: IHashWithKey;
  484. begin
  485. Result := TMurmur2_64.Create();
  486. end;
  487. class function THashFactory.THash64.CreateSipHash2_4: IHashWithKey;
  488. begin
  489. Result := TSipHash2_4.Create();
  490. end;
  491. class function THashFactory.THash64.CreateXXHash64: IHashWithKey;
  492. begin
  493. Result := TXXHash64.Create();
  494. end;
  495. { THashFactory.THash128 }
  496. class function THashFactory.THash128.CreateMurmurHash3_x86_128: IHashWithKey;
  497. begin
  498. Result := TMurmurHash3_x86_128.Create();
  499. end;
  500. class function THashFactory.THash128.CreateMurmurHash3_x64_128: IHashWithKey;
  501. begin
  502. Result := TMurmurHash3_x64_128.Create();
  503. end;
  504. { THashFactory.TCrypto }
  505. class function THashFactory.TCrypto.CreateGost: IHash;
  506. begin
  507. Result := TGost.Create();
  508. end;
  509. class function THashFactory.TCrypto.CreateGOST3411_2012_256: IHash;
  510. begin
  511. Result := TGOST3411_2012_256.Create();
  512. end;
  513. class function THashFactory.TCrypto.CreateGOST3411_2012_512: IHash;
  514. begin
  515. Result := TGOST3411_2012_512.Create();
  516. end;
  517. class function THashFactory.TCrypto.CreateGrindahl256: IHash;
  518. begin
  519. Result := TGrindahl256.Create();
  520. end;
  521. class function THashFactory.TCrypto.CreateGrindahl512: IHash;
  522. begin
  523. Result := TGrindahl512.Create();
  524. end;
  525. class function THashFactory.TCrypto.CreateHAS160: IHash;
  526. begin
  527. Result := THAS160.Create();
  528. end;
  529. class function THashFactory.TCrypto.CreateHaval(a_rounds: THashRounds;
  530. a_hash_size: THashSize): IHash;
  531. begin
  532. case a_rounds of
  533. THashRounds.hrRounds3:
  534. case a_hash_size of
  535. THashSize.hsHashSize128:
  536. Result := CreateHaval_3_128();
  537. THashSize.hsHashSize160:
  538. Result := CreateHaval_3_160();
  539. THashSize.hsHashSize192:
  540. Result := CreateHaval_3_192();
  541. THashSize.hsHashSize224:
  542. Result := CreateHaval_3_224();
  543. THashSize.hsHashSize256:
  544. Result := CreateHaval_3_256();
  545. else
  546. raise EArgumentHashLibException.CreateRes(@SInvalidHavalHashSize);
  547. end;
  548. THashRounds.hrRounds4:
  549. case a_hash_size of
  550. THashSize.hsHashSize128:
  551. Result := CreateHaval_4_128();
  552. THashSize.hsHashSize160:
  553. Result := CreateHaval_4_160();
  554. THashSize.hsHashSize192:
  555. Result := CreateHaval_4_192();
  556. THashSize.hsHashSize224:
  557. Result := CreateHaval_4_224();
  558. THashSize.hsHashSize256:
  559. Result := CreateHaval_4_256();
  560. else
  561. raise EArgumentHashLibException.CreateRes(@SInvalidHavalHashSize);
  562. end;
  563. THashRounds.hrRounds5:
  564. case a_hash_size of
  565. THashSize.hsHashSize128:
  566. Result := CreateHaval_5_128();
  567. THashSize.hsHashSize160:
  568. Result := CreateHaval_5_160();
  569. THashSize.hsHashSize192:
  570. Result := CreateHaval_5_192();
  571. THashSize.hsHashSize224:
  572. Result := CreateHaval_5_224();
  573. THashSize.hsHashSize256:
  574. Result := CreateHaval_5_256();
  575. else
  576. raise EArgumentHashLibException.CreateRes(@SInvalidHavalHashSize);
  577. end;
  578. else
  579. raise EArgumentHashLibException.CreateRes(@SInvalidHavalRound);
  580. end;
  581. end;
  582. class function THashFactory.TCrypto.CreateHaval_3_128: IHash;
  583. begin
  584. Result := THaval_3_128.Create();
  585. end;
  586. class function THashFactory.TCrypto.CreateHaval_3_160: IHash;
  587. begin
  588. Result := THaval_3_160.Create();
  589. end;
  590. class function THashFactory.TCrypto.CreateHaval_3_192: IHash;
  591. begin
  592. Result := THaval_3_192.Create();
  593. end;
  594. class function THashFactory.TCrypto.CreateHaval_3_224: IHash;
  595. begin
  596. Result := THaval_3_224.Create();
  597. end;
  598. class function THashFactory.TCrypto.CreateHaval_3_256: IHash;
  599. begin
  600. Result := THaval_3_256.Create();
  601. end;
  602. class function THashFactory.TCrypto.CreateHaval_4_128: IHash;
  603. begin
  604. Result := THaval_4_128.Create();
  605. end;
  606. class function THashFactory.TCrypto.CreateHaval_4_160: IHash;
  607. begin
  608. Result := THaval_4_160.Create();
  609. end;
  610. class function THashFactory.TCrypto.CreateHaval_4_192: IHash;
  611. begin
  612. Result := THaval_4_192.Create();
  613. end;
  614. class function THashFactory.TCrypto.CreateHaval_4_224: IHash;
  615. begin
  616. Result := THaval_4_224.Create();
  617. end;
  618. class function THashFactory.TCrypto.CreateHaval_4_256: IHash;
  619. begin
  620. Result := THaval_4_256.Create();
  621. end;
  622. class function THashFactory.TCrypto.CreateHaval_5_128: IHash;
  623. begin
  624. Result := THaval_5_128.Create();
  625. end;
  626. class function THashFactory.TCrypto.CreateHaval_5_160: IHash;
  627. begin
  628. Result := THaval_5_160.Create();
  629. end;
  630. class function THashFactory.TCrypto.CreateHaval_5_192: IHash;
  631. begin
  632. Result := THaval_5_192.Create();
  633. end;
  634. class function THashFactory.TCrypto.CreateHaval_5_224: IHash;
  635. begin
  636. Result := THaval_5_224.Create();
  637. end;
  638. class function THashFactory.TCrypto.CreateHaval_5_256: IHash;
  639. begin
  640. Result := THaval_5_256.Create();
  641. end;
  642. class function THashFactory.TCrypto.CreateMD2: IHash;
  643. begin
  644. Result := TMD2.Create();
  645. end;
  646. class function THashFactory.TCrypto.CreateMD4: IHash;
  647. begin
  648. Result := TMD4.Create();
  649. end;
  650. class function THashFactory.TCrypto.CreateMD5: IHash;
  651. begin
  652. Result := TMD5.Create();
  653. end;
  654. class function THashFactory.TCrypto.CreatePanama: IHash;
  655. begin
  656. Result := TPanama.Create();
  657. end;
  658. class function THashFactory.TCrypto.CreateRadioGatun32: IHash;
  659. begin
  660. Result := TRadioGatun32.Create();
  661. end;
  662. class function THashFactory.TCrypto.CreateRadioGatun64: IHash;
  663. begin
  664. Result := TRadioGatun64.Create();
  665. end;
  666. class function THashFactory.TCrypto.CreateRIPEMD: IHash;
  667. begin
  668. Result := TRIPEMD.Create();
  669. end;
  670. class function THashFactory.TCrypto.CreateRIPEMD128: IHash;
  671. begin
  672. Result := TRIPEMD128.Create();
  673. end;
  674. class function THashFactory.TCrypto.CreateRIPEMD160: IHash;
  675. begin
  676. Result := TRIPEMD160.Create();
  677. end;
  678. class function THashFactory.TCrypto.CreateRIPEMD256: IHash;
  679. begin
  680. Result := TRIPEMD256.Create();
  681. end;
  682. class function THashFactory.TCrypto.CreateRIPEMD320: IHash;
  683. begin
  684. Result := TRIPEMD320.Create();
  685. end;
  686. class function THashFactory.TCrypto.CreateSHA0: IHash;
  687. begin
  688. Result := TSHA0.Create();
  689. end;
  690. class function THashFactory.TCrypto.CreateSHA1: IHash;
  691. begin
  692. Result := TSHA1.Create();
  693. end;
  694. class function THashFactory.TCrypto.CreateSHA2_224: IHash;
  695. begin
  696. Result := TSHA2_224.Create();
  697. end;
  698. class function THashFactory.TCrypto.CreateSHA2_256: IHash;
  699. begin
  700. Result := TSHA2_256.Create();
  701. end;
  702. class function THashFactory.TCrypto.CreateSHA2_384: IHash;
  703. begin
  704. Result := TSHA2_384.Create();
  705. end;
  706. class function THashFactory.TCrypto.CreateSHA2_512: IHash;
  707. begin
  708. Result := TSHA2_512.Create();
  709. end;
  710. class function THashFactory.TCrypto.CreateSHA2_512_224: IHash;
  711. begin
  712. Result := TSHA2_512_224.Create();
  713. end;
  714. class function THashFactory.TCrypto.CreateSHA2_512_256: IHash;
  715. begin
  716. Result := TSHA2_512_256.Create();
  717. end;
  718. class function THashFactory.TCrypto.CreateSHA3_224: IHash;
  719. begin
  720. Result := TSHA3_224.Create();
  721. end;
  722. class function THashFactory.TCrypto.CreateSHA3_256: IHash;
  723. begin
  724. Result := TSHA3_256.Create();
  725. end;
  726. class function THashFactory.TCrypto.CreateSHA3_384: IHash;
  727. begin
  728. Result := TSHA3_384.Create();
  729. end;
  730. class function THashFactory.TCrypto.CreateSHA3_512: IHash;
  731. begin
  732. Result := TSHA3_512.Create();
  733. end;
  734. class function THashFactory.TCrypto.CreateShake_128
  735. (a_xof_size_in_bits: Int32): IHash;
  736. begin
  737. Result := (TShake_128.Create() as IXOF).SetXOFOutputSize(a_xof_size_in_bits);
  738. end;
  739. class function THashFactory.TCrypto.CreateShake_256
  740. (a_xof_size_in_bits: Int32): IHash;
  741. begin
  742. Result := (TShake_256.Create() as IXOF).SetXOFOutputSize(a_xof_size_in_bits);
  743. end;
  744. class function THashFactory.TCrypto.CreateKeccak_224: IHash;
  745. begin
  746. Result := TKeccak_224.Create();
  747. end;
  748. class function THashFactory.TCrypto.CreateKeccak_256: IHash;
  749. begin
  750. Result := TKeccak_256.Create();
  751. end;
  752. class function THashFactory.TCrypto.CreateKeccak_384: IHash;
  753. begin
  754. Result := TKeccak_384.Create();
  755. end;
  756. class function THashFactory.TCrypto.CreateKeccak_512: IHash;
  757. begin
  758. Result := TKeccak_512.Create();
  759. end;
  760. class function THashFactory.TCrypto.CreateBlake2B(const config
  761. : IBlake2BConfig): IHash;
  762. begin
  763. if config = Nil then
  764. begin
  765. Result := TBlake2B.Create()
  766. end
  767. else
  768. begin
  769. Result := TBlake2B.Create(config);
  770. end;
  771. end;
  772. class function THashFactory.TCrypto.CreateBlake2B_160: IHash;
  773. begin
  774. Result := THashFactory.TCrypto.CreateBlake2B
  775. (TBlake2BConfig.Create(THashSize.hsHashSize160));
  776. end;
  777. class function THashFactory.TCrypto.CreateBlake2B_256: IHash;
  778. begin
  779. Result := THashFactory.TCrypto.CreateBlake2B
  780. (TBlake2BConfig.Create(THashSize.hsHashSize256));
  781. end;
  782. class function THashFactory.TCrypto.CreateBlake2B_384: IHash;
  783. begin
  784. Result := THashFactory.TCrypto.CreateBlake2B
  785. (TBlake2BConfig.Create(THashSize.hsHashSize384));
  786. end;
  787. class function THashFactory.TCrypto.CreateBlake2B_512: IHash;
  788. begin
  789. Result := THashFactory.TCrypto.CreateBlake2B
  790. (TBlake2BConfig.Create(THashSize.hsHashSize512));
  791. end;
  792. class function THashFactory.TCrypto.CreateBlake2S(const config
  793. : IBlake2SConfig): IHash;
  794. begin
  795. if config = Nil then
  796. begin
  797. Result := TBlake2S.Create()
  798. end
  799. else
  800. begin
  801. Result := TBlake2S.Create(config);
  802. end;
  803. end;
  804. class function THashFactory.TCrypto.CreateBlake2S_128: IHash;
  805. begin
  806. Result := THashFactory.TCrypto.CreateBlake2S
  807. (TBlake2SConfig.Create(THashSize.hsHashSize128));
  808. end;
  809. class function THashFactory.TCrypto.CreateBlake2S_160: IHash;
  810. begin
  811. Result := THashFactory.TCrypto.CreateBlake2S
  812. (TBlake2SConfig.Create(THashSize.hsHashSize160));
  813. end;
  814. class function THashFactory.TCrypto.CreateBlake2S_224: IHash;
  815. begin
  816. Result := THashFactory.TCrypto.CreateBlake2S
  817. (TBlake2SConfig.Create(THashSize.hsHashSize224));
  818. end;
  819. class function THashFactory.TCrypto.CreateBlake2S_256: IHash;
  820. begin
  821. Result := THashFactory.TCrypto.CreateBlake2S
  822. (TBlake2SConfig.Create(THashSize.hsHashSize256));
  823. end;
  824. class function THashFactory.TCrypto.CreateSnefru(a_security_level: Int32;
  825. a_hash_size: THashSize): IHash;
  826. begin
  827. if a_security_level < Int32(1) then
  828. raise EArgumentHashLibException.CreateRes(@SInvalidSnefruLevel);
  829. if ((a_hash_size = THashSize.hsHashSize128) or
  830. (a_hash_size = THashSize.hsHashSize256)) then
  831. begin
  832. Result := TSnefru.Create(a_security_level, a_hash_size);
  833. end
  834. else
  835. begin
  836. raise EArgumentHashLibException.CreateRes(@SInvalidSnefruHashSize);
  837. end
  838. end;
  839. class function THashFactory.TCrypto.CreateSnefru_8_128: IHash;
  840. begin
  841. Result := CreateSnefru(8, THashSize.hsHashSize128);
  842. end;
  843. class function THashFactory.TCrypto.CreateSnefru_8_256: IHash;
  844. begin
  845. Result := CreateSnefru(8, THashSize.hsHashSize256);
  846. end;
  847. class function THashFactory.TCrypto.CreateTiger_3_128: IHash;
  848. begin
  849. Result := TTiger_128.CreateRound3();
  850. end;
  851. class function THashFactory.TCrypto.CreateTiger_3_160: IHash;
  852. begin
  853. Result := TTiger_160.CreateRound3();
  854. end;
  855. class function THashFactory.TCrypto.CreateTiger_3_192: IHash;
  856. begin
  857. Result := TTiger_192.CreateRound3();
  858. end;
  859. class function THashFactory.TCrypto.CreateTiger_4_128: IHash;
  860. begin
  861. Result := TTiger_128.CreateRound4();
  862. end;
  863. class function THashFactory.TCrypto.CreateTiger_4_160: IHash;
  864. begin
  865. Result := TTiger_160.CreateRound4();
  866. end;
  867. class function THashFactory.TCrypto.CreateTiger_4_192: IHash;
  868. begin
  869. Result := TTiger_192.CreateRound4();
  870. end;
  871. class function THashFactory.TCrypto.CreateTiger_5_128: IHash;
  872. begin
  873. Result := TTiger_128.CreateRound5();
  874. end;
  875. class function THashFactory.TCrypto.CreateTiger_5_160: IHash;
  876. begin
  877. Result := TTiger_160.CreateRound5();
  878. end;
  879. class function THashFactory.TCrypto.CreateTiger_5_192: IHash;
  880. begin
  881. Result := TTiger_192.CreateRound5();
  882. end;
  883. class function THashFactory.TCrypto.CreateWhirlPool: IHash;
  884. begin
  885. Result := TWhirlPool.Create();
  886. end;
  887. class function THashFactory.TCrypto.CreateTiger(a_hash_size: Int32;
  888. a_rounds: THashRounds): IHash;
  889. begin
  890. if ((a_hash_size <> 16) and (a_hash_size <> 20) and (a_hash_size <> 24)) then
  891. raise EArgumentHashLibException.CreateRes(@SInvalidTigerHashSize);
  892. Result := TTiger_Base.Create(a_hash_size, a_rounds);
  893. end;
  894. class function THashFactory.TCrypto.CreateTiger2(a_hash_size: Int32;
  895. a_rounds: THashRounds): IHash;
  896. begin
  897. if ((a_hash_size <> 16) and (a_hash_size <> 20) and (a_hash_size <> 24)) then
  898. raise EArgumentHashLibException.CreateRes(@SInvalidTiger2HashSize);
  899. Result := TTiger2_Base.Create(a_hash_size, a_rounds);
  900. end;
  901. class function THashFactory.TCrypto.CreateTiger2_3_128: IHash;
  902. begin
  903. Result := TTiger2_128.CreateRound3();
  904. end;
  905. class function THashFactory.TCrypto.CreateTiger2_3_160: IHash;
  906. begin
  907. Result := TTiger2_160.CreateRound3();
  908. end;
  909. class function THashFactory.TCrypto.CreateTiger2_3_192: IHash;
  910. begin
  911. Result := TTiger2_192.CreateRound3();
  912. end;
  913. class function THashFactory.TCrypto.CreateTiger2_4_128: IHash;
  914. begin
  915. Result := TTiger2_128.CreateRound4();
  916. end;
  917. class function THashFactory.TCrypto.CreateTiger2_4_160: IHash;
  918. begin
  919. Result := TTiger2_160.CreateRound4();
  920. end;
  921. class function THashFactory.TCrypto.CreateTiger2_4_192: IHash;
  922. begin
  923. Result := TTiger2_192.CreateRound4();
  924. end;
  925. class function THashFactory.TCrypto.CreateTiger2_5_128: IHash;
  926. begin
  927. Result := TTiger2_128.CreateRound5();
  928. end;
  929. class function THashFactory.TCrypto.CreateTiger2_5_160: IHash;
  930. begin
  931. Result := TTiger2_160.CreateRound5();
  932. end;
  933. class function THashFactory.TCrypto.CreateTiger2_5_192: IHash;
  934. begin
  935. Result := TTiger2_192.CreateRound5();
  936. end;
  937. { THashFactory.THMAC }
  938. class function THashFactory.THMAC.CreateHMAC(const a_hash: IHash;
  939. const a_hmacKey: THashLibByteArray): IHMAC;
  940. begin
  941. Result := THMACNotBuildInAdapter.CreateHMAC(a_hash, a_hmacKey);
  942. end;
  943. { TKDF.TPBKDF2_HMAC }
  944. class function TKDF.TPBKDF2_HMAC.CreatePBKDF2_HMAC(const a_hash: IHash;
  945. const a_password, a_salt: THashLibByteArray; a_iterations: UInt32)
  946. : IPBKDF2_HMAC;
  947. begin
  948. if not(System.Assigned(a_hash)) then
  949. raise EArgumentNilHashLibException.CreateRes(@SUninitializedInstance);
  950. if (a_password = Nil) then
  951. raise EArgumentNilHashLibException.CreateRes(@SEmptyPassword);
  952. if (a_salt = Nil) then
  953. raise EArgumentNilHashLibException.CreateRes(@SEmptySalt);
  954. if (a_iterations < 1) then
  955. raise EArgumentHashLibException.CreateRes(@SIterationtooSmall);
  956. Result := TPBKDF2_HMACNotBuildInAdapter.Create(a_hash, a_password, a_salt,
  957. a_iterations);
  958. end;
  959. end.