hash.c 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790
  1. /* hash.c
  2. *
  3. * Copyright (C) 2006-2022 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. #include <wolfssl/wolfcrypt/logging.h>
  26. #include <wolfssl/wolfcrypt/error-crypt.h>
  27. #ifndef NO_ASN
  28. #include <wolfssl/wolfcrypt/asn.h>
  29. #endif
  30. #include <wolfssl/wolfcrypt/hash.h>
  31. #include <wolfssl/wolfcrypt/hmac.h>
  32. #include <wolfssl/wolfcrypt/cryptocb.h>
  33. #ifdef NO_INLINE
  34. #include <wolfssl/wolfcrypt/misc.h>
  35. #else
  36. #define WOLFSSL_MISC_INCLUDED
  37. #include <wolfcrypt/src/misc.c>
  38. #endif
  39. #ifdef NO_ASN
  40. enum Hash_Sum {
  41. MD2h = 646,
  42. MD5h = 649,
  43. SHAh = 88,
  44. SHA224h = 417,
  45. SHA256h = 414,
  46. SHA384h = 415,
  47. SHA512h = 416,
  48. SHA512_224h = 418,
  49. SHA512_256h = 419,
  50. SHA3_224h = 420,
  51. SHA3_256h = 421,
  52. SHA3_384h = 422,
  53. SHA3_512h = 423,
  54. SHAKE128h = 424,
  55. SHAKE256h = 425
  56. };
  57. #endif /* !NO_ASN */
  58. #if !defined(NO_PWDBASED) || !defined(NO_ASN)
  59. /* function converts int hash type to enum */
  60. enum wc_HashType wc_HashTypeConvert(int hashType)
  61. {
  62. /* Default to hash type none as error */
  63. enum wc_HashType eHashType = WC_HASH_TYPE_NONE;
  64. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  65. /* original FIPSv1 and CAVP selftest require a mapping for unique hash
  66. type to wc_HashType */
  67. switch (hashType) {
  68. #ifndef NO_MD5
  69. case WC_MD5:
  70. eHashType = WC_HASH_TYPE_MD5;
  71. break;
  72. #endif /* !NO_MD5 */
  73. #ifndef NO_SHA
  74. case WC_SHA:
  75. eHashType = WC_HASH_TYPE_SHA;
  76. break;
  77. #endif /* !NO_SHA */
  78. #ifdef WOLFSSL_SHA224
  79. case WC_SHA224:
  80. eHashType = WC_HASH_TYPE_SHA224;
  81. break;
  82. #endif /* WOLFSSL_SHA224 */
  83. #ifndef NO_SHA256
  84. case WC_SHA256:
  85. eHashType = WC_HASH_TYPE_SHA256;
  86. break;
  87. #endif /* !NO_SHA256 */
  88. #ifdef WOLFSSL_SHA384
  89. case WC_SHA384:
  90. eHashType = WC_HASH_TYPE_SHA384;
  91. break;
  92. #endif /* WOLFSSL_SHA384 */
  93. #ifdef WOLFSSL_SHA512
  94. case WC_SHA512:
  95. eHashType = WC_HASH_TYPE_SHA512;
  96. break;
  97. #endif /* WOLFSSL_SHA512 */
  98. #ifdef WOLFSSL_SHA3
  99. case WC_SHA3_224:
  100. eHashType = WC_HASH_TYPE_SHA3_224;
  101. break;
  102. case WC_SHA3_256:
  103. eHashType = WC_HASH_TYPE_SHA3_256;
  104. break;
  105. case WC_SHA3_384:
  106. eHashType = WC_HASH_TYPE_SHA3_384;
  107. break;
  108. case WC_SHA3_512:
  109. eHashType = WC_HASH_TYPE_SHA3_512;
  110. break;
  111. #endif /* WOLFSSL_SHA3 */
  112. default:
  113. eHashType = WC_HASH_TYPE_NONE;
  114. break;
  115. }
  116. #else
  117. /* current master uses same unique types as wc_HashType */
  118. if (hashType > 0 && hashType <= WC_HASH_TYPE_MAX) {
  119. eHashType = (enum wc_HashType)hashType;
  120. }
  121. #endif
  122. return eHashType;
  123. }
  124. #endif /* !NO_PWDBASED || !NO_ASN */
  125. #if !defined(NO_ASN) || !defined(NO_DH) || defined(HAVE_ECC)
  126. int wc_HashGetOID(enum wc_HashType hash_type)
  127. {
  128. int oid = HASH_TYPE_E; /* Default to hash type error */
  129. switch(hash_type)
  130. {
  131. case WC_HASH_TYPE_MD2:
  132. #ifdef WOLFSSL_MD2
  133. oid = MD2h;
  134. #endif
  135. break;
  136. case WC_HASH_TYPE_MD5_SHA:
  137. case WC_HASH_TYPE_MD5:
  138. #ifndef NO_MD5
  139. oid = MD5h;
  140. #endif
  141. break;
  142. case WC_HASH_TYPE_SHA:
  143. #ifndef NO_SHA
  144. oid = SHAh;
  145. #endif
  146. break;
  147. case WC_HASH_TYPE_SHA224:
  148. #ifdef WOLFSSL_SHA224
  149. oid = SHA224h;
  150. #endif
  151. break;
  152. case WC_HASH_TYPE_SHA256:
  153. #ifndef NO_SHA256
  154. oid = SHA256h;
  155. #endif
  156. break;
  157. case WC_HASH_TYPE_SHA384:
  158. #ifdef WOLFSSL_SHA384
  159. oid = SHA384h;
  160. #endif
  161. break;
  162. case WC_HASH_TYPE_SHA512:
  163. #ifdef WOLFSSL_SHA512
  164. oid = SHA512h;
  165. #endif
  166. break;
  167. #ifndef WOLFSSL_NOSHA512_224
  168. case WC_HASH_TYPE_SHA512_224:
  169. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  170. oid = SHA512_224h;
  171. #endif
  172. break;
  173. #endif
  174. #ifndef WOLFSSL_NOSHA512_256
  175. case WC_HASH_TYPE_SHA512_256:
  176. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  177. oid = SHA512_256h;
  178. #endif
  179. break;
  180. #endif
  181. case WC_HASH_TYPE_SHA3_224:
  182. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  183. oid = SHA3_224h;
  184. #endif
  185. break;
  186. case WC_HASH_TYPE_SHA3_256:
  187. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  188. oid = SHA3_256h;
  189. #endif
  190. break;
  191. case WC_HASH_TYPE_SHA3_384:
  192. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  193. oid = SHA3_384h;
  194. #endif
  195. break;
  196. case WC_HASH_TYPE_SHA3_512:
  197. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  198. oid = SHA3_512h;
  199. #endif
  200. break;
  201. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  202. case WC_HASH_TYPE_SHAKE128:
  203. oid = SHAKE128h;
  204. break;
  205. #endif
  206. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  207. case WC_HASH_TYPE_SHAKE256:
  208. oid = SHAKE256h;
  209. break;
  210. #endif
  211. /* Not Supported */
  212. case WC_HASH_TYPE_MD4:
  213. case WC_HASH_TYPE_BLAKE2B:
  214. case WC_HASH_TYPE_BLAKE2S:
  215. case WC_HASH_TYPE_NONE:
  216. default:
  217. oid = BAD_FUNC_ARG;
  218. break;
  219. }
  220. return oid;
  221. }
  222. enum wc_HashType wc_OidGetHash(int oid)
  223. {
  224. enum wc_HashType hash_type = WC_HASH_TYPE_NONE;
  225. switch (oid)
  226. {
  227. #ifdef WOLFSSL_MD2
  228. case MD2h:
  229. hash_type = WC_HASH_TYPE_MD2;
  230. break;
  231. #endif
  232. case MD5h:
  233. #ifndef NO_MD5
  234. hash_type = WC_HASH_TYPE_MD5;
  235. #endif
  236. break;
  237. case SHAh:
  238. #ifndef NO_SHA
  239. hash_type = WC_HASH_TYPE_SHA;
  240. #endif
  241. break;
  242. case SHA224h:
  243. #ifdef WOLFSSL_SHA224
  244. hash_type = WC_HASH_TYPE_SHA224;
  245. #endif
  246. break;
  247. case SHA256h:
  248. #ifndef NO_SHA256
  249. hash_type = WC_HASH_TYPE_SHA256;
  250. #endif
  251. break;
  252. case SHA384h:
  253. #ifdef WOLFSSL_SHA384
  254. hash_type = WC_HASH_TYPE_SHA384;
  255. #endif
  256. break;
  257. case SHA512h:
  258. #ifdef WOLFSSL_SHA512
  259. hash_type = WC_HASH_TYPE_SHA512;
  260. #endif
  261. break;
  262. #ifdef WOLFSSL_SHA3
  263. case SHA3_224h:
  264. hash_type = WC_HASH_TYPE_SHA3_224;
  265. break;
  266. case SHA3_256h:
  267. hash_type = WC_HASH_TYPE_SHA3_256;
  268. break;
  269. case SHA3_384h:
  270. hash_type = WC_HASH_TYPE_SHA3_384;
  271. break;
  272. case SHA3_512h:
  273. hash_type = WC_HASH_TYPE_SHA3_512;
  274. break;
  275. #endif /* WOLFSSL_SHA3 */
  276. default:
  277. break;
  278. }
  279. return hash_type;
  280. }
  281. #endif /* !NO_ASN || !NO_DH || HAVE_ECC */
  282. #ifndef NO_HASH_WRAPPER
  283. /* Get Hash digest size */
  284. int wc_HashGetDigestSize(enum wc_HashType hash_type)
  285. {
  286. int dig_size = HASH_TYPE_E; /* Default to hash type error */
  287. switch(hash_type)
  288. {
  289. case WC_HASH_TYPE_MD2:
  290. #ifdef WOLFSSL_MD2
  291. dig_size = MD2_DIGEST_SIZE;
  292. #endif
  293. break;
  294. case WC_HASH_TYPE_MD4:
  295. #ifndef NO_MD4
  296. dig_size = MD4_DIGEST_SIZE;
  297. #endif
  298. break;
  299. case WC_HASH_TYPE_MD5:
  300. #ifndef NO_MD5
  301. dig_size = WC_MD5_DIGEST_SIZE;
  302. #endif
  303. break;
  304. case WC_HASH_TYPE_SHA:
  305. #ifndef NO_SHA
  306. dig_size = WC_SHA_DIGEST_SIZE;
  307. #endif
  308. break;
  309. case WC_HASH_TYPE_SHA224:
  310. #ifdef WOLFSSL_SHA224
  311. dig_size = WC_SHA224_DIGEST_SIZE;
  312. #endif
  313. break;
  314. case WC_HASH_TYPE_SHA256:
  315. #ifndef NO_SHA256
  316. dig_size = WC_SHA256_DIGEST_SIZE;
  317. #endif
  318. break;
  319. case WC_HASH_TYPE_SHA384:
  320. #ifdef WOLFSSL_SHA384
  321. dig_size = WC_SHA384_DIGEST_SIZE;
  322. #endif
  323. break;
  324. case WC_HASH_TYPE_SHA512:
  325. #ifdef WOLFSSL_SHA512
  326. dig_size = WC_SHA512_DIGEST_SIZE;
  327. #endif
  328. break;
  329. #ifndef WOLFSSL_NOSHA512_224
  330. case WC_HASH_TYPE_SHA512_224:
  331. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  332. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  333. dig_size = WC_SHA512_224_DIGEST_SIZE;
  334. #endif
  335. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  336. break;
  337. #endif
  338. #ifndef WOLFSSL_NOSHA512_256
  339. case WC_HASH_TYPE_SHA512_256:
  340. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  341. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  342. dig_size = WC_SHA512_256_DIGEST_SIZE;
  343. #endif
  344. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  345. break;
  346. #endif
  347. case WC_HASH_TYPE_MD5_SHA: /* Old TLS Specific */
  348. #if !defined(NO_MD5) && !defined(NO_SHA)
  349. dig_size = (int)WC_MD5_DIGEST_SIZE + (int)WC_SHA_DIGEST_SIZE;
  350. #endif
  351. break;
  352. case WC_HASH_TYPE_SHA3_224:
  353. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  354. dig_size = WC_SHA3_224_DIGEST_SIZE;
  355. #endif
  356. break;
  357. case WC_HASH_TYPE_SHA3_256:
  358. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  359. dig_size = WC_SHA3_256_DIGEST_SIZE;
  360. #endif
  361. break;
  362. case WC_HASH_TYPE_SHA3_384:
  363. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  364. dig_size = WC_SHA3_384_DIGEST_SIZE;
  365. #endif
  366. break;
  367. case WC_HASH_TYPE_SHA3_512:
  368. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  369. dig_size = WC_SHA3_512_DIGEST_SIZE;
  370. #endif
  371. break;
  372. case WC_HASH_TYPE_BLAKE2B:
  373. case WC_HASH_TYPE_BLAKE2S:
  374. #if defined(HAVE_BLAKE2) || defined(HAVE_BLAKE2S)
  375. dig_size = BLAKE2S_OUTBYTES;
  376. #endif
  377. break;
  378. /* Not Supported */
  379. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  380. case WC_HASH_TYPE_SHAKE128:
  381. #endif
  382. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  383. case WC_HASH_TYPE_SHAKE256:
  384. #endif
  385. case WC_HASH_TYPE_NONE:
  386. default:
  387. dig_size = BAD_FUNC_ARG;
  388. break;
  389. }
  390. return dig_size;
  391. }
  392. /* Get Hash block size */
  393. int wc_HashGetBlockSize(enum wc_HashType hash_type)
  394. {
  395. int block_size = HASH_TYPE_E; /* Default to hash type error */
  396. switch (hash_type)
  397. {
  398. case WC_HASH_TYPE_MD2:
  399. #ifdef WOLFSSL_MD2
  400. block_size = MD2_BLOCK_SIZE;
  401. #endif
  402. break;
  403. case WC_HASH_TYPE_MD4:
  404. #ifndef NO_MD4
  405. block_size = MD4_BLOCK_SIZE;
  406. #endif
  407. break;
  408. case WC_HASH_TYPE_MD5:
  409. #ifndef NO_MD5
  410. block_size = WC_MD5_BLOCK_SIZE;
  411. #endif
  412. break;
  413. case WC_HASH_TYPE_SHA:
  414. #ifndef NO_SHA
  415. block_size = WC_SHA_BLOCK_SIZE;
  416. #endif
  417. break;
  418. case WC_HASH_TYPE_SHA224:
  419. #ifdef WOLFSSL_SHA224
  420. block_size = WC_SHA224_BLOCK_SIZE;
  421. #endif
  422. break;
  423. case WC_HASH_TYPE_SHA256:
  424. #ifndef NO_SHA256
  425. block_size = WC_SHA256_BLOCK_SIZE;
  426. #endif
  427. break;
  428. case WC_HASH_TYPE_SHA384:
  429. #ifdef WOLFSSL_SHA384
  430. block_size = WC_SHA384_BLOCK_SIZE;
  431. #endif
  432. break;
  433. case WC_HASH_TYPE_SHA512:
  434. #ifdef WOLFSSL_SHA512
  435. block_size = WC_SHA512_BLOCK_SIZE;
  436. #endif
  437. break;
  438. #ifndef WOLFSSL_NOSHA512_224
  439. case WC_HASH_TYPE_SHA512_224:
  440. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  441. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  442. block_size = WC_SHA512_224_BLOCK_SIZE;
  443. #endif
  444. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  445. break;
  446. #endif
  447. #ifndef WOLFSSL_NOSHA512_256
  448. case WC_HASH_TYPE_SHA512_256:
  449. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  450. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  451. block_size = WC_SHA512_256_BLOCK_SIZE;
  452. #endif
  453. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  454. break;
  455. #endif
  456. case WC_HASH_TYPE_MD5_SHA: /* Old TLS Specific */
  457. #if !defined(NO_MD5) && !defined(NO_SHA)
  458. block_size = (int)WC_MD5_BLOCK_SIZE + (int)WC_SHA_BLOCK_SIZE;
  459. #endif
  460. break;
  461. case WC_HASH_TYPE_SHA3_224:
  462. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  463. block_size = WC_SHA3_224_BLOCK_SIZE;
  464. #endif
  465. break;
  466. case WC_HASH_TYPE_SHA3_256:
  467. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  468. block_size = WC_SHA3_256_BLOCK_SIZE;
  469. #endif
  470. break;
  471. case WC_HASH_TYPE_SHA3_384:
  472. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  473. block_size = WC_SHA3_384_BLOCK_SIZE;
  474. #endif
  475. break;
  476. case WC_HASH_TYPE_SHA3_512:
  477. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  478. block_size = WC_SHA3_512_BLOCK_SIZE;
  479. #endif
  480. break;
  481. case WC_HASH_TYPE_BLAKE2B:
  482. case WC_HASH_TYPE_BLAKE2S:
  483. #if defined(HAVE_BLAKE2) || defined(HAVE_BLAKE2S)
  484. block_size = BLAKE2S_BLOCKBYTES;
  485. #endif
  486. break;
  487. /* Not Supported */
  488. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  489. case WC_HASH_TYPE_SHAKE128:
  490. #endif
  491. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  492. case WC_HASH_TYPE_SHAKE256:
  493. #endif
  494. case WC_HASH_TYPE_NONE:
  495. default:
  496. block_size = BAD_FUNC_ARG;
  497. break;
  498. }
  499. return block_size;
  500. }
  501. /* Generic Hashing Wrapper */
  502. int wc_Hash(enum wc_HashType hash_type, const byte* data,
  503. word32 data_len, byte* hash, word32 hash_len)
  504. {
  505. int ret = HASH_TYPE_E; /* Default to hash type error */
  506. word32 dig_size;
  507. /* Validate hash buffer size */
  508. dig_size = wc_HashGetDigestSize(hash_type);
  509. if (hash_len < dig_size) {
  510. return BUFFER_E;
  511. }
  512. /* Suppress possible unused arg if all hashing is disabled */
  513. (void)data;
  514. (void)data_len;
  515. (void)hash;
  516. (void)hash_len;
  517. switch(hash_type)
  518. {
  519. case WC_HASH_TYPE_MD5:
  520. #ifndef NO_MD5
  521. ret = wc_Md5Hash(data, data_len, hash);
  522. #endif
  523. break;
  524. case WC_HASH_TYPE_SHA:
  525. #ifndef NO_SHA
  526. ret = wc_ShaHash(data, data_len, hash);
  527. #endif
  528. break;
  529. case WC_HASH_TYPE_SHA224:
  530. #ifdef WOLFSSL_SHA224
  531. ret = wc_Sha224Hash(data, data_len, hash);
  532. #endif
  533. break;
  534. case WC_HASH_TYPE_SHA256:
  535. #ifndef NO_SHA256
  536. ret = wc_Sha256Hash(data, data_len, hash);
  537. #endif
  538. break;
  539. case WC_HASH_TYPE_SHA384:
  540. #ifdef WOLFSSL_SHA384
  541. ret = wc_Sha384Hash(data, data_len, hash);
  542. #endif
  543. break;
  544. case WC_HASH_TYPE_SHA512:
  545. #ifdef WOLFSSL_SHA512
  546. ret = wc_Sha512Hash(data, data_len, hash);
  547. #endif
  548. break;
  549. #ifndef WOLFSSL_NOSHA512_224
  550. case WC_HASH_TYPE_SHA512_224:
  551. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  552. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  553. ret = wc_Sha512_224Hash(data, data_len, hash);
  554. #endif
  555. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  556. break;
  557. #endif
  558. #ifndef WOLFSSL_NOSHA512_256
  559. case WC_HASH_TYPE_SHA512_256:
  560. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  561. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  562. ret = wc_Sha512_256Hash(data, data_len, hash);
  563. #endif
  564. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  565. break;
  566. #endif
  567. case WC_HASH_TYPE_MD5_SHA:
  568. #if !defined(NO_MD5) && !defined(NO_SHA)
  569. ret = wc_Md5Hash(data, data_len, hash);
  570. if (ret == 0) {
  571. ret = wc_ShaHash(data, data_len, &hash[WC_MD5_DIGEST_SIZE]);
  572. }
  573. #endif
  574. break;
  575. case WC_HASH_TYPE_SHA3_224:
  576. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  577. ret = wc_Sha3_224Hash(data, data_len, hash);
  578. #endif
  579. break;
  580. case WC_HASH_TYPE_SHA3_256:
  581. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  582. ret = wc_Sha3_256Hash(data, data_len, hash);
  583. #endif
  584. break;
  585. case WC_HASH_TYPE_SHA3_384:
  586. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  587. ret = wc_Sha3_384Hash(data, data_len, hash);
  588. #endif
  589. break;
  590. case WC_HASH_TYPE_SHA3_512:
  591. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  592. ret = wc_Sha3_512Hash(data, data_len, hash);
  593. #endif
  594. break;
  595. /* Not Supported */
  596. case WC_HASH_TYPE_MD2:
  597. case WC_HASH_TYPE_MD4:
  598. case WC_HASH_TYPE_BLAKE2B:
  599. case WC_HASH_TYPE_BLAKE2S:
  600. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  601. case WC_HASH_TYPE_SHAKE128:
  602. #endif
  603. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  604. case WC_HASH_TYPE_SHAKE256:
  605. #endif
  606. case WC_HASH_TYPE_NONE:
  607. default:
  608. ret = BAD_FUNC_ARG;
  609. break;
  610. }
  611. return ret;
  612. }
  613. int wc_HashInit_ex(wc_HashAlg* hash, enum wc_HashType type, void* heap,
  614. int devId)
  615. {
  616. int ret = HASH_TYPE_E; /* Default to hash type error */
  617. if (hash == NULL)
  618. return BAD_FUNC_ARG;
  619. switch (type) {
  620. case WC_HASH_TYPE_MD5:
  621. #ifndef NO_MD5
  622. ret = wc_InitMd5_ex(&hash->md5, heap, devId);
  623. #endif
  624. break;
  625. case WC_HASH_TYPE_SHA:
  626. #ifndef NO_SHA
  627. ret = wc_InitSha_ex(&hash->sha, heap, devId);
  628. #endif
  629. break;
  630. case WC_HASH_TYPE_SHA224:
  631. #ifdef WOLFSSL_SHA224
  632. ret = wc_InitSha224_ex(&hash->sha224, heap, devId);
  633. #endif
  634. break;
  635. case WC_HASH_TYPE_SHA256:
  636. #ifndef NO_SHA256
  637. ret = wc_InitSha256_ex(&hash->sha256, heap, devId);
  638. #endif
  639. break;
  640. case WC_HASH_TYPE_SHA384:
  641. #ifdef WOLFSSL_SHA384
  642. ret = wc_InitSha384_ex(&hash->sha384, heap, devId);
  643. #endif
  644. break;
  645. case WC_HASH_TYPE_SHA512:
  646. #ifdef WOLFSSL_SHA512
  647. ret = wc_InitSha512_ex(&hash->sha512, heap, devId);
  648. #endif
  649. break;
  650. #ifndef WOLFSSL_NOSHA512_224
  651. case WC_HASH_TYPE_SHA512_224:
  652. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  653. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  654. ret = wc_InitSha512_224_ex(&hash->sha512, heap, devId);
  655. #endif
  656. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  657. break;
  658. #endif
  659. #ifndef WOLFSSL_NOSHA512_256
  660. case WC_HASH_TYPE_SHA512_256:
  661. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  662. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  663. ret = wc_InitSha512_256_ex(&hash->sha512, heap, devId);
  664. #endif
  665. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  666. break;
  667. #endif
  668. case WC_HASH_TYPE_SHA3_224:
  669. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  670. ret = wc_InitSha3_224(&hash->sha3, heap, devId);
  671. #endif
  672. break;
  673. case WC_HASH_TYPE_SHA3_256:
  674. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  675. ret = wc_InitSha3_256(&hash->sha3, heap, devId);
  676. #endif
  677. break;
  678. case WC_HASH_TYPE_SHA3_384:
  679. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  680. ret = wc_InitSha3_384(&hash->sha3, heap, devId);
  681. #endif
  682. break;
  683. case WC_HASH_TYPE_SHA3_512:
  684. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  685. ret = wc_InitSha3_512(&hash->sha3, heap, devId);
  686. #endif
  687. break;
  688. /* not supported */
  689. case WC_HASH_TYPE_MD5_SHA:
  690. case WC_HASH_TYPE_MD2:
  691. case WC_HASH_TYPE_MD4:
  692. case WC_HASH_TYPE_BLAKE2B:
  693. case WC_HASH_TYPE_BLAKE2S:
  694. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  695. case WC_HASH_TYPE_SHAKE128:
  696. #endif
  697. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  698. case WC_HASH_TYPE_SHAKE256:
  699. #endif
  700. case WC_HASH_TYPE_NONE:
  701. default:
  702. ret = BAD_FUNC_ARG;
  703. };
  704. (void)heap;
  705. (void)devId;
  706. return ret;
  707. }
  708. int wc_HashInit(wc_HashAlg* hash, enum wc_HashType type)
  709. {
  710. return wc_HashInit_ex(hash, type, NULL, INVALID_DEVID);
  711. }
  712. int wc_HashUpdate(wc_HashAlg* hash, enum wc_HashType type, const byte* data,
  713. word32 dataSz)
  714. {
  715. int ret = HASH_TYPE_E; /* Default to hash type error */
  716. if (hash == NULL || (data == NULL && dataSz > 0))
  717. return BAD_FUNC_ARG;
  718. switch (type) {
  719. case WC_HASH_TYPE_MD5:
  720. #ifndef NO_MD5
  721. ret = wc_Md5Update(&hash->md5, data, dataSz);
  722. #endif
  723. break;
  724. case WC_HASH_TYPE_SHA:
  725. #ifndef NO_SHA
  726. ret = wc_ShaUpdate(&hash->sha, data, dataSz);
  727. #endif
  728. break;
  729. case WC_HASH_TYPE_SHA224:
  730. #ifdef WOLFSSL_SHA224
  731. ret = wc_Sha224Update(&hash->sha224, data, dataSz);
  732. #endif
  733. break;
  734. case WC_HASH_TYPE_SHA256:
  735. #ifndef NO_SHA256
  736. ret = wc_Sha256Update(&hash->sha256, data, dataSz);
  737. #endif
  738. break;
  739. case WC_HASH_TYPE_SHA384:
  740. #ifdef WOLFSSL_SHA384
  741. ret = wc_Sha384Update(&hash->sha384, data, dataSz);
  742. #endif
  743. break;
  744. case WC_HASH_TYPE_SHA512:
  745. #ifdef WOLFSSL_SHA512
  746. ret = wc_Sha512Update(&hash->sha512, data, dataSz);
  747. #endif
  748. break;
  749. #ifndef WOLFSSL_NOSHA512_224
  750. case WC_HASH_TYPE_SHA512_224:
  751. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  752. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  753. ret = wc_Sha512_224Update(&hash->sha512, data, dataSz);
  754. #endif
  755. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  756. break;
  757. #endif
  758. #ifndef WOLFSSL_NOSHA512_256
  759. case WC_HASH_TYPE_SHA512_256:
  760. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  761. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  762. ret = wc_Sha512_256Update(&hash->sha512, data, dataSz);
  763. #endif
  764. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  765. break;
  766. #endif
  767. case WC_HASH_TYPE_SHA3_224:
  768. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  769. ret = wc_Sha3_224_Update(&hash->sha3, data, dataSz);
  770. #endif
  771. break;
  772. case WC_HASH_TYPE_SHA3_256:
  773. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  774. ret = wc_Sha3_256_Update(&hash->sha3, data, dataSz);
  775. #endif
  776. break;
  777. case WC_HASH_TYPE_SHA3_384:
  778. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  779. ret = wc_Sha3_384_Update(&hash->sha3, data, dataSz);
  780. #endif
  781. break;
  782. case WC_HASH_TYPE_SHA3_512:
  783. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  784. ret = wc_Sha3_512_Update(&hash->sha3, data, dataSz);
  785. #endif
  786. break;
  787. /* not supported */
  788. case WC_HASH_TYPE_MD5_SHA:
  789. case WC_HASH_TYPE_MD2:
  790. case WC_HASH_TYPE_MD4:
  791. case WC_HASH_TYPE_BLAKE2B:
  792. case WC_HASH_TYPE_BLAKE2S:
  793. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  794. case WC_HASH_TYPE_SHAKE128:
  795. #endif
  796. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  797. case WC_HASH_TYPE_SHAKE256:
  798. #endif
  799. case WC_HASH_TYPE_NONE:
  800. default:
  801. ret = BAD_FUNC_ARG;
  802. };
  803. return ret;
  804. }
  805. int wc_HashFinal(wc_HashAlg* hash, enum wc_HashType type, byte* out)
  806. {
  807. int ret = HASH_TYPE_E; /* Default to hash type error */
  808. if (hash == NULL || out == NULL)
  809. return BAD_FUNC_ARG;
  810. switch (type) {
  811. case WC_HASH_TYPE_MD5:
  812. #ifndef NO_MD5
  813. ret = wc_Md5Final(&hash->md5, out);
  814. #endif
  815. break;
  816. case WC_HASH_TYPE_SHA:
  817. #ifndef NO_SHA
  818. ret = wc_ShaFinal(&hash->sha, out);
  819. #endif
  820. break;
  821. case WC_HASH_TYPE_SHA224:
  822. #ifdef WOLFSSL_SHA224
  823. ret = wc_Sha224Final(&hash->sha224, out);
  824. #endif
  825. break;
  826. case WC_HASH_TYPE_SHA256:
  827. #ifndef NO_SHA256
  828. ret = wc_Sha256Final(&hash->sha256, out);
  829. #endif
  830. break;
  831. case WC_HASH_TYPE_SHA384:
  832. #ifdef WOLFSSL_SHA384
  833. ret = wc_Sha384Final(&hash->sha384, out);
  834. #endif
  835. break;
  836. case WC_HASH_TYPE_SHA512:
  837. #ifdef WOLFSSL_SHA512
  838. ret = wc_Sha512Final(&hash->sha512, out);
  839. #endif
  840. break;
  841. #ifndef WOLFSSL_NOSHA512_224
  842. case WC_HASH_TYPE_SHA512_224:
  843. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  844. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  845. ret = wc_Sha512_224Final(&hash->sha512, out);
  846. #endif
  847. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  848. break;
  849. #endif
  850. #ifndef WOLFSSL_NOSHA512_256
  851. case WC_HASH_TYPE_SHA512_256:
  852. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  853. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  854. ret = wc_Sha512_256Final(&hash->sha512, out);
  855. #endif
  856. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  857. break;
  858. #endif
  859. case WC_HASH_TYPE_SHA3_224:
  860. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  861. ret = wc_Sha3_224_Final(&hash->sha3, out);
  862. #endif
  863. break;
  864. case WC_HASH_TYPE_SHA3_256:
  865. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  866. ret = wc_Sha3_256_Final(&hash->sha3, out);
  867. #endif
  868. break;
  869. case WC_HASH_TYPE_SHA3_384:
  870. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  871. ret = wc_Sha3_384_Final(&hash->sha3, out);
  872. #endif
  873. break;
  874. case WC_HASH_TYPE_SHA3_512:
  875. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  876. ret = wc_Sha3_512_Final(&hash->sha3, out);
  877. #endif
  878. break;
  879. /* not supported */
  880. case WC_HASH_TYPE_MD5_SHA:
  881. case WC_HASH_TYPE_MD2:
  882. case WC_HASH_TYPE_MD4:
  883. case WC_HASH_TYPE_BLAKE2B:
  884. case WC_HASH_TYPE_BLAKE2S:
  885. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  886. case WC_HASH_TYPE_SHAKE128:
  887. #endif
  888. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  889. case WC_HASH_TYPE_SHAKE256:
  890. #endif
  891. case WC_HASH_TYPE_NONE:
  892. default:
  893. ret = BAD_FUNC_ARG;
  894. };
  895. return ret;
  896. }
  897. int wc_HashFree(wc_HashAlg* hash, enum wc_HashType type)
  898. {
  899. int ret = HASH_TYPE_E; /* Default to hash type error */
  900. if (hash == NULL)
  901. return BAD_FUNC_ARG;
  902. switch (type) {
  903. case WC_HASH_TYPE_MD5:
  904. #ifndef NO_MD5
  905. wc_Md5Free(&hash->md5);
  906. ret = 0;
  907. #endif
  908. break;
  909. case WC_HASH_TYPE_SHA:
  910. #ifndef NO_SHA
  911. wc_ShaFree(&hash->sha);
  912. ret = 0;
  913. #endif
  914. break;
  915. case WC_HASH_TYPE_SHA224:
  916. #ifdef WOLFSSL_SHA224
  917. wc_Sha224Free(&hash->sha224);
  918. ret = 0;
  919. #endif
  920. break;
  921. case WC_HASH_TYPE_SHA256:
  922. #ifndef NO_SHA256
  923. wc_Sha256Free(&hash->sha256);
  924. ret = 0;
  925. #endif
  926. break;
  927. case WC_HASH_TYPE_SHA384:
  928. #ifdef WOLFSSL_SHA384
  929. wc_Sha384Free(&hash->sha384);
  930. ret = 0;
  931. #endif
  932. break;
  933. case WC_HASH_TYPE_SHA512:
  934. #ifdef WOLFSSL_SHA512
  935. wc_Sha512Free(&hash->sha512);
  936. ret = 0;
  937. #endif
  938. break;
  939. #ifndef WOLFSSL_NOSHA512_224
  940. case WC_HASH_TYPE_SHA512_224:
  941. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  942. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  943. wc_Sha512_224Free(&hash->sha512);
  944. ret = 0;
  945. #endif
  946. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  947. break;
  948. #endif
  949. #ifndef WOLFSSL_NOSHA512_256
  950. case WC_HASH_TYPE_SHA512_256:
  951. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  952. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  953. wc_Sha512_256Free(&hash->sha512);
  954. ret = 0;
  955. #endif
  956. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  957. break;
  958. #endif
  959. case WC_HASH_TYPE_SHA3_224:
  960. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  961. wc_Sha3_224_Free(&hash->sha3);
  962. ret = 0;
  963. #endif
  964. break;
  965. case WC_HASH_TYPE_SHA3_256:
  966. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  967. wc_Sha3_256_Free(&hash->sha3);
  968. ret = 0;
  969. #endif
  970. break;
  971. case WC_HASH_TYPE_SHA3_384:
  972. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  973. wc_Sha3_384_Free(&hash->sha3);
  974. ret = 0;
  975. #endif
  976. break;
  977. case WC_HASH_TYPE_SHA3_512:
  978. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  979. wc_Sha3_512_Free(&hash->sha3);
  980. ret = 0;
  981. #endif
  982. break;
  983. /* not supported */
  984. case WC_HASH_TYPE_MD5_SHA:
  985. case WC_HASH_TYPE_MD2:
  986. case WC_HASH_TYPE_MD4:
  987. case WC_HASH_TYPE_BLAKE2B:
  988. case WC_HASH_TYPE_BLAKE2S:
  989. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  990. case WC_HASH_TYPE_SHAKE128:
  991. #endif
  992. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  993. case WC_HASH_TYPE_SHAKE256:
  994. #endif
  995. case WC_HASH_TYPE_NONE:
  996. default:
  997. ret = BAD_FUNC_ARG;
  998. };
  999. return ret;
  1000. }
  1001. #ifdef WOLFSSL_HASH_FLAGS
  1002. int wc_HashSetFlags(wc_HashAlg* hash, enum wc_HashType type, word32 flags)
  1003. {
  1004. int ret = HASH_TYPE_E; /* Default to hash type error */
  1005. if (hash == NULL)
  1006. return BAD_FUNC_ARG;
  1007. switch (type) {
  1008. case WC_HASH_TYPE_MD5:
  1009. #ifndef NO_MD5
  1010. ret = wc_Md5SetFlags(&hash->md5, flags);
  1011. #endif
  1012. break;
  1013. case WC_HASH_TYPE_SHA:
  1014. #ifndef NO_SHA
  1015. ret = wc_ShaSetFlags(&hash->sha, flags);
  1016. #endif
  1017. break;
  1018. case WC_HASH_TYPE_SHA224:
  1019. #ifdef WOLFSSL_SHA224
  1020. ret = wc_Sha224SetFlags(&hash->sha224, flags);
  1021. #endif
  1022. break;
  1023. case WC_HASH_TYPE_SHA256:
  1024. #ifndef NO_SHA256
  1025. ret = wc_Sha256SetFlags(&hash->sha256, flags);
  1026. #endif
  1027. break;
  1028. case WC_HASH_TYPE_SHA384:
  1029. #ifdef WOLFSSL_SHA384
  1030. ret = wc_Sha384SetFlags(&hash->sha384, flags);
  1031. #endif
  1032. break;
  1033. case WC_HASH_TYPE_SHA512:
  1034. #ifndef WOLFSSL_NOSHA512_224
  1035. case WC_HASH_TYPE_SHA512_224:
  1036. #endif
  1037. #ifndef WOLFSSL_NOSHA512_256
  1038. case WC_HASH_TYPE_SHA512_256:
  1039. #endif
  1040. #ifdef WOLFSSL_SHA512
  1041. ret = wc_Sha512SetFlags(&hash->sha512, flags);
  1042. #endif
  1043. break;
  1044. case WC_HASH_TYPE_SHA3_224:
  1045. case WC_HASH_TYPE_SHA3_256:
  1046. case WC_HASH_TYPE_SHA3_384:
  1047. case WC_HASH_TYPE_SHA3_512:
  1048. #ifdef WOLFSSL_SHA3
  1049. ret = wc_Sha3_SetFlags(&hash->sha3, flags);
  1050. #endif
  1051. break;
  1052. /* not supported */
  1053. case WC_HASH_TYPE_MD5_SHA:
  1054. case WC_HASH_TYPE_MD2:
  1055. case WC_HASH_TYPE_MD4:
  1056. case WC_HASH_TYPE_BLAKE2B:
  1057. case WC_HASH_TYPE_BLAKE2S:
  1058. case WC_HASH_TYPE_NONE:
  1059. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  1060. case WC_HASH_TYPE_SHAKE128:
  1061. #endif
  1062. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  1063. case WC_HASH_TYPE_SHAKE256:
  1064. #endif
  1065. default:
  1066. ret = BAD_FUNC_ARG;
  1067. };
  1068. return ret;
  1069. }
  1070. int wc_HashGetFlags(wc_HashAlg* hash, enum wc_HashType type, word32* flags)
  1071. {
  1072. int ret = HASH_TYPE_E; /* Default to hash type error */
  1073. if (hash == NULL)
  1074. return BAD_FUNC_ARG;
  1075. switch (type) {
  1076. case WC_HASH_TYPE_MD5:
  1077. #ifndef NO_MD5
  1078. ret = wc_Md5GetFlags(&hash->md5, flags);
  1079. #endif
  1080. break;
  1081. case WC_HASH_TYPE_SHA:
  1082. #ifndef NO_SHA
  1083. ret = wc_ShaGetFlags(&hash->sha, flags);
  1084. #endif
  1085. break;
  1086. case WC_HASH_TYPE_SHA224:
  1087. #ifdef WOLFSSL_SHA224
  1088. ret = wc_Sha224GetFlags(&hash->sha224, flags);
  1089. #endif
  1090. break;
  1091. case WC_HASH_TYPE_SHA256:
  1092. #ifndef NO_SHA256
  1093. ret = wc_Sha256GetFlags(&hash->sha256, flags);
  1094. #endif
  1095. break;
  1096. case WC_HASH_TYPE_SHA384:
  1097. #ifdef WOLFSSL_SHA384
  1098. ret = wc_Sha384GetFlags(&hash->sha384, flags);
  1099. #endif
  1100. break;
  1101. case WC_HASH_TYPE_SHA512:
  1102. #ifndef WOLFSSL_NOSHA512_224
  1103. case WC_HASH_TYPE_SHA512_224:
  1104. #endif
  1105. #ifndef WOLFSSL_NOSHA512_256
  1106. case WC_HASH_TYPE_SHA512_256:
  1107. #endif
  1108. #ifdef WOLFSSL_SHA512
  1109. ret = wc_Sha512GetFlags(&hash->sha512, flags);
  1110. #endif
  1111. break;
  1112. case WC_HASH_TYPE_SHA3_224:
  1113. case WC_HASH_TYPE_SHA3_256:
  1114. case WC_HASH_TYPE_SHA3_384:
  1115. case WC_HASH_TYPE_SHA3_512:
  1116. #ifdef WOLFSSL_SHA3
  1117. ret = wc_Sha3_GetFlags(&hash->sha3, flags);
  1118. #endif
  1119. break;
  1120. /* not supported */
  1121. case WC_HASH_TYPE_MD5_SHA:
  1122. case WC_HASH_TYPE_MD2:
  1123. case WC_HASH_TYPE_MD4:
  1124. case WC_HASH_TYPE_BLAKE2B:
  1125. case WC_HASH_TYPE_BLAKE2S:
  1126. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  1127. case WC_HASH_TYPE_SHAKE128:
  1128. #endif
  1129. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  1130. case WC_HASH_TYPE_SHAKE256:
  1131. #endif
  1132. case WC_HASH_TYPE_NONE:
  1133. default:
  1134. ret = BAD_FUNC_ARG;
  1135. };
  1136. return ret;
  1137. }
  1138. #endif /* WOLFSSL_HASH_FLAGS */
  1139. #if !defined(WOLFSSL_TI_HASH)
  1140. #if !defined(NO_MD5)
  1141. int wc_Md5Hash(const byte* data, word32 len, byte* hash)
  1142. {
  1143. int ret;
  1144. #ifdef WOLFSSL_SMALL_STACK
  1145. wc_Md5* md5;
  1146. #else
  1147. wc_Md5 md5[1];
  1148. #endif
  1149. #ifdef WOLFSSL_SMALL_STACK
  1150. md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1151. if (md5 == NULL)
  1152. return MEMORY_E;
  1153. #endif
  1154. if ((ret = wc_InitMd5(md5)) != 0) {
  1155. WOLFSSL_MSG("InitMd5 failed");
  1156. }
  1157. else {
  1158. if ((ret = wc_Md5Update(md5, data, len)) != 0) {
  1159. WOLFSSL_MSG("Md5Update failed");
  1160. }
  1161. else if ((ret = wc_Md5Final(md5, hash)) != 0) {
  1162. WOLFSSL_MSG("Md5Final failed");
  1163. }
  1164. wc_Md5Free(md5);
  1165. }
  1166. #ifdef WOLFSSL_SMALL_STACK
  1167. XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1168. #endif
  1169. return ret;
  1170. }
  1171. #endif /* !NO_MD5 */
  1172. #if !defined(NO_SHA)
  1173. int wc_ShaHash(const byte* data, word32 len, byte* hash)
  1174. {
  1175. int ret = 0;
  1176. #ifdef WOLFSSL_SMALL_STACK
  1177. wc_Sha* sha;
  1178. #else
  1179. wc_Sha sha[1];
  1180. #endif
  1181. int devId = INVALID_DEVID;
  1182. #ifdef WOLFSSL_SMALL_STACK
  1183. sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1184. if (sha == NULL)
  1185. return MEMORY_E;
  1186. #endif
  1187. #ifdef WOLF_CRYPTO_CB
  1188. /* only use devId if its not an empty hash */
  1189. if (data != NULL && len > 0)
  1190. devId = wc_CryptoCb_GetDevIdAtIndex(0);
  1191. #endif
  1192. if ((ret = wc_InitSha_ex(sha, NULL, devId)) != 0) {
  1193. WOLFSSL_MSG("InitSha failed");
  1194. }
  1195. else {
  1196. if ((ret = wc_ShaUpdate(sha, data, len)) != 0) {
  1197. WOLFSSL_MSG("ShaUpdate failed");
  1198. }
  1199. else if ((ret = wc_ShaFinal(sha, hash)) != 0) {
  1200. WOLFSSL_MSG("ShaFinal failed");
  1201. }
  1202. wc_ShaFree(sha);
  1203. }
  1204. #ifdef WOLFSSL_SMALL_STACK
  1205. XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1206. #endif
  1207. return ret;
  1208. }
  1209. #endif /* !NO_SHA */
  1210. #if defined(WOLFSSL_SHA224)
  1211. int wc_Sha224Hash(const byte* data, word32 len, byte* hash)
  1212. {
  1213. int ret = 0;
  1214. #ifdef WOLFSSL_SMALL_STACK
  1215. wc_Sha224* sha224;
  1216. #else
  1217. wc_Sha224 sha224[1];
  1218. #endif
  1219. #ifdef WOLFSSL_SMALL_STACK
  1220. sha224 = (wc_Sha224*)XMALLOC(sizeof(wc_Sha224), NULL,
  1221. DYNAMIC_TYPE_TMP_BUFFER);
  1222. if (sha224 == NULL)
  1223. return MEMORY_E;
  1224. #endif
  1225. if ((ret = wc_InitSha224(sha224)) != 0) {
  1226. WOLFSSL_MSG("InitSha224 failed");
  1227. }
  1228. else {
  1229. if ((ret = wc_Sha224Update(sha224, data, len)) != 0) {
  1230. WOLFSSL_MSG("Sha224Update failed");
  1231. }
  1232. else if ((ret = wc_Sha224Final(sha224, hash)) != 0) {
  1233. WOLFSSL_MSG("Sha224Final failed");
  1234. }
  1235. wc_Sha224Free(sha224);
  1236. }
  1237. #ifdef WOLFSSL_SMALL_STACK
  1238. XFREE(sha224, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1239. #endif
  1240. return ret;
  1241. }
  1242. #endif /* WOLFSSL_SHA224 */
  1243. #if !defined(NO_SHA256)
  1244. int wc_Sha256Hash(const byte* data, word32 len, byte* hash)
  1245. {
  1246. int ret = 0;
  1247. #ifdef WOLFSSL_SMALL_STACK
  1248. wc_Sha256* sha256;
  1249. #else
  1250. wc_Sha256 sha256[1];
  1251. #endif
  1252. int devId = INVALID_DEVID;
  1253. #ifdef WOLFSSL_SMALL_STACK
  1254. sha256 = (wc_Sha256*)XMALLOC(sizeof(wc_Sha256), NULL,
  1255. DYNAMIC_TYPE_TMP_BUFFER);
  1256. if (sha256 == NULL)
  1257. return MEMORY_E;
  1258. #endif
  1259. #ifdef WOLF_CRYPTO_CB
  1260. /* only use devId if its not an empty hash */
  1261. if (data != NULL && len > 0)
  1262. devId = wc_CryptoCb_GetDevIdAtIndex(0);
  1263. #endif
  1264. if ((ret = wc_InitSha256_ex(sha256, NULL, devId)) != 0) {
  1265. WOLFSSL_MSG("InitSha256 failed");
  1266. }
  1267. else {
  1268. if ((ret = wc_Sha256Update(sha256, data, len)) != 0) {
  1269. WOLFSSL_MSG("Sha256Update failed");
  1270. }
  1271. else if ((ret = wc_Sha256Final(sha256, hash)) != 0) {
  1272. WOLFSSL_MSG("Sha256Final failed");
  1273. }
  1274. wc_Sha256Free(sha256);
  1275. }
  1276. #ifdef WOLFSSL_SMALL_STACK
  1277. XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1278. #endif
  1279. return ret;
  1280. }
  1281. #endif /* !NO_SHA256 */
  1282. #endif /* !defined(WOLFSSL_TI_HASH) */
  1283. #if defined(WOLFSSL_SHA512)
  1284. int wc_Sha512Hash(const byte* data, word32 len, byte* hash)
  1285. {
  1286. int ret = 0;
  1287. #ifdef WOLFSSL_SMALL_STACK
  1288. wc_Sha512* sha512;
  1289. #else
  1290. wc_Sha512 sha512[1];
  1291. #endif
  1292. #ifdef WOLFSSL_SMALL_STACK
  1293. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1294. DYNAMIC_TYPE_TMP_BUFFER);
  1295. if (sha512 == NULL)
  1296. return MEMORY_E;
  1297. #endif
  1298. if ((ret = wc_InitSha512(sha512)) != 0) {
  1299. WOLFSSL_MSG("InitSha512 failed");
  1300. }
  1301. else {
  1302. if ((ret = wc_Sha512Update(sha512, data, len)) != 0) {
  1303. WOLFSSL_MSG("Sha512Update failed");
  1304. }
  1305. else if ((ret = wc_Sha512Final(sha512, hash)) != 0) {
  1306. WOLFSSL_MSG("Sha512Final failed");
  1307. }
  1308. wc_Sha512Free(sha512);
  1309. }
  1310. #ifdef WOLFSSL_SMALL_STACK
  1311. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1312. #endif
  1313. return ret;
  1314. }
  1315. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  1316. #ifndef WOLFSSL_NOSHA512_224
  1317. int wc_Sha512_224Hash(const byte* data, word32 len, byte* hash)
  1318. {
  1319. int ret = 0;
  1320. #ifdef WOLFSSL_SMALL_STACK
  1321. wc_Sha512* sha512;
  1322. #else
  1323. wc_Sha512 sha512[1];
  1324. #endif
  1325. #ifdef WOLFSSL_SMALL_STACK
  1326. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1327. DYNAMIC_TYPE_TMP_BUFFER);
  1328. if (sha512 == NULL)
  1329. return MEMORY_E;
  1330. #endif
  1331. if ((ret = wc_InitSha512_224(sha512)) != 0) {
  1332. WOLFSSL_MSG("wc_InitSha512_224 failed");
  1333. }
  1334. else {
  1335. if ((ret = wc_Sha512_224Update(sha512, data, len)) != 0) {
  1336. WOLFSSL_MSG("wc_Sha512_224_Update failed");
  1337. }
  1338. else if ((ret = wc_Sha512_224Final(sha512, hash)) != 0) {
  1339. WOLFSSL_MSG("wc_Sha512_224_Final failed");
  1340. }
  1341. wc_Sha512_224Free(sha512);
  1342. }
  1343. #ifdef WOLFSSL_SMALL_STACK
  1344. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1345. #endif
  1346. return ret;
  1347. }
  1348. #endif /* !WOLFSSL_NOSHA512_224 */
  1349. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  1350. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  1351. #ifndef WOLFSSL_NOSHA512_256
  1352. int wc_Sha512_256Hash(const byte* data, word32 len, byte* hash)
  1353. {
  1354. int ret = 0;
  1355. #ifdef WOLFSSL_SMALL_STACK
  1356. wc_Sha512* sha512;
  1357. #else
  1358. wc_Sha512 sha512[1];
  1359. #endif
  1360. #ifdef WOLFSSL_SMALL_STACK
  1361. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1362. DYNAMIC_TYPE_TMP_BUFFER);
  1363. if (sha512 == NULL)
  1364. return MEMORY_E;
  1365. #endif
  1366. if ((ret = wc_InitSha512_256(sha512)) != 0) {
  1367. WOLFSSL_MSG("wc_InitSha512_256 failed");
  1368. }
  1369. else {
  1370. if ((ret = wc_Sha512_256Update(sha512, data, len)) != 0) {
  1371. WOLFSSL_MSG("wc_Sha512_256_Update failed");
  1372. }
  1373. else if ((ret = wc_Sha512_256Final(sha512, hash)) != 0) {
  1374. WOLFSSL_MSG("wc_Sha512_256_Final failed");
  1375. }
  1376. wc_Sha512_256Free(sha512);
  1377. }
  1378. #ifdef WOLFSSL_SMALL_STACK
  1379. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1380. #endif
  1381. return ret;
  1382. }
  1383. #endif /* !WOLFSSL_NOSHA512_256 */
  1384. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  1385. #endif /* WOLFSSL_SHA512 */
  1386. #if defined(WOLFSSL_SHA384)
  1387. int wc_Sha384Hash(const byte* data, word32 len, byte* hash)
  1388. {
  1389. int ret = 0;
  1390. #ifdef WOLFSSL_SMALL_STACK
  1391. wc_Sha384* sha384;
  1392. #else
  1393. wc_Sha384 sha384[1];
  1394. #endif
  1395. #ifdef WOLFSSL_SMALL_STACK
  1396. sha384 = (wc_Sha384*)XMALLOC(sizeof(wc_Sha384), NULL,
  1397. DYNAMIC_TYPE_TMP_BUFFER);
  1398. if (sha384 == NULL)
  1399. return MEMORY_E;
  1400. #endif
  1401. if ((ret = wc_InitSha384(sha384)) != 0) {
  1402. WOLFSSL_MSG("InitSha384 failed");
  1403. }
  1404. else {
  1405. if ((ret = wc_Sha384Update(sha384, data, len)) != 0) {
  1406. WOLFSSL_MSG("Sha384Update failed");
  1407. }
  1408. else if ((ret = wc_Sha384Final(sha384, hash)) != 0) {
  1409. WOLFSSL_MSG("Sha384Final failed");
  1410. }
  1411. wc_Sha384Free(sha384);
  1412. }
  1413. #ifdef WOLFSSL_SMALL_STACK
  1414. XFREE(sha384, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1415. #endif
  1416. return ret;
  1417. }
  1418. #endif /* WOLFSSL_SHA384 */
  1419. #if defined(WOLFSSL_SHA3)
  1420. #if !defined(WOLFSSL_NOSHA3_224)
  1421. int wc_Sha3_224Hash(const byte* data, word32 len, byte* hash)
  1422. {
  1423. int ret = 0;
  1424. #ifdef WOLFSSL_SMALL_STACK
  1425. wc_Sha3* sha3;
  1426. #else
  1427. wc_Sha3 sha3[1];
  1428. #endif
  1429. #ifdef WOLFSSL_SMALL_STACK
  1430. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1431. DYNAMIC_TYPE_TMP_BUFFER);
  1432. if (sha3 == NULL)
  1433. return MEMORY_E;
  1434. #endif
  1435. if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) {
  1436. WOLFSSL_MSG("InitSha3_224 failed");
  1437. }
  1438. else {
  1439. if ((ret = wc_Sha3_224_Update(sha3, data, len)) != 0) {
  1440. WOLFSSL_MSG("Sha3_224_Update failed");
  1441. }
  1442. else if ((ret = wc_Sha3_224_Final(sha3, hash)) != 0) {
  1443. WOLFSSL_MSG("Sha3_224_Final failed");
  1444. }
  1445. wc_Sha3_224_Free(sha3);
  1446. }
  1447. #ifdef WOLFSSL_SMALL_STACK
  1448. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1449. #endif
  1450. return ret;
  1451. }
  1452. #endif /* !WOLFSSL_NOSHA3_224 */
  1453. #if !defined(WOLFSSL_NOSHA3_256)
  1454. int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash)
  1455. {
  1456. int ret = 0;
  1457. #ifdef WOLFSSL_SMALL_STACK
  1458. wc_Sha3* sha3;
  1459. #else
  1460. wc_Sha3 sha3[1];
  1461. #endif
  1462. #ifdef WOLFSSL_SMALL_STACK
  1463. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1464. DYNAMIC_TYPE_TMP_BUFFER);
  1465. if (sha3 == NULL)
  1466. return MEMORY_E;
  1467. #endif
  1468. if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) {
  1469. WOLFSSL_MSG("InitSha3_256 failed");
  1470. }
  1471. else {
  1472. if ((ret = wc_Sha3_256_Update(sha3, data, len)) != 0) {
  1473. WOLFSSL_MSG("Sha3_256_Update failed");
  1474. }
  1475. else if ((ret = wc_Sha3_256_Final(sha3, hash)) != 0) {
  1476. WOLFSSL_MSG("Sha3_256_Final failed");
  1477. }
  1478. wc_Sha3_256_Free(sha3);
  1479. }
  1480. #ifdef WOLFSSL_SMALL_STACK
  1481. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1482. #endif
  1483. return ret;
  1484. }
  1485. #endif /* !WOLFSSL_NOSHA3_256 */
  1486. #if !defined(WOLFSSL_NOSHA3_384)
  1487. int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash)
  1488. {
  1489. int ret = 0;
  1490. #ifdef WOLFSSL_SMALL_STACK
  1491. wc_Sha3* sha3;
  1492. #else
  1493. wc_Sha3 sha3[1];
  1494. #endif
  1495. #ifdef WOLFSSL_SMALL_STACK
  1496. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1497. DYNAMIC_TYPE_TMP_BUFFER);
  1498. if (sha3 == NULL)
  1499. return MEMORY_E;
  1500. #endif
  1501. if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) {
  1502. WOLFSSL_MSG("InitSha3_384 failed");
  1503. }
  1504. else {
  1505. if ((ret = wc_Sha3_384_Update(sha3, data, len)) != 0) {
  1506. WOLFSSL_MSG("Sha3_384_Update failed");
  1507. }
  1508. else if ((ret = wc_Sha3_384_Final(sha3, hash)) != 0) {
  1509. WOLFSSL_MSG("Sha3_384_Final failed");
  1510. }
  1511. wc_Sha3_384_Free(sha3);
  1512. }
  1513. #ifdef WOLFSSL_SMALL_STACK
  1514. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1515. #endif
  1516. return ret;
  1517. }
  1518. #endif /* !WOLFSSL_NOSHA3_384 */
  1519. #if !defined(WOLFSSL_NOSHA3_512)
  1520. int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash)
  1521. {
  1522. int ret = 0;
  1523. #ifdef WOLFSSL_SMALL_STACK
  1524. wc_Sha3* sha3;
  1525. #else
  1526. wc_Sha3 sha3[1];
  1527. #endif
  1528. #ifdef WOLFSSL_SMALL_STACK
  1529. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1530. DYNAMIC_TYPE_TMP_BUFFER);
  1531. if (sha3 == NULL)
  1532. return MEMORY_E;
  1533. #endif
  1534. if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) {
  1535. WOLFSSL_MSG("InitSha3_512 failed");
  1536. }
  1537. else {
  1538. if ((ret = wc_Sha3_512_Update(sha3, data, len)) != 0) {
  1539. WOLFSSL_MSG("Sha3_512_Update failed");
  1540. }
  1541. else if ((ret = wc_Sha3_512_Final(sha3, hash)) != 0) {
  1542. WOLFSSL_MSG("Sha3_512_Final failed");
  1543. }
  1544. wc_Sha3_512_Free(sha3);
  1545. }
  1546. #ifdef WOLFSSL_SMALL_STACK
  1547. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1548. #endif
  1549. return ret;
  1550. }
  1551. #endif /* !WOLFSSL_NOSHA3_512 */
  1552. #ifdef WOLFSSL_SHAKE128
  1553. int wc_Shake128Hash(const byte* data, word32 len, byte* hash,
  1554. word32 hashLen)
  1555. {
  1556. int ret = 0;
  1557. #ifdef WOLFSSL_SMALL_STACK
  1558. wc_Shake* shake;
  1559. #else
  1560. wc_Shake shake[1];
  1561. #endif
  1562. #ifdef WOLFSSL_SMALL_STACK
  1563. shake = (wc_Shake*)XMALLOC(sizeof(wc_Shake), NULL,
  1564. DYNAMIC_TYPE_TMP_BUFFER);
  1565. if (shake == NULL)
  1566. return MEMORY_E;
  1567. #endif
  1568. if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) {
  1569. WOLFSSL_MSG("InitShake128 failed");
  1570. }
  1571. else {
  1572. if ((ret = wc_Shake128_Update(shake, data, len)) != 0) {
  1573. WOLFSSL_MSG("Shake128_Update failed");
  1574. }
  1575. else if ((ret = wc_Shake128_Final(shake, hash, hashLen)) != 0) {
  1576. WOLFSSL_MSG("Shake128_Final failed");
  1577. }
  1578. wc_Shake128_Free(shake);
  1579. }
  1580. #ifdef WOLFSSL_SMALL_STACK
  1581. XFREE(shake, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1582. #endif
  1583. return ret;
  1584. }
  1585. #endif /* WOLFSSL_SHAKE_128 */
  1586. #ifdef WOLFSSL_SHAKE256
  1587. int wc_Shake256Hash(const byte* data, word32 len, byte* hash,
  1588. word32 hashLen)
  1589. {
  1590. int ret = 0;
  1591. #ifdef WOLFSSL_SMALL_STACK
  1592. wc_Shake* shake;
  1593. #else
  1594. wc_Shake shake[1];
  1595. #endif
  1596. #ifdef WOLFSSL_SMALL_STACK
  1597. shake = (wc_Shake*)XMALLOC(sizeof(wc_Shake), NULL,
  1598. DYNAMIC_TYPE_TMP_BUFFER);
  1599. if (shake == NULL)
  1600. return MEMORY_E;
  1601. #endif
  1602. if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) {
  1603. WOLFSSL_MSG("InitShake256 failed");
  1604. }
  1605. else {
  1606. if ((ret = wc_Shake256_Update(shake, data, len)) != 0) {
  1607. WOLFSSL_MSG("Shake256_Update failed");
  1608. }
  1609. else if ((ret = wc_Shake256_Final(shake, hash, hashLen)) != 0) {
  1610. WOLFSSL_MSG("Shake256_Final failed");
  1611. }
  1612. wc_Shake256_Free(shake);
  1613. }
  1614. #ifdef WOLFSSL_SMALL_STACK
  1615. XFREE(shake, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1616. #endif
  1617. return ret;
  1618. }
  1619. #endif /* WOLFSSL_SHAKE_256 */
  1620. #endif /* WOLFSSL_SHA3 */
  1621. #endif /* !NO_HASH_WRAPPER */
  1622. #ifdef WOLFSSL_HASH_KEEP
  1623. int _wc_Hash_Grow(byte** msg, word32* used, word32* len, const byte* in,
  1624. int inSz, void* heap)
  1625. {
  1626. if (*len < *used + inSz) {
  1627. if (*msg == NULL) {
  1628. *msg = (byte*)XMALLOC(*used + inSz, heap, DYNAMIC_TYPE_TMP_BUFFER);
  1629. }
  1630. else {
  1631. byte* pt = (byte*)XREALLOC(*msg, *used + inSz, heap,
  1632. DYNAMIC_TYPE_TMP_BUFFER);
  1633. if (pt == NULL) {
  1634. return MEMORY_E;
  1635. }
  1636. *msg = pt;
  1637. }
  1638. if (*msg == NULL) {
  1639. return MEMORY_E;
  1640. }
  1641. *len = *used + inSz;
  1642. }
  1643. XMEMCPY(*msg + *used, in, inSz);
  1644. *used += inSz;
  1645. return 0;
  1646. }
  1647. #endif /* WOLFSSL_HASH_KEEP */