- Timestamp:
- Feb 7, 2019, 8:36:33 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_rx/trunk/wolfssl-3.12.2/wolfcrypt/src/md5.c
r337 r372 47 47 48 48 49 static INLINE void AddLength(wc_Md5* md5, word32 len);50 51 49 /* Hardware Acceleration */ 52 50 #if defined(STM32_HASH) 53 51 54 /* 55 * STM32F2/F4/F7 hardware MD5 support through the HASH_* API's from the 56 * Standard Peripheral Library or CubeMX (See note in README). 57 */ 58 52 /* Supports CubeMX HAL or Standard Peripheral Library */ 59 53 #define HAVE_MD5_CUST_API 60 61 /* STM32 register size, bytes */62 #ifdef WOLFSSL_STM32_CUBEMX63 #define MD5_REG_SIZE WC_MD5_BLOCK_SIZE64 #else65 #define MD5_REG_SIZE 466 /* STM32 struct notes:67 * md5->buffer = first 4 bytes used to hold partial block if needed68 * md5->buffLen = num bytes currently stored in md5->buffer69 * md5->loLen = num bytes that have been written to STM32 FIFO70 */71 #endif72 #define MD5_HW_TIMEOUT 0xFF73 54 74 55 int wc_InitMd5_ex(wc_Md5* md5, void* heap, int devId) 75 56 { 76 if (md5 == NULL) 57 if (md5 == NULL) { 77 58 return BAD_FUNC_ARG; 78 59 } 60 61 (void)devId; 79 62 (void)heap; 80 (void)devId; 81 82 md5->heap = heap; 83 XMEMSET(md5->buffer, 0, sizeof(md5->buffer)); 84 md5->buffLen = 0; 85 md5->loLen = 0; 86 md5->hiLen = 0; 87 88 /* initialize HASH peripheral */ 89 #ifdef WOLFSSL_STM32_CUBEMX 90 HAL_HASH_DeInit(&md5->hashHandle); 91 md5->hashHandle.Init.DataType = HASH_DATATYPE_8B; 92 if (HAL_HASH_Init(&md5->hashHandle) != HAL_OK) { 93 return ASYNC_INIT_E; 94 } 95 /* reset the hash control register */ 96 /* required because Cube MX is not clearing algo bits */ 97 HASH->CR &= ~HASH_CR_ALGO; 98 #else 99 HASH_DeInit(); 100 101 /* reset the control register */ 102 HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); 103 104 /* configure algo used, algo mode, datatype */ 105 HASH->CR |= (HASH_AlgoSelection_MD5 | HASH_AlgoMode_HASH 106 | HASH_DataType_8b); 107 108 /* reset HASH processor */ 109 HASH->CR |= HASH_CR_INIT; 110 #endif 63 64 wc_Stm32_Hash_Init(&md5->stmCtx); 111 65 112 66 return 0; … … 115 69 int wc_Md5Update(wc_Md5* md5, const byte* data, word32 len) 116 70 { 117 int ret = 0; 118 byte* local; 71 int ret; 119 72 120 73 if (md5 == NULL || (data == NULL && len > 0)) { … … 122 75 } 123 76 124 /* do block size increments */ 125 local = (byte*)md5->buffer; 126 127 /* check that internal buffLen is valid */ 128 if (md5->buffLen >= MD5_REG_SIZE) 129 return BUFFER_E; 130 131 while (len) { 132 word32 add = min(len, MD5_REG_SIZE - md5->buffLen); 133 XMEMCPY(&local[md5->buffLen], data, add); 134 135 md5->buffLen += add; 136 data += add; 137 len -= add; 138 139 if (md5->buffLen == MD5_REG_SIZE) { 140 #ifdef WOLFSSL_STM32_CUBEMX 141 if (HAL_HASH_MD5_Accumulate( 142 &md5->hashHandle, local, MD5_REG_SIZE) != HAL_OK) { 143 ret = ASYNC_OP_E; 144 } 145 #else 146 HASH_DataIn(*(uint32_t*)local); 147 #endif 148 149 AddLength(md5, MD5_REG_SIZE); 150 md5->buffLen = 0; 151 } 77 ret = wolfSSL_CryptHwMutexLock(); 78 if (ret == 0) { 79 ret = wc_Stm32_Hash_Update(&md5->stmCtx, HASH_AlgoSelection_MD5, 80 data, len); 81 wolfSSL_CryptHwMutexUnLock(); 152 82 } 153 83 return ret; … … 156 86 int wc_Md5Final(wc_Md5* md5, byte* hash) 157 87 { 158 int ret = 0;159 160 if (md5 == NULL || hash == NULL) 88 int ret; 89 90 if (md5 == NULL || hash == NULL) { 161 91 return BAD_FUNC_ARG; 162 163 #ifdef WOLFSSL_STM32_CUBEMX 164 if (HAL_HASH_MD5_Start(&md5->hashHandle, 165 (byte*)md5->buffer, md5->buffLen, 166 (byte*)md5->digest, MD5_HW_TIMEOUT) != HAL_OK) { 167 ret = ASYNC_OP_E; 168 } 169 #else 170 __IO uint16_t nbvalidbitsdata = 0; 171 172 /* finish reading any trailing bytes into FIFO */ 173 if (md5->buffLen > 0) { 174 HASH_DataIn(*(uint32_t*)md5->buffer); 175 AddLength(md5, md5->buffLen); 176 } 177 178 /* calculate number of valid bits in last word of input data */ 179 nbvalidbitsdata = 8 * (md5->loLen % MD5_REG_SIZE); 180 181 /* configure number of valid bits in last word of the data */ 182 HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); 183 184 /* start HASH processor */ 185 HASH_StartDigest(); 186 187 /* wait until Busy flag == RESET */ 188 while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} 189 190 /* read message digest */ 191 md5->digest[0] = HASH->HR[0]; 192 md5->digest[1] = HASH->HR[1]; 193 md5->digest[2] = HASH->HR[2]; 194 md5->digest[3] = HASH->HR[3]; 195 196 ByteReverseWords(md5->digest, md5->digest, WC_MD5_DIGEST_SIZE); 197 #endif /* WOLFSSL_STM32_CUBEMX */ 198 199 XMEMCPY(hash, md5->digest, WC_MD5_DIGEST_SIZE); 92 } 93 94 ret = wolfSSL_CryptHwMutexLock(); 95 if (ret == 0) { 96 ret = wc_Stm32_Hash_Final(&md5->stmCtx, HASH_AlgoSelection_MD5, 97 hash, WC_MD5_DIGEST_SIZE); 98 wolfSSL_CryptHwMutexUnLock(); 99 } 200 100 201 101 (void)wc_InitMd5(md5); /* reset state */ … … 226 126 #define HAVE_MD5_CUST_API 227 127 128 #elif defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_HASH) 129 /* functions implemented in wolfcrypt/src/port/caam/caam_sha.c */ 130 #define HAVE_MD5_CUST_API 228 131 #else 229 132 #define NEED_SOFT_MD5 … … 330 233 #endif /* NEED_SOFT_MD5 */ 331 234 332 #if !defined(HAVE_MD5_CUST_API) || defined(STM32_HASH) 333 static INLINE void AddLength(wc_Md5* md5, word32 len) 235 #ifndef HAVE_MD5_CUST_API 236 237 static WC_INLINE void AddLength(wc_Md5* md5, word32 len) 334 238 { 335 239 word32 tmp = md5->loLen; … … 338 242 } 339 243 } 340 #endif 341 342 #ifndef HAVE_MD5_CUST_API 244 343 245 static int _InitMd5(wc_Md5* md5) 344 246 { … … 498 400 wolfAsync_DevCtxFree(&md5->asyncDev, WOLFSSL_ASYNC_MARKER_MD5); 499 401 #endif /* WOLFSSL_ASYNC_CRYPT */ 402 403 #ifdef WOLFSSL_PIC32MZ_HASH 404 wc_Md5Pic32Free(md5); 405 #endif 500 406 } 501 407
Note:
See TracChangeset
for help on using the changeset viewer.