hash.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708
  1. /* hash.c
  2. *
  3. * Copyright (C) 2006-2021 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. #ifndef WOLFSSL_NO_SHAKE256
  202. case WC_HASH_TYPE_SHAKE128:
  203. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  204. oid = SHAKE128h;
  205. #endif
  206. break;
  207. case WC_HASH_TYPE_SHAKE256:
  208. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  209. oid = SHAKE256h;
  210. #endif
  211. break;
  212. #endif
  213. /* Not Supported */
  214. case WC_HASH_TYPE_MD4:
  215. case WC_HASH_TYPE_BLAKE2B:
  216. case WC_HASH_TYPE_BLAKE2S:
  217. case WC_HASH_TYPE_NONE:
  218. default:
  219. oid = BAD_FUNC_ARG;
  220. break;
  221. }
  222. return oid;
  223. }
  224. enum wc_HashType wc_OidGetHash(int oid)
  225. {
  226. enum wc_HashType hash_type = WC_HASH_TYPE_NONE;
  227. switch (oid)
  228. {
  229. #ifdef WOLFSSL_MD2
  230. case MD2h:
  231. hash_type = WC_HASH_TYPE_MD2;
  232. break;
  233. #endif
  234. case MD5h:
  235. #ifndef NO_MD5
  236. hash_type = WC_HASH_TYPE_MD5;
  237. #endif
  238. break;
  239. case SHAh:
  240. #ifndef NO_SHA
  241. hash_type = WC_HASH_TYPE_SHA;
  242. #endif
  243. break;
  244. case SHA224h:
  245. #ifdef WOLFSSL_SHA224
  246. hash_type = WC_HASH_TYPE_SHA224;
  247. #endif
  248. break;
  249. case SHA256h:
  250. #ifndef NO_SHA256
  251. hash_type = WC_HASH_TYPE_SHA256;
  252. #endif
  253. break;
  254. case SHA384h:
  255. #ifdef WOLFSSL_SHA384
  256. hash_type = WC_HASH_TYPE_SHA384;
  257. #endif
  258. break;
  259. case SHA512h:
  260. #ifdef WOLFSSL_SHA512
  261. hash_type = WC_HASH_TYPE_SHA512;
  262. #endif
  263. break;
  264. #ifdef WOLFSSL_SHA3
  265. case SHA3_224h:
  266. hash_type = WC_HASH_TYPE_SHA3_224;
  267. break;
  268. case SHA3_256h:
  269. hash_type = WC_HASH_TYPE_SHA3_256;
  270. break;
  271. case SHA3_384h:
  272. hash_type = WC_HASH_TYPE_SHA3_384;
  273. break;
  274. case SHA3_512h:
  275. hash_type = WC_HASH_TYPE_SHA3_512;
  276. break;
  277. #endif /* WOLFSSL_SHA3 */
  278. default:
  279. break;
  280. }
  281. return hash_type;
  282. }
  283. #endif /* !NO_ASN || !NO_DH || HAVE_ECC */
  284. #ifndef NO_HASH_WRAPPER
  285. /* Get Hash digest size */
  286. int wc_HashGetDigestSize(enum wc_HashType hash_type)
  287. {
  288. int dig_size = HASH_TYPE_E; /* Default to hash type error */
  289. switch(hash_type)
  290. {
  291. case WC_HASH_TYPE_MD2:
  292. #ifdef WOLFSSL_MD2
  293. dig_size = MD2_DIGEST_SIZE;
  294. #endif
  295. break;
  296. case WC_HASH_TYPE_MD4:
  297. #ifndef NO_MD4
  298. dig_size = MD4_DIGEST_SIZE;
  299. #endif
  300. break;
  301. case WC_HASH_TYPE_MD5:
  302. #ifndef NO_MD5
  303. dig_size = WC_MD5_DIGEST_SIZE;
  304. #endif
  305. break;
  306. case WC_HASH_TYPE_SHA:
  307. #ifndef NO_SHA
  308. dig_size = WC_SHA_DIGEST_SIZE;
  309. #endif
  310. break;
  311. case WC_HASH_TYPE_SHA224:
  312. #ifdef WOLFSSL_SHA224
  313. dig_size = WC_SHA224_DIGEST_SIZE;
  314. #endif
  315. break;
  316. case WC_HASH_TYPE_SHA256:
  317. #ifndef NO_SHA256
  318. dig_size = WC_SHA256_DIGEST_SIZE;
  319. #endif
  320. break;
  321. case WC_HASH_TYPE_SHA384:
  322. #ifdef WOLFSSL_SHA384
  323. dig_size = WC_SHA384_DIGEST_SIZE;
  324. #endif
  325. break;
  326. case WC_HASH_TYPE_SHA512:
  327. #ifdef WOLFSSL_SHA512
  328. dig_size = WC_SHA512_DIGEST_SIZE;
  329. #endif
  330. break;
  331. #ifndef WOLFSSL_NOSHA512_224
  332. case WC_HASH_TYPE_SHA512_224:
  333. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  334. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  335. dig_size = WC_SHA512_224_DIGEST_SIZE;
  336. #endif
  337. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  338. break;
  339. #endif
  340. #ifndef WOLFSSL_NOSHA512_256
  341. case WC_HASH_TYPE_SHA512_256:
  342. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  343. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  344. dig_size = WC_SHA512_256_DIGEST_SIZE;
  345. #endif
  346. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  347. break;
  348. #endif
  349. case WC_HASH_TYPE_MD5_SHA: /* Old TLS Specific */
  350. #if !defined(NO_MD5) && !defined(NO_SHA)
  351. dig_size = (int)WC_MD5_DIGEST_SIZE + (int)WC_SHA_DIGEST_SIZE;
  352. #endif
  353. break;
  354. case WC_HASH_TYPE_SHA3_224:
  355. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  356. dig_size = WC_SHA3_224_DIGEST_SIZE;
  357. #endif
  358. break;
  359. case WC_HASH_TYPE_SHA3_256:
  360. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  361. dig_size = WC_SHA3_256_DIGEST_SIZE;
  362. #endif
  363. break;
  364. case WC_HASH_TYPE_SHA3_384:
  365. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  366. dig_size = WC_SHA3_384_DIGEST_SIZE;
  367. #endif
  368. break;
  369. case WC_HASH_TYPE_SHA3_512:
  370. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  371. dig_size = WC_SHA3_512_DIGEST_SIZE;
  372. #endif
  373. break;
  374. case WC_HASH_TYPE_BLAKE2B:
  375. case WC_HASH_TYPE_BLAKE2S:
  376. #if defined(HAVE_BLAKE2) || defined(HAVE_BLAKE2S)
  377. dig_size = BLAKE2S_OUTBYTES;
  378. #endif
  379. break;
  380. /* Not Supported */
  381. #ifndef WOLFSSL_NO_SHAKE256
  382. case WC_HASH_TYPE_SHAKE128:
  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. #ifndef WOLFSSL_NO_SHAKE256
  489. case WC_HASH_TYPE_SHAKE128:
  490. case WC_HASH_TYPE_SHAKE256:
  491. #endif
  492. case WC_HASH_TYPE_NONE:
  493. default:
  494. block_size = BAD_FUNC_ARG;
  495. break;
  496. }
  497. return block_size;
  498. }
  499. /* Generic Hashing Wrapper */
  500. int wc_Hash(enum wc_HashType hash_type, const byte* data,
  501. word32 data_len, byte* hash, word32 hash_len)
  502. {
  503. int ret = HASH_TYPE_E; /* Default to hash type error */
  504. word32 dig_size;
  505. /* Validate hash buffer size */
  506. dig_size = wc_HashGetDigestSize(hash_type);
  507. if (hash_len < dig_size) {
  508. return BUFFER_E;
  509. }
  510. /* Suppress possible unused arg if all hashing is disabled */
  511. (void)data;
  512. (void)data_len;
  513. (void)hash;
  514. (void)hash_len;
  515. switch(hash_type)
  516. {
  517. case WC_HASH_TYPE_MD5:
  518. #ifndef NO_MD5
  519. ret = wc_Md5Hash(data, data_len, hash);
  520. #endif
  521. break;
  522. case WC_HASH_TYPE_SHA:
  523. #ifndef NO_SHA
  524. ret = wc_ShaHash(data, data_len, hash);
  525. #endif
  526. break;
  527. case WC_HASH_TYPE_SHA224:
  528. #ifdef WOLFSSL_SHA224
  529. ret = wc_Sha224Hash(data, data_len, hash);
  530. #endif
  531. break;
  532. case WC_HASH_TYPE_SHA256:
  533. #ifndef NO_SHA256
  534. ret = wc_Sha256Hash(data, data_len, hash);
  535. #endif
  536. break;
  537. case WC_HASH_TYPE_SHA384:
  538. #ifdef WOLFSSL_SHA384
  539. ret = wc_Sha384Hash(data, data_len, hash);
  540. #endif
  541. break;
  542. case WC_HASH_TYPE_SHA512:
  543. #ifdef WOLFSSL_SHA512
  544. ret = wc_Sha512Hash(data, data_len, hash);
  545. #endif
  546. break;
  547. #ifndef WOLFSSL_NOSHA512_224
  548. case WC_HASH_TYPE_SHA512_224:
  549. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  550. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  551. ret = wc_Sha512_224Hash(data, data_len, hash);
  552. #endif
  553. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  554. break;
  555. #endif
  556. #ifndef WOLFSSL_NOSHA512_256
  557. case WC_HASH_TYPE_SHA512_256:
  558. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  559. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  560. ret = wc_Sha512_256Hash(data, data_len, hash);
  561. #endif
  562. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  563. break;
  564. #endif
  565. case WC_HASH_TYPE_MD5_SHA:
  566. #if !defined(NO_MD5) && !defined(NO_SHA)
  567. ret = wc_Md5Hash(data, data_len, hash);
  568. if (ret == 0) {
  569. ret = wc_ShaHash(data, data_len, &hash[WC_MD5_DIGEST_SIZE]);
  570. }
  571. #endif
  572. break;
  573. case WC_HASH_TYPE_SHA3_224:
  574. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  575. ret = wc_Sha3_224Hash(data, data_len, hash);
  576. #endif
  577. break;
  578. case WC_HASH_TYPE_SHA3_256:
  579. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  580. ret = wc_Sha3_256Hash(data, data_len, hash);
  581. #endif
  582. break;
  583. case WC_HASH_TYPE_SHA3_384:
  584. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  585. ret = wc_Sha3_384Hash(data, data_len, hash);
  586. #endif
  587. break;
  588. case WC_HASH_TYPE_SHA3_512:
  589. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  590. ret = wc_Sha3_512Hash(data, data_len, hash);
  591. #endif
  592. break;
  593. /* Not Supported */
  594. case WC_HASH_TYPE_MD2:
  595. case WC_HASH_TYPE_MD4:
  596. case WC_HASH_TYPE_BLAKE2B:
  597. case WC_HASH_TYPE_BLAKE2S:
  598. #ifndef WOLFSSL_NO_SHAKE256
  599. case WC_HASH_TYPE_SHAKE128:
  600. case WC_HASH_TYPE_SHAKE256:
  601. #endif
  602. case WC_HASH_TYPE_NONE:
  603. default:
  604. ret = BAD_FUNC_ARG;
  605. break;
  606. }
  607. return ret;
  608. }
  609. int wc_HashInit_ex(wc_HashAlg* hash, enum wc_HashType type, void* heap,
  610. int devId)
  611. {
  612. int ret = HASH_TYPE_E; /* Default to hash type error */
  613. if (hash == NULL)
  614. return BAD_FUNC_ARG;
  615. switch (type) {
  616. case WC_HASH_TYPE_MD5:
  617. #ifndef NO_MD5
  618. ret = wc_InitMd5_ex(&hash->md5, heap, devId);
  619. #endif
  620. break;
  621. case WC_HASH_TYPE_SHA:
  622. #ifndef NO_SHA
  623. ret = wc_InitSha_ex(&hash->sha, heap, devId);
  624. #endif
  625. break;
  626. case WC_HASH_TYPE_SHA224:
  627. #ifdef WOLFSSL_SHA224
  628. ret = wc_InitSha224_ex(&hash->sha224, heap, devId);
  629. #endif
  630. break;
  631. case WC_HASH_TYPE_SHA256:
  632. #ifndef NO_SHA256
  633. ret = wc_InitSha256_ex(&hash->sha256, heap, devId);
  634. #endif
  635. break;
  636. case WC_HASH_TYPE_SHA384:
  637. #ifdef WOLFSSL_SHA384
  638. ret = wc_InitSha384_ex(&hash->sha384, heap, devId);
  639. #endif
  640. break;
  641. case WC_HASH_TYPE_SHA512:
  642. #ifdef WOLFSSL_SHA512
  643. ret = wc_InitSha512_ex(&hash->sha512, heap, devId);
  644. #endif
  645. break;
  646. #ifndef WOLFSSL_NOSHA512_224
  647. case WC_HASH_TYPE_SHA512_224:
  648. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  649. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  650. ret = wc_InitSha512_224_ex(&hash->sha512, heap, devId);
  651. #endif
  652. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  653. break;
  654. #endif
  655. #ifndef WOLFSSL_NOSHA512_256
  656. case WC_HASH_TYPE_SHA512_256:
  657. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  658. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  659. ret = wc_InitSha512_256_ex(&hash->sha512, heap, devId);
  660. #endif
  661. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  662. break;
  663. #endif
  664. case WC_HASH_TYPE_SHA3_224:
  665. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  666. ret = wc_InitSha3_224(&hash->sha3, heap, devId);
  667. #endif
  668. break;
  669. case WC_HASH_TYPE_SHA3_256:
  670. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  671. ret = wc_InitSha3_256(&hash->sha3, heap, devId);
  672. #endif
  673. break;
  674. case WC_HASH_TYPE_SHA3_384:
  675. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  676. ret = wc_InitSha3_384(&hash->sha3, heap, devId);
  677. #endif
  678. break;
  679. case WC_HASH_TYPE_SHA3_512:
  680. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  681. ret = wc_InitSha3_512(&hash->sha3, heap, devId);
  682. #endif
  683. break;
  684. /* not supported */
  685. case WC_HASH_TYPE_MD5_SHA:
  686. case WC_HASH_TYPE_MD2:
  687. case WC_HASH_TYPE_MD4:
  688. case WC_HASH_TYPE_BLAKE2B:
  689. case WC_HASH_TYPE_BLAKE2S:
  690. #ifndef WOLFSSL_NO_SHAKE256
  691. case WC_HASH_TYPE_SHAKE128:
  692. case WC_HASH_TYPE_SHAKE256:
  693. #endif
  694. case WC_HASH_TYPE_NONE:
  695. default:
  696. ret = BAD_FUNC_ARG;
  697. };
  698. (void)heap;
  699. (void)devId;
  700. return ret;
  701. }
  702. int wc_HashInit(wc_HashAlg* hash, enum wc_HashType type)
  703. {
  704. return wc_HashInit_ex(hash, type, NULL, INVALID_DEVID);
  705. }
  706. int wc_HashUpdate(wc_HashAlg* hash, enum wc_HashType type, const byte* data,
  707. word32 dataSz)
  708. {
  709. int ret = HASH_TYPE_E; /* Default to hash type error */
  710. if (hash == NULL || (data == NULL && dataSz > 0))
  711. return BAD_FUNC_ARG;
  712. switch (type) {
  713. case WC_HASH_TYPE_MD5:
  714. #ifndef NO_MD5
  715. ret = wc_Md5Update(&hash->md5, data, dataSz);
  716. #endif
  717. break;
  718. case WC_HASH_TYPE_SHA:
  719. #ifndef NO_SHA
  720. ret = wc_ShaUpdate(&hash->sha, data, dataSz);
  721. #endif
  722. break;
  723. case WC_HASH_TYPE_SHA224:
  724. #ifdef WOLFSSL_SHA224
  725. ret = wc_Sha224Update(&hash->sha224, data, dataSz);
  726. #endif
  727. break;
  728. case WC_HASH_TYPE_SHA256:
  729. #ifndef NO_SHA256
  730. ret = wc_Sha256Update(&hash->sha256, data, dataSz);
  731. #endif
  732. break;
  733. case WC_HASH_TYPE_SHA384:
  734. #ifdef WOLFSSL_SHA384
  735. ret = wc_Sha384Update(&hash->sha384, data, dataSz);
  736. #endif
  737. break;
  738. case WC_HASH_TYPE_SHA512:
  739. #ifdef WOLFSSL_SHA512
  740. ret = wc_Sha512Update(&hash->sha512, data, dataSz);
  741. #endif
  742. break;
  743. #ifndef WOLFSSL_NOSHA512_224
  744. case WC_HASH_TYPE_SHA512_224:
  745. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  746. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  747. ret = wc_Sha512_224Update(&hash->sha512, data, dataSz);
  748. #endif
  749. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  750. break;
  751. #endif
  752. #ifndef WOLFSSL_NOSHA512_256
  753. case WC_HASH_TYPE_SHA512_256:
  754. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  755. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  756. ret = wc_Sha512_256Update(&hash->sha512, data, dataSz);
  757. #endif
  758. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  759. break;
  760. #endif
  761. case WC_HASH_TYPE_SHA3_224:
  762. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  763. ret = wc_Sha3_224_Update(&hash->sha3, data, dataSz);
  764. #endif
  765. break;
  766. case WC_HASH_TYPE_SHA3_256:
  767. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  768. ret = wc_Sha3_256_Update(&hash->sha3, data, dataSz);
  769. #endif
  770. break;
  771. case WC_HASH_TYPE_SHA3_384:
  772. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  773. ret = wc_Sha3_384_Update(&hash->sha3, data, dataSz);
  774. #endif
  775. break;
  776. case WC_HASH_TYPE_SHA3_512:
  777. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  778. ret = wc_Sha3_512_Update(&hash->sha3, data, dataSz);
  779. #endif
  780. break;
  781. /* not supported */
  782. case WC_HASH_TYPE_MD5_SHA:
  783. case WC_HASH_TYPE_MD2:
  784. case WC_HASH_TYPE_MD4:
  785. case WC_HASH_TYPE_BLAKE2B:
  786. case WC_HASH_TYPE_BLAKE2S:
  787. #ifndef WOLFSSL_NO_SHAKE256
  788. case WC_HASH_TYPE_SHAKE128:
  789. case WC_HASH_TYPE_SHAKE256:
  790. #endif
  791. case WC_HASH_TYPE_NONE:
  792. default:
  793. ret = BAD_FUNC_ARG;
  794. };
  795. return ret;
  796. }
  797. int wc_HashFinal(wc_HashAlg* hash, enum wc_HashType type, byte* out)
  798. {
  799. int ret = HASH_TYPE_E; /* Default to hash type error */
  800. if (hash == NULL || out == NULL)
  801. return BAD_FUNC_ARG;
  802. switch (type) {
  803. case WC_HASH_TYPE_MD5:
  804. #ifndef NO_MD5
  805. ret = wc_Md5Final(&hash->md5, out);
  806. #endif
  807. break;
  808. case WC_HASH_TYPE_SHA:
  809. #ifndef NO_SHA
  810. ret = wc_ShaFinal(&hash->sha, out);
  811. #endif
  812. break;
  813. case WC_HASH_TYPE_SHA224:
  814. #ifdef WOLFSSL_SHA224
  815. ret = wc_Sha224Final(&hash->sha224, out);
  816. #endif
  817. break;
  818. case WC_HASH_TYPE_SHA256:
  819. #ifndef NO_SHA256
  820. ret = wc_Sha256Final(&hash->sha256, out);
  821. #endif
  822. break;
  823. case WC_HASH_TYPE_SHA384:
  824. #ifdef WOLFSSL_SHA384
  825. ret = wc_Sha384Final(&hash->sha384, out);
  826. #endif
  827. break;
  828. case WC_HASH_TYPE_SHA512:
  829. #ifdef WOLFSSL_SHA512
  830. ret = wc_Sha512Final(&hash->sha512, out);
  831. #endif
  832. break;
  833. #ifndef WOLFSSL_NOSHA512_224
  834. case WC_HASH_TYPE_SHA512_224:
  835. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  836. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  837. ret = wc_Sha512_224Final(&hash->sha512, out);
  838. #endif
  839. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  840. break;
  841. #endif
  842. #ifndef WOLFSSL_NOSHA512_256
  843. case WC_HASH_TYPE_SHA512_256:
  844. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  845. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  846. ret = wc_Sha512_256Final(&hash->sha512, out);
  847. #endif
  848. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  849. break;
  850. #endif
  851. case WC_HASH_TYPE_SHA3_224:
  852. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  853. ret = wc_Sha3_224_Final(&hash->sha3, out);
  854. #endif
  855. break;
  856. case WC_HASH_TYPE_SHA3_256:
  857. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  858. ret = wc_Sha3_256_Final(&hash->sha3, out);
  859. #endif
  860. break;
  861. case WC_HASH_TYPE_SHA3_384:
  862. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  863. ret = wc_Sha3_384_Final(&hash->sha3, out);
  864. #endif
  865. break;
  866. case WC_HASH_TYPE_SHA3_512:
  867. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  868. ret = wc_Sha3_512_Final(&hash->sha3, out);
  869. #endif
  870. break;
  871. /* not supported */
  872. case WC_HASH_TYPE_MD5_SHA:
  873. case WC_HASH_TYPE_MD2:
  874. case WC_HASH_TYPE_MD4:
  875. case WC_HASH_TYPE_BLAKE2B:
  876. case WC_HASH_TYPE_BLAKE2S:
  877. #ifndef WOLFSSL_NO_SHAKE256
  878. case WC_HASH_TYPE_SHAKE128:
  879. case WC_HASH_TYPE_SHAKE256:
  880. #endif
  881. case WC_HASH_TYPE_NONE:
  882. default:
  883. ret = BAD_FUNC_ARG;
  884. };
  885. return ret;
  886. }
  887. int wc_HashFree(wc_HashAlg* hash, enum wc_HashType type)
  888. {
  889. int ret = HASH_TYPE_E; /* Default to hash type error */
  890. if (hash == NULL)
  891. return BAD_FUNC_ARG;
  892. switch (type) {
  893. case WC_HASH_TYPE_MD5:
  894. #ifndef NO_MD5
  895. wc_Md5Free(&hash->md5);
  896. ret = 0;
  897. #endif
  898. break;
  899. case WC_HASH_TYPE_SHA:
  900. #ifndef NO_SHA
  901. wc_ShaFree(&hash->sha);
  902. ret = 0;
  903. #endif
  904. break;
  905. case WC_HASH_TYPE_SHA224:
  906. #ifdef WOLFSSL_SHA224
  907. wc_Sha224Free(&hash->sha224);
  908. ret = 0;
  909. #endif
  910. break;
  911. case WC_HASH_TYPE_SHA256:
  912. #ifndef NO_SHA256
  913. wc_Sha256Free(&hash->sha256);
  914. ret = 0;
  915. #endif
  916. break;
  917. case WC_HASH_TYPE_SHA384:
  918. #ifdef WOLFSSL_SHA384
  919. wc_Sha384Free(&hash->sha384);
  920. ret = 0;
  921. #endif
  922. break;
  923. case WC_HASH_TYPE_SHA512:
  924. #ifdef WOLFSSL_SHA512
  925. wc_Sha512Free(&hash->sha512);
  926. ret = 0;
  927. #endif
  928. break;
  929. #ifndef WOLFSSL_NOSHA512_224
  930. case WC_HASH_TYPE_SHA512_224:
  931. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  932. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  933. wc_Sha512_224Free(&hash->sha512);
  934. ret = 0;
  935. #endif
  936. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  937. break;
  938. #endif
  939. #ifndef WOLFSSL_NOSHA512_256
  940. case WC_HASH_TYPE_SHA512_256:
  941. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  942. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  943. wc_Sha512_256Free(&hash->sha512);
  944. ret = 0;
  945. #endif
  946. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  947. break;
  948. #endif
  949. case WC_HASH_TYPE_SHA3_224:
  950. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  951. wc_Sha3_224_Free(&hash->sha3);
  952. ret = 0;
  953. #endif
  954. break;
  955. case WC_HASH_TYPE_SHA3_256:
  956. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  957. wc_Sha3_256_Free(&hash->sha3);
  958. ret = 0;
  959. #endif
  960. break;
  961. case WC_HASH_TYPE_SHA3_384:
  962. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  963. wc_Sha3_384_Free(&hash->sha3);
  964. ret = 0;
  965. #endif
  966. break;
  967. case WC_HASH_TYPE_SHA3_512:
  968. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  969. wc_Sha3_512_Free(&hash->sha3);
  970. ret = 0;
  971. #endif
  972. break;
  973. /* not supported */
  974. case WC_HASH_TYPE_MD5_SHA:
  975. case WC_HASH_TYPE_MD2:
  976. case WC_HASH_TYPE_MD4:
  977. case WC_HASH_TYPE_BLAKE2B:
  978. case WC_HASH_TYPE_BLAKE2S:
  979. #ifndef WOLFSSL_NO_SHAKE256
  980. case WC_HASH_TYPE_SHAKE128:
  981. case WC_HASH_TYPE_SHAKE256:
  982. #endif
  983. case WC_HASH_TYPE_NONE:
  984. default:
  985. ret = BAD_FUNC_ARG;
  986. };
  987. return ret;
  988. }
  989. #ifdef WOLFSSL_HASH_FLAGS
  990. int wc_HashSetFlags(wc_HashAlg* hash, enum wc_HashType type, word32 flags)
  991. {
  992. int ret = HASH_TYPE_E; /* Default to hash type error */
  993. if (hash == NULL)
  994. return BAD_FUNC_ARG;
  995. switch (type) {
  996. case WC_HASH_TYPE_MD5:
  997. #ifndef NO_MD5
  998. ret = wc_Md5SetFlags(&hash->md5, flags);
  999. #endif
  1000. break;
  1001. case WC_HASH_TYPE_SHA:
  1002. #ifndef NO_SHA
  1003. ret = wc_ShaSetFlags(&hash->sha, flags);
  1004. #endif
  1005. break;
  1006. case WC_HASH_TYPE_SHA224:
  1007. #ifdef WOLFSSL_SHA224
  1008. ret = wc_Sha224SetFlags(&hash->sha224, flags);
  1009. #endif
  1010. break;
  1011. case WC_HASH_TYPE_SHA256:
  1012. #ifndef NO_SHA256
  1013. ret = wc_Sha256SetFlags(&hash->sha256, flags);
  1014. #endif
  1015. break;
  1016. case WC_HASH_TYPE_SHA384:
  1017. #ifdef WOLFSSL_SHA384
  1018. ret = wc_Sha384SetFlags(&hash->sha384, flags);
  1019. #endif
  1020. break;
  1021. case WC_HASH_TYPE_SHA512:
  1022. #ifndef WOLFSSL_NOSHA512_224
  1023. case WC_HASH_TYPE_SHA512_224:
  1024. #endif
  1025. #ifndef WOLFSSL_NOSHA512_256
  1026. case WC_HASH_TYPE_SHA512_256:
  1027. #endif
  1028. #ifdef WOLFSSL_SHA512
  1029. ret = wc_Sha512SetFlags(&hash->sha512, flags);
  1030. #endif
  1031. break;
  1032. case WC_HASH_TYPE_SHA3_224:
  1033. case WC_HASH_TYPE_SHA3_256:
  1034. case WC_HASH_TYPE_SHA3_384:
  1035. case WC_HASH_TYPE_SHA3_512:
  1036. #ifdef WOLFSSL_SHA3
  1037. ret = wc_Sha3_SetFlags(&hash->sha3, flags);
  1038. #endif
  1039. break;
  1040. /* not supported */
  1041. case WC_HASH_TYPE_MD5_SHA:
  1042. case WC_HASH_TYPE_MD2:
  1043. case WC_HASH_TYPE_MD4:
  1044. case WC_HASH_TYPE_BLAKE2B:
  1045. case WC_HASH_TYPE_BLAKE2S:
  1046. case WC_HASH_TYPE_NONE:
  1047. #ifndef WOLFSSL_NO_SHAKE256
  1048. case WC_HASH_TYPE_SHAKE128:
  1049. case WC_HASH_TYPE_SHAKE256:
  1050. #endif
  1051. default:
  1052. ret = BAD_FUNC_ARG;
  1053. };
  1054. return ret;
  1055. }
  1056. int wc_HashGetFlags(wc_HashAlg* hash, enum wc_HashType type, word32* flags)
  1057. {
  1058. int ret = HASH_TYPE_E; /* Default to hash type error */
  1059. if (hash == NULL)
  1060. return BAD_FUNC_ARG;
  1061. switch (type) {
  1062. case WC_HASH_TYPE_MD5:
  1063. #ifndef NO_MD5
  1064. ret = wc_Md5GetFlags(&hash->md5, flags);
  1065. #endif
  1066. break;
  1067. case WC_HASH_TYPE_SHA:
  1068. #ifndef NO_SHA
  1069. ret = wc_ShaGetFlags(&hash->sha, flags);
  1070. #endif
  1071. break;
  1072. case WC_HASH_TYPE_SHA224:
  1073. #ifdef WOLFSSL_SHA224
  1074. ret = wc_Sha224GetFlags(&hash->sha224, flags);
  1075. #endif
  1076. break;
  1077. case WC_HASH_TYPE_SHA256:
  1078. #ifndef NO_SHA256
  1079. ret = wc_Sha256GetFlags(&hash->sha256, flags);
  1080. #endif
  1081. break;
  1082. case WC_HASH_TYPE_SHA384:
  1083. #ifdef WOLFSSL_SHA384
  1084. ret = wc_Sha384GetFlags(&hash->sha384, flags);
  1085. #endif
  1086. break;
  1087. case WC_HASH_TYPE_SHA512:
  1088. #ifndef WOLFSSL_NOSHA512_224
  1089. case WC_HASH_TYPE_SHA512_224:
  1090. #endif
  1091. #ifndef WOLFSSL_NOSHA512_256
  1092. case WC_HASH_TYPE_SHA512_256:
  1093. #endif
  1094. #ifdef WOLFSSL_SHA512
  1095. ret = wc_Sha512GetFlags(&hash->sha512, flags);
  1096. #endif
  1097. break;
  1098. case WC_HASH_TYPE_SHA3_224:
  1099. case WC_HASH_TYPE_SHA3_256:
  1100. case WC_HASH_TYPE_SHA3_384:
  1101. case WC_HASH_TYPE_SHA3_512:
  1102. #ifdef WOLFSSL_SHA3
  1103. ret = wc_Sha3_GetFlags(&hash->sha3, flags);
  1104. #endif
  1105. break;
  1106. /* not supported */
  1107. case WC_HASH_TYPE_MD5_SHA:
  1108. case WC_HASH_TYPE_MD2:
  1109. case WC_HASH_TYPE_MD4:
  1110. case WC_HASH_TYPE_BLAKE2B:
  1111. case WC_HASH_TYPE_BLAKE2S:
  1112. #ifndef WOLFSSL_NO_SHAKE256
  1113. case WC_HASH_TYPE_SHAKE128:
  1114. case WC_HASH_TYPE_SHAKE256:
  1115. #endif
  1116. case WC_HASH_TYPE_NONE:
  1117. default:
  1118. ret = BAD_FUNC_ARG;
  1119. };
  1120. return ret;
  1121. }
  1122. #endif /* WOLFSSL_HASH_FLAGS */
  1123. #if !defined(WOLFSSL_TI_HASH)
  1124. #if !defined(NO_MD5)
  1125. int wc_Md5Hash(const byte* data, word32 len, byte* hash)
  1126. {
  1127. int ret;
  1128. #ifdef WOLFSSL_SMALL_STACK
  1129. wc_Md5* md5;
  1130. #else
  1131. wc_Md5 md5[1];
  1132. #endif
  1133. #ifdef WOLFSSL_SMALL_STACK
  1134. md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1135. if (md5 == NULL)
  1136. return MEMORY_E;
  1137. #endif
  1138. if ((ret = wc_InitMd5(md5)) != 0) {
  1139. WOLFSSL_MSG("InitMd5 failed");
  1140. }
  1141. else {
  1142. if ((ret = wc_Md5Update(md5, data, len)) != 0) {
  1143. WOLFSSL_MSG("Md5Update failed");
  1144. }
  1145. else if ((ret = wc_Md5Final(md5, hash)) != 0) {
  1146. WOLFSSL_MSG("Md5Final failed");
  1147. }
  1148. wc_Md5Free(md5);
  1149. }
  1150. #ifdef WOLFSSL_SMALL_STACK
  1151. XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1152. #endif
  1153. return ret;
  1154. }
  1155. #endif /* !NO_MD5 */
  1156. #if !defined(NO_SHA)
  1157. int wc_ShaHash(const byte* data, word32 len, byte* hash)
  1158. {
  1159. int ret = 0;
  1160. #ifdef WOLFSSL_SMALL_STACK
  1161. wc_Sha* sha;
  1162. #else
  1163. wc_Sha sha[1];
  1164. #endif
  1165. int devId = INVALID_DEVID;
  1166. #ifdef WOLFSSL_SMALL_STACK
  1167. sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1168. if (sha == NULL)
  1169. return MEMORY_E;
  1170. #endif
  1171. #ifdef WOLF_CRYPTO_CB
  1172. /* only use devId if its not an empty hash */
  1173. if (data != NULL && len > 0)
  1174. devId = wc_CryptoCb_GetDevIdAtIndex(0);
  1175. #endif
  1176. if ((ret = wc_InitSha_ex(sha, NULL, devId)) != 0) {
  1177. WOLFSSL_MSG("InitSha failed");
  1178. }
  1179. else {
  1180. if ((ret = wc_ShaUpdate(sha, data, len)) != 0) {
  1181. WOLFSSL_MSG("ShaUpdate failed");
  1182. }
  1183. else if ((ret = wc_ShaFinal(sha, hash)) != 0) {
  1184. WOLFSSL_MSG("ShaFinal failed");
  1185. }
  1186. wc_ShaFree(sha);
  1187. }
  1188. #ifdef WOLFSSL_SMALL_STACK
  1189. XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1190. #endif
  1191. return ret;
  1192. }
  1193. #endif /* !NO_SHA */
  1194. #if defined(WOLFSSL_SHA224)
  1195. int wc_Sha224Hash(const byte* data, word32 len, byte* hash)
  1196. {
  1197. int ret = 0;
  1198. #ifdef WOLFSSL_SMALL_STACK
  1199. wc_Sha224* sha224;
  1200. #else
  1201. wc_Sha224 sha224[1];
  1202. #endif
  1203. #ifdef WOLFSSL_SMALL_STACK
  1204. sha224 = (wc_Sha224*)XMALLOC(sizeof(wc_Sha224), NULL,
  1205. DYNAMIC_TYPE_TMP_BUFFER);
  1206. if (sha224 == NULL)
  1207. return MEMORY_E;
  1208. #endif
  1209. if ((ret = wc_InitSha224(sha224)) != 0) {
  1210. WOLFSSL_MSG("InitSha224 failed");
  1211. }
  1212. else {
  1213. if ((ret = wc_Sha224Update(sha224, data, len)) != 0) {
  1214. WOLFSSL_MSG("Sha224Update failed");
  1215. }
  1216. else if ((ret = wc_Sha224Final(sha224, hash)) != 0) {
  1217. WOLFSSL_MSG("Sha224Final failed");
  1218. }
  1219. wc_Sha224Free(sha224);
  1220. }
  1221. #ifdef WOLFSSL_SMALL_STACK
  1222. XFREE(sha224, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1223. #endif
  1224. return ret;
  1225. }
  1226. #endif /* WOLFSSL_SHA224 */
  1227. #if !defined(NO_SHA256)
  1228. int wc_Sha256Hash(const byte* data, word32 len, byte* hash)
  1229. {
  1230. int ret = 0;
  1231. #ifdef WOLFSSL_SMALL_STACK
  1232. wc_Sha256* sha256;
  1233. #else
  1234. wc_Sha256 sha256[1];
  1235. #endif
  1236. int devId = INVALID_DEVID;
  1237. #ifdef WOLFSSL_SMALL_STACK
  1238. sha256 = (wc_Sha256*)XMALLOC(sizeof(wc_Sha256), NULL,
  1239. DYNAMIC_TYPE_TMP_BUFFER);
  1240. if (sha256 == NULL)
  1241. return MEMORY_E;
  1242. #endif
  1243. #ifdef WOLF_CRYPTO_CB
  1244. /* only use devId if its not an empty hash */
  1245. if (data != NULL && len > 0)
  1246. devId = wc_CryptoCb_GetDevIdAtIndex(0);
  1247. #endif
  1248. if ((ret = wc_InitSha256_ex(sha256, NULL, devId)) != 0) {
  1249. WOLFSSL_MSG("InitSha256 failed");
  1250. }
  1251. else {
  1252. if ((ret = wc_Sha256Update(sha256, data, len)) != 0) {
  1253. WOLFSSL_MSG("Sha256Update failed");
  1254. }
  1255. else if ((ret = wc_Sha256Final(sha256, hash)) != 0) {
  1256. WOLFSSL_MSG("Sha256Final failed");
  1257. }
  1258. wc_Sha256Free(sha256);
  1259. }
  1260. #ifdef WOLFSSL_SMALL_STACK
  1261. XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1262. #endif
  1263. return ret;
  1264. }
  1265. #endif /* !NO_SHA256 */
  1266. #endif /* !defined(WOLFSSL_TI_HASH) */
  1267. #if defined(WOLFSSL_SHA512)
  1268. int wc_Sha512Hash(const byte* data, word32 len, byte* hash)
  1269. {
  1270. int ret = 0;
  1271. #ifdef WOLFSSL_SMALL_STACK
  1272. wc_Sha512* sha512;
  1273. #else
  1274. wc_Sha512 sha512[1];
  1275. #endif
  1276. #ifdef WOLFSSL_SMALL_STACK
  1277. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1278. DYNAMIC_TYPE_TMP_BUFFER);
  1279. if (sha512 == NULL)
  1280. return MEMORY_E;
  1281. #endif
  1282. if ((ret = wc_InitSha512(sha512)) != 0) {
  1283. WOLFSSL_MSG("InitSha512 failed");
  1284. }
  1285. else {
  1286. if ((ret = wc_Sha512Update(sha512, data, len)) != 0) {
  1287. WOLFSSL_MSG("Sha512Update failed");
  1288. }
  1289. else if ((ret = wc_Sha512Final(sha512, hash)) != 0) {
  1290. WOLFSSL_MSG("Sha512Final failed");
  1291. }
  1292. wc_Sha512Free(sha512);
  1293. }
  1294. #ifdef WOLFSSL_SMALL_STACK
  1295. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1296. #endif
  1297. return ret;
  1298. }
  1299. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  1300. #ifndef WOLFSSL_NOSHA512_224
  1301. int wc_Sha512_224Hash(const byte* data, word32 len, byte* hash)
  1302. {
  1303. int ret = 0;
  1304. #ifdef WOLFSSL_SMALL_STACK
  1305. wc_Sha512* sha512;
  1306. #else
  1307. wc_Sha512 sha512[1];
  1308. #endif
  1309. #ifdef WOLFSSL_SMALL_STACK
  1310. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1311. DYNAMIC_TYPE_TMP_BUFFER);
  1312. if (sha512 == NULL)
  1313. return MEMORY_E;
  1314. #endif
  1315. if ((ret = wc_InitSha512_224(sha512)) != 0) {
  1316. WOLFSSL_MSG("wc_InitSha512_224 failed");
  1317. }
  1318. else {
  1319. if ((ret = wc_Sha512_224Update(sha512, data, len)) != 0) {
  1320. WOLFSSL_MSG("wc_Sha512_224_Update failed");
  1321. }
  1322. else if ((ret = wc_Sha512_224Final(sha512, hash)) != 0) {
  1323. WOLFSSL_MSG("wc_Sha512_224_Final failed");
  1324. }
  1325. wc_Sha512_224Free(sha512);
  1326. }
  1327. #ifdef WOLFSSL_SMALL_STACK
  1328. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1329. #endif
  1330. return ret;
  1331. }
  1332. #endif /* !WOLFSSL_NOSHA512_224 */
  1333. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  1334. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  1335. #ifndef WOLFSSL_NOSHA512_256
  1336. int wc_Sha512_256Hash(const byte* data, word32 len, byte* hash)
  1337. {
  1338. int ret = 0;
  1339. #ifdef WOLFSSL_SMALL_STACK
  1340. wc_Sha512* sha512;
  1341. #else
  1342. wc_Sha512 sha512[1];
  1343. #endif
  1344. #ifdef WOLFSSL_SMALL_STACK
  1345. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1346. DYNAMIC_TYPE_TMP_BUFFER);
  1347. if (sha512 == NULL)
  1348. return MEMORY_E;
  1349. #endif
  1350. if ((ret = wc_InitSha512_256(sha512)) != 0) {
  1351. WOLFSSL_MSG("wc_InitSha512_256 failed");
  1352. }
  1353. else {
  1354. if ((ret = wc_Sha512_256Update(sha512, data, len)) != 0) {
  1355. WOLFSSL_MSG("wc_Sha512_256_Update failed");
  1356. }
  1357. else if ((ret = wc_Sha512_256Final(sha512, hash)) != 0) {
  1358. WOLFSSL_MSG("wc_Sha512_256_Final failed");
  1359. }
  1360. wc_Sha512_256Free(sha512);
  1361. }
  1362. #ifdef WOLFSSL_SMALL_STACK
  1363. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1364. #endif
  1365. return ret;
  1366. }
  1367. #endif /* !WOLFSSL_NOSHA512_256 */
  1368. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  1369. #endif /* WOLFSSL_SHA512 */
  1370. #if defined(WOLFSSL_SHA384)
  1371. int wc_Sha384Hash(const byte* data, word32 len, byte* hash)
  1372. {
  1373. int ret = 0;
  1374. #ifdef WOLFSSL_SMALL_STACK
  1375. wc_Sha384* sha384;
  1376. #else
  1377. wc_Sha384 sha384[1];
  1378. #endif
  1379. #ifdef WOLFSSL_SMALL_STACK
  1380. sha384 = (wc_Sha384*)XMALLOC(sizeof(wc_Sha384), NULL,
  1381. DYNAMIC_TYPE_TMP_BUFFER);
  1382. if (sha384 == NULL)
  1383. return MEMORY_E;
  1384. #endif
  1385. if ((ret = wc_InitSha384(sha384)) != 0) {
  1386. WOLFSSL_MSG("InitSha384 failed");
  1387. }
  1388. else {
  1389. if ((ret = wc_Sha384Update(sha384, data, len)) != 0) {
  1390. WOLFSSL_MSG("Sha384Update failed");
  1391. }
  1392. else if ((ret = wc_Sha384Final(sha384, hash)) != 0) {
  1393. WOLFSSL_MSG("Sha384Final failed");
  1394. }
  1395. wc_Sha384Free(sha384);
  1396. }
  1397. #ifdef WOLFSSL_SMALL_STACK
  1398. XFREE(sha384, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1399. #endif
  1400. return ret;
  1401. }
  1402. #endif /* WOLFSSL_SHA384 */
  1403. #if defined(WOLFSSL_SHA3)
  1404. #if !defined(WOLFSSL_NOSHA3_224)
  1405. int wc_Sha3_224Hash(const byte* data, word32 len, byte* hash)
  1406. {
  1407. int ret = 0;
  1408. #ifdef WOLFSSL_SMALL_STACK
  1409. wc_Sha3* sha3;
  1410. #else
  1411. wc_Sha3 sha3[1];
  1412. #endif
  1413. #ifdef WOLFSSL_SMALL_STACK
  1414. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1415. DYNAMIC_TYPE_TMP_BUFFER);
  1416. if (sha3 == NULL)
  1417. return MEMORY_E;
  1418. #endif
  1419. if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) {
  1420. WOLFSSL_MSG("InitSha3_224 failed");
  1421. }
  1422. else {
  1423. if ((ret = wc_Sha3_224_Update(sha3, data, len)) != 0) {
  1424. WOLFSSL_MSG("Sha3_224_Update failed");
  1425. }
  1426. else if ((ret = wc_Sha3_224_Final(sha3, hash)) != 0) {
  1427. WOLFSSL_MSG("Sha3_224_Final failed");
  1428. }
  1429. wc_Sha3_224_Free(sha3);
  1430. }
  1431. #ifdef WOLFSSL_SMALL_STACK
  1432. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1433. #endif
  1434. return ret;
  1435. }
  1436. #endif /* !WOLFSSL_NOSHA3_224 */
  1437. #if !defined(WOLFSSL_NOSHA3_256)
  1438. int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash)
  1439. {
  1440. int ret = 0;
  1441. #ifdef WOLFSSL_SMALL_STACK
  1442. wc_Sha3* sha3;
  1443. #else
  1444. wc_Sha3 sha3[1];
  1445. #endif
  1446. #ifdef WOLFSSL_SMALL_STACK
  1447. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1448. DYNAMIC_TYPE_TMP_BUFFER);
  1449. if (sha3 == NULL)
  1450. return MEMORY_E;
  1451. #endif
  1452. if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) {
  1453. WOLFSSL_MSG("InitSha3_256 failed");
  1454. }
  1455. else {
  1456. if ((ret = wc_Sha3_256_Update(sha3, data, len)) != 0) {
  1457. WOLFSSL_MSG("Sha3_256_Update failed");
  1458. }
  1459. else if ((ret = wc_Sha3_256_Final(sha3, hash)) != 0) {
  1460. WOLFSSL_MSG("Sha3_256_Final failed");
  1461. }
  1462. wc_Sha3_256_Free(sha3);
  1463. }
  1464. #ifdef WOLFSSL_SMALL_STACK
  1465. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1466. #endif
  1467. return ret;
  1468. }
  1469. #endif /* !WOLFSSL_NOSHA3_256 */
  1470. #if !defined(WOLFSSL_NOSHA3_384)
  1471. int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash)
  1472. {
  1473. int ret = 0;
  1474. #ifdef WOLFSSL_SMALL_STACK
  1475. wc_Sha3* sha3;
  1476. #else
  1477. wc_Sha3 sha3[1];
  1478. #endif
  1479. #ifdef WOLFSSL_SMALL_STACK
  1480. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1481. DYNAMIC_TYPE_TMP_BUFFER);
  1482. if (sha3 == NULL)
  1483. return MEMORY_E;
  1484. #endif
  1485. if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) {
  1486. WOLFSSL_MSG("InitSha3_384 failed");
  1487. }
  1488. else {
  1489. if ((ret = wc_Sha3_384_Update(sha3, data, len)) != 0) {
  1490. WOLFSSL_MSG("Sha3_384_Update failed");
  1491. }
  1492. else if ((ret = wc_Sha3_384_Final(sha3, hash)) != 0) {
  1493. WOLFSSL_MSG("Sha3_384_Final failed");
  1494. }
  1495. wc_Sha3_384_Free(sha3);
  1496. }
  1497. #ifdef WOLFSSL_SMALL_STACK
  1498. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1499. #endif
  1500. return ret;
  1501. }
  1502. #endif /* !WOLFSSL_NOSHA3_384 */
  1503. #if !defined(WOLFSSL_NOSHA3_512)
  1504. int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash)
  1505. {
  1506. int ret = 0;
  1507. #ifdef WOLFSSL_SMALL_STACK
  1508. wc_Sha3* sha3;
  1509. #else
  1510. wc_Sha3 sha3[1];
  1511. #endif
  1512. #ifdef WOLFSSL_SMALL_STACK
  1513. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1514. DYNAMIC_TYPE_TMP_BUFFER);
  1515. if (sha3 == NULL)
  1516. return MEMORY_E;
  1517. #endif
  1518. if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) {
  1519. WOLFSSL_MSG("InitSha3_512 failed");
  1520. }
  1521. else {
  1522. if ((ret = wc_Sha3_512_Update(sha3, data, len)) != 0) {
  1523. WOLFSSL_MSG("Sha3_512_Update failed");
  1524. }
  1525. else if ((ret = wc_Sha3_512_Final(sha3, hash)) != 0) {
  1526. WOLFSSL_MSG("Sha3_512_Final failed");
  1527. }
  1528. wc_Sha3_512_Free(sha3);
  1529. }
  1530. #ifdef WOLFSSL_SMALL_STACK
  1531. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1532. #endif
  1533. return ret;
  1534. }
  1535. #endif /* !WOLFSSL_NOSHA3_512 */
  1536. #ifdef WOLFSSL_SHAKE256
  1537. int wc_Shake256Hash(const byte* data, word32 len, byte* hash,
  1538. word32 hashLen)
  1539. {
  1540. int ret = 0;
  1541. #ifdef WOLFSSL_SMALL_STACK
  1542. wc_Shake* shake;
  1543. #else
  1544. wc_Shake shake[1];
  1545. #endif
  1546. #ifdef WOLFSSL_SMALL_STACK
  1547. shake = (wc_Shake*)XMALLOC(sizeof(wc_Shake), NULL,
  1548. DYNAMIC_TYPE_TMP_BUFFER);
  1549. if (shake == NULL)
  1550. return MEMORY_E;
  1551. #endif
  1552. if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) {
  1553. WOLFSSL_MSG("InitShake256 failed");
  1554. }
  1555. else {
  1556. if ((ret = wc_Shake256_Update(shake, data, len)) != 0) {
  1557. WOLFSSL_MSG("Shake256_Update failed");
  1558. }
  1559. else if ((ret = wc_Shake256_Final(shake, hash, hashLen)) != 0) {
  1560. WOLFSSL_MSG("Shake256_Final failed");
  1561. }
  1562. wc_Shake256_Free(shake);
  1563. }
  1564. #ifdef WOLFSSL_SMALL_STACK
  1565. XFREE(shake, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1566. #endif
  1567. return ret;
  1568. }
  1569. #endif /* WOLFSSL_SHAKE_256 */
  1570. #endif /* WOLFSSL_SHA3 */
  1571. #endif /* !NO_HASH_WRAPPER */