hash.c 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794
  1. /* hash.c
  2. *
  3. * Copyright (C) 2006-2023 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. int dig_size;
  507. /* Validate hash buffer size */
  508. dig_size = wc_HashGetDigestSize(hash_type);
  509. if (dig_size < 0) {
  510. return dig_size;
  511. }
  512. if (hash_len < (word32)dig_size) {
  513. return BUFFER_E;
  514. }
  515. /* Suppress possible unused arg if all hashing is disabled */
  516. (void)data;
  517. (void)data_len;
  518. (void)hash;
  519. (void)hash_len;
  520. switch(hash_type)
  521. {
  522. case WC_HASH_TYPE_MD5:
  523. #ifndef NO_MD5
  524. ret = wc_Md5Hash(data, data_len, hash);
  525. #endif
  526. break;
  527. case WC_HASH_TYPE_SHA:
  528. #ifndef NO_SHA
  529. ret = wc_ShaHash(data, data_len, hash);
  530. #endif
  531. break;
  532. case WC_HASH_TYPE_SHA224:
  533. #ifdef WOLFSSL_SHA224
  534. ret = wc_Sha224Hash(data, data_len, hash);
  535. #endif
  536. break;
  537. case WC_HASH_TYPE_SHA256:
  538. #ifndef NO_SHA256
  539. ret = wc_Sha256Hash(data, data_len, hash);
  540. #endif
  541. break;
  542. case WC_HASH_TYPE_SHA384:
  543. #ifdef WOLFSSL_SHA384
  544. ret = wc_Sha384Hash(data, data_len, hash);
  545. #endif
  546. break;
  547. case WC_HASH_TYPE_SHA512:
  548. #ifdef WOLFSSL_SHA512
  549. ret = wc_Sha512Hash(data, data_len, hash);
  550. #endif
  551. break;
  552. #ifndef WOLFSSL_NOSHA512_224
  553. case WC_HASH_TYPE_SHA512_224:
  554. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  555. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  556. ret = wc_Sha512_224Hash(data, data_len, hash);
  557. #endif
  558. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  559. break;
  560. #endif
  561. #ifndef WOLFSSL_NOSHA512_256
  562. case WC_HASH_TYPE_SHA512_256:
  563. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  564. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  565. ret = wc_Sha512_256Hash(data, data_len, hash);
  566. #endif
  567. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  568. break;
  569. #endif
  570. case WC_HASH_TYPE_MD5_SHA:
  571. #if !defined(NO_MD5) && !defined(NO_SHA)
  572. ret = wc_Md5Hash(data, data_len, hash);
  573. if (ret == 0) {
  574. ret = wc_ShaHash(data, data_len, &hash[WC_MD5_DIGEST_SIZE]);
  575. }
  576. #endif
  577. break;
  578. case WC_HASH_TYPE_SHA3_224:
  579. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  580. ret = wc_Sha3_224Hash(data, data_len, hash);
  581. #endif
  582. break;
  583. case WC_HASH_TYPE_SHA3_256:
  584. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  585. ret = wc_Sha3_256Hash(data, data_len, hash);
  586. #endif
  587. break;
  588. case WC_HASH_TYPE_SHA3_384:
  589. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  590. ret = wc_Sha3_384Hash(data, data_len, hash);
  591. #endif
  592. break;
  593. case WC_HASH_TYPE_SHA3_512:
  594. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  595. ret = wc_Sha3_512Hash(data, data_len, hash);
  596. #endif
  597. break;
  598. /* Not Supported */
  599. case WC_HASH_TYPE_MD2:
  600. case WC_HASH_TYPE_MD4:
  601. case WC_HASH_TYPE_BLAKE2B:
  602. case WC_HASH_TYPE_BLAKE2S:
  603. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  604. case WC_HASH_TYPE_SHAKE128:
  605. #endif
  606. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  607. case WC_HASH_TYPE_SHAKE256:
  608. #endif
  609. case WC_HASH_TYPE_NONE:
  610. default:
  611. ret = BAD_FUNC_ARG;
  612. break;
  613. }
  614. return ret;
  615. }
  616. int wc_HashInit_ex(wc_HashAlg* hash, enum wc_HashType type, void* heap,
  617. int devId)
  618. {
  619. int ret = HASH_TYPE_E; /* Default to hash type error */
  620. if (hash == NULL)
  621. return BAD_FUNC_ARG;
  622. switch (type) {
  623. case WC_HASH_TYPE_MD5:
  624. #ifndef NO_MD5
  625. ret = wc_InitMd5_ex(&hash->md5, heap, devId);
  626. #endif
  627. break;
  628. case WC_HASH_TYPE_SHA:
  629. #ifndef NO_SHA
  630. ret = wc_InitSha_ex(&hash->sha, heap, devId);
  631. #endif
  632. break;
  633. case WC_HASH_TYPE_SHA224:
  634. #ifdef WOLFSSL_SHA224
  635. ret = wc_InitSha224_ex(&hash->sha224, heap, devId);
  636. #endif
  637. break;
  638. case WC_HASH_TYPE_SHA256:
  639. #ifndef NO_SHA256
  640. ret = wc_InitSha256_ex(&hash->sha256, heap, devId);
  641. #endif
  642. break;
  643. case WC_HASH_TYPE_SHA384:
  644. #ifdef WOLFSSL_SHA384
  645. ret = wc_InitSha384_ex(&hash->sha384, heap, devId);
  646. #endif
  647. break;
  648. case WC_HASH_TYPE_SHA512:
  649. #ifdef WOLFSSL_SHA512
  650. ret = wc_InitSha512_ex(&hash->sha512, heap, devId);
  651. #endif
  652. break;
  653. #ifndef WOLFSSL_NOSHA512_224
  654. case WC_HASH_TYPE_SHA512_224:
  655. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  656. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  657. ret = wc_InitSha512_224_ex(&hash->sha512, heap, devId);
  658. #endif
  659. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  660. break;
  661. #endif
  662. #ifndef WOLFSSL_NOSHA512_256
  663. case WC_HASH_TYPE_SHA512_256:
  664. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  665. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  666. ret = wc_InitSha512_256_ex(&hash->sha512, heap, devId);
  667. #endif
  668. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  669. break;
  670. #endif
  671. case WC_HASH_TYPE_SHA3_224:
  672. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  673. ret = wc_InitSha3_224(&hash->sha3, heap, devId);
  674. #endif
  675. break;
  676. case WC_HASH_TYPE_SHA3_256:
  677. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  678. ret = wc_InitSha3_256(&hash->sha3, heap, devId);
  679. #endif
  680. break;
  681. case WC_HASH_TYPE_SHA3_384:
  682. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  683. ret = wc_InitSha3_384(&hash->sha3, heap, devId);
  684. #endif
  685. break;
  686. case WC_HASH_TYPE_SHA3_512:
  687. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  688. ret = wc_InitSha3_512(&hash->sha3, heap, devId);
  689. #endif
  690. break;
  691. /* not supported */
  692. case WC_HASH_TYPE_MD5_SHA:
  693. case WC_HASH_TYPE_MD2:
  694. case WC_HASH_TYPE_MD4:
  695. case WC_HASH_TYPE_BLAKE2B:
  696. case WC_HASH_TYPE_BLAKE2S:
  697. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  698. case WC_HASH_TYPE_SHAKE128:
  699. #endif
  700. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  701. case WC_HASH_TYPE_SHAKE256:
  702. #endif
  703. case WC_HASH_TYPE_NONE:
  704. default:
  705. ret = BAD_FUNC_ARG;
  706. };
  707. (void)heap;
  708. (void)devId;
  709. return ret;
  710. }
  711. int wc_HashInit(wc_HashAlg* hash, enum wc_HashType type)
  712. {
  713. return wc_HashInit_ex(hash, type, NULL, INVALID_DEVID);
  714. }
  715. int wc_HashUpdate(wc_HashAlg* hash, enum wc_HashType type, const byte* data,
  716. word32 dataSz)
  717. {
  718. int ret = HASH_TYPE_E; /* Default to hash type error */
  719. if (hash == NULL || (data == NULL && dataSz > 0))
  720. return BAD_FUNC_ARG;
  721. switch (type) {
  722. case WC_HASH_TYPE_MD5:
  723. #ifndef NO_MD5
  724. ret = wc_Md5Update(&hash->md5, data, dataSz);
  725. #endif
  726. break;
  727. case WC_HASH_TYPE_SHA:
  728. #ifndef NO_SHA
  729. ret = wc_ShaUpdate(&hash->sha, data, dataSz);
  730. #endif
  731. break;
  732. case WC_HASH_TYPE_SHA224:
  733. #ifdef WOLFSSL_SHA224
  734. ret = wc_Sha224Update(&hash->sha224, data, dataSz);
  735. #endif
  736. break;
  737. case WC_HASH_TYPE_SHA256:
  738. #ifndef NO_SHA256
  739. ret = wc_Sha256Update(&hash->sha256, data, dataSz);
  740. #endif
  741. break;
  742. case WC_HASH_TYPE_SHA384:
  743. #ifdef WOLFSSL_SHA384
  744. ret = wc_Sha384Update(&hash->sha384, data, dataSz);
  745. #endif
  746. break;
  747. case WC_HASH_TYPE_SHA512:
  748. #ifdef WOLFSSL_SHA512
  749. ret = wc_Sha512Update(&hash->sha512, data, dataSz);
  750. #endif
  751. break;
  752. #ifndef WOLFSSL_NOSHA512_224
  753. case WC_HASH_TYPE_SHA512_224:
  754. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  755. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  756. ret = wc_Sha512_224Update(&hash->sha512, data, dataSz);
  757. #endif
  758. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  759. break;
  760. #endif
  761. #ifndef WOLFSSL_NOSHA512_256
  762. case WC_HASH_TYPE_SHA512_256:
  763. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  764. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  765. ret = wc_Sha512_256Update(&hash->sha512, data, dataSz);
  766. #endif
  767. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  768. break;
  769. #endif
  770. case WC_HASH_TYPE_SHA3_224:
  771. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  772. ret = wc_Sha3_224_Update(&hash->sha3, data, dataSz);
  773. #endif
  774. break;
  775. case WC_HASH_TYPE_SHA3_256:
  776. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  777. ret = wc_Sha3_256_Update(&hash->sha3, data, dataSz);
  778. #endif
  779. break;
  780. case WC_HASH_TYPE_SHA3_384:
  781. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  782. ret = wc_Sha3_384_Update(&hash->sha3, data, dataSz);
  783. #endif
  784. break;
  785. case WC_HASH_TYPE_SHA3_512:
  786. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  787. ret = wc_Sha3_512_Update(&hash->sha3, data, dataSz);
  788. #endif
  789. break;
  790. /* not supported */
  791. case WC_HASH_TYPE_MD5_SHA:
  792. case WC_HASH_TYPE_MD2:
  793. case WC_HASH_TYPE_MD4:
  794. case WC_HASH_TYPE_BLAKE2B:
  795. case WC_HASH_TYPE_BLAKE2S:
  796. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  797. case WC_HASH_TYPE_SHAKE128:
  798. #endif
  799. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  800. case WC_HASH_TYPE_SHAKE256:
  801. #endif
  802. case WC_HASH_TYPE_NONE:
  803. default:
  804. ret = BAD_FUNC_ARG;
  805. };
  806. return ret;
  807. }
  808. int wc_HashFinal(wc_HashAlg* hash, enum wc_HashType type, byte* out)
  809. {
  810. int ret = HASH_TYPE_E; /* Default to hash type error */
  811. if (hash == NULL || out == NULL)
  812. return BAD_FUNC_ARG;
  813. switch (type) {
  814. case WC_HASH_TYPE_MD5:
  815. #ifndef NO_MD5
  816. ret = wc_Md5Final(&hash->md5, out);
  817. #endif
  818. break;
  819. case WC_HASH_TYPE_SHA:
  820. #ifndef NO_SHA
  821. ret = wc_ShaFinal(&hash->sha, out);
  822. #endif
  823. break;
  824. case WC_HASH_TYPE_SHA224:
  825. #ifdef WOLFSSL_SHA224
  826. ret = wc_Sha224Final(&hash->sha224, out);
  827. #endif
  828. break;
  829. case WC_HASH_TYPE_SHA256:
  830. #ifndef NO_SHA256
  831. ret = wc_Sha256Final(&hash->sha256, out);
  832. #endif
  833. break;
  834. case WC_HASH_TYPE_SHA384:
  835. #ifdef WOLFSSL_SHA384
  836. ret = wc_Sha384Final(&hash->sha384, out);
  837. #endif
  838. break;
  839. case WC_HASH_TYPE_SHA512:
  840. #ifdef WOLFSSL_SHA512
  841. ret = wc_Sha512Final(&hash->sha512, out);
  842. #endif
  843. break;
  844. #ifndef WOLFSSL_NOSHA512_224
  845. case WC_HASH_TYPE_SHA512_224:
  846. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  847. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  848. ret = wc_Sha512_224Final(&hash->sha512, out);
  849. #endif
  850. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  851. break;
  852. #endif
  853. #ifndef WOLFSSL_NOSHA512_256
  854. case WC_HASH_TYPE_SHA512_256:
  855. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  856. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  857. ret = wc_Sha512_256Final(&hash->sha512, out);
  858. #endif
  859. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  860. break;
  861. #endif
  862. case WC_HASH_TYPE_SHA3_224:
  863. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  864. ret = wc_Sha3_224_Final(&hash->sha3, out);
  865. #endif
  866. break;
  867. case WC_HASH_TYPE_SHA3_256:
  868. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  869. ret = wc_Sha3_256_Final(&hash->sha3, out);
  870. #endif
  871. break;
  872. case WC_HASH_TYPE_SHA3_384:
  873. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  874. ret = wc_Sha3_384_Final(&hash->sha3, out);
  875. #endif
  876. break;
  877. case WC_HASH_TYPE_SHA3_512:
  878. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  879. ret = wc_Sha3_512_Final(&hash->sha3, out);
  880. #endif
  881. break;
  882. /* not supported */
  883. case WC_HASH_TYPE_MD5_SHA:
  884. case WC_HASH_TYPE_MD2:
  885. case WC_HASH_TYPE_MD4:
  886. case WC_HASH_TYPE_BLAKE2B:
  887. case WC_HASH_TYPE_BLAKE2S:
  888. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  889. case WC_HASH_TYPE_SHAKE128:
  890. #endif
  891. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  892. case WC_HASH_TYPE_SHAKE256:
  893. #endif
  894. case WC_HASH_TYPE_NONE:
  895. default:
  896. ret = BAD_FUNC_ARG;
  897. };
  898. return ret;
  899. }
  900. int wc_HashFree(wc_HashAlg* hash, enum wc_HashType type)
  901. {
  902. int ret = HASH_TYPE_E; /* Default to hash type error */
  903. if (hash == NULL)
  904. return BAD_FUNC_ARG;
  905. switch (type) {
  906. case WC_HASH_TYPE_MD5:
  907. #ifndef NO_MD5
  908. wc_Md5Free(&hash->md5);
  909. ret = 0;
  910. #endif
  911. break;
  912. case WC_HASH_TYPE_SHA:
  913. #ifndef NO_SHA
  914. wc_ShaFree(&hash->sha);
  915. ret = 0;
  916. #endif
  917. break;
  918. case WC_HASH_TYPE_SHA224:
  919. #ifdef WOLFSSL_SHA224
  920. wc_Sha224Free(&hash->sha224);
  921. ret = 0;
  922. #endif
  923. break;
  924. case WC_HASH_TYPE_SHA256:
  925. #ifndef NO_SHA256
  926. wc_Sha256Free(&hash->sha256);
  927. ret = 0;
  928. #endif
  929. break;
  930. case WC_HASH_TYPE_SHA384:
  931. #ifdef WOLFSSL_SHA384
  932. wc_Sha384Free(&hash->sha384);
  933. ret = 0;
  934. #endif
  935. break;
  936. case WC_HASH_TYPE_SHA512:
  937. #ifdef WOLFSSL_SHA512
  938. wc_Sha512Free(&hash->sha512);
  939. ret = 0;
  940. #endif
  941. break;
  942. #ifndef WOLFSSL_NOSHA512_224
  943. case WC_HASH_TYPE_SHA512_224:
  944. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  945. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  946. wc_Sha512_224Free(&hash->sha512);
  947. ret = 0;
  948. #endif
  949. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  950. break;
  951. #endif
  952. #ifndef WOLFSSL_NOSHA512_256
  953. case WC_HASH_TYPE_SHA512_256:
  954. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  955. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  956. wc_Sha512_256Free(&hash->sha512);
  957. ret = 0;
  958. #endif
  959. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  960. break;
  961. #endif
  962. case WC_HASH_TYPE_SHA3_224:
  963. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  964. wc_Sha3_224_Free(&hash->sha3);
  965. ret = 0;
  966. #endif
  967. break;
  968. case WC_HASH_TYPE_SHA3_256:
  969. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  970. wc_Sha3_256_Free(&hash->sha3);
  971. ret = 0;
  972. #endif
  973. break;
  974. case WC_HASH_TYPE_SHA3_384:
  975. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  976. wc_Sha3_384_Free(&hash->sha3);
  977. ret = 0;
  978. #endif
  979. break;
  980. case WC_HASH_TYPE_SHA3_512:
  981. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  982. wc_Sha3_512_Free(&hash->sha3);
  983. ret = 0;
  984. #endif
  985. break;
  986. /* not supported */
  987. case WC_HASH_TYPE_MD5_SHA:
  988. case WC_HASH_TYPE_MD2:
  989. case WC_HASH_TYPE_MD4:
  990. case WC_HASH_TYPE_BLAKE2B:
  991. case WC_HASH_TYPE_BLAKE2S:
  992. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  993. case WC_HASH_TYPE_SHAKE128:
  994. #endif
  995. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  996. case WC_HASH_TYPE_SHAKE256:
  997. #endif
  998. case WC_HASH_TYPE_NONE:
  999. default:
  1000. ret = BAD_FUNC_ARG;
  1001. };
  1002. return ret;
  1003. }
  1004. #ifdef WOLFSSL_HASH_FLAGS
  1005. int wc_HashSetFlags(wc_HashAlg* hash, enum wc_HashType type, word32 flags)
  1006. {
  1007. int ret = HASH_TYPE_E; /* Default to hash type error */
  1008. if (hash == NULL)
  1009. return BAD_FUNC_ARG;
  1010. switch (type) {
  1011. case WC_HASH_TYPE_MD5:
  1012. #ifndef NO_MD5
  1013. ret = wc_Md5SetFlags(&hash->md5, flags);
  1014. #endif
  1015. break;
  1016. case WC_HASH_TYPE_SHA:
  1017. #ifndef NO_SHA
  1018. ret = wc_ShaSetFlags(&hash->sha, flags);
  1019. #endif
  1020. break;
  1021. case WC_HASH_TYPE_SHA224:
  1022. #ifdef WOLFSSL_SHA224
  1023. ret = wc_Sha224SetFlags(&hash->sha224, flags);
  1024. #endif
  1025. break;
  1026. case WC_HASH_TYPE_SHA256:
  1027. #ifndef NO_SHA256
  1028. ret = wc_Sha256SetFlags(&hash->sha256, flags);
  1029. #endif
  1030. break;
  1031. case WC_HASH_TYPE_SHA384:
  1032. #ifdef WOLFSSL_SHA384
  1033. ret = wc_Sha384SetFlags(&hash->sha384, flags);
  1034. #endif
  1035. break;
  1036. case WC_HASH_TYPE_SHA512:
  1037. #ifndef WOLFSSL_NOSHA512_224
  1038. case WC_HASH_TYPE_SHA512_224:
  1039. #endif
  1040. #ifndef WOLFSSL_NOSHA512_256
  1041. case WC_HASH_TYPE_SHA512_256:
  1042. #endif
  1043. #ifdef WOLFSSL_SHA512
  1044. ret = wc_Sha512SetFlags(&hash->sha512, flags);
  1045. #endif
  1046. break;
  1047. case WC_HASH_TYPE_SHA3_224:
  1048. case WC_HASH_TYPE_SHA3_256:
  1049. case WC_HASH_TYPE_SHA3_384:
  1050. case WC_HASH_TYPE_SHA3_512:
  1051. #ifdef WOLFSSL_SHA3
  1052. ret = wc_Sha3_SetFlags(&hash->sha3, flags);
  1053. #endif
  1054. break;
  1055. /* not supported */
  1056. case WC_HASH_TYPE_MD5_SHA:
  1057. case WC_HASH_TYPE_MD2:
  1058. case WC_HASH_TYPE_MD4:
  1059. case WC_HASH_TYPE_BLAKE2B:
  1060. case WC_HASH_TYPE_BLAKE2S:
  1061. case WC_HASH_TYPE_NONE:
  1062. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  1063. case WC_HASH_TYPE_SHAKE128:
  1064. #endif
  1065. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  1066. case WC_HASH_TYPE_SHAKE256:
  1067. #endif
  1068. default:
  1069. ret = BAD_FUNC_ARG;
  1070. };
  1071. return ret;
  1072. }
  1073. int wc_HashGetFlags(wc_HashAlg* hash, enum wc_HashType type, word32* flags)
  1074. {
  1075. int ret = HASH_TYPE_E; /* Default to hash type error */
  1076. if (hash == NULL)
  1077. return BAD_FUNC_ARG;
  1078. switch (type) {
  1079. case WC_HASH_TYPE_MD5:
  1080. #ifndef NO_MD5
  1081. ret = wc_Md5GetFlags(&hash->md5, flags);
  1082. #endif
  1083. break;
  1084. case WC_HASH_TYPE_SHA:
  1085. #ifndef NO_SHA
  1086. ret = wc_ShaGetFlags(&hash->sha, flags);
  1087. #endif
  1088. break;
  1089. case WC_HASH_TYPE_SHA224:
  1090. #ifdef WOLFSSL_SHA224
  1091. ret = wc_Sha224GetFlags(&hash->sha224, flags);
  1092. #endif
  1093. break;
  1094. case WC_HASH_TYPE_SHA256:
  1095. #ifndef NO_SHA256
  1096. ret = wc_Sha256GetFlags(&hash->sha256, flags);
  1097. #endif
  1098. break;
  1099. case WC_HASH_TYPE_SHA384:
  1100. #ifdef WOLFSSL_SHA384
  1101. ret = wc_Sha384GetFlags(&hash->sha384, flags);
  1102. #endif
  1103. break;
  1104. case WC_HASH_TYPE_SHA512:
  1105. #ifndef WOLFSSL_NOSHA512_224
  1106. case WC_HASH_TYPE_SHA512_224:
  1107. #endif
  1108. #ifndef WOLFSSL_NOSHA512_256
  1109. case WC_HASH_TYPE_SHA512_256:
  1110. #endif
  1111. #ifdef WOLFSSL_SHA512
  1112. ret = wc_Sha512GetFlags(&hash->sha512, flags);
  1113. #endif
  1114. break;
  1115. case WC_HASH_TYPE_SHA3_224:
  1116. case WC_HASH_TYPE_SHA3_256:
  1117. case WC_HASH_TYPE_SHA3_384:
  1118. case WC_HASH_TYPE_SHA3_512:
  1119. #ifdef WOLFSSL_SHA3
  1120. ret = wc_Sha3_GetFlags(&hash->sha3, flags);
  1121. #endif
  1122. break;
  1123. /* not supported */
  1124. case WC_HASH_TYPE_MD5_SHA:
  1125. case WC_HASH_TYPE_MD2:
  1126. case WC_HASH_TYPE_MD4:
  1127. case WC_HASH_TYPE_BLAKE2B:
  1128. case WC_HASH_TYPE_BLAKE2S:
  1129. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  1130. case WC_HASH_TYPE_SHAKE128:
  1131. #endif
  1132. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  1133. case WC_HASH_TYPE_SHAKE256:
  1134. #endif
  1135. case WC_HASH_TYPE_NONE:
  1136. default:
  1137. ret = BAD_FUNC_ARG;
  1138. };
  1139. return ret;
  1140. }
  1141. #endif /* WOLFSSL_HASH_FLAGS */
  1142. #if !defined(WOLFSSL_TI_HASH)
  1143. #if !defined(NO_MD5)
  1144. int wc_Md5Hash(const byte* data, word32 len, byte* hash)
  1145. {
  1146. int ret;
  1147. #ifdef WOLFSSL_SMALL_STACK
  1148. wc_Md5* md5;
  1149. #else
  1150. wc_Md5 md5[1];
  1151. #endif
  1152. #ifdef WOLFSSL_SMALL_STACK
  1153. md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1154. if (md5 == NULL)
  1155. return MEMORY_E;
  1156. #endif
  1157. if ((ret = wc_InitMd5(md5)) != 0) {
  1158. WOLFSSL_MSG("InitMd5 failed");
  1159. }
  1160. else {
  1161. if ((ret = wc_Md5Update(md5, data, len)) != 0) {
  1162. WOLFSSL_MSG("Md5Update failed");
  1163. }
  1164. else if ((ret = wc_Md5Final(md5, hash)) != 0) {
  1165. WOLFSSL_MSG("Md5Final failed");
  1166. }
  1167. wc_Md5Free(md5);
  1168. }
  1169. #ifdef WOLFSSL_SMALL_STACK
  1170. XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1171. #endif
  1172. return ret;
  1173. }
  1174. #endif /* !NO_MD5 */
  1175. #if !defined(NO_SHA)
  1176. int wc_ShaHash(const byte* data, word32 len, byte* hash)
  1177. {
  1178. int ret = 0;
  1179. #ifdef WOLFSSL_SMALL_STACK
  1180. wc_Sha* sha;
  1181. #else
  1182. wc_Sha sha[1];
  1183. #endif
  1184. int devId = INVALID_DEVID;
  1185. #ifdef WOLFSSL_SMALL_STACK
  1186. sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1187. if (sha == NULL)
  1188. return MEMORY_E;
  1189. #endif
  1190. #ifdef WOLF_CRYPTO_CB
  1191. /* only use devId if its not an empty hash */
  1192. if (data != NULL && len > 0)
  1193. devId = wc_CryptoCb_GetDevIdAtIndex(0);
  1194. #endif
  1195. if ((ret = wc_InitSha_ex(sha, NULL, devId)) != 0) {
  1196. WOLFSSL_MSG("InitSha failed");
  1197. }
  1198. else {
  1199. if ((ret = wc_ShaUpdate(sha, data, len)) != 0) {
  1200. WOLFSSL_MSG("ShaUpdate failed");
  1201. }
  1202. else if ((ret = wc_ShaFinal(sha, hash)) != 0) {
  1203. WOLFSSL_MSG("ShaFinal failed");
  1204. }
  1205. wc_ShaFree(sha);
  1206. }
  1207. #ifdef WOLFSSL_SMALL_STACK
  1208. XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1209. #endif
  1210. return ret;
  1211. }
  1212. #endif /* !NO_SHA */
  1213. #if defined(WOLFSSL_SHA224)
  1214. int wc_Sha224Hash(const byte* data, word32 len, byte* hash)
  1215. {
  1216. int ret = 0;
  1217. #ifdef WOLFSSL_SMALL_STACK
  1218. wc_Sha224* sha224;
  1219. #else
  1220. wc_Sha224 sha224[1];
  1221. #endif
  1222. #ifdef WOLFSSL_SMALL_STACK
  1223. sha224 = (wc_Sha224*)XMALLOC(sizeof(wc_Sha224), NULL,
  1224. DYNAMIC_TYPE_TMP_BUFFER);
  1225. if (sha224 == NULL)
  1226. return MEMORY_E;
  1227. #endif
  1228. if ((ret = wc_InitSha224(sha224)) != 0) {
  1229. WOLFSSL_MSG("InitSha224 failed");
  1230. }
  1231. else {
  1232. if ((ret = wc_Sha224Update(sha224, data, len)) != 0) {
  1233. WOLFSSL_MSG("Sha224Update failed");
  1234. }
  1235. else if ((ret = wc_Sha224Final(sha224, hash)) != 0) {
  1236. WOLFSSL_MSG("Sha224Final failed");
  1237. }
  1238. wc_Sha224Free(sha224);
  1239. }
  1240. #ifdef WOLFSSL_SMALL_STACK
  1241. XFREE(sha224, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1242. #endif
  1243. return ret;
  1244. }
  1245. #endif /* WOLFSSL_SHA224 */
  1246. #if !defined(NO_SHA256)
  1247. int wc_Sha256Hash(const byte* data, word32 len, byte* hash)
  1248. {
  1249. int ret = 0;
  1250. #ifdef WOLFSSL_SMALL_STACK
  1251. wc_Sha256* sha256;
  1252. #else
  1253. wc_Sha256 sha256[1];
  1254. #endif
  1255. int devId = INVALID_DEVID;
  1256. #ifdef WOLFSSL_SMALL_STACK
  1257. sha256 = (wc_Sha256*)XMALLOC(sizeof(wc_Sha256), NULL,
  1258. DYNAMIC_TYPE_TMP_BUFFER);
  1259. if (sha256 == NULL)
  1260. return MEMORY_E;
  1261. #endif
  1262. #ifdef WOLF_CRYPTO_CB
  1263. /* only use devId if its not an empty hash */
  1264. if (data != NULL && len > 0)
  1265. devId = wc_CryptoCb_GetDevIdAtIndex(0);
  1266. #endif
  1267. if ((ret = wc_InitSha256_ex(sha256, NULL, devId)) != 0) {
  1268. WOLFSSL_MSG("InitSha256 failed");
  1269. }
  1270. else {
  1271. if ((ret = wc_Sha256Update(sha256, data, len)) != 0) {
  1272. WOLFSSL_MSG("Sha256Update failed");
  1273. }
  1274. else if ((ret = wc_Sha256Final(sha256, hash)) != 0) {
  1275. WOLFSSL_MSG("Sha256Final failed");
  1276. }
  1277. wc_Sha256Free(sha256);
  1278. }
  1279. #ifdef WOLFSSL_SMALL_STACK
  1280. XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1281. #endif
  1282. return ret;
  1283. }
  1284. #endif /* !NO_SHA256 */
  1285. #endif /* !defined(WOLFSSL_TI_HASH) */
  1286. #if defined(WOLFSSL_SHA512)
  1287. int wc_Sha512Hash(const byte* data, word32 len, byte* hash)
  1288. {
  1289. int ret = 0;
  1290. #ifdef WOLFSSL_SMALL_STACK
  1291. wc_Sha512* sha512;
  1292. #else
  1293. wc_Sha512 sha512[1];
  1294. #endif
  1295. #ifdef WOLFSSL_SMALL_STACK
  1296. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1297. DYNAMIC_TYPE_TMP_BUFFER);
  1298. if (sha512 == NULL)
  1299. return MEMORY_E;
  1300. #endif
  1301. if ((ret = wc_InitSha512(sha512)) != 0) {
  1302. WOLFSSL_MSG("InitSha512 failed");
  1303. }
  1304. else {
  1305. if ((ret = wc_Sha512Update(sha512, data, len)) != 0) {
  1306. WOLFSSL_MSG("Sha512Update failed");
  1307. }
  1308. else if ((ret = wc_Sha512Final(sha512, hash)) != 0) {
  1309. WOLFSSL_MSG("Sha512Final failed");
  1310. }
  1311. wc_Sha512Free(sha512);
  1312. }
  1313. #ifdef WOLFSSL_SMALL_STACK
  1314. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1315. #endif
  1316. return ret;
  1317. }
  1318. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  1319. #ifndef WOLFSSL_NOSHA512_224
  1320. int wc_Sha512_224Hash(const byte* data, word32 len, byte* hash)
  1321. {
  1322. int ret = 0;
  1323. #ifdef WOLFSSL_SMALL_STACK
  1324. wc_Sha512* sha512;
  1325. #else
  1326. wc_Sha512 sha512[1];
  1327. #endif
  1328. #ifdef WOLFSSL_SMALL_STACK
  1329. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1330. DYNAMIC_TYPE_TMP_BUFFER);
  1331. if (sha512 == NULL)
  1332. return MEMORY_E;
  1333. #endif
  1334. if ((ret = wc_InitSha512_224(sha512)) != 0) {
  1335. WOLFSSL_MSG("wc_InitSha512_224 failed");
  1336. }
  1337. else {
  1338. if ((ret = wc_Sha512_224Update(sha512, data, len)) != 0) {
  1339. WOLFSSL_MSG("wc_Sha512_224_Update failed");
  1340. }
  1341. else if ((ret = wc_Sha512_224Final(sha512, hash)) != 0) {
  1342. WOLFSSL_MSG("wc_Sha512_224_Final failed");
  1343. }
  1344. wc_Sha512_224Free(sha512);
  1345. }
  1346. #ifdef WOLFSSL_SMALL_STACK
  1347. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1348. #endif
  1349. return ret;
  1350. }
  1351. #endif /* !WOLFSSL_NOSHA512_224 */
  1352. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  1353. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  1354. #ifndef WOLFSSL_NOSHA512_256
  1355. int wc_Sha512_256Hash(const byte* data, word32 len, byte* hash)
  1356. {
  1357. int ret = 0;
  1358. #ifdef WOLFSSL_SMALL_STACK
  1359. wc_Sha512* sha512;
  1360. #else
  1361. wc_Sha512 sha512[1];
  1362. #endif
  1363. #ifdef WOLFSSL_SMALL_STACK
  1364. sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL,
  1365. DYNAMIC_TYPE_TMP_BUFFER);
  1366. if (sha512 == NULL)
  1367. return MEMORY_E;
  1368. #endif
  1369. if ((ret = wc_InitSha512_256(sha512)) != 0) {
  1370. WOLFSSL_MSG("wc_InitSha512_256 failed");
  1371. }
  1372. else {
  1373. if ((ret = wc_Sha512_256Update(sha512, data, len)) != 0) {
  1374. WOLFSSL_MSG("wc_Sha512_256_Update failed");
  1375. }
  1376. else if ((ret = wc_Sha512_256Final(sha512, hash)) != 0) {
  1377. WOLFSSL_MSG("wc_Sha512_256_Final failed");
  1378. }
  1379. wc_Sha512_256Free(sha512);
  1380. }
  1381. #ifdef WOLFSSL_SMALL_STACK
  1382. XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1383. #endif
  1384. return ret;
  1385. }
  1386. #endif /* !WOLFSSL_NOSHA512_256 */
  1387. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  1388. #endif /* WOLFSSL_SHA512 */
  1389. #if defined(WOLFSSL_SHA384)
  1390. int wc_Sha384Hash(const byte* data, word32 len, byte* hash)
  1391. {
  1392. int ret = 0;
  1393. #ifdef WOLFSSL_SMALL_STACK
  1394. wc_Sha384* sha384;
  1395. #else
  1396. wc_Sha384 sha384[1];
  1397. #endif
  1398. #ifdef WOLFSSL_SMALL_STACK
  1399. sha384 = (wc_Sha384*)XMALLOC(sizeof(wc_Sha384), NULL,
  1400. DYNAMIC_TYPE_TMP_BUFFER);
  1401. if (sha384 == NULL)
  1402. return MEMORY_E;
  1403. #endif
  1404. if ((ret = wc_InitSha384(sha384)) != 0) {
  1405. WOLFSSL_MSG("InitSha384 failed");
  1406. }
  1407. else {
  1408. if ((ret = wc_Sha384Update(sha384, data, len)) != 0) {
  1409. WOLFSSL_MSG("Sha384Update failed");
  1410. }
  1411. else if ((ret = wc_Sha384Final(sha384, hash)) != 0) {
  1412. WOLFSSL_MSG("Sha384Final failed");
  1413. }
  1414. wc_Sha384Free(sha384);
  1415. }
  1416. #ifdef WOLFSSL_SMALL_STACK
  1417. XFREE(sha384, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1418. #endif
  1419. return ret;
  1420. }
  1421. #endif /* WOLFSSL_SHA384 */
  1422. #if defined(WOLFSSL_SHA3)
  1423. #if !defined(WOLFSSL_NOSHA3_224)
  1424. int wc_Sha3_224Hash(const byte* data, word32 len, byte* hash)
  1425. {
  1426. int ret = 0;
  1427. #ifdef WOLFSSL_SMALL_STACK
  1428. wc_Sha3* sha3;
  1429. #else
  1430. wc_Sha3 sha3[1];
  1431. #endif
  1432. #ifdef WOLFSSL_SMALL_STACK
  1433. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1434. DYNAMIC_TYPE_TMP_BUFFER);
  1435. if (sha3 == NULL)
  1436. return MEMORY_E;
  1437. #endif
  1438. if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) {
  1439. WOLFSSL_MSG("InitSha3_224 failed");
  1440. }
  1441. else {
  1442. if ((ret = wc_Sha3_224_Update(sha3, data, len)) != 0) {
  1443. WOLFSSL_MSG("Sha3_224_Update failed");
  1444. }
  1445. else if ((ret = wc_Sha3_224_Final(sha3, hash)) != 0) {
  1446. WOLFSSL_MSG("Sha3_224_Final failed");
  1447. }
  1448. wc_Sha3_224_Free(sha3);
  1449. }
  1450. #ifdef WOLFSSL_SMALL_STACK
  1451. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1452. #endif
  1453. return ret;
  1454. }
  1455. #endif /* !WOLFSSL_NOSHA3_224 */
  1456. #if !defined(WOLFSSL_NOSHA3_256)
  1457. int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash)
  1458. {
  1459. int ret = 0;
  1460. #ifdef WOLFSSL_SMALL_STACK
  1461. wc_Sha3* sha3;
  1462. #else
  1463. wc_Sha3 sha3[1];
  1464. #endif
  1465. #ifdef WOLFSSL_SMALL_STACK
  1466. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1467. DYNAMIC_TYPE_TMP_BUFFER);
  1468. if (sha3 == NULL)
  1469. return MEMORY_E;
  1470. #endif
  1471. if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) {
  1472. WOLFSSL_MSG("InitSha3_256 failed");
  1473. }
  1474. else {
  1475. if ((ret = wc_Sha3_256_Update(sha3, data, len)) != 0) {
  1476. WOLFSSL_MSG("Sha3_256_Update failed");
  1477. }
  1478. else if ((ret = wc_Sha3_256_Final(sha3, hash)) != 0) {
  1479. WOLFSSL_MSG("Sha3_256_Final failed");
  1480. }
  1481. wc_Sha3_256_Free(sha3);
  1482. }
  1483. #ifdef WOLFSSL_SMALL_STACK
  1484. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1485. #endif
  1486. return ret;
  1487. }
  1488. #endif /* !WOLFSSL_NOSHA3_256 */
  1489. #if !defined(WOLFSSL_NOSHA3_384)
  1490. int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash)
  1491. {
  1492. int ret = 0;
  1493. #ifdef WOLFSSL_SMALL_STACK
  1494. wc_Sha3* sha3;
  1495. #else
  1496. wc_Sha3 sha3[1];
  1497. #endif
  1498. #ifdef WOLFSSL_SMALL_STACK
  1499. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1500. DYNAMIC_TYPE_TMP_BUFFER);
  1501. if (sha3 == NULL)
  1502. return MEMORY_E;
  1503. #endif
  1504. if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) {
  1505. WOLFSSL_MSG("InitSha3_384 failed");
  1506. }
  1507. else {
  1508. if ((ret = wc_Sha3_384_Update(sha3, data, len)) != 0) {
  1509. WOLFSSL_MSG("Sha3_384_Update failed");
  1510. }
  1511. else if ((ret = wc_Sha3_384_Final(sha3, hash)) != 0) {
  1512. WOLFSSL_MSG("Sha3_384_Final failed");
  1513. }
  1514. wc_Sha3_384_Free(sha3);
  1515. }
  1516. #ifdef WOLFSSL_SMALL_STACK
  1517. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1518. #endif
  1519. return ret;
  1520. }
  1521. #endif /* !WOLFSSL_NOSHA3_384 */
  1522. #if !defined(WOLFSSL_NOSHA3_512)
  1523. int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash)
  1524. {
  1525. int ret = 0;
  1526. #ifdef WOLFSSL_SMALL_STACK
  1527. wc_Sha3* sha3;
  1528. #else
  1529. wc_Sha3 sha3[1];
  1530. #endif
  1531. #ifdef WOLFSSL_SMALL_STACK
  1532. sha3 = (wc_Sha3*)XMALLOC(sizeof(wc_Sha3), NULL,
  1533. DYNAMIC_TYPE_TMP_BUFFER);
  1534. if (sha3 == NULL)
  1535. return MEMORY_E;
  1536. #endif
  1537. if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) {
  1538. WOLFSSL_MSG("InitSha3_512 failed");
  1539. }
  1540. else {
  1541. if ((ret = wc_Sha3_512_Update(sha3, data, len)) != 0) {
  1542. WOLFSSL_MSG("Sha3_512_Update failed");
  1543. }
  1544. else if ((ret = wc_Sha3_512_Final(sha3, hash)) != 0) {
  1545. WOLFSSL_MSG("Sha3_512_Final failed");
  1546. }
  1547. wc_Sha3_512_Free(sha3);
  1548. }
  1549. #ifdef WOLFSSL_SMALL_STACK
  1550. XFREE(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1551. #endif
  1552. return ret;
  1553. }
  1554. #endif /* !WOLFSSL_NOSHA3_512 */
  1555. #ifdef WOLFSSL_SHAKE128
  1556. int wc_Shake128Hash(const byte* data, word32 len, byte* hash,
  1557. word32 hashLen)
  1558. {
  1559. int ret = 0;
  1560. #ifdef WOLFSSL_SMALL_STACK
  1561. wc_Shake* shake;
  1562. #else
  1563. wc_Shake shake[1];
  1564. #endif
  1565. #ifdef WOLFSSL_SMALL_STACK
  1566. shake = (wc_Shake*)XMALLOC(sizeof(wc_Shake), NULL,
  1567. DYNAMIC_TYPE_TMP_BUFFER);
  1568. if (shake == NULL)
  1569. return MEMORY_E;
  1570. #endif
  1571. if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) {
  1572. WOLFSSL_MSG("InitShake128 failed");
  1573. }
  1574. else {
  1575. if ((ret = wc_Shake128_Update(shake, data, len)) != 0) {
  1576. WOLFSSL_MSG("Shake128_Update failed");
  1577. }
  1578. else if ((ret = wc_Shake128_Final(shake, hash, hashLen)) != 0) {
  1579. WOLFSSL_MSG("Shake128_Final failed");
  1580. }
  1581. wc_Shake128_Free(shake);
  1582. }
  1583. #ifdef WOLFSSL_SMALL_STACK
  1584. XFREE(shake, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1585. #endif
  1586. return ret;
  1587. }
  1588. #endif /* WOLFSSL_SHAKE_128 */
  1589. #ifdef WOLFSSL_SHAKE256
  1590. int wc_Shake256Hash(const byte* data, word32 len, byte* hash,
  1591. word32 hashLen)
  1592. {
  1593. int ret = 0;
  1594. #ifdef WOLFSSL_SMALL_STACK
  1595. wc_Shake* shake;
  1596. #else
  1597. wc_Shake shake[1];
  1598. #endif
  1599. #ifdef WOLFSSL_SMALL_STACK
  1600. shake = (wc_Shake*)XMALLOC(sizeof(wc_Shake), NULL,
  1601. DYNAMIC_TYPE_TMP_BUFFER);
  1602. if (shake == NULL)
  1603. return MEMORY_E;
  1604. #endif
  1605. if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) {
  1606. WOLFSSL_MSG("InitShake256 failed");
  1607. }
  1608. else {
  1609. if ((ret = wc_Shake256_Update(shake, data, len)) != 0) {
  1610. WOLFSSL_MSG("Shake256_Update failed");
  1611. }
  1612. else if ((ret = wc_Shake256_Final(shake, hash, hashLen)) != 0) {
  1613. WOLFSSL_MSG("Shake256_Final failed");
  1614. }
  1615. wc_Shake256_Free(shake);
  1616. }
  1617. #ifdef WOLFSSL_SMALL_STACK
  1618. XFREE(shake, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1619. #endif
  1620. return ret;
  1621. }
  1622. #endif /* WOLFSSL_SHAKE_256 */
  1623. #endif /* WOLFSSL_SHA3 */
  1624. #endif /* !NO_HASH_WRAPPER */
  1625. #ifdef WOLFSSL_HASH_KEEP
  1626. int _wc_Hash_Grow(byte** msg, word32* used, word32* len, const byte* in,
  1627. int inSz, void* heap)
  1628. {
  1629. if (*len < *used + inSz) {
  1630. if (*msg == NULL) {
  1631. *msg = (byte*)XMALLOC(*used + inSz, heap, DYNAMIC_TYPE_TMP_BUFFER);
  1632. }
  1633. else {
  1634. byte* pt = (byte*)XREALLOC(*msg, *used + inSz, heap,
  1635. DYNAMIC_TYPE_TMP_BUFFER);
  1636. if (pt == NULL) {
  1637. return MEMORY_E;
  1638. }
  1639. *msg = pt;
  1640. }
  1641. if (*msg == NULL) {
  1642. return MEMORY_E;
  1643. }
  1644. *len = *used + inSz;
  1645. }
  1646. XMEMCPY(*msg + *used, in, inSz);
  1647. *used += inSz;
  1648. return 0;
  1649. }
  1650. #endif /* WOLFSSL_HASH_KEEP */