- Timestamp:
- Jun 22, 2021, 9:00:19 PM (3 years ago)
- Location:
- azure_iot_hub_f767zi/trunk/wolfssl-4.7.0
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/wolfcrypt/src/sha256.c
r457 r464 20 20 */ 21 21 22 /* For more info on the algorithm, see https://tools.ietf.org/html/rfc6234 */ 23 /* 24 25 DESCRIPTION 26 This library provides the interface to SHA-256 secure hash algorithms. 27 SHA-256 performs processing on message blocks to produce a final hash digest 28 output. It can be used to hash a message, M, having a length of L bits, 29 where 0 <= L < 2^64. 30 31 */ 22 32 #ifdef HAVE_CONFIG_H 23 33 #include <config.h> … … 120 130 #elif defined(WOLFSSL_CRYPTOCELL) 121 131 /* wc_port.c includes wolfcrypt/src/port/arm/cryptoCellHash.c */ 132 133 #elif defined(WOLFSSL_IMXRT_DCP) 134 135 #elif defined(WOLFSSL_PSOC6_CRYPTO) 136 137 122 138 #else 123 139 … … 165 181 !defined(WOLFSSL_AFALG_HASH) && !defined(WOLFSSL_DEVCRYPTO_HASH) && \ 166 182 (!defined(WOLFSSL_ESP32WROOM32_CRYPT) || defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH)) && \ 167 (!defined(WOLFSSL_RENESAS_TSIP_CRYPT) || defined(NO_WOLFSSL_RENESAS_TSIP_HASH)) 183 (!defined(WOLFSSL_RENESAS_TSIP_CRYPT) || defined(NO_WOLFSSL_RENESAS_TSIP_HASH)) && \ 184 !defined(WOLFSSL_PSOC6_CRYPTO) && !defined(WOLFSSL_IMXRT_DCP) && !defined(WOLFSSL_SILABS_SE_ACCEL) 185 168 186 169 187 static int InitSha256(wc_Sha256* sha256) … … 197 215 198 216 /* Hardware Acceleration */ 199 #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 217 #if defined(USE_INTEL_SPEEDUP) && (defined(HAVE_INTEL_AVX1) || \ 218 defined(HAVE_INTEL_AVX2)) 200 219 201 220 /* in case intel instructions aren't available, plus we need the K[] global */ … … 295 314 static int transform_check = 0; 296 315 static word32 intel_flags; 297 298 #define XTRANSFORM(S, D) (*Transform_Sha256_p)((S),(D)) 299 #define XTRANSFORM_LEN(S, D, L) (*Transform_Sha256_Len_p)((S),(D),(L)) 316 static int Transform_Sha256_is_vectorized = 0; 317 318 static WC_INLINE int inline_XTRANSFORM(wc_Sha256* S, const byte* D) { 319 int ret; 320 if (Transform_Sha256_is_vectorized) 321 SAVE_VECTOR_REGISTERS(); 322 ret = (*Transform_Sha256_p)(S, D); 323 if (Transform_Sha256_is_vectorized) 324 RESTORE_VECTOR_REGISTERS(); 325 return ret; 326 } 327 #define XTRANSFORM(...) inline_XTRANSFORM(__VA_ARGS__) 328 329 static WC_INLINE int inline_XTRANSFORM_LEN(wc_Sha256* S, const byte* D, word32 L) { 330 int ret; 331 if (Transform_Sha256_is_vectorized) 332 SAVE_VECTOR_REGISTERS(); 333 ret = (*Transform_Sha256_Len_p)(S, D, L); 334 if (Transform_Sha256_is_vectorized) 335 RESTORE_VECTOR_REGISTERS(); 336 return ret; 337 } 338 #define XTRANSFORM_LEN(...) inline_XTRANSFORM_LEN(__VA_ARGS__) 300 339 301 340 static void Sha256_SetTransform(void) … … 313 352 Transform_Sha256_p = Transform_Sha256_AVX2_RORX; 314 353 Transform_Sha256_Len_p = Transform_Sha256_AVX2_RORX_Len; 354 Transform_Sha256_is_vectorized = 1; 315 355 } 316 356 else … … 320 360 Transform_Sha256_p = Transform_Sha256_AVX2; 321 361 Transform_Sha256_Len_p = Transform_Sha256_AVX2_Len; 362 Transform_Sha256_is_vectorized = 1; 322 363 } 323 364 #ifdef HAVE_INTEL_RORX … … 325 366 Transform_Sha256_p = Transform_Sha256_AVX1_RORX; 326 367 Transform_Sha256_Len_p = Transform_Sha256_AVX1_RORX_Len; 368 Transform_Sha256_is_vectorized = 1; 327 369 } 328 370 #endif … … 334 376 Transform_Sha256_p = Transform_Sha256_AVX1; 335 377 Transform_Sha256_Len_p = Transform_Sha256_AVX1_Len; 378 Transform_Sha256_is_vectorized = 1; 336 379 } 337 380 else … … 340 383 Transform_Sha256_p = Transform_Sha256; 341 384 Transform_Sha256_Len_p = NULL; 385 Transform_Sha256_is_vectorized = 0; 342 386 } 343 387 … … 354 398 #ifdef WOLF_CRYPTO_CB 355 399 sha256->devId = devId; 400 #endif 401 #ifdef WOLFSSL_SMALL_STACK_CACHE 402 sha256->W = NULL; 356 403 #endif 357 404 … … 415 462 cau_sha256_initialize_output(sha256->digest); 416 463 #else 417 MMCAU_SHA256_InitializeOutput(( uint32_t*)sha256->digest);464 MMCAU_SHA256_InitializeOutput((word32*)sha256->digest); 418 465 #endif 419 466 wolfSSL_CryptHwMutexUnLock(); … … 495 542 (void)heap; 496 543 544 XMEMSET(sha256, 0, sizeof(wc_Sha256)); 497 545 wc_Stm32_Hash_Init(&sha256->stmCtx); 498 546 return 0; … … 664 712 /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */ 665 713 714 #elif defined(WOLFSSL_PSOC6_CRYPTO) 715 716 /* implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */ 717 718 #elif defined(WOLFSSL_IMXRT_DCP) 719 #include <wolfssl/wolfcrypt/port/nxp/dcp_port.h> 720 /* implemented in wolfcrypt/src/port/nxp/dcp_port.c */ 721 722 #elif defined(WOLFSSL_SILABS_SE_ACCEL) 723 /* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */ 724 666 725 #else 667 726 #define NEED_SOFT_SHA256 … … 678 737 sha256->devCtx = NULL; 679 738 #endif 739 #ifdef WOLFSSL_SMALL_STACK_CACHE 740 sha256->W = NULL; 741 #endif 680 742 681 743 ret = InitSha256(sha256); 682 744 if (ret != 0) 683 745 return ret; 684 685 #ifdef WOLFSSL_SMALL_STACK_CACHE686 sha256->W = NULL;687 #endif688 746 689 747 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256) … … 700 758 #ifdef NEED_SOFT_SHA256 701 759 702 static const ALIGN32 word32 K[64] = {760 static const FLASH_QUALIFIER ALIGN32 word32 K[64] = { 703 761 0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL, 704 762 0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L, 0xD807AA98L, 0x12835B01L, … … 929 987 if (sha256->buffLen == WC_SHA256_BLOCK_SIZE) { 930 988 #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) 931 #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 989 #if defined(USE_INTEL_SPEEDUP) && \ 990 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) 932 991 if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) 933 992 #endif … … 961 1020 /* process blocks */ 962 1021 #ifdef XTRANSFORM_LEN 963 #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 1022 #if defined(USE_INTEL_SPEEDUP) && \ 1023 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) 964 1024 if (Transform_Sha256_Len_p != NULL) 965 1025 #endif … … 976 1036 } 977 1037 } 978 #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 1038 #if defined(USE_INTEL_SPEEDUP) && \ 1039 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) 979 1040 else 980 1041 #endif 981 1042 #endif /* XTRANSFORM_LEN */ 982 #if !defined(XTRANSFORM_LEN) || defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 1043 #if !defined(XTRANSFORM_LEN) || (defined(USE_INTEL_SPEEDUP) && \ 1044 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) 983 1045 { 984 1046 while (len >= WC_SHA256_BLOCK_SIZE) { … … 988 1050 /* Little Endian requires byte swap, so can't use data directly */ 989 1051 #if defined(WC_HASH_DATA_ALIGNMENT) && !defined(LITTLE_ENDIAN_ORDER) && \ 990 !defined(HAVE_INTEL_AVX1) && !defined(HAVE_INTEL_AVX2) 1052 !(defined(USE_INTEL_SPEEDUP) && \ 1053 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) 991 1054 if (((size_t)data % WC_HASH_DATA_ALIGNMENT) == 0) { 992 1055 local32 = (word32*)data; … … 1002 1065 1003 1066 #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) 1004 #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 1067 #if defined(USE_INTEL_SPEEDUP) && \ 1068 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) 1005 1069 if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) 1006 1070 #endif … … 1031 1095 1032 1096 /* save remainder */ 1033 if ( len > 0) {1097 if (ret == 0 && len > 0) { 1034 1098 XMEMCPY(local, data, len); 1035 1099 sha256->buffLen = len; … … 1089 1153 1090 1154 #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) 1091 #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 1155 #if defined(USE_INTEL_SPEEDUP) && \ 1156 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) 1092 1157 if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) 1093 1158 #endif … … 1126 1191 /* store lengths */ 1127 1192 #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) 1128 #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 1193 #if defined(USE_INTEL_SPEEDUP) && \ 1194 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) 1129 1195 if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) 1130 1196 #endif … … 1139 1205 sizeof(word32)); 1140 1206 1141 #if defined(FREESCALE_MMCAU_SHA) || defined(HAVE_INTEL_AVX1) ||\1142 defined(HAVE_INTEL_AVX2)1207 #if defined(FREESCALE_MMCAU_SHA) || (defined(USE_INTEL_SPEEDUP) && \ 1208 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) 1143 1209 /* Kinetis requires only these bytes reversed */ 1144 #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) 1210 #if defined(USE_INTEL_SPEEDUP) && \ 1211 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) 1145 1212 if (IS_INTEL_AVX1(intel_flags) || IS_INTEL_AVX2(intel_flags)) 1146 1213 #endif … … 1245 1312 (void)heap; 1246 1313 1314 XMEMSET(sha224, 0, sizeof(wc_Sha224)); 1247 1315 wc_Stm32_Hash_Init(&sha224->stmCtx); 1248 1316 return 0; … … 1294 1362 #elif defined(WOLFSSL_DEVCRYPTO_HASH) 1295 1363 /* implemented in wolfcrypt/src/port/devcrypto/devcrypt_hash.c */ 1364 1365 #elif defined(WOLFSSL_SILABS_SE_ACCEL) 1366 /* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */ 1296 1367 1297 1368 #else … … 1321 1392 sha224->hiLen = 0; 1322 1393 1323 #if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) 1394 #if defined(USE_INTEL_SPEEDUP) && \ 1395 (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) 1324 1396 /* choose best Transform function under this runtime environment */ 1325 1397 Sha256_SetTransform(); … … 1343 1415 1344 1416 sha224->heap = heap; 1417 #ifdef WOLFSSL_SMALL_STACK_CACHE 1418 sha224->W = NULL; 1419 #endif 1345 1420 1346 1421 ret = InitSha224(sha224); 1347 1422 if (ret != 0) 1348 1423 return ret; 1349 1350 #ifdef WOLFSSL_SMALL_STACK_CACHE1351 sha224->W = NULL;1352 #endif1353 1424 1354 1425 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA224) … … 1486 1557 } 1487 1558 #endif 1559 #ifdef WOLFSSL_IMXRT_DCP 1560 DCPSha256Free(sha256); 1561 #endif 1488 1562 } 1489 1563 … … 1521 1595 #endif 1522 1596 1597 #ifdef WOLFSSL_SILABS_SE_ACCEL 1598 dst->silabsCtx.hash_ctx.cmd_ctx = &(dst->silabsCtx.cmd_ctx); 1599 dst->silabsCtx.hash_ctx.hash_type_ctx = &(dst->silabsCtx.hash_type_ctx); 1600 #endif 1601 1523 1602 #ifdef WOLFSSL_ASYNC_CRYPT 1524 1603 ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev); … … 1560 1639 1561 1640 /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */ 1641 #elif defined(WOLFSSL_PSOC6_CRYPTO) 1642 /* implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */ 1643 #elif defined(WOLFSSL_IMXRT_DCP) 1644 /* implemented in wolfcrypt/src/port/nxp/dcp_port.c */ 1562 1645 #else 1563 1646 … … 1604 1687 #endif 1605 1688 1689 #ifdef WOLFSSL_SILABS_SE_ACCEL 1690 dst->silabsCtx.hash_ctx.cmd_ctx = &(dst->silabsCtx.cmd_ctx); 1691 dst->silabsCtx.hash_ctx.hash_type_ctx = &(dst->silabsCtx.hash_type_ctx); 1692 #endif 1693 1606 1694 #ifdef WOLFSSL_ASYNC_CRYPT 1607 1695 ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
Note:
See TracChangeset
for help on using the changeset viewer.