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

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

Committer:
wolfSSL
Date:
Fri Jun 05 00:11:07 2020 +0000
Revision:
17:a5f916481144
Parent:
16:8e0d178b1d1e
wolfSSL 4.4.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 15:117db924cf7c 1 /* md5.c
wolfSSL 15:117db924cf7c 2 *
wolfSSL 16:8e0d178b1d1e 3 * Copyright (C) 2006-2020 wolfSSL Inc.
wolfSSL 15:117db924cf7c 4 *
wolfSSL 15:117db924cf7c 5 * This file is part of wolfSSL.
wolfSSL 15:117db924cf7c 6 *
wolfSSL 15:117db924cf7c 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 15:117db924cf7c 8 * it under the terms of the GNU General Public License as published by
wolfSSL 15:117db924cf7c 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 15:117db924cf7c 10 * (at your option) any later version.
wolfSSL 15:117db924cf7c 11 *
wolfSSL 15:117db924cf7c 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 15:117db924cf7c 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 15:117db924cf7c 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 15:117db924cf7c 15 * GNU General Public License for more details.
wolfSSL 15:117db924cf7c 16 *
wolfSSL 15:117db924cf7c 17 * You should have received a copy of the GNU General Public License
wolfSSL 15:117db924cf7c 18 * along with this program; if not, write to the Free Software
wolfSSL 15:117db924cf7c 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 15:117db924cf7c 20 */
wolfSSL 15:117db924cf7c 21
wolfSSL 15:117db924cf7c 22
wolfSSL 15:117db924cf7c 23
wolfSSL 15:117db924cf7c 24 #ifdef HAVE_CONFIG_H
wolfSSL 16:8e0d178b1d1e 25 #include <config.h>
wolfSSL 15:117db924cf7c 26 #endif
wolfSSL 15:117db924cf7c 27
wolfSSL 15:117db924cf7c 28 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 15:117db924cf7c 29
wolfSSL 15:117db924cf7c 30 #if !defined(NO_MD5)
wolfSSL 15:117db924cf7c 31
wolfSSL 15:117db924cf7c 32 #if defined(WOLFSSL_TI_HASH)
wolfSSL 16:8e0d178b1d1e 33 /* #include <wolfcrypt/src/port/ti/ti-hash.c> included by wc_port.c */
wolfSSL 15:117db924cf7c 34
wolfSSL 15:117db924cf7c 35 #else
wolfSSL 15:117db924cf7c 36
wolfSSL 15:117db924cf7c 37 #include <wolfssl/wolfcrypt/md5.h>
wolfSSL 15:117db924cf7c 38 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 15:117db924cf7c 39 #include <wolfssl/wolfcrypt/logging.h>
wolfSSL 16:8e0d178b1d1e 40 #include <wolfssl/wolfcrypt/hash.h>
wolfSSL 15:117db924cf7c 41
wolfSSL 15:117db924cf7c 42 #ifdef NO_INLINE
wolfSSL 16:8e0d178b1d1e 43 #include <wolfssl/wolfcrypt/misc.h>
wolfSSL 15:117db924cf7c 44 #else
wolfSSL 16:8e0d178b1d1e 45 #define WOLFSSL_MISC_INCLUDED
wolfSSL 16:8e0d178b1d1e 46 #include <wolfcrypt/src/misc.c>
wolfSSL 15:117db924cf7c 47 #endif
wolfSSL 15:117db924cf7c 48
wolfSSL 15:117db924cf7c 49
wolfSSL 15:117db924cf7c 50 /* Hardware Acceleration */
wolfSSL 15:117db924cf7c 51 #if defined(STM32_HASH)
wolfSSL 15:117db924cf7c 52
wolfSSL 16:8e0d178b1d1e 53 /* Supports CubeMX HAL or Standard Peripheral Library */
wolfSSL 16:8e0d178b1d1e 54 #define HAVE_MD5_CUST_API
wolfSSL 15:117db924cf7c 55
wolfSSL 16:8e0d178b1d1e 56 int wc_InitMd5_ex(wc_Md5* md5, void* heap, int devId)
wolfSSL 16:8e0d178b1d1e 57 {
wolfSSL 16:8e0d178b1d1e 58 if (md5 == NULL) {
wolfSSL 16:8e0d178b1d1e 59 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 60 }
wolfSSL 15:117db924cf7c 61
wolfSSL 16:8e0d178b1d1e 62 (void)devId;
wolfSSL 16:8e0d178b1d1e 63 (void)heap;
wolfSSL 16:8e0d178b1d1e 64
wolfSSL 16:8e0d178b1d1e 65 wc_Stm32_Hash_Init(&md5->stmCtx);
wolfSSL 16:8e0d178b1d1e 66
wolfSSL 16:8e0d178b1d1e 67 return 0;
wolfSSL 16:8e0d178b1d1e 68 }
wolfSSL 15:117db924cf7c 69
wolfSSL 16:8e0d178b1d1e 70 int wc_Md5Update(wc_Md5* md5, const byte* data, word32 len)
wolfSSL 16:8e0d178b1d1e 71 {
wolfSSL 16:8e0d178b1d1e 72 int ret;
wolfSSL 16:8e0d178b1d1e 73
wolfSSL 16:8e0d178b1d1e 74 if (md5 == NULL || (data == NULL && len > 0)) {
wolfSSL 16:8e0d178b1d1e 75 return BAD_FUNC_ARG;
wolfSSL 16:8e0d178b1d1e 76 }
wolfSSL 15:117db924cf7c 77
wolfSSL 16:8e0d178b1d1e 78 ret = wolfSSL_CryptHwMutexLock();
wolfSSL 16:8e0d178b1d1e 79 if (ret == 0) {
wolfSSL 16:8e0d178b1d1e 80 ret = wc_Stm32_Hash_Update(&md5->stmCtx, HASH_AlgoSelection_MD5,
wolfSSL 16:8e0d178b1d1e 81 data, len);
wolfSSL 16:8e0d178b1d1e 82 wolfSSL_CryptHwMutexUnLock();
wolfSSL 16:8e0d178b1d1e 83 }
wolfSSL 16:8e0d178b1d1e 84 return ret;
wolfSSL 16:8e0d178b1d1e 85 }
wolfSSL 16:8e0d178b1d1e 86
wolfSSL 16:8e0d178b1d1e 87 int wc_Md5Final(wc_Md5* md5, byte* hash)
wolfSSL 16:8e0d178b1d1e 88 {
wolfSSL 16:8e0d178b1d1e 89 int ret;
wolfSSL 16:8e0d178b1d1e 90
wolfSSL 16:8e0d178b1d1e 91 if (md5 == NULL || hash == NULL) {
wolfSSL 16:8e0d178b1d1e 92 return BAD_FUNC_ARG;
wolfSSL 16:8e0d178b1d1e 93 }
wolfSSL 16:8e0d178b1d1e 94
wolfSSL 16:8e0d178b1d1e 95 ret = wolfSSL_CryptHwMutexLock();
wolfSSL 16:8e0d178b1d1e 96 if (ret == 0) {
wolfSSL 16:8e0d178b1d1e 97 ret = wc_Stm32_Hash_Final(&md5->stmCtx, HASH_AlgoSelection_MD5,
wolfSSL 16:8e0d178b1d1e 98 hash, WC_MD5_DIGEST_SIZE);
wolfSSL 16:8e0d178b1d1e 99 wolfSSL_CryptHwMutexUnLock();
wolfSSL 15:117db924cf7c 100 }
wolfSSL 15:117db924cf7c 101
wolfSSL 16:8e0d178b1d1e 102 (void)wc_InitMd5(md5); /* reset state */
wolfSSL 15:117db924cf7c 103
wolfSSL 16:8e0d178b1d1e 104 return ret;
wolfSSL 16:8e0d178b1d1e 105 }
wolfSSL 15:117db924cf7c 106
wolfSSL 15:117db924cf7c 107 #elif defined(FREESCALE_MMCAU_SHA)
wolfSSL 16:8e0d178b1d1e 108
wolfSSL 16:8e0d178b1d1e 109 #ifdef FREESCALE_MMCAU_CLASSIC_SHA
wolfSSL 15:117db924cf7c 110 #include "cau_api.h"
wolfSSL 16:8e0d178b1d1e 111 #else
wolfSSL 16:8e0d178b1d1e 112 #include "fsl_mmcau.h"
wolfSSL 16:8e0d178b1d1e 113 #endif
wolfSSL 16:8e0d178b1d1e 114
wolfSSL 16:8e0d178b1d1e 115 #define XTRANSFORM(S,B) Transform((S), (B))
wolfSSL 16:8e0d178b1d1e 116 #define XTRANSFORM_LEN(S,B,L) Transform_Len((S), (B), (L))
wolfSSL 16:8e0d178b1d1e 117
wolfSSL 16:8e0d178b1d1e 118 #ifndef WC_HASH_DATA_ALIGNMENT
wolfSSL 16:8e0d178b1d1e 119 /* these hardware API's require 4 byte (word32) alignment */
wolfSSL 16:8e0d178b1d1e 120 #define WC_HASH_DATA_ALIGNMENT 4
wolfSSL 16:8e0d178b1d1e 121 #endif
wolfSSL 16:8e0d178b1d1e 122
wolfSSL 16:8e0d178b1d1e 123 static int Transform(wc_Md5* md5, const byte* data)
wolfSSL 16:8e0d178b1d1e 124 {
wolfSSL 16:8e0d178b1d1e 125 int ret = wolfSSL_CryptHwMutexLock();
wolfSSL 16:8e0d178b1d1e 126 if (ret == 0) {
wolfSSL 16:8e0d178b1d1e 127 #ifdef FREESCALE_MMCAU_CLASSIC_SHA
wolfSSL 16:8e0d178b1d1e 128 cau_md5_hash_n((byte*)data, 1, (unsigned char*)md5->digest);
wolfSSL 16:8e0d178b1d1e 129 #else
wolfSSL 16:8e0d178b1d1e 130 MMCAU_MD5_HashN((byte*)data, 1, (uint32_t*)md5->digest);
wolfSSL 16:8e0d178b1d1e 131 #endif
wolfSSL 16:8e0d178b1d1e 132 wolfSSL_CryptHwMutexUnLock();
wolfSSL 16:8e0d178b1d1e 133 }
wolfSSL 16:8e0d178b1d1e 134 return ret;
wolfSSL 16:8e0d178b1d1e 135 }
wolfSSL 15:117db924cf7c 136
wolfSSL 16:8e0d178b1d1e 137 static int Transform_Len(wc_Md5* md5, const byte* data, word32 len)
wolfSSL 16:8e0d178b1d1e 138 {
wolfSSL 16:8e0d178b1d1e 139 int ret = wolfSSL_CryptHwMutexLock();
wolfSSL 16:8e0d178b1d1e 140 if (ret == 0) {
wolfSSL 16:8e0d178b1d1e 141 #if defined(WC_HASH_DATA_ALIGNMENT) && WC_HASH_DATA_ALIGNMENT > 0
wolfSSL 16:8e0d178b1d1e 142 if ((size_t)data % WC_HASH_DATA_ALIGNMENT) {
wolfSSL 16:8e0d178b1d1e 143 /* data pointer is NOT aligned,
wolfSSL 16:8e0d178b1d1e 144 * so copy and perform one block at a time */
wolfSSL 16:8e0d178b1d1e 145 byte* local = (byte*)md5->buffer;
wolfSSL 16:8e0d178b1d1e 146 while (len >= WC_MD5_BLOCK_SIZE) {
wolfSSL 16:8e0d178b1d1e 147 XMEMCPY(local, data, WC_MD5_BLOCK_SIZE);
wolfSSL 16:8e0d178b1d1e 148 #ifdef FREESCALE_MMCAU_CLASSIC_SHA
wolfSSL 16:8e0d178b1d1e 149 cau_md5_hash_n(local, 1, (unsigned char*)md5->digest);
wolfSSL 16:8e0d178b1d1e 150 #else
wolfSSL 16:8e0d178b1d1e 151 MMCAU_MD5_HashN(local, 1, (uint32_t*)md5->digest);
wolfSSL 16:8e0d178b1d1e 152 #endif
wolfSSL 16:8e0d178b1d1e 153 data += WC_MD5_BLOCK_SIZE;
wolfSSL 16:8e0d178b1d1e 154 len -= WC_MD5_BLOCK_SIZE;
wolfSSL 16:8e0d178b1d1e 155 }
wolfSSL 15:117db924cf7c 156 }
wolfSSL 16:8e0d178b1d1e 157 else
wolfSSL 16:8e0d178b1d1e 158 #endif
wolfSSL 16:8e0d178b1d1e 159 {
wolfSSL 16:8e0d178b1d1e 160 #ifdef FREESCALE_MMCAU_CLASSIC_SHA
wolfSSL 16:8e0d178b1d1e 161 cau_md5_hash_n((byte*)data, len / WC_MD5_BLOCK_SIZE,
wolfSSL 16:8e0d178b1d1e 162 (unsigned char*)md5->digest);
wolfSSL 16:8e0d178b1d1e 163 #else
wolfSSL 16:8e0d178b1d1e 164 MMCAU_MD5_HashN((byte*)data, len / WC_MD5_BLOCK_SIZE,
wolfSSL 16:8e0d178b1d1e 165 (uint32_t*)md5->digest);
wolfSSL 16:8e0d178b1d1e 166 #endif
wolfSSL 16:8e0d178b1d1e 167 }
wolfSSL 16:8e0d178b1d1e 168 wolfSSL_CryptHwMutexUnLock();
wolfSSL 15:117db924cf7c 169 }
wolfSSL 16:8e0d178b1d1e 170 return ret;
wolfSSL 16:8e0d178b1d1e 171 }
wolfSSL 15:117db924cf7c 172
wolfSSL 15:117db924cf7c 173 #elif defined(WOLFSSL_PIC32MZ_HASH)
wolfSSL 16:8e0d178b1d1e 174 #include <wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h>
wolfSSL 16:8e0d178b1d1e 175 #define HAVE_MD5_CUST_API
wolfSSL 15:117db924cf7c 176
wolfSSL 15:117db924cf7c 177 #elif defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_HASH)
wolfSSL 16:8e0d178b1d1e 178 /* functions implemented in wolfcrypt/src/port/caam/caam_sha.c */
wolfSSL 16:8e0d178b1d1e 179 #define HAVE_MD5_CUST_API
wolfSSL 15:117db924cf7c 180 #else
wolfSSL 16:8e0d178b1d1e 181 #define NEED_SOFT_MD5
wolfSSL 15:117db924cf7c 182 #endif /* End Hardware Acceleration */
wolfSSL 15:117db924cf7c 183
wolfSSL 15:117db924cf7c 184 #ifdef NEED_SOFT_MD5
wolfSSL 15:117db924cf7c 185
wolfSSL 16:8e0d178b1d1e 186 #define XTRANSFORM(S,B) Transform((S),(B))
wolfSSL 15:117db924cf7c 187
wolfSSL 16:8e0d178b1d1e 188 #define F1(x, y, z) (z ^ (x & (y ^ z)))
wolfSSL 16:8e0d178b1d1e 189 #define F2(x, y, z) F1(z, x, y)
wolfSSL 16:8e0d178b1d1e 190 #define F3(x, y, z) (x ^ y ^ z)
wolfSSL 16:8e0d178b1d1e 191 #define F4(x, y, z) (y ^ (x | ~z))
wolfSSL 15:117db924cf7c 192
wolfSSL 16:8e0d178b1d1e 193 #define MD5STEP(f, w, x, y, z, data, s) \
wolfSSL 15:117db924cf7c 194 w = rotlFixed(w + f(x, y, z) + data, s) + x
wolfSSL 15:117db924cf7c 195
wolfSSL 16:8e0d178b1d1e 196 static int Transform(wc_Md5* md5, const byte* data)
wolfSSL 16:8e0d178b1d1e 197 {
wolfSSL 16:8e0d178b1d1e 198 word32* buffer = (word32*)data;
wolfSSL 16:8e0d178b1d1e 199 /* Copy context->state[] to working vars */
wolfSSL 16:8e0d178b1d1e 200 word32 a = md5->digest[0];
wolfSSL 16:8e0d178b1d1e 201 word32 b = md5->digest[1];
wolfSSL 16:8e0d178b1d1e 202 word32 c = md5->digest[2];
wolfSSL 16:8e0d178b1d1e 203 word32 d = md5->digest[3];
wolfSSL 15:117db924cf7c 204
wolfSSL 16:8e0d178b1d1e 205 MD5STEP(F1, a, b, c, d, buffer[0] + 0xd76aa478, 7);
wolfSSL 16:8e0d178b1d1e 206 MD5STEP(F1, d, a, b, c, buffer[1] + 0xe8c7b756, 12);
wolfSSL 16:8e0d178b1d1e 207 MD5STEP(F1, c, d, a, b, buffer[2] + 0x242070db, 17);
wolfSSL 16:8e0d178b1d1e 208 MD5STEP(F1, b, c, d, a, buffer[3] + 0xc1bdceee, 22);
wolfSSL 16:8e0d178b1d1e 209 MD5STEP(F1, a, b, c, d, buffer[4] + 0xf57c0faf, 7);
wolfSSL 16:8e0d178b1d1e 210 MD5STEP(F1, d, a, b, c, buffer[5] + 0x4787c62a, 12);
wolfSSL 16:8e0d178b1d1e 211 MD5STEP(F1, c, d, a, b, buffer[6] + 0xa8304613, 17);
wolfSSL 16:8e0d178b1d1e 212 MD5STEP(F1, b, c, d, a, buffer[7] + 0xfd469501, 22);
wolfSSL 16:8e0d178b1d1e 213 MD5STEP(F1, a, b, c, d, buffer[8] + 0x698098d8, 7);
wolfSSL 16:8e0d178b1d1e 214 MD5STEP(F1, d, a, b, c, buffer[9] + 0x8b44f7af, 12);
wolfSSL 16:8e0d178b1d1e 215 MD5STEP(F1, c, d, a, b, buffer[10] + 0xffff5bb1, 17);
wolfSSL 16:8e0d178b1d1e 216 MD5STEP(F1, b, c, d, a, buffer[11] + 0x895cd7be, 22);
wolfSSL 16:8e0d178b1d1e 217 MD5STEP(F1, a, b, c, d, buffer[12] + 0x6b901122, 7);
wolfSSL 16:8e0d178b1d1e 218 MD5STEP(F1, d, a, b, c, buffer[13] + 0xfd987193, 12);
wolfSSL 16:8e0d178b1d1e 219 MD5STEP(F1, c, d, a, b, buffer[14] + 0xa679438e, 17);
wolfSSL 16:8e0d178b1d1e 220 MD5STEP(F1, b, c, d, a, buffer[15] + 0x49b40821, 22);
wolfSSL 15:117db924cf7c 221
wolfSSL 16:8e0d178b1d1e 222 MD5STEP(F2, a, b, c, d, buffer[1] + 0xf61e2562, 5);
wolfSSL 16:8e0d178b1d1e 223 MD5STEP(F2, d, a, b, c, buffer[6] + 0xc040b340, 9);
wolfSSL 16:8e0d178b1d1e 224 MD5STEP(F2, c, d, a, b, buffer[11] + 0x265e5a51, 14);
wolfSSL 16:8e0d178b1d1e 225 MD5STEP(F2, b, c, d, a, buffer[0] + 0xe9b6c7aa, 20);
wolfSSL 16:8e0d178b1d1e 226 MD5STEP(F2, a, b, c, d, buffer[5] + 0xd62f105d, 5);
wolfSSL 16:8e0d178b1d1e 227 MD5STEP(F2, d, a, b, c, buffer[10] + 0x02441453, 9);
wolfSSL 16:8e0d178b1d1e 228 MD5STEP(F2, c, d, a, b, buffer[15] + 0xd8a1e681, 14);
wolfSSL 16:8e0d178b1d1e 229 MD5STEP(F2, b, c, d, a, buffer[4] + 0xe7d3fbc8, 20);
wolfSSL 16:8e0d178b1d1e 230 MD5STEP(F2, a, b, c, d, buffer[9] + 0x21e1cde6, 5);
wolfSSL 16:8e0d178b1d1e 231 MD5STEP(F2, d, a, b, c, buffer[14] + 0xc33707d6, 9);
wolfSSL 16:8e0d178b1d1e 232 MD5STEP(F2, c, d, a, b, buffer[3] + 0xf4d50d87, 14);
wolfSSL 16:8e0d178b1d1e 233 MD5STEP(F2, b, c, d, a, buffer[8] + 0x455a14ed, 20);
wolfSSL 16:8e0d178b1d1e 234 MD5STEP(F2, a, b, c, d, buffer[13] + 0xa9e3e905, 5);
wolfSSL 16:8e0d178b1d1e 235 MD5STEP(F2, d, a, b, c, buffer[2] + 0xfcefa3f8, 9);
wolfSSL 16:8e0d178b1d1e 236 MD5STEP(F2, c, d, a, b, buffer[7] + 0x676f02d9, 14);
wolfSSL 16:8e0d178b1d1e 237 MD5STEP(F2, b, c, d, a, buffer[12] + 0x8d2a4c8a, 20);
wolfSSL 15:117db924cf7c 238
wolfSSL 16:8e0d178b1d1e 239 MD5STEP(F3, a, b, c, d, buffer[5] + 0xfffa3942, 4);
wolfSSL 16:8e0d178b1d1e 240 MD5STEP(F3, d, a, b, c, buffer[8] + 0x8771f681, 11);
wolfSSL 16:8e0d178b1d1e 241 MD5STEP(F3, c, d, a, b, buffer[11] + 0x6d9d6122, 16);
wolfSSL 16:8e0d178b1d1e 242 MD5STEP(F3, b, c, d, a, buffer[14] + 0xfde5380c, 23);
wolfSSL 16:8e0d178b1d1e 243 MD5STEP(F3, a, b, c, d, buffer[1] + 0xa4beea44, 4);
wolfSSL 16:8e0d178b1d1e 244 MD5STEP(F3, d, a, b, c, buffer[4] + 0x4bdecfa9, 11);
wolfSSL 16:8e0d178b1d1e 245 MD5STEP(F3, c, d, a, b, buffer[7] + 0xf6bb4b60, 16);
wolfSSL 16:8e0d178b1d1e 246 MD5STEP(F3, b, c, d, a, buffer[10] + 0xbebfbc70, 23);
wolfSSL 16:8e0d178b1d1e 247 MD5STEP(F3, a, b, c, d, buffer[13] + 0x289b7ec6, 4);
wolfSSL 16:8e0d178b1d1e 248 MD5STEP(F3, d, a, b, c, buffer[0] + 0xeaa127fa, 11);
wolfSSL 16:8e0d178b1d1e 249 MD5STEP(F3, c, d, a, b, buffer[3] + 0xd4ef3085, 16);
wolfSSL 16:8e0d178b1d1e 250 MD5STEP(F3, b, c, d, a, buffer[6] + 0x04881d05, 23);
wolfSSL 16:8e0d178b1d1e 251 MD5STEP(F3, a, b, c, d, buffer[9] + 0xd9d4d039, 4);
wolfSSL 16:8e0d178b1d1e 252 MD5STEP(F3, d, a, b, c, buffer[12] + 0xe6db99e5, 11);
wolfSSL 16:8e0d178b1d1e 253 MD5STEP(F3, c, d, a, b, buffer[15] + 0x1fa27cf8, 16);
wolfSSL 16:8e0d178b1d1e 254 MD5STEP(F3, b, c, d, a, buffer[2] + 0xc4ac5665, 23);
wolfSSL 15:117db924cf7c 255
wolfSSL 16:8e0d178b1d1e 256 MD5STEP(F4, a, b, c, d, buffer[0] + 0xf4292244, 6);
wolfSSL 16:8e0d178b1d1e 257 MD5STEP(F4, d, a, b, c, buffer[7] + 0x432aff97, 10);
wolfSSL 16:8e0d178b1d1e 258 MD5STEP(F4, c, d, a, b, buffer[14] + 0xab9423a7, 15);
wolfSSL 16:8e0d178b1d1e 259 MD5STEP(F4, b, c, d, a, buffer[5] + 0xfc93a039, 21);
wolfSSL 16:8e0d178b1d1e 260 MD5STEP(F4, a, b, c, d, buffer[12] + 0x655b59c3, 6);
wolfSSL 16:8e0d178b1d1e 261 MD5STEP(F4, d, a, b, c, buffer[3] + 0x8f0ccc92, 10);
wolfSSL 16:8e0d178b1d1e 262 MD5STEP(F4, c, d, a, b, buffer[10] + 0xffeff47d, 15);
wolfSSL 16:8e0d178b1d1e 263 MD5STEP(F4, b, c, d, a, buffer[1] + 0x85845dd1, 21);
wolfSSL 16:8e0d178b1d1e 264 MD5STEP(F4, a, b, c, d, buffer[8] + 0x6fa87e4f, 6);
wolfSSL 16:8e0d178b1d1e 265 MD5STEP(F4, d, a, b, c, buffer[15] + 0xfe2ce6e0, 10);
wolfSSL 16:8e0d178b1d1e 266 MD5STEP(F4, c, d, a, b, buffer[6] + 0xa3014314, 15);
wolfSSL 16:8e0d178b1d1e 267 MD5STEP(F4, b, c, d, a, buffer[13] + 0x4e0811a1, 21);
wolfSSL 16:8e0d178b1d1e 268 MD5STEP(F4, a, b, c, d, buffer[4] + 0xf7537e82, 6);
wolfSSL 16:8e0d178b1d1e 269 MD5STEP(F4, d, a, b, c, buffer[11] + 0xbd3af235, 10);
wolfSSL 16:8e0d178b1d1e 270 MD5STEP(F4, c, d, a, b, buffer[2] + 0x2ad7d2bb, 15);
wolfSSL 16:8e0d178b1d1e 271 MD5STEP(F4, b, c, d, a, buffer[9] + 0xeb86d391, 21);
wolfSSL 15:117db924cf7c 272
wolfSSL 16:8e0d178b1d1e 273 /* Add the working vars back into digest state[] */
wolfSSL 16:8e0d178b1d1e 274 md5->digest[0] += a;
wolfSSL 16:8e0d178b1d1e 275 md5->digest[1] += b;
wolfSSL 16:8e0d178b1d1e 276 md5->digest[2] += c;
wolfSSL 16:8e0d178b1d1e 277 md5->digest[3] += d;
wolfSSL 15:117db924cf7c 278
wolfSSL 16:8e0d178b1d1e 279 return 0;
wolfSSL 16:8e0d178b1d1e 280 }
wolfSSL 15:117db924cf7c 281 #endif /* NEED_SOFT_MD5 */
wolfSSL 15:117db924cf7c 282
wolfSSL 15:117db924cf7c 283 #ifndef HAVE_MD5_CUST_API
wolfSSL 15:117db924cf7c 284
wolfSSL 15:117db924cf7c 285 static WC_INLINE void AddLength(wc_Md5* md5, word32 len)
wolfSSL 15:117db924cf7c 286 {
wolfSSL 15:117db924cf7c 287 word32 tmp = md5->loLen;
wolfSSL 15:117db924cf7c 288 if ((md5->loLen += len) < tmp) {
wolfSSL 15:117db924cf7c 289 md5->hiLen++; /* carry low to high */
wolfSSL 15:117db924cf7c 290 }
wolfSSL 15:117db924cf7c 291 }
wolfSSL 15:117db924cf7c 292
wolfSSL 15:117db924cf7c 293 static int _InitMd5(wc_Md5* md5)
wolfSSL 15:117db924cf7c 294 {
wolfSSL 15:117db924cf7c 295 int ret = 0;
wolfSSL 15:117db924cf7c 296
wolfSSL 15:117db924cf7c 297 md5->digest[0] = 0x67452301L;
wolfSSL 15:117db924cf7c 298 md5->digest[1] = 0xefcdab89L;
wolfSSL 15:117db924cf7c 299 md5->digest[2] = 0x98badcfeL;
wolfSSL 15:117db924cf7c 300 md5->digest[3] = 0x10325476L;
wolfSSL 15:117db924cf7c 301
wolfSSL 15:117db924cf7c 302 md5->buffLen = 0;
wolfSSL 15:117db924cf7c 303 md5->loLen = 0;
wolfSSL 15:117db924cf7c 304 md5->hiLen = 0;
wolfSSL 16:8e0d178b1d1e 305 #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
wolfSSL 16:8e0d178b1d1e 306 md5->flags = 0;
wolfSSL 16:8e0d178b1d1e 307 #endif
wolfSSL 15:117db924cf7c 308
wolfSSL 15:117db924cf7c 309 return ret;
wolfSSL 15:117db924cf7c 310 }
wolfSSL 15:117db924cf7c 311
wolfSSL 15:117db924cf7c 312 int wc_InitMd5_ex(wc_Md5* md5, void* heap, int devId)
wolfSSL 15:117db924cf7c 313 {
wolfSSL 15:117db924cf7c 314 int ret = 0;
wolfSSL 15:117db924cf7c 315
wolfSSL 15:117db924cf7c 316 if (md5 == NULL)
wolfSSL 15:117db924cf7c 317 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 318
wolfSSL 15:117db924cf7c 319 md5->heap = heap;
wolfSSL 15:117db924cf7c 320
wolfSSL 15:117db924cf7c 321 ret = _InitMd5(md5);
wolfSSL 15:117db924cf7c 322 if (ret != 0)
wolfSSL 15:117db924cf7c 323 return ret;
wolfSSL 15:117db924cf7c 324
wolfSSL 15:117db924cf7c 325 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_MD5)
wolfSSL 15:117db924cf7c 326 ret = wolfAsync_DevCtxInit(&md5->asyncDev, WOLFSSL_ASYNC_MARKER_MD5,
wolfSSL 16:8e0d178b1d1e 327 md5->heap, devId);
wolfSSL 15:117db924cf7c 328 #else
wolfSSL 15:117db924cf7c 329 (void)devId;
wolfSSL 15:117db924cf7c 330 #endif
wolfSSL 15:117db924cf7c 331 return ret;
wolfSSL 15:117db924cf7c 332 }
wolfSSL 15:117db924cf7c 333
wolfSSL 16:8e0d178b1d1e 334 /* do block size increments/updates */
wolfSSL 15:117db924cf7c 335 int wc_Md5Update(wc_Md5* md5, const byte* data, word32 len)
wolfSSL 15:117db924cf7c 336 {
wolfSSL 15:117db924cf7c 337 int ret = 0;
wolfSSL 16:8e0d178b1d1e 338 word32 blocksLen;
wolfSSL 15:117db924cf7c 339 byte* local;
wolfSSL 15:117db924cf7c 340
wolfSSL 15:117db924cf7c 341 if (md5 == NULL || (data == NULL && len > 0)) {
wolfSSL 15:117db924cf7c 342 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 343 }
wolfSSL 15:117db924cf7c 344
wolfSSL 15:117db924cf7c 345 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_MD5)
wolfSSL 15:117db924cf7c 346 if (md5->asyncDev.marker == WOLFSSL_ASYNC_MARKER_MD5) {
wolfSSL 16:8e0d178b1d1e 347 #if defined(HAVE_INTEL_QA)
wolfSSL 15:117db924cf7c 348 return IntelQaSymMd5(&md5->asyncDev, NULL, data, len);
wolfSSL 16:8e0d178b1d1e 349 #endif
wolfSSL 15:117db924cf7c 350 }
wolfSSL 15:117db924cf7c 351 #endif /* WOLFSSL_ASYNC_CRYPT */
wolfSSL 15:117db924cf7c 352
wolfSSL 15:117db924cf7c 353 /* check that internal buffLen is valid */
wolfSSL 15:117db924cf7c 354 if (md5->buffLen >= WC_MD5_BLOCK_SIZE)
wolfSSL 15:117db924cf7c 355 return BUFFER_E;
wolfSSL 15:117db924cf7c 356
wolfSSL 16:8e0d178b1d1e 357 if (data == NULL && len == 0) {
wolfSSL 16:8e0d178b1d1e 358 /* valid, but do nothing */
wolfSSL 16:8e0d178b1d1e 359 return 0;
wolfSSL 16:8e0d178b1d1e 360 }
wolfSSL 16:8e0d178b1d1e 361
wolfSSL 16:8e0d178b1d1e 362 /* add length for final */
wolfSSL 16:8e0d178b1d1e 363 AddLength(md5, len);
wolfSSL 15:117db924cf7c 364
wolfSSL 16:8e0d178b1d1e 365 local = (byte*)md5->buffer;
wolfSSL 16:8e0d178b1d1e 366
wolfSSL 16:8e0d178b1d1e 367 /* process any remainder from previous operation */
wolfSSL 16:8e0d178b1d1e 368 if (md5->buffLen > 0) {
wolfSSL 16:8e0d178b1d1e 369 blocksLen = min(len, WC_MD5_BLOCK_SIZE - md5->buffLen);
wolfSSL 16:8e0d178b1d1e 370 XMEMCPY(&local[md5->buffLen], data, blocksLen);
wolfSSL 16:8e0d178b1d1e 371
wolfSSL 16:8e0d178b1d1e 372 md5->buffLen += blocksLen;
wolfSSL 16:8e0d178b1d1e 373 data += blocksLen;
wolfSSL 16:8e0d178b1d1e 374 len -= blocksLen;
wolfSSL 15:117db924cf7c 375
wolfSSL 15:117db924cf7c 376 if (md5->buffLen == WC_MD5_BLOCK_SIZE) {
wolfSSL 15:117db924cf7c 377 #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
wolfSSL 15:117db924cf7c 378 ByteReverseWords(md5->buffer, md5->buffer, WC_MD5_BLOCK_SIZE);
wolfSSL 15:117db924cf7c 379 #endif
wolfSSL 16:8e0d178b1d1e 380
wolfSSL 16:8e0d178b1d1e 381 ret = XTRANSFORM(md5, (const byte*)local);
wolfSSL 16:8e0d178b1d1e 382 if (ret != 0)
wolfSSL 16:8e0d178b1d1e 383 return ret;
wolfSSL 16:8e0d178b1d1e 384
wolfSSL 15:117db924cf7c 385 md5->buffLen = 0;
wolfSSL 15:117db924cf7c 386 }
wolfSSL 15:117db924cf7c 387 }
wolfSSL 16:8e0d178b1d1e 388
wolfSSL 16:8e0d178b1d1e 389 /* process blocks */
wolfSSL 16:8e0d178b1d1e 390 #ifdef XTRANSFORM_LEN
wolfSSL 16:8e0d178b1d1e 391 /* get number of blocks */
wolfSSL 16:8e0d178b1d1e 392 /* 64-1 = 0x3F (~ Inverted = 0xFFFFFFC0) */
wolfSSL 16:8e0d178b1d1e 393 /* len (masked by 0xFFFFFFC0) returns block aligned length */
wolfSSL 16:8e0d178b1d1e 394 blocksLen = len & ~(WC_MD5_BLOCK_SIZE-1);
wolfSSL 16:8e0d178b1d1e 395 if (blocksLen > 0) {
wolfSSL 16:8e0d178b1d1e 396 /* Byte reversal performed in function if required. */
wolfSSL 16:8e0d178b1d1e 397 XTRANSFORM_LEN(md5, data, blocksLen);
wolfSSL 16:8e0d178b1d1e 398 data += blocksLen;
wolfSSL 16:8e0d178b1d1e 399 len -= blocksLen;
wolfSSL 16:8e0d178b1d1e 400 }
wolfSSL 16:8e0d178b1d1e 401 #else
wolfSSL 16:8e0d178b1d1e 402 while (len >= WC_MD5_BLOCK_SIZE) {
wolfSSL 16:8e0d178b1d1e 403 word32* local32 = md5->buffer;
wolfSSL 16:8e0d178b1d1e 404 /* optimization to avoid memcpy if data pointer is properly aligned */
wolfSSL 16:8e0d178b1d1e 405 /* Big Endian requires byte swap, so can't use data directly */
wolfSSL 16:8e0d178b1d1e 406 #if defined(WC_HASH_DATA_ALIGNMENT) && !defined(BIG_ENDIAN_ORDER)
wolfSSL 16:8e0d178b1d1e 407 if (((size_t)data % WC_HASH_DATA_ALIGNMENT) == 0) {
wolfSSL 16:8e0d178b1d1e 408 local32 = (word32*)data;
wolfSSL 16:8e0d178b1d1e 409 }
wolfSSL 16:8e0d178b1d1e 410 else
wolfSSL 16:8e0d178b1d1e 411 #endif
wolfSSL 16:8e0d178b1d1e 412 {
wolfSSL 16:8e0d178b1d1e 413 XMEMCPY(local32, data, WC_MD5_BLOCK_SIZE);
wolfSSL 16:8e0d178b1d1e 414 }
wolfSSL 16:8e0d178b1d1e 415
wolfSSL 16:8e0d178b1d1e 416 data += WC_MD5_BLOCK_SIZE;
wolfSSL 16:8e0d178b1d1e 417 len -= WC_MD5_BLOCK_SIZE;
wolfSSL 16:8e0d178b1d1e 418
wolfSSL 16:8e0d178b1d1e 419 #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
wolfSSL 16:8e0d178b1d1e 420 ByteReverseWords(local32, local32, WC_MD5_BLOCK_SIZE);
wolfSSL 16:8e0d178b1d1e 421 #endif
wolfSSL 16:8e0d178b1d1e 422
wolfSSL 16:8e0d178b1d1e 423 ret = XTRANSFORM(md5, (const byte*)local32);
wolfSSL 16:8e0d178b1d1e 424 }
wolfSSL 16:8e0d178b1d1e 425 #endif /* XTRANSFORM_LEN */
wolfSSL 16:8e0d178b1d1e 426
wolfSSL 16:8e0d178b1d1e 427 /* save remainder */
wolfSSL 16:8e0d178b1d1e 428 if (len > 0) {
wolfSSL 16:8e0d178b1d1e 429 XMEMCPY(local, data, len);
wolfSSL 16:8e0d178b1d1e 430 md5->buffLen = len;
wolfSSL 16:8e0d178b1d1e 431 }
wolfSSL 16:8e0d178b1d1e 432
wolfSSL 15:117db924cf7c 433 return ret;
wolfSSL 15:117db924cf7c 434 }
wolfSSL 15:117db924cf7c 435
wolfSSL 15:117db924cf7c 436 int wc_Md5Final(wc_Md5* md5, byte* hash)
wolfSSL 15:117db924cf7c 437 {
wolfSSL 15:117db924cf7c 438 byte* local;
wolfSSL 15:117db924cf7c 439
wolfSSL 15:117db924cf7c 440 if (md5 == NULL || hash == NULL) {
wolfSSL 15:117db924cf7c 441 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 442 }
wolfSSL 15:117db924cf7c 443
wolfSSL 15:117db924cf7c 444 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_MD5)
wolfSSL 15:117db924cf7c 445 if (md5->asyncDev.marker == WOLFSSL_ASYNC_MARKER_MD5) {
wolfSSL 16:8e0d178b1d1e 446 #if defined(HAVE_INTEL_QA)
wolfSSL 15:117db924cf7c 447 return IntelQaSymMd5(&md5->asyncDev, hash, NULL, WC_MD5_DIGEST_SIZE);
wolfSSL 16:8e0d178b1d1e 448 #endif
wolfSSL 15:117db924cf7c 449 }
wolfSSL 15:117db924cf7c 450 #endif /* WOLFSSL_ASYNC_CRYPT */
wolfSSL 15:117db924cf7c 451
wolfSSL 15:117db924cf7c 452 local = (byte*)md5->buffer;
wolfSSL 15:117db924cf7c 453
wolfSSL 15:117db924cf7c 454 local[md5->buffLen++] = 0x80; /* add 1 */
wolfSSL 15:117db924cf7c 455
wolfSSL 15:117db924cf7c 456 /* pad with zeros */
wolfSSL 15:117db924cf7c 457 if (md5->buffLen > WC_MD5_PAD_SIZE) {
wolfSSL 15:117db924cf7c 458 XMEMSET(&local[md5->buffLen], 0, WC_MD5_BLOCK_SIZE - md5->buffLen);
wolfSSL 15:117db924cf7c 459 md5->buffLen += WC_MD5_BLOCK_SIZE - md5->buffLen;
wolfSSL 15:117db924cf7c 460
wolfSSL 16:8e0d178b1d1e 461 #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
wolfSSL 15:117db924cf7c 462 ByteReverseWords(md5->buffer, md5->buffer, WC_MD5_BLOCK_SIZE);
wolfSSL 16:8e0d178b1d1e 463 #endif
wolfSSL 15:117db924cf7c 464 XTRANSFORM(md5, local);
wolfSSL 15:117db924cf7c 465 md5->buffLen = 0;
wolfSSL 15:117db924cf7c 466 }
wolfSSL 15:117db924cf7c 467 XMEMSET(&local[md5->buffLen], 0, WC_MD5_PAD_SIZE - md5->buffLen);
wolfSSL 15:117db924cf7c 468
wolfSSL 15:117db924cf7c 469 #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
wolfSSL 15:117db924cf7c 470 ByteReverseWords(md5->buffer, md5->buffer, WC_MD5_BLOCK_SIZE);
wolfSSL 15:117db924cf7c 471 #endif
wolfSSL 15:117db924cf7c 472
wolfSSL 15:117db924cf7c 473 /* put lengths in bits */
wolfSSL 16:8e0d178b1d1e 474 md5->hiLen = (md5->loLen >> (8 * sizeof(md5->loLen) - 3)) +
wolfSSL 15:117db924cf7c 475 (md5->hiLen << 3);
wolfSSL 15:117db924cf7c 476 md5->loLen = md5->loLen << 3;
wolfSSL 15:117db924cf7c 477
wolfSSL 15:117db924cf7c 478 /* store lengths */
wolfSSL 15:117db924cf7c 479 /* ! length ordering dependent on digest endian type ! */
wolfSSL 15:117db924cf7c 480 XMEMCPY(&local[WC_MD5_PAD_SIZE], &md5->loLen, sizeof(word32));
wolfSSL 15:117db924cf7c 481 XMEMCPY(&local[WC_MD5_PAD_SIZE + sizeof(word32)], &md5->hiLen, sizeof(word32));
wolfSSL 15:117db924cf7c 482
wolfSSL 15:117db924cf7c 483 /* final transform and result to hash */
wolfSSL 15:117db924cf7c 484 XTRANSFORM(md5, local);
wolfSSL 15:117db924cf7c 485 #ifdef BIG_ENDIAN_ORDER
wolfSSL 15:117db924cf7c 486 ByteReverseWords(md5->digest, md5->digest, WC_MD5_DIGEST_SIZE);
wolfSSL 15:117db924cf7c 487 #endif
wolfSSL 15:117db924cf7c 488 XMEMCPY(hash, md5->digest, WC_MD5_DIGEST_SIZE);
wolfSSL 15:117db924cf7c 489
wolfSSL 15:117db924cf7c 490 return _InitMd5(md5); /* reset state */
wolfSSL 15:117db924cf7c 491 }
wolfSSL 15:117db924cf7c 492 #endif /* !HAVE_MD5_CUST_API */
wolfSSL 15:117db924cf7c 493
wolfSSL 15:117db924cf7c 494
wolfSSL 15:117db924cf7c 495 int wc_InitMd5(wc_Md5* md5)
wolfSSL 15:117db924cf7c 496 {
wolfSSL 15:117db924cf7c 497 if (md5 == NULL) {
wolfSSL 15:117db924cf7c 498 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 499 }
wolfSSL 15:117db924cf7c 500 return wc_InitMd5_ex(md5, NULL, INVALID_DEVID);
wolfSSL 15:117db924cf7c 501 }
wolfSSL 15:117db924cf7c 502
wolfSSL 15:117db924cf7c 503 void wc_Md5Free(wc_Md5* md5)
wolfSSL 15:117db924cf7c 504 {
wolfSSL 15:117db924cf7c 505 if (md5 == NULL)
wolfSSL 15:117db924cf7c 506 return;
wolfSSL 15:117db924cf7c 507 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_MD5)
wolfSSL 15:117db924cf7c 508 wolfAsync_DevCtxFree(&md5->asyncDev, WOLFSSL_ASYNC_MARKER_MD5);
wolfSSL 15:117db924cf7c 509 #endif /* WOLFSSL_ASYNC_CRYPT */
wolfSSL 16:8e0d178b1d1e 510
wolfSSL 16:8e0d178b1d1e 511 #ifdef WOLFSSL_PIC32MZ_HASH
wolfSSL 16:8e0d178b1d1e 512 wc_Md5Pic32Free(md5);
wolfSSL 16:8e0d178b1d1e 513 #endif
wolfSSL 15:117db924cf7c 514 }
wolfSSL 15:117db924cf7c 515
wolfSSL 15:117db924cf7c 516 int wc_Md5GetHash(wc_Md5* md5, byte* hash)
wolfSSL 15:117db924cf7c 517 {
wolfSSL 15:117db924cf7c 518 int ret;
wolfSSL 15:117db924cf7c 519 wc_Md5 tmpMd5;
wolfSSL 15:117db924cf7c 520
wolfSSL 15:117db924cf7c 521 if (md5 == NULL || hash == NULL)
wolfSSL 15:117db924cf7c 522 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 523
wolfSSL 15:117db924cf7c 524 ret = wc_Md5Copy(md5, &tmpMd5);
wolfSSL 15:117db924cf7c 525 if (ret == 0) {
wolfSSL 15:117db924cf7c 526 ret = wc_Md5Final(&tmpMd5, hash);
wolfSSL 15:117db924cf7c 527 }
wolfSSL 15:117db924cf7c 528
wolfSSL 15:117db924cf7c 529 return ret;
wolfSSL 15:117db924cf7c 530 }
wolfSSL 15:117db924cf7c 531
wolfSSL 15:117db924cf7c 532 int wc_Md5Copy(wc_Md5* src, wc_Md5* dst)
wolfSSL 15:117db924cf7c 533 {
wolfSSL 15:117db924cf7c 534 int ret = 0;
wolfSSL 15:117db924cf7c 535
wolfSSL 15:117db924cf7c 536 if (src == NULL || dst == NULL)
wolfSSL 15:117db924cf7c 537 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 538
wolfSSL 15:117db924cf7c 539 XMEMCPY(dst, src, sizeof(wc_Md5));
wolfSSL 15:117db924cf7c 540
wolfSSL 15:117db924cf7c 541 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 15:117db924cf7c 542 ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
wolfSSL 15:117db924cf7c 543 #endif
wolfSSL 15:117db924cf7c 544 #ifdef WOLFSSL_PIC32MZ_HASH
wolfSSL 15:117db924cf7c 545 ret = wc_Pic32HashCopy(&src->cache, &dst->cache);
wolfSSL 15:117db924cf7c 546 #endif
wolfSSL 16:8e0d178b1d1e 547 #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
wolfSSL 16:8e0d178b1d1e 548 dst->flags |= WC_HASH_FLAG_ISCOPY;
wolfSSL 16:8e0d178b1d1e 549 #endif
wolfSSL 15:117db924cf7c 550
wolfSSL 15:117db924cf7c 551 return ret;
wolfSSL 15:117db924cf7c 552 }
wolfSSL 15:117db924cf7c 553
wolfSSL 16:8e0d178b1d1e 554 #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
wolfSSL 16:8e0d178b1d1e 555 int wc_Md5SetFlags(wc_Md5* md5, word32 flags)
wolfSSL 16:8e0d178b1d1e 556 {
wolfSSL 16:8e0d178b1d1e 557 if (md5) {
wolfSSL 16:8e0d178b1d1e 558 md5->flags = flags;
wolfSSL 16:8e0d178b1d1e 559 }
wolfSSL 16:8e0d178b1d1e 560 return 0;
wolfSSL 16:8e0d178b1d1e 561 }
wolfSSL 16:8e0d178b1d1e 562 int wc_Md5GetFlags(wc_Md5* md5, word32* flags)
wolfSSL 16:8e0d178b1d1e 563 {
wolfSSL 16:8e0d178b1d1e 564 if (md5 && flags) {
wolfSSL 16:8e0d178b1d1e 565 *flags = md5->flags;
wolfSSL 16:8e0d178b1d1e 566 }
wolfSSL 16:8e0d178b1d1e 567 return 0;
wolfSSL 16:8e0d178b1d1e 568 }
wolfSSL 16:8e0d178b1d1e 569 #endif
wolfSSL 16:8e0d178b1d1e 570
wolfSSL 15:117db924cf7c 571 #endif /* WOLFSSL_TI_HASH */
wolfSSL 15:117db924cf7c 572 #endif /* NO_MD5 */
wolfSSL 15:117db924cf7c 573