wolfSSL SSL/TLS library, support up to TLS1.3

Dependents:   CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more

Committer:
wolfSSL
Date:
Tue Aug 22 10:48:22 2017 +0000
Revision:
13:f67a6c6013ca
wolfSSL3.12.0 with TLS1.3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 13:f67a6c6013ca 1 /* md5.c
wolfSSL 13:f67a6c6013ca 2 *
wolfSSL 13:f67a6c6013ca 3 * Copyright (C) 2006-2016 wolfSSL Inc.
wolfSSL 13:f67a6c6013ca 4 *
wolfSSL 13:f67a6c6013ca 5 * This file is part of wolfSSL.
wolfSSL 13:f67a6c6013ca 6 *
wolfSSL 13:f67a6c6013ca 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 13:f67a6c6013ca 8 * it under the terms of the GNU General Public License as published by
wolfSSL 13:f67a6c6013ca 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 13:f67a6c6013ca 10 * (at your option) any later version.
wolfSSL 13:f67a6c6013ca 11 *
wolfSSL 13:f67a6c6013ca 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 13:f67a6c6013ca 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 13:f67a6c6013ca 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 13:f67a6c6013ca 15 * GNU General Public License for more details.
wolfSSL 13:f67a6c6013ca 16 *
wolfSSL 13:f67a6c6013ca 17 * You should have received a copy of the GNU General Public License
wolfSSL 13:f67a6c6013ca 18 * along with this program; if not, write to the Free Software
wolfSSL 13:f67a6c6013ca 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 13:f67a6c6013ca 20 */
wolfSSL 13:f67a6c6013ca 21
wolfSSL 13:f67a6c6013ca 22
wolfSSL 13:f67a6c6013ca 23
wolfSSL 13:f67a6c6013ca 24 #ifdef HAVE_CONFIG_H
wolfSSL 13:f67a6c6013ca 25 #include <config.h>
wolfSSL 13:f67a6c6013ca 26 #endif
wolfSSL 13:f67a6c6013ca 27
wolfSSL 13:f67a6c6013ca 28 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 13:f67a6c6013ca 29
wolfSSL 13:f67a6c6013ca 30 #if !defined(NO_MD5)
wolfSSL 13:f67a6c6013ca 31
wolfSSL 13:f67a6c6013ca 32 #if defined(WOLFSSL_TI_HASH)
wolfSSL 13:f67a6c6013ca 33 /* #include <wolfcrypt/src/port/ti/ti-hash.c> included by wc_port.c */
wolfSSL 13:f67a6c6013ca 34
wolfSSL 13:f67a6c6013ca 35 #else
wolfSSL 13:f67a6c6013ca 36
wolfSSL 13:f67a6c6013ca 37 #include <wolfssl/wolfcrypt/md5.h>
wolfSSL 13:f67a6c6013ca 38 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 13:f67a6c6013ca 39 #include <wolfssl/wolfcrypt/logging.h>
wolfSSL 13:f67a6c6013ca 40
wolfSSL 13:f67a6c6013ca 41 #ifdef NO_INLINE
wolfSSL 13:f67a6c6013ca 42 #include <wolfssl/wolfcrypt/misc.h>
wolfSSL 13:f67a6c6013ca 43 #else
wolfSSL 13:f67a6c6013ca 44 #define WOLFSSL_MISC_INCLUDED
wolfSSL 13:f67a6c6013ca 45 #include <wolfcrypt/src/misc.c>
wolfSSL 13:f67a6c6013ca 46 #endif
wolfSSL 13:f67a6c6013ca 47
wolfSSL 13:f67a6c6013ca 48
wolfSSL 13:f67a6c6013ca 49 /* Hardware Acceleration */
wolfSSL 13:f67a6c6013ca 50 #if defined(STM32F2_HASH) || defined(STM32F4_HASH)
wolfSSL 13:f67a6c6013ca 51 /*
wolfSSL 13:f67a6c6013ca 52 * STM32F2/F4 hardware MD5 support through the standard peripheral
wolfSSL 13:f67a6c6013ca 53 * library. (See note in README).
wolfSSL 13:f67a6c6013ca 54 */
wolfSSL 13:f67a6c6013ca 55
wolfSSL 13:f67a6c6013ca 56 #define HAVE_MD5_CUST_API
wolfSSL 13:f67a6c6013ca 57
wolfSSL 13:f67a6c6013ca 58 int wc_InitMd5_ex(Md5* md5, void* heap, int devId)
wolfSSL 13:f67a6c6013ca 59 {
wolfSSL 13:f67a6c6013ca 60 (void)heap;
wolfSSL 13:f67a6c6013ca 61 (void)devId;
wolfSSL 13:f67a6c6013ca 62
wolfSSL 13:f67a6c6013ca 63 /* STM32 struct notes:
wolfSSL 13:f67a6c6013ca 64 * md5->buffer = first 4 bytes used to hold partial block if needed
wolfSSL 13:f67a6c6013ca 65 * md5->buffLen = num bytes currently stored in md5->buffer
wolfSSL 13:f67a6c6013ca 66 * md5->loLen = num bytes that have been written to STM32 FIFO
wolfSSL 13:f67a6c6013ca 67 */
wolfSSL 13:f67a6c6013ca 68 XMEMSET(md5->buffer, 0, MD5_REG_SIZE);
wolfSSL 13:f67a6c6013ca 69
wolfSSL 13:f67a6c6013ca 70 md5->buffLen = 0;
wolfSSL 13:f67a6c6013ca 71 md5->loLen = 0;
wolfSSL 13:f67a6c6013ca 72
wolfSSL 13:f67a6c6013ca 73 /* initialize HASH peripheral */
wolfSSL 13:f67a6c6013ca 74 HASH_DeInit();
wolfSSL 13:f67a6c6013ca 75
wolfSSL 13:f67a6c6013ca 76 /* configure algo used, algo mode, datatype */
wolfSSL 13:f67a6c6013ca 77 HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE);
wolfSSL 13:f67a6c6013ca 78 HASH->CR |= (HASH_AlgoSelection_MD5 | HASH_AlgoMode_HASH
wolfSSL 13:f67a6c6013ca 79 | HASH_DataType_8b);
wolfSSL 13:f67a6c6013ca 80
wolfSSL 13:f67a6c6013ca 81 /* reset HASH processor */
wolfSSL 13:f67a6c6013ca 82 HASH->CR |= HASH_CR_INIT;
wolfSSL 13:f67a6c6013ca 83
wolfSSL 13:f67a6c6013ca 84 return 0;
wolfSSL 13:f67a6c6013ca 85 }
wolfSSL 13:f67a6c6013ca 86
wolfSSL 13:f67a6c6013ca 87 int wc_Md5Update(Md5* md5, const byte* data, word32 len)
wolfSSL 13:f67a6c6013ca 88 {
wolfSSL 13:f67a6c6013ca 89 word32 i = 0;
wolfSSL 13:f67a6c6013ca 90 word32 fill = 0;
wolfSSL 13:f67a6c6013ca 91 word32 diff = 0;
wolfSSL 13:f67a6c6013ca 92
wolfSSL 13:f67a6c6013ca 93 /* if saved partial block is available */
wolfSSL 13:f67a6c6013ca 94 if (md5->buffLen > 0) {
wolfSSL 13:f67a6c6013ca 95 fill = 4 - md5->buffLen;
wolfSSL 13:f67a6c6013ca 96
wolfSSL 13:f67a6c6013ca 97 /* if enough data to fill, fill and push to FIFO */
wolfSSL 13:f67a6c6013ca 98 if (fill <= len) {
wolfSSL 13:f67a6c6013ca 99 XMEMCPY((byte*)md5->buffer + md5->buffLen, data, fill);
wolfSSL 13:f67a6c6013ca 100 HASH_DataIn(*(uint32_t*)md5->buffer);
wolfSSL 13:f67a6c6013ca 101
wolfSSL 13:f67a6c6013ca 102 data += fill;
wolfSSL 13:f67a6c6013ca 103 len -= fill;
wolfSSL 13:f67a6c6013ca 104 md5->loLen += 4;
wolfSSL 13:f67a6c6013ca 105 md5->buffLen = 0;
wolfSSL 13:f67a6c6013ca 106 } else {
wolfSSL 13:f67a6c6013ca 107 /* append partial to existing stored block */
wolfSSL 13:f67a6c6013ca 108 XMEMCPY((byte*)md5->buffer + md5->buffLen, data, len);
wolfSSL 13:f67a6c6013ca 109 md5->buffLen += len;
wolfSSL 13:f67a6c6013ca 110 return 0;
wolfSSL 13:f67a6c6013ca 111 }
wolfSSL 13:f67a6c6013ca 112 }
wolfSSL 13:f67a6c6013ca 113
wolfSSL 13:f67a6c6013ca 114 /* write input block in the IN FIFO */
wolfSSL 13:f67a6c6013ca 115 for (i = 0; i < len; i += 4)
wolfSSL 13:f67a6c6013ca 116 {
wolfSSL 13:f67a6c6013ca 117 diff = len - i;
wolfSSL 13:f67a6c6013ca 118 if (diff < 4) {
wolfSSL 13:f67a6c6013ca 119 /* store incomplete last block, not yet in FIFO */
wolfSSL 13:f67a6c6013ca 120 XMEMSET(md5->buffer, 0, MD5_REG_SIZE);
wolfSSL 13:f67a6c6013ca 121 XMEMCPY((byte*)md5->buffer, data, diff);
wolfSSL 13:f67a6c6013ca 122 md5->buffLen = diff;
wolfSSL 13:f67a6c6013ca 123 } else {
wolfSSL 13:f67a6c6013ca 124 HASH_DataIn(*(uint32_t*)data);
wolfSSL 13:f67a6c6013ca 125 data+=4;
wolfSSL 13:f67a6c6013ca 126 }
wolfSSL 13:f67a6c6013ca 127 }
wolfSSL 13:f67a6c6013ca 128
wolfSSL 13:f67a6c6013ca 129 /* keep track of total data length thus far */
wolfSSL 13:f67a6c6013ca 130 md5->loLen += (len - md5->buffLen);
wolfSSL 13:f67a6c6013ca 131
wolfSSL 13:f67a6c6013ca 132 return 0;
wolfSSL 13:f67a6c6013ca 133 }
wolfSSL 13:f67a6c6013ca 134
wolfSSL 13:f67a6c6013ca 135 int wc_Md5Final(Md5* md5, byte* hash)
wolfSSL 13:f67a6c6013ca 136 {
wolfSSL 13:f67a6c6013ca 137 __IO uint16_t nbvalidbitsdata = 0;
wolfSSL 13:f67a6c6013ca 138
wolfSSL 13:f67a6c6013ca 139 /* finish reading any trailing bytes into FIFO */
wolfSSL 13:f67a6c6013ca 140 if (md5->buffLen > 0) {
wolfSSL 13:f67a6c6013ca 141 HASH_DataIn(*(uint32_t*)md5->buffer);
wolfSSL 13:f67a6c6013ca 142 md5->loLen += md5->buffLen;
wolfSSL 13:f67a6c6013ca 143 }
wolfSSL 13:f67a6c6013ca 144
wolfSSL 13:f67a6c6013ca 145 /* calculate number of valid bits in last word of input data */
wolfSSL 13:f67a6c6013ca 146 nbvalidbitsdata = 8 * (md5->loLen % MD5_REG_SIZE);
wolfSSL 13:f67a6c6013ca 147
wolfSSL 13:f67a6c6013ca 148 /* configure number of valid bits in last word of the data */
wolfSSL 13:f67a6c6013ca 149 HASH_SetLastWordValidBitsNbr(nbvalidbitsdata);
wolfSSL 13:f67a6c6013ca 150
wolfSSL 13:f67a6c6013ca 151 /* start HASH processor */
wolfSSL 13:f67a6c6013ca 152 HASH_StartDigest();
wolfSSL 13:f67a6c6013ca 153
wolfSSL 13:f67a6c6013ca 154 /* wait until Busy flag == RESET */
wolfSSL 13:f67a6c6013ca 155 while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {}
wolfSSL 13:f67a6c6013ca 156
wolfSSL 13:f67a6c6013ca 157 /* read message digest */
wolfSSL 13:f67a6c6013ca 158 md5->digest[0] = HASH->HR[0];
wolfSSL 13:f67a6c6013ca 159 md5->digest[1] = HASH->HR[1];
wolfSSL 13:f67a6c6013ca 160 md5->digest[2] = HASH->HR[2];
wolfSSL 13:f67a6c6013ca 161 md5->digest[3] = HASH->HR[3];
wolfSSL 13:f67a6c6013ca 162
wolfSSL 13:f67a6c6013ca 163 ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE);
wolfSSL 13:f67a6c6013ca 164
wolfSSL 13:f67a6c6013ca 165 XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE);
wolfSSL 13:f67a6c6013ca 166
wolfSSL 13:f67a6c6013ca 167 return wc_InitMd5(md5); /* reset state */
wolfSSL 13:f67a6c6013ca 168 }
wolfSSL 13:f67a6c6013ca 169
wolfSSL 13:f67a6c6013ca 170 #elif defined(FREESCALE_MMCAU_SHA)
wolfSSL 13:f67a6c6013ca 171 #include "cau_api.h"
wolfSSL 13:f67a6c6013ca 172 #define XTRANSFORM(S,B) Transform((S), (B))
wolfSSL 13:f67a6c6013ca 173
wolfSSL 13:f67a6c6013ca 174 static int Transform(Md5* md5, byte* data)
wolfSSL 13:f67a6c6013ca 175 {
wolfSSL 13:f67a6c6013ca 176 int ret = wolfSSL_CryptHwMutexLock();
wolfSSL 13:f67a6c6013ca 177 if(ret == 0) {
wolfSSL 13:f67a6c6013ca 178 #ifdef FREESCALE_MMCAU_CLASSIC_SHA
wolfSSL 13:f67a6c6013ca 179 cau_md5_hash_n(data, 1, (unsigned char*)md5->digest);
wolfSSL 13:f67a6c6013ca 180 #else
wolfSSL 13:f67a6c6013ca 181 MMCAU_MD5_HashN(data, 1, (uint32_t*)md5->digest);
wolfSSL 13:f67a6c6013ca 182 #endif
wolfSSL 13:f67a6c6013ca 183 wolfSSL_CryptHwMutexUnLock();
wolfSSL 13:f67a6c6013ca 184 }
wolfSSL 13:f67a6c6013ca 185 return ret;
wolfSSL 13:f67a6c6013ca 186 }
wolfSSL 13:f67a6c6013ca 187
wolfSSL 13:f67a6c6013ca 188 #elif defined(WOLFSSL_PIC32MZ_HASH)
wolfSSL 13:f67a6c6013ca 189 #include <wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h>
wolfSSL 13:f67a6c6013ca 190 #define HAVE_MD5_CUST_API
wolfSSL 13:f67a6c6013ca 191
wolfSSL 13:f67a6c6013ca 192 #else
wolfSSL 13:f67a6c6013ca 193 #define NEED_SOFT_MD5
wolfSSL 13:f67a6c6013ca 194
wolfSSL 13:f67a6c6013ca 195 #endif /* End Hardware Acceleration */
wolfSSL 13:f67a6c6013ca 196
wolfSSL 13:f67a6c6013ca 197
wolfSSL 13:f67a6c6013ca 198 #ifdef NEED_SOFT_MD5
wolfSSL 13:f67a6c6013ca 199
wolfSSL 13:f67a6c6013ca 200 #define XTRANSFORM(S,B) Transform((S))
wolfSSL 13:f67a6c6013ca 201
wolfSSL 13:f67a6c6013ca 202 #define F1(x, y, z) (z ^ (x & (y ^ z)))
wolfSSL 13:f67a6c6013ca 203 #define F2(x, y, z) F1(z, x, y)
wolfSSL 13:f67a6c6013ca 204 #define F3(x, y, z) (x ^ y ^ z)
wolfSSL 13:f67a6c6013ca 205 #define F4(x, y, z) (y ^ (x | ~z))
wolfSSL 13:f67a6c6013ca 206
wolfSSL 13:f67a6c6013ca 207 #define MD5STEP(f, w, x, y, z, data, s) \
wolfSSL 13:f67a6c6013ca 208 w = rotlFixed(w + f(x, y, z) + data, s) + x
wolfSSL 13:f67a6c6013ca 209
wolfSSL 13:f67a6c6013ca 210 static int Transform(Md5* md5)
wolfSSL 13:f67a6c6013ca 211 {
wolfSSL 13:f67a6c6013ca 212 /* Copy context->state[] to working vars */
wolfSSL 13:f67a6c6013ca 213 word32 a = md5->digest[0];
wolfSSL 13:f67a6c6013ca 214 word32 b = md5->digest[1];
wolfSSL 13:f67a6c6013ca 215 word32 c = md5->digest[2];
wolfSSL 13:f67a6c6013ca 216 word32 d = md5->digest[3];
wolfSSL 13:f67a6c6013ca 217
wolfSSL 13:f67a6c6013ca 218 MD5STEP(F1, a, b, c, d, md5->buffer[0] + 0xd76aa478, 7);
wolfSSL 13:f67a6c6013ca 219 MD5STEP(F1, d, a, b, c, md5->buffer[1] + 0xe8c7b756, 12);
wolfSSL 13:f67a6c6013ca 220 MD5STEP(F1, c, d, a, b, md5->buffer[2] + 0x242070db, 17);
wolfSSL 13:f67a6c6013ca 221 MD5STEP(F1, b, c, d, a, md5->buffer[3] + 0xc1bdceee, 22);
wolfSSL 13:f67a6c6013ca 222 MD5STEP(F1, a, b, c, d, md5->buffer[4] + 0xf57c0faf, 7);
wolfSSL 13:f67a6c6013ca 223 MD5STEP(F1, d, a, b, c, md5->buffer[5] + 0x4787c62a, 12);
wolfSSL 13:f67a6c6013ca 224 MD5STEP(F1, c, d, a, b, md5->buffer[6] + 0xa8304613, 17);
wolfSSL 13:f67a6c6013ca 225 MD5STEP(F1, b, c, d, a, md5->buffer[7] + 0xfd469501, 22);
wolfSSL 13:f67a6c6013ca 226 MD5STEP(F1, a, b, c, d, md5->buffer[8] + 0x698098d8, 7);
wolfSSL 13:f67a6c6013ca 227 MD5STEP(F1, d, a, b, c, md5->buffer[9] + 0x8b44f7af, 12);
wolfSSL 13:f67a6c6013ca 228 MD5STEP(F1, c, d, a, b, md5->buffer[10] + 0xffff5bb1, 17);
wolfSSL 13:f67a6c6013ca 229 MD5STEP(F1, b, c, d, a, md5->buffer[11] + 0x895cd7be, 22);
wolfSSL 13:f67a6c6013ca 230 MD5STEP(F1, a, b, c, d, md5->buffer[12] + 0x6b901122, 7);
wolfSSL 13:f67a6c6013ca 231 MD5STEP(F1, d, a, b, c, md5->buffer[13] + 0xfd987193, 12);
wolfSSL 13:f67a6c6013ca 232 MD5STEP(F1, c, d, a, b, md5->buffer[14] + 0xa679438e, 17);
wolfSSL 13:f67a6c6013ca 233 MD5STEP(F1, b, c, d, a, md5->buffer[15] + 0x49b40821, 22);
wolfSSL 13:f67a6c6013ca 234
wolfSSL 13:f67a6c6013ca 235 MD5STEP(F2, a, b, c, d, md5->buffer[1] + 0xf61e2562, 5);
wolfSSL 13:f67a6c6013ca 236 MD5STEP(F2, d, a, b, c, md5->buffer[6] + 0xc040b340, 9);
wolfSSL 13:f67a6c6013ca 237 MD5STEP(F2, c, d, a, b, md5->buffer[11] + 0x265e5a51, 14);
wolfSSL 13:f67a6c6013ca 238 MD5STEP(F2, b, c, d, a, md5->buffer[0] + 0xe9b6c7aa, 20);
wolfSSL 13:f67a6c6013ca 239 MD5STEP(F2, a, b, c, d, md5->buffer[5] + 0xd62f105d, 5);
wolfSSL 13:f67a6c6013ca 240 MD5STEP(F2, d, a, b, c, md5->buffer[10] + 0x02441453, 9);
wolfSSL 13:f67a6c6013ca 241 MD5STEP(F2, c, d, a, b, md5->buffer[15] + 0xd8a1e681, 14);
wolfSSL 13:f67a6c6013ca 242 MD5STEP(F2, b, c, d, a, md5->buffer[4] + 0xe7d3fbc8, 20);
wolfSSL 13:f67a6c6013ca 243 MD5STEP(F2, a, b, c, d, md5->buffer[9] + 0x21e1cde6, 5);
wolfSSL 13:f67a6c6013ca 244 MD5STEP(F2, d, a, b, c, md5->buffer[14] + 0xc33707d6, 9);
wolfSSL 13:f67a6c6013ca 245 MD5STEP(F2, c, d, a, b, md5->buffer[3] + 0xf4d50d87, 14);
wolfSSL 13:f67a6c6013ca 246 MD5STEP(F2, b, c, d, a, md5->buffer[8] + 0x455a14ed, 20);
wolfSSL 13:f67a6c6013ca 247 MD5STEP(F2, a, b, c, d, md5->buffer[13] + 0xa9e3e905, 5);
wolfSSL 13:f67a6c6013ca 248 MD5STEP(F2, d, a, b, c, md5->buffer[2] + 0xfcefa3f8, 9);
wolfSSL 13:f67a6c6013ca 249 MD5STEP(F2, c, d, a, b, md5->buffer[7] + 0x676f02d9, 14);
wolfSSL 13:f67a6c6013ca 250 MD5STEP(F2, b, c, d, a, md5->buffer[12] + 0x8d2a4c8a, 20);
wolfSSL 13:f67a6c6013ca 251
wolfSSL 13:f67a6c6013ca 252 MD5STEP(F3, a, b, c, d, md5->buffer[5] + 0xfffa3942, 4);
wolfSSL 13:f67a6c6013ca 253 MD5STEP(F3, d, a, b, c, md5->buffer[8] + 0x8771f681, 11);
wolfSSL 13:f67a6c6013ca 254 MD5STEP(F3, c, d, a, b, md5->buffer[11] + 0x6d9d6122, 16);
wolfSSL 13:f67a6c6013ca 255 MD5STEP(F3, b, c, d, a, md5->buffer[14] + 0xfde5380c, 23);
wolfSSL 13:f67a6c6013ca 256 MD5STEP(F3, a, b, c, d, md5->buffer[1] + 0xa4beea44, 4);
wolfSSL 13:f67a6c6013ca 257 MD5STEP(F3, d, a, b, c, md5->buffer[4] + 0x4bdecfa9, 11);
wolfSSL 13:f67a6c6013ca 258 MD5STEP(F3, c, d, a, b, md5->buffer[7] + 0xf6bb4b60, 16);
wolfSSL 13:f67a6c6013ca 259 MD5STEP(F3, b, c, d, a, md5->buffer[10] + 0xbebfbc70, 23);
wolfSSL 13:f67a6c6013ca 260 MD5STEP(F3, a, b, c, d, md5->buffer[13] + 0x289b7ec6, 4);
wolfSSL 13:f67a6c6013ca 261 MD5STEP(F3, d, a, b, c, md5->buffer[0] + 0xeaa127fa, 11);
wolfSSL 13:f67a6c6013ca 262 MD5STEP(F3, c, d, a, b, md5->buffer[3] + 0xd4ef3085, 16);
wolfSSL 13:f67a6c6013ca 263 MD5STEP(F3, b, c, d, a, md5->buffer[6] + 0x04881d05, 23);
wolfSSL 13:f67a6c6013ca 264 MD5STEP(F3, a, b, c, d, md5->buffer[9] + 0xd9d4d039, 4);
wolfSSL 13:f67a6c6013ca 265 MD5STEP(F3, d, a, b, c, md5->buffer[12] + 0xe6db99e5, 11);
wolfSSL 13:f67a6c6013ca 266 MD5STEP(F3, c, d, a, b, md5->buffer[15] + 0x1fa27cf8, 16);
wolfSSL 13:f67a6c6013ca 267 MD5STEP(F3, b, c, d, a, md5->buffer[2] + 0xc4ac5665, 23);
wolfSSL 13:f67a6c6013ca 268
wolfSSL 13:f67a6c6013ca 269 MD5STEP(F4, a, b, c, d, md5->buffer[0] + 0xf4292244, 6);
wolfSSL 13:f67a6c6013ca 270 MD5STEP(F4, d, a, b, c, md5->buffer[7] + 0x432aff97, 10);
wolfSSL 13:f67a6c6013ca 271 MD5STEP(F4, c, d, a, b, md5->buffer[14] + 0xab9423a7, 15);
wolfSSL 13:f67a6c6013ca 272 MD5STEP(F4, b, c, d, a, md5->buffer[5] + 0xfc93a039, 21);
wolfSSL 13:f67a6c6013ca 273 MD5STEP(F4, a, b, c, d, md5->buffer[12] + 0x655b59c3, 6);
wolfSSL 13:f67a6c6013ca 274 MD5STEP(F4, d, a, b, c, md5->buffer[3] + 0x8f0ccc92, 10);
wolfSSL 13:f67a6c6013ca 275 MD5STEP(F4, c, d, a, b, md5->buffer[10] + 0xffeff47d, 15);
wolfSSL 13:f67a6c6013ca 276 MD5STEP(F4, b, c, d, a, md5->buffer[1] + 0x85845dd1, 21);
wolfSSL 13:f67a6c6013ca 277 MD5STEP(F4, a, b, c, d, md5->buffer[8] + 0x6fa87e4f, 6);
wolfSSL 13:f67a6c6013ca 278 MD5STEP(F4, d, a, b, c, md5->buffer[15] + 0xfe2ce6e0, 10);
wolfSSL 13:f67a6c6013ca 279 MD5STEP(F4, c, d, a, b, md5->buffer[6] + 0xa3014314, 15);
wolfSSL 13:f67a6c6013ca 280 MD5STEP(F4, b, c, d, a, md5->buffer[13] + 0x4e0811a1, 21);
wolfSSL 13:f67a6c6013ca 281 MD5STEP(F4, a, b, c, d, md5->buffer[4] + 0xf7537e82, 6);
wolfSSL 13:f67a6c6013ca 282 MD5STEP(F4, d, a, b, c, md5->buffer[11] + 0xbd3af235, 10);
wolfSSL 13:f67a6c6013ca 283 MD5STEP(F4, c, d, a, b, md5->buffer[2] + 0x2ad7d2bb, 15);
wolfSSL 13:f67a6c6013ca 284 MD5STEP(F4, b, c, d, a, md5->buffer[9] + 0xeb86d391, 21);
wolfSSL 13:f67a6c6013ca 285
wolfSSL 13:f67a6c6013ca 286 /* Add the working vars back into digest state[] */
wolfSSL 13:f67a6c6013ca 287 md5->digest[0] += a;
wolfSSL 13:f67a6c6013ca 288 md5->digest[1] += b;
wolfSSL 13:f67a6c6013ca 289 md5->digest[2] += c;
wolfSSL 13:f67a6c6013ca 290 md5->digest[3] += d;
wolfSSL 13:f67a6c6013ca 291
wolfSSL 13:f67a6c6013ca 292 return 0;
wolfSSL 13:f67a6c6013ca 293 }
wolfSSL 13:f67a6c6013ca 294 #endif /* NEED_SOFT_MD5 */
wolfSSL 13:f67a6c6013ca 295
wolfSSL 13:f67a6c6013ca 296
wolfSSL 13:f67a6c6013ca 297 #ifndef HAVE_MD5_CUST_API
wolfSSL 13:f67a6c6013ca 298 static INLINE void AddMd5Length(Md5* md5, word32 len)
wolfSSL 13:f67a6c6013ca 299 {
wolfSSL 13:f67a6c6013ca 300 word32 tmp = md5->loLen;
wolfSSL 13:f67a6c6013ca 301 if ((md5->loLen += len) < tmp) {
wolfSSL 13:f67a6c6013ca 302 md5->hiLen++; /* carry low to high */
wolfSSL 13:f67a6c6013ca 303 }
wolfSSL 13:f67a6c6013ca 304 }
wolfSSL 13:f67a6c6013ca 305
wolfSSL 13:f67a6c6013ca 306 static int _InitMd5(Md5* md5)
wolfSSL 13:f67a6c6013ca 307 {
wolfSSL 13:f67a6c6013ca 308 int ret = 0;
wolfSSL 13:f67a6c6013ca 309
wolfSSL 13:f67a6c6013ca 310 md5->digest[0] = 0x67452301L;
wolfSSL 13:f67a6c6013ca 311 md5->digest[1] = 0xefcdab89L;
wolfSSL 13:f67a6c6013ca 312 md5->digest[2] = 0x98badcfeL;
wolfSSL 13:f67a6c6013ca 313 md5->digest[3] = 0x10325476L;
wolfSSL 13:f67a6c6013ca 314
wolfSSL 13:f67a6c6013ca 315 md5->buffLen = 0;
wolfSSL 13:f67a6c6013ca 316 md5->loLen = 0;
wolfSSL 13:f67a6c6013ca 317 md5->hiLen = 0;
wolfSSL 13:f67a6c6013ca 318
wolfSSL 13:f67a6c6013ca 319 return ret;
wolfSSL 13:f67a6c6013ca 320 }
wolfSSL 13:f67a6c6013ca 321
wolfSSL 13:f67a6c6013ca 322 int wc_InitMd5_ex(Md5* md5, void* heap, int devId)
wolfSSL 13:f67a6c6013ca 323 {
wolfSSL 13:f67a6c6013ca 324 int ret = 0;
wolfSSL 13:f67a6c6013ca 325
wolfSSL 13:f67a6c6013ca 326 if (md5 == NULL)
wolfSSL 13:f67a6c6013ca 327 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 328
wolfSSL 13:f67a6c6013ca 329 md5->heap = heap;
wolfSSL 13:f67a6c6013ca 330
wolfSSL 13:f67a6c6013ca 331 ret = _InitMd5(md5);
wolfSSL 13:f67a6c6013ca 332 if (ret != 0)
wolfSSL 13:f67a6c6013ca 333 return ret;
wolfSSL 13:f67a6c6013ca 334
wolfSSL 13:f67a6c6013ca 335 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_MD5)
wolfSSL 13:f67a6c6013ca 336 ret = wolfAsync_DevCtxInit(&md5->asyncDev, WOLFSSL_ASYNC_MARKER_MD5,
wolfSSL 13:f67a6c6013ca 337 md5->heap, devId);
wolfSSL 13:f67a6c6013ca 338 #else
wolfSSL 13:f67a6c6013ca 339 (void)devId;
wolfSSL 13:f67a6c6013ca 340 #endif
wolfSSL 13:f67a6c6013ca 341 return ret;
wolfSSL 13:f67a6c6013ca 342 }
wolfSSL 13:f67a6c6013ca 343
wolfSSL 13:f67a6c6013ca 344 int wc_Md5Update(Md5* md5, const byte* data, word32 len)
wolfSSL 13:f67a6c6013ca 345 {
wolfSSL 13:f67a6c6013ca 346 int ret = 0;
wolfSSL 13:f67a6c6013ca 347 byte* local;
wolfSSL 13:f67a6c6013ca 348
wolfSSL 13:f67a6c6013ca 349 if (md5 == NULL || (data == NULL && len > 0)) {
wolfSSL 13:f67a6c6013ca 350 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 351 }
wolfSSL 13:f67a6c6013ca 352
wolfSSL 13:f67a6c6013ca 353 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_MD5)
wolfSSL 13:f67a6c6013ca 354 if (md5->asyncDev.marker == WOLFSSL_ASYNC_MARKER_MD5) {
wolfSSL 13:f67a6c6013ca 355 #if defined(HAVE_INTEL_QA)
wolfSSL 13:f67a6c6013ca 356 return IntelQaSymMd5(&md5->asyncDev, NULL, data, len);
wolfSSL 13:f67a6c6013ca 357 #endif
wolfSSL 13:f67a6c6013ca 358 }
wolfSSL 13:f67a6c6013ca 359 #endif /* WOLFSSL_ASYNC_CRYPT */
wolfSSL 13:f67a6c6013ca 360
wolfSSL 13:f67a6c6013ca 361 /* do block size increments */
wolfSSL 13:f67a6c6013ca 362 local = (byte*)md5->buffer;
wolfSSL 13:f67a6c6013ca 363
wolfSSL 13:f67a6c6013ca 364 /* check that internal buffLen is valid */
wolfSSL 13:f67a6c6013ca 365 if (md5->buffLen >= MD5_BLOCK_SIZE)
wolfSSL 13:f67a6c6013ca 366 return BUFFER_E;
wolfSSL 13:f67a6c6013ca 367
wolfSSL 13:f67a6c6013ca 368 while (len) {
wolfSSL 13:f67a6c6013ca 369 word32 add = min(len, MD5_BLOCK_SIZE - md5->buffLen);
wolfSSL 13:f67a6c6013ca 370 XMEMCPY(&local[md5->buffLen], data, add);
wolfSSL 13:f67a6c6013ca 371
wolfSSL 13:f67a6c6013ca 372 md5->buffLen += add;
wolfSSL 13:f67a6c6013ca 373 data += add;
wolfSSL 13:f67a6c6013ca 374 len -= add;
wolfSSL 13:f67a6c6013ca 375
wolfSSL 13:f67a6c6013ca 376 if (md5->buffLen == MD5_BLOCK_SIZE) {
wolfSSL 13:f67a6c6013ca 377 #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
wolfSSL 13:f67a6c6013ca 378 ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE);
wolfSSL 13:f67a6c6013ca 379 #endif
wolfSSL 13:f67a6c6013ca 380 XTRANSFORM(md5, local);
wolfSSL 13:f67a6c6013ca 381 AddMd5Length(md5, MD5_BLOCK_SIZE);
wolfSSL 13:f67a6c6013ca 382 md5->buffLen = 0;
wolfSSL 13:f67a6c6013ca 383 }
wolfSSL 13:f67a6c6013ca 384 }
wolfSSL 13:f67a6c6013ca 385 return ret;
wolfSSL 13:f67a6c6013ca 386 }
wolfSSL 13:f67a6c6013ca 387
wolfSSL 13:f67a6c6013ca 388 int wc_Md5Final(Md5* md5, byte* hash)
wolfSSL 13:f67a6c6013ca 389 {
wolfSSL 13:f67a6c6013ca 390 byte* local;
wolfSSL 13:f67a6c6013ca 391
wolfSSL 13:f67a6c6013ca 392 if (md5 == NULL || hash == NULL) {
wolfSSL 13:f67a6c6013ca 393 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 394 }
wolfSSL 13:f67a6c6013ca 395
wolfSSL 13:f67a6c6013ca 396 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_MD5)
wolfSSL 13:f67a6c6013ca 397 if (md5->asyncDev.marker == WOLFSSL_ASYNC_MARKER_MD5) {
wolfSSL 13:f67a6c6013ca 398 #if defined(HAVE_INTEL_QA)
wolfSSL 13:f67a6c6013ca 399 return IntelQaSymMd5(&md5->asyncDev, hash, NULL, MD5_DIGEST_SIZE);
wolfSSL 13:f67a6c6013ca 400 #endif
wolfSSL 13:f67a6c6013ca 401 }
wolfSSL 13:f67a6c6013ca 402 #endif /* WOLFSSL_ASYNC_CRYPT */
wolfSSL 13:f67a6c6013ca 403
wolfSSL 13:f67a6c6013ca 404 local = (byte*)md5->buffer;
wolfSSL 13:f67a6c6013ca 405
wolfSSL 13:f67a6c6013ca 406 AddMd5Length(md5, md5->buffLen); /* before adding pads */
wolfSSL 13:f67a6c6013ca 407 local[md5->buffLen++] = 0x80; /* add 1 */
wolfSSL 13:f67a6c6013ca 408
wolfSSL 13:f67a6c6013ca 409 /* pad with zeros */
wolfSSL 13:f67a6c6013ca 410 if (md5->buffLen > MD5_PAD_SIZE) {
wolfSSL 13:f67a6c6013ca 411 XMEMSET(&local[md5->buffLen], 0, MD5_BLOCK_SIZE - md5->buffLen);
wolfSSL 13:f67a6c6013ca 412 md5->buffLen += MD5_BLOCK_SIZE - md5->buffLen;
wolfSSL 13:f67a6c6013ca 413
wolfSSL 13:f67a6c6013ca 414 #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
wolfSSL 13:f67a6c6013ca 415 ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE);
wolfSSL 13:f67a6c6013ca 416 #endif
wolfSSL 13:f67a6c6013ca 417 XTRANSFORM(md5, local);
wolfSSL 13:f67a6c6013ca 418 md5->buffLen = 0;
wolfSSL 13:f67a6c6013ca 419 }
wolfSSL 13:f67a6c6013ca 420 XMEMSET(&local[md5->buffLen], 0, MD5_PAD_SIZE - md5->buffLen);
wolfSSL 13:f67a6c6013ca 421
wolfSSL 13:f67a6c6013ca 422 #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
wolfSSL 13:f67a6c6013ca 423 ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE);
wolfSSL 13:f67a6c6013ca 424 #endif
wolfSSL 13:f67a6c6013ca 425
wolfSSL 13:f67a6c6013ca 426 /* put lengths in bits */
wolfSSL 13:f67a6c6013ca 427 md5->hiLen = (md5->loLen >> (8*sizeof(md5->loLen) - 3)) +
wolfSSL 13:f67a6c6013ca 428 (md5->hiLen << 3);
wolfSSL 13:f67a6c6013ca 429 md5->loLen = md5->loLen << 3;
wolfSSL 13:f67a6c6013ca 430
wolfSSL 13:f67a6c6013ca 431 /* store lengths */
wolfSSL 13:f67a6c6013ca 432 /* ! length ordering dependent on digest endian type ! */
wolfSSL 13:f67a6c6013ca 433 XMEMCPY(&local[MD5_PAD_SIZE], &md5->loLen, sizeof(word32));
wolfSSL 13:f67a6c6013ca 434 XMEMCPY(&local[MD5_PAD_SIZE + sizeof(word32)], &md5->hiLen, sizeof(word32));
wolfSSL 13:f67a6c6013ca 435
wolfSSL 13:f67a6c6013ca 436 /* final transform and result to hash */
wolfSSL 13:f67a6c6013ca 437 XTRANSFORM(md5, local);
wolfSSL 13:f67a6c6013ca 438 #ifdef BIG_ENDIAN_ORDER
wolfSSL 13:f67a6c6013ca 439 ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE);
wolfSSL 13:f67a6c6013ca 440 #endif
wolfSSL 13:f67a6c6013ca 441 XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE);
wolfSSL 13:f67a6c6013ca 442
wolfSSL 13:f67a6c6013ca 443 return _InitMd5(md5); /* reset state */
wolfSSL 13:f67a6c6013ca 444 }
wolfSSL 13:f67a6c6013ca 445 #endif /* !HAVE_MD5_CUST_API */
wolfSSL 13:f67a6c6013ca 446
wolfSSL 13:f67a6c6013ca 447
wolfSSL 13:f67a6c6013ca 448 int wc_InitMd5(Md5* md5)
wolfSSL 13:f67a6c6013ca 449 {
wolfSSL 13:f67a6c6013ca 450 if (md5 == NULL) {
wolfSSL 13:f67a6c6013ca 451 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 452 }
wolfSSL 13:f67a6c6013ca 453 return wc_InitMd5_ex(md5, NULL, INVALID_DEVID);
wolfSSL 13:f67a6c6013ca 454 }
wolfSSL 13:f67a6c6013ca 455
wolfSSL 13:f67a6c6013ca 456 void wc_Md5Free(Md5* md5)
wolfSSL 13:f67a6c6013ca 457 {
wolfSSL 13:f67a6c6013ca 458 if (md5 == NULL)
wolfSSL 13:f67a6c6013ca 459 return;
wolfSSL 13:f67a6c6013ca 460 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_MD5)
wolfSSL 13:f67a6c6013ca 461 wolfAsync_DevCtxFree(&md5->asyncDev, WOLFSSL_ASYNC_MARKER_MD5);
wolfSSL 13:f67a6c6013ca 462 #endif /* WOLFSSL_ASYNC_CRYPT */
wolfSSL 13:f67a6c6013ca 463 }
wolfSSL 13:f67a6c6013ca 464
wolfSSL 13:f67a6c6013ca 465 int wc_Md5GetHash(Md5* md5, byte* hash)
wolfSSL 13:f67a6c6013ca 466 {
wolfSSL 13:f67a6c6013ca 467 int ret;
wolfSSL 13:f67a6c6013ca 468 Md5 tmpMd5;
wolfSSL 13:f67a6c6013ca 469
wolfSSL 13:f67a6c6013ca 470 if (md5 == NULL || hash == NULL)
wolfSSL 13:f67a6c6013ca 471 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 472
wolfSSL 13:f67a6c6013ca 473 ret = wc_Md5Copy(md5, &tmpMd5);
wolfSSL 13:f67a6c6013ca 474 if (ret == 0) {
wolfSSL 13:f67a6c6013ca 475 ret = wc_Md5Final(&tmpMd5, hash);
wolfSSL 13:f67a6c6013ca 476 }
wolfSSL 13:f67a6c6013ca 477
wolfSSL 13:f67a6c6013ca 478 return ret;
wolfSSL 13:f67a6c6013ca 479 }
wolfSSL 13:f67a6c6013ca 480
wolfSSL 13:f67a6c6013ca 481 int wc_Md5Copy(Md5* src, Md5* dst)
wolfSSL 13:f67a6c6013ca 482 {
wolfSSL 13:f67a6c6013ca 483 int ret = 0;
wolfSSL 13:f67a6c6013ca 484
wolfSSL 13:f67a6c6013ca 485 if (src == NULL || dst == NULL)
wolfSSL 13:f67a6c6013ca 486 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 487
wolfSSL 13:f67a6c6013ca 488 XMEMCPY(dst, src, sizeof(Md5));
wolfSSL 13:f67a6c6013ca 489
wolfSSL 13:f67a6c6013ca 490 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 13:f67a6c6013ca 491 ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
wolfSSL 13:f67a6c6013ca 492 #endif
wolfSSL 13:f67a6c6013ca 493 #ifdef WOLFSSL_PIC32MZ_HASH
wolfSSL 13:f67a6c6013ca 494 ret = wc_Pic32HashCopy(&src->cache, &dst->cache);
wolfSSL 13:f67a6c6013ca 495 #endif
wolfSSL 13:f67a6c6013ca 496
wolfSSL 13:f67a6c6013ca 497 return ret;
wolfSSL 13:f67a6c6013ca 498 }
wolfSSL 13:f67a6c6013ca 499
wolfSSL 13:f67a6c6013ca 500 #endif /* WOLFSSL_TI_HASH */
wolfSSL 13:f67a6c6013ca 501 #endif /* NO_MD5 */
wolfSSL 13:f67a6c6013ca 502