takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Thu Oct 11 02:27:46 2018 +0000
Revision:
3:f3764f852aa8
Parent:
0:8fdf9a60065b
Nucreo 446 + SSD1331 test version;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /*
kadonotakashi 0:8fdf9a60065b 2 * RFC 1321 compliant MD5 implementation
kadonotakashi 0:8fdf9a60065b 3 *
kadonotakashi 0:8fdf9a60065b 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
kadonotakashi 0:8fdf9a60065b 5 * SPDX-License-Identifier: Apache-2.0
kadonotakashi 0:8fdf9a60065b 6 *
kadonotakashi 0:8fdf9a60065b 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
kadonotakashi 0:8fdf9a60065b 8 * not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 9 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 10 *
kadonotakashi 0:8fdf9a60065b 11 * http://www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 12 *
kadonotakashi 0:8fdf9a60065b 13 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
kadonotakashi 0:8fdf9a60065b 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 16 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 17 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 18 *
kadonotakashi 0:8fdf9a60065b 19 * This file is part of mbed TLS (https://tls.mbed.org)
kadonotakashi 0:8fdf9a60065b 20 */
kadonotakashi 0:8fdf9a60065b 21 /*
kadonotakashi 0:8fdf9a60065b 22 * The MD5 algorithm was designed by Ron Rivest in 1991.
kadonotakashi 0:8fdf9a60065b 23 *
kadonotakashi 0:8fdf9a60065b 24 * http://www.ietf.org/rfc/rfc1321.txt
kadonotakashi 0:8fdf9a60065b 25 */
kadonotakashi 0:8fdf9a60065b 26
kadonotakashi 0:8fdf9a60065b 27 #if !defined(MBEDTLS_CONFIG_FILE)
kadonotakashi 0:8fdf9a60065b 28 #include "mbedtls/config.h"
kadonotakashi 0:8fdf9a60065b 29 #else
kadonotakashi 0:8fdf9a60065b 30 #include MBEDTLS_CONFIG_FILE
kadonotakashi 0:8fdf9a60065b 31 #endif
kadonotakashi 0:8fdf9a60065b 32
kadonotakashi 0:8fdf9a60065b 33 #if defined(MBEDTLS_MD5_C)
kadonotakashi 0:8fdf9a60065b 34
kadonotakashi 0:8fdf9a60065b 35 #include "mbedtls/md5.h"
kadonotakashi 0:8fdf9a60065b 36 #include "mbedtls/platform_util.h"
kadonotakashi 0:8fdf9a60065b 37
kadonotakashi 0:8fdf9a60065b 38 #include <string.h>
kadonotakashi 0:8fdf9a60065b 39
kadonotakashi 0:8fdf9a60065b 40 #if defined(MBEDTLS_SELF_TEST)
kadonotakashi 0:8fdf9a60065b 41 #if defined(MBEDTLS_PLATFORM_C)
kadonotakashi 0:8fdf9a60065b 42 #include "mbedtls/platform.h"
kadonotakashi 0:8fdf9a60065b 43 #else
kadonotakashi 0:8fdf9a60065b 44 #include <stdio.h>
kadonotakashi 0:8fdf9a60065b 45 #define mbedtls_printf printf
kadonotakashi 0:8fdf9a60065b 46 #endif /* MBEDTLS_PLATFORM_C */
kadonotakashi 0:8fdf9a60065b 47 #endif /* MBEDTLS_SELF_TEST */
kadonotakashi 0:8fdf9a60065b 48
kadonotakashi 0:8fdf9a60065b 49 #if !defined(MBEDTLS_MD5_ALT)
kadonotakashi 0:8fdf9a60065b 50
kadonotakashi 0:8fdf9a60065b 51 /*
kadonotakashi 0:8fdf9a60065b 52 * 32-bit integer manipulation macros (little endian)
kadonotakashi 0:8fdf9a60065b 53 */
kadonotakashi 0:8fdf9a60065b 54 #ifndef GET_UINT32_LE
kadonotakashi 0:8fdf9a60065b 55 #define GET_UINT32_LE(n,b,i) \
kadonotakashi 0:8fdf9a60065b 56 { \
kadonotakashi 0:8fdf9a60065b 57 (n) = ( (uint32_t) (b)[(i) ] ) \
kadonotakashi 0:8fdf9a60065b 58 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
kadonotakashi 0:8fdf9a60065b 59 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
kadonotakashi 0:8fdf9a60065b 60 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
kadonotakashi 0:8fdf9a60065b 61 }
kadonotakashi 0:8fdf9a60065b 62 #endif
kadonotakashi 0:8fdf9a60065b 63
kadonotakashi 0:8fdf9a60065b 64 #ifndef PUT_UINT32_LE
kadonotakashi 0:8fdf9a60065b 65 #define PUT_UINT32_LE(n,b,i) \
kadonotakashi 0:8fdf9a60065b 66 { \
kadonotakashi 0:8fdf9a60065b 67 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
kadonotakashi 0:8fdf9a60065b 68 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
kadonotakashi 0:8fdf9a60065b 69 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
kadonotakashi 0:8fdf9a60065b 70 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
kadonotakashi 0:8fdf9a60065b 71 }
kadonotakashi 0:8fdf9a60065b 72 #endif
kadonotakashi 0:8fdf9a60065b 73
kadonotakashi 0:8fdf9a60065b 74 void mbedtls_md5_init( mbedtls_md5_context *ctx )
kadonotakashi 0:8fdf9a60065b 75 {
kadonotakashi 0:8fdf9a60065b 76 memset( ctx, 0, sizeof( mbedtls_md5_context ) );
kadonotakashi 0:8fdf9a60065b 77 }
kadonotakashi 0:8fdf9a60065b 78
kadonotakashi 0:8fdf9a60065b 79 void mbedtls_md5_free( mbedtls_md5_context *ctx )
kadonotakashi 0:8fdf9a60065b 80 {
kadonotakashi 0:8fdf9a60065b 81 if( ctx == NULL )
kadonotakashi 0:8fdf9a60065b 82 return;
kadonotakashi 0:8fdf9a60065b 83
kadonotakashi 0:8fdf9a60065b 84 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md5_context ) );
kadonotakashi 0:8fdf9a60065b 85 }
kadonotakashi 0:8fdf9a60065b 86
kadonotakashi 0:8fdf9a60065b 87 void mbedtls_md5_clone( mbedtls_md5_context *dst,
kadonotakashi 0:8fdf9a60065b 88 const mbedtls_md5_context *src )
kadonotakashi 0:8fdf9a60065b 89 {
kadonotakashi 0:8fdf9a60065b 90 *dst = *src;
kadonotakashi 0:8fdf9a60065b 91 }
kadonotakashi 0:8fdf9a60065b 92
kadonotakashi 0:8fdf9a60065b 93 /*
kadonotakashi 0:8fdf9a60065b 94 * MD5 context setup
kadonotakashi 0:8fdf9a60065b 95 */
kadonotakashi 0:8fdf9a60065b 96 int mbedtls_md5_starts_ret( mbedtls_md5_context *ctx )
kadonotakashi 0:8fdf9a60065b 97 {
kadonotakashi 0:8fdf9a60065b 98 ctx->total[0] = 0;
kadonotakashi 0:8fdf9a60065b 99 ctx->total[1] = 0;
kadonotakashi 0:8fdf9a60065b 100
kadonotakashi 0:8fdf9a60065b 101 ctx->state[0] = 0x67452301;
kadonotakashi 0:8fdf9a60065b 102 ctx->state[1] = 0xEFCDAB89;
kadonotakashi 0:8fdf9a60065b 103 ctx->state[2] = 0x98BADCFE;
kadonotakashi 0:8fdf9a60065b 104 ctx->state[3] = 0x10325476;
kadonotakashi 0:8fdf9a60065b 105
kadonotakashi 0:8fdf9a60065b 106 return( 0 );
kadonotakashi 0:8fdf9a60065b 107 }
kadonotakashi 0:8fdf9a60065b 108
kadonotakashi 0:8fdf9a60065b 109 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
kadonotakashi 0:8fdf9a60065b 110 void mbedtls_md5_starts( mbedtls_md5_context *ctx )
kadonotakashi 0:8fdf9a60065b 111 {
kadonotakashi 0:8fdf9a60065b 112 mbedtls_md5_starts_ret( ctx );
kadonotakashi 0:8fdf9a60065b 113 }
kadonotakashi 0:8fdf9a60065b 114 #endif
kadonotakashi 0:8fdf9a60065b 115
kadonotakashi 0:8fdf9a60065b 116 #if !defined(MBEDTLS_MD5_PROCESS_ALT)
kadonotakashi 0:8fdf9a60065b 117 int mbedtls_internal_md5_process( mbedtls_md5_context *ctx,
kadonotakashi 0:8fdf9a60065b 118 const unsigned char data[64] )
kadonotakashi 0:8fdf9a60065b 119 {
kadonotakashi 0:8fdf9a60065b 120 uint32_t X[16], A, B, C, D;
kadonotakashi 0:8fdf9a60065b 121
kadonotakashi 0:8fdf9a60065b 122 GET_UINT32_LE( X[ 0], data, 0 );
kadonotakashi 0:8fdf9a60065b 123 GET_UINT32_LE( X[ 1], data, 4 );
kadonotakashi 0:8fdf9a60065b 124 GET_UINT32_LE( X[ 2], data, 8 );
kadonotakashi 0:8fdf9a60065b 125 GET_UINT32_LE( X[ 3], data, 12 );
kadonotakashi 0:8fdf9a60065b 126 GET_UINT32_LE( X[ 4], data, 16 );
kadonotakashi 0:8fdf9a60065b 127 GET_UINT32_LE( X[ 5], data, 20 );
kadonotakashi 0:8fdf9a60065b 128 GET_UINT32_LE( X[ 6], data, 24 );
kadonotakashi 0:8fdf9a60065b 129 GET_UINT32_LE( X[ 7], data, 28 );
kadonotakashi 0:8fdf9a60065b 130 GET_UINT32_LE( X[ 8], data, 32 );
kadonotakashi 0:8fdf9a60065b 131 GET_UINT32_LE( X[ 9], data, 36 );
kadonotakashi 0:8fdf9a60065b 132 GET_UINT32_LE( X[10], data, 40 );
kadonotakashi 0:8fdf9a60065b 133 GET_UINT32_LE( X[11], data, 44 );
kadonotakashi 0:8fdf9a60065b 134 GET_UINT32_LE( X[12], data, 48 );
kadonotakashi 0:8fdf9a60065b 135 GET_UINT32_LE( X[13], data, 52 );
kadonotakashi 0:8fdf9a60065b 136 GET_UINT32_LE( X[14], data, 56 );
kadonotakashi 0:8fdf9a60065b 137 GET_UINT32_LE( X[15], data, 60 );
kadonotakashi 0:8fdf9a60065b 138
kadonotakashi 0:8fdf9a60065b 139 #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
kadonotakashi 0:8fdf9a60065b 140
kadonotakashi 0:8fdf9a60065b 141 #define P(a,b,c,d,k,s,t) \
kadonotakashi 0:8fdf9a60065b 142 { \
kadonotakashi 0:8fdf9a60065b 143 a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
kadonotakashi 0:8fdf9a60065b 144 }
kadonotakashi 0:8fdf9a60065b 145
kadonotakashi 0:8fdf9a60065b 146 A = ctx->state[0];
kadonotakashi 0:8fdf9a60065b 147 B = ctx->state[1];
kadonotakashi 0:8fdf9a60065b 148 C = ctx->state[2];
kadonotakashi 0:8fdf9a60065b 149 D = ctx->state[3];
kadonotakashi 0:8fdf9a60065b 150
kadonotakashi 0:8fdf9a60065b 151 #define F(x,y,z) (z ^ (x & (y ^ z)))
kadonotakashi 0:8fdf9a60065b 152
kadonotakashi 0:8fdf9a60065b 153 P( A, B, C, D, 0, 7, 0xD76AA478 );
kadonotakashi 0:8fdf9a60065b 154 P( D, A, B, C, 1, 12, 0xE8C7B756 );
kadonotakashi 0:8fdf9a60065b 155 P( C, D, A, B, 2, 17, 0x242070DB );
kadonotakashi 0:8fdf9a60065b 156 P( B, C, D, A, 3, 22, 0xC1BDCEEE );
kadonotakashi 0:8fdf9a60065b 157 P( A, B, C, D, 4, 7, 0xF57C0FAF );
kadonotakashi 0:8fdf9a60065b 158 P( D, A, B, C, 5, 12, 0x4787C62A );
kadonotakashi 0:8fdf9a60065b 159 P( C, D, A, B, 6, 17, 0xA8304613 );
kadonotakashi 0:8fdf9a60065b 160 P( B, C, D, A, 7, 22, 0xFD469501 );
kadonotakashi 0:8fdf9a60065b 161 P( A, B, C, D, 8, 7, 0x698098D8 );
kadonotakashi 0:8fdf9a60065b 162 P( D, A, B, C, 9, 12, 0x8B44F7AF );
kadonotakashi 0:8fdf9a60065b 163 P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
kadonotakashi 0:8fdf9a60065b 164 P( B, C, D, A, 11, 22, 0x895CD7BE );
kadonotakashi 0:8fdf9a60065b 165 P( A, B, C, D, 12, 7, 0x6B901122 );
kadonotakashi 0:8fdf9a60065b 166 P( D, A, B, C, 13, 12, 0xFD987193 );
kadonotakashi 0:8fdf9a60065b 167 P( C, D, A, B, 14, 17, 0xA679438E );
kadonotakashi 0:8fdf9a60065b 168 P( B, C, D, A, 15, 22, 0x49B40821 );
kadonotakashi 0:8fdf9a60065b 169
kadonotakashi 0:8fdf9a60065b 170 #undef F
kadonotakashi 0:8fdf9a60065b 171
kadonotakashi 0:8fdf9a60065b 172 #define F(x,y,z) (y ^ (z & (x ^ y)))
kadonotakashi 0:8fdf9a60065b 173
kadonotakashi 0:8fdf9a60065b 174 P( A, B, C, D, 1, 5, 0xF61E2562 );
kadonotakashi 0:8fdf9a60065b 175 P( D, A, B, C, 6, 9, 0xC040B340 );
kadonotakashi 0:8fdf9a60065b 176 P( C, D, A, B, 11, 14, 0x265E5A51 );
kadonotakashi 0:8fdf9a60065b 177 P( B, C, D, A, 0, 20, 0xE9B6C7AA );
kadonotakashi 0:8fdf9a60065b 178 P( A, B, C, D, 5, 5, 0xD62F105D );
kadonotakashi 0:8fdf9a60065b 179 P( D, A, B, C, 10, 9, 0x02441453 );
kadonotakashi 0:8fdf9a60065b 180 P( C, D, A, B, 15, 14, 0xD8A1E681 );
kadonotakashi 0:8fdf9a60065b 181 P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
kadonotakashi 0:8fdf9a60065b 182 P( A, B, C, D, 9, 5, 0x21E1CDE6 );
kadonotakashi 0:8fdf9a60065b 183 P( D, A, B, C, 14, 9, 0xC33707D6 );
kadonotakashi 0:8fdf9a60065b 184 P( C, D, A, B, 3, 14, 0xF4D50D87 );
kadonotakashi 0:8fdf9a60065b 185 P( B, C, D, A, 8, 20, 0x455A14ED );
kadonotakashi 0:8fdf9a60065b 186 P( A, B, C, D, 13, 5, 0xA9E3E905 );
kadonotakashi 0:8fdf9a60065b 187 P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
kadonotakashi 0:8fdf9a60065b 188 P( C, D, A, B, 7, 14, 0x676F02D9 );
kadonotakashi 0:8fdf9a60065b 189 P( B, C, D, A, 12, 20, 0x8D2A4C8A );
kadonotakashi 0:8fdf9a60065b 190
kadonotakashi 0:8fdf9a60065b 191 #undef F
kadonotakashi 0:8fdf9a60065b 192
kadonotakashi 0:8fdf9a60065b 193 #define F(x,y,z) (x ^ y ^ z)
kadonotakashi 0:8fdf9a60065b 194
kadonotakashi 0:8fdf9a60065b 195 P( A, B, C, D, 5, 4, 0xFFFA3942 );
kadonotakashi 0:8fdf9a60065b 196 P( D, A, B, C, 8, 11, 0x8771F681 );
kadonotakashi 0:8fdf9a60065b 197 P( C, D, A, B, 11, 16, 0x6D9D6122 );
kadonotakashi 0:8fdf9a60065b 198 P( B, C, D, A, 14, 23, 0xFDE5380C );
kadonotakashi 0:8fdf9a60065b 199 P( A, B, C, D, 1, 4, 0xA4BEEA44 );
kadonotakashi 0:8fdf9a60065b 200 P( D, A, B, C, 4, 11, 0x4BDECFA9 );
kadonotakashi 0:8fdf9a60065b 201 P( C, D, A, B, 7, 16, 0xF6BB4B60 );
kadonotakashi 0:8fdf9a60065b 202 P( B, C, D, A, 10, 23, 0xBEBFBC70 );
kadonotakashi 0:8fdf9a60065b 203 P( A, B, C, D, 13, 4, 0x289B7EC6 );
kadonotakashi 0:8fdf9a60065b 204 P( D, A, B, C, 0, 11, 0xEAA127FA );
kadonotakashi 0:8fdf9a60065b 205 P( C, D, A, B, 3, 16, 0xD4EF3085 );
kadonotakashi 0:8fdf9a60065b 206 P( B, C, D, A, 6, 23, 0x04881D05 );
kadonotakashi 0:8fdf9a60065b 207 P( A, B, C, D, 9, 4, 0xD9D4D039 );
kadonotakashi 0:8fdf9a60065b 208 P( D, A, B, C, 12, 11, 0xE6DB99E5 );
kadonotakashi 0:8fdf9a60065b 209 P( C, D, A, B, 15, 16, 0x1FA27CF8 );
kadonotakashi 0:8fdf9a60065b 210 P( B, C, D, A, 2, 23, 0xC4AC5665 );
kadonotakashi 0:8fdf9a60065b 211
kadonotakashi 0:8fdf9a60065b 212 #undef F
kadonotakashi 0:8fdf9a60065b 213
kadonotakashi 0:8fdf9a60065b 214 #define F(x,y,z) (y ^ (x | ~z))
kadonotakashi 0:8fdf9a60065b 215
kadonotakashi 0:8fdf9a60065b 216 P( A, B, C, D, 0, 6, 0xF4292244 );
kadonotakashi 0:8fdf9a60065b 217 P( D, A, B, C, 7, 10, 0x432AFF97 );
kadonotakashi 0:8fdf9a60065b 218 P( C, D, A, B, 14, 15, 0xAB9423A7 );
kadonotakashi 0:8fdf9a60065b 219 P( B, C, D, A, 5, 21, 0xFC93A039 );
kadonotakashi 0:8fdf9a60065b 220 P( A, B, C, D, 12, 6, 0x655B59C3 );
kadonotakashi 0:8fdf9a60065b 221 P( D, A, B, C, 3, 10, 0x8F0CCC92 );
kadonotakashi 0:8fdf9a60065b 222 P( C, D, A, B, 10, 15, 0xFFEFF47D );
kadonotakashi 0:8fdf9a60065b 223 P( B, C, D, A, 1, 21, 0x85845DD1 );
kadonotakashi 0:8fdf9a60065b 224 P( A, B, C, D, 8, 6, 0x6FA87E4F );
kadonotakashi 0:8fdf9a60065b 225 P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
kadonotakashi 0:8fdf9a60065b 226 P( C, D, A, B, 6, 15, 0xA3014314 );
kadonotakashi 0:8fdf9a60065b 227 P( B, C, D, A, 13, 21, 0x4E0811A1 );
kadonotakashi 0:8fdf9a60065b 228 P( A, B, C, D, 4, 6, 0xF7537E82 );
kadonotakashi 0:8fdf9a60065b 229 P( D, A, B, C, 11, 10, 0xBD3AF235 );
kadonotakashi 0:8fdf9a60065b 230 P( C, D, A, B, 2, 15, 0x2AD7D2BB );
kadonotakashi 0:8fdf9a60065b 231 P( B, C, D, A, 9, 21, 0xEB86D391 );
kadonotakashi 0:8fdf9a60065b 232
kadonotakashi 0:8fdf9a60065b 233 #undef F
kadonotakashi 0:8fdf9a60065b 234
kadonotakashi 0:8fdf9a60065b 235 ctx->state[0] += A;
kadonotakashi 0:8fdf9a60065b 236 ctx->state[1] += B;
kadonotakashi 0:8fdf9a60065b 237 ctx->state[2] += C;
kadonotakashi 0:8fdf9a60065b 238 ctx->state[3] += D;
kadonotakashi 0:8fdf9a60065b 239
kadonotakashi 0:8fdf9a60065b 240 return( 0 );
kadonotakashi 0:8fdf9a60065b 241 }
kadonotakashi 0:8fdf9a60065b 242
kadonotakashi 0:8fdf9a60065b 243 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
kadonotakashi 0:8fdf9a60065b 244 void mbedtls_md5_process( mbedtls_md5_context *ctx,
kadonotakashi 0:8fdf9a60065b 245 const unsigned char data[64] )
kadonotakashi 0:8fdf9a60065b 246 {
kadonotakashi 0:8fdf9a60065b 247 mbedtls_internal_md5_process( ctx, data );
kadonotakashi 0:8fdf9a60065b 248 }
kadonotakashi 0:8fdf9a60065b 249 #endif
kadonotakashi 0:8fdf9a60065b 250 #endif /* !MBEDTLS_MD5_PROCESS_ALT */
kadonotakashi 0:8fdf9a60065b 251
kadonotakashi 0:8fdf9a60065b 252 /*
kadonotakashi 0:8fdf9a60065b 253 * MD5 process buffer
kadonotakashi 0:8fdf9a60065b 254 */
kadonotakashi 0:8fdf9a60065b 255 int mbedtls_md5_update_ret( mbedtls_md5_context *ctx,
kadonotakashi 0:8fdf9a60065b 256 const unsigned char *input,
kadonotakashi 0:8fdf9a60065b 257 size_t ilen )
kadonotakashi 0:8fdf9a60065b 258 {
kadonotakashi 0:8fdf9a60065b 259 int ret;
kadonotakashi 0:8fdf9a60065b 260 size_t fill;
kadonotakashi 0:8fdf9a60065b 261 uint32_t left;
kadonotakashi 0:8fdf9a60065b 262
kadonotakashi 0:8fdf9a60065b 263 if( ilen == 0 )
kadonotakashi 0:8fdf9a60065b 264 return( 0 );
kadonotakashi 0:8fdf9a60065b 265
kadonotakashi 0:8fdf9a60065b 266 left = ctx->total[0] & 0x3F;
kadonotakashi 0:8fdf9a60065b 267 fill = 64 - left;
kadonotakashi 0:8fdf9a60065b 268
kadonotakashi 0:8fdf9a60065b 269 ctx->total[0] += (uint32_t) ilen;
kadonotakashi 0:8fdf9a60065b 270 ctx->total[0] &= 0xFFFFFFFF;
kadonotakashi 0:8fdf9a60065b 271
kadonotakashi 0:8fdf9a60065b 272 if( ctx->total[0] < (uint32_t) ilen )
kadonotakashi 0:8fdf9a60065b 273 ctx->total[1]++;
kadonotakashi 0:8fdf9a60065b 274
kadonotakashi 0:8fdf9a60065b 275 if( left && ilen >= fill )
kadonotakashi 0:8fdf9a60065b 276 {
kadonotakashi 0:8fdf9a60065b 277 memcpy( (void *) (ctx->buffer + left), input, fill );
kadonotakashi 0:8fdf9a60065b 278 if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 279 return( ret );
kadonotakashi 0:8fdf9a60065b 280
kadonotakashi 0:8fdf9a60065b 281 input += fill;
kadonotakashi 0:8fdf9a60065b 282 ilen -= fill;
kadonotakashi 0:8fdf9a60065b 283 left = 0;
kadonotakashi 0:8fdf9a60065b 284 }
kadonotakashi 0:8fdf9a60065b 285
kadonotakashi 0:8fdf9a60065b 286 while( ilen >= 64 )
kadonotakashi 0:8fdf9a60065b 287 {
kadonotakashi 0:8fdf9a60065b 288 if( ( ret = mbedtls_internal_md5_process( ctx, input ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 289 return( ret );
kadonotakashi 0:8fdf9a60065b 290
kadonotakashi 0:8fdf9a60065b 291 input += 64;
kadonotakashi 0:8fdf9a60065b 292 ilen -= 64;
kadonotakashi 0:8fdf9a60065b 293 }
kadonotakashi 0:8fdf9a60065b 294
kadonotakashi 0:8fdf9a60065b 295 if( ilen > 0 )
kadonotakashi 0:8fdf9a60065b 296 {
kadonotakashi 0:8fdf9a60065b 297 memcpy( (void *) (ctx->buffer + left), input, ilen );
kadonotakashi 0:8fdf9a60065b 298 }
kadonotakashi 0:8fdf9a60065b 299
kadonotakashi 0:8fdf9a60065b 300 return( 0 );
kadonotakashi 0:8fdf9a60065b 301 }
kadonotakashi 0:8fdf9a60065b 302
kadonotakashi 0:8fdf9a60065b 303 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
kadonotakashi 0:8fdf9a60065b 304 void mbedtls_md5_update( mbedtls_md5_context *ctx,
kadonotakashi 0:8fdf9a60065b 305 const unsigned char *input,
kadonotakashi 0:8fdf9a60065b 306 size_t ilen )
kadonotakashi 0:8fdf9a60065b 307 {
kadonotakashi 0:8fdf9a60065b 308 mbedtls_md5_update_ret( ctx, input, ilen );
kadonotakashi 0:8fdf9a60065b 309 }
kadonotakashi 0:8fdf9a60065b 310 #endif
kadonotakashi 0:8fdf9a60065b 311
kadonotakashi 0:8fdf9a60065b 312 /*
kadonotakashi 0:8fdf9a60065b 313 * MD5 final digest
kadonotakashi 0:8fdf9a60065b 314 */
kadonotakashi 0:8fdf9a60065b 315 int mbedtls_md5_finish_ret( mbedtls_md5_context *ctx,
kadonotakashi 0:8fdf9a60065b 316 unsigned char output[16] )
kadonotakashi 0:8fdf9a60065b 317 {
kadonotakashi 0:8fdf9a60065b 318 int ret;
kadonotakashi 0:8fdf9a60065b 319 uint32_t used;
kadonotakashi 0:8fdf9a60065b 320 uint32_t high, low;
kadonotakashi 0:8fdf9a60065b 321
kadonotakashi 0:8fdf9a60065b 322 /*
kadonotakashi 0:8fdf9a60065b 323 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
kadonotakashi 0:8fdf9a60065b 324 */
kadonotakashi 0:8fdf9a60065b 325 used = ctx->total[0] & 0x3F;
kadonotakashi 0:8fdf9a60065b 326
kadonotakashi 0:8fdf9a60065b 327 ctx->buffer[used++] = 0x80;
kadonotakashi 0:8fdf9a60065b 328
kadonotakashi 0:8fdf9a60065b 329 if( used <= 56 )
kadonotakashi 0:8fdf9a60065b 330 {
kadonotakashi 0:8fdf9a60065b 331 /* Enough room for padding + length in current block */
kadonotakashi 0:8fdf9a60065b 332 memset( ctx->buffer + used, 0, 56 - used );
kadonotakashi 0:8fdf9a60065b 333 }
kadonotakashi 0:8fdf9a60065b 334 else
kadonotakashi 0:8fdf9a60065b 335 {
kadonotakashi 0:8fdf9a60065b 336 /* We'll need an extra block */
kadonotakashi 0:8fdf9a60065b 337 memset( ctx->buffer + used, 0, 64 - used );
kadonotakashi 0:8fdf9a60065b 338
kadonotakashi 0:8fdf9a60065b 339 if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 340 return( ret );
kadonotakashi 0:8fdf9a60065b 341
kadonotakashi 0:8fdf9a60065b 342 memset( ctx->buffer, 0, 56 );
kadonotakashi 0:8fdf9a60065b 343 }
kadonotakashi 0:8fdf9a60065b 344
kadonotakashi 0:8fdf9a60065b 345 /*
kadonotakashi 0:8fdf9a60065b 346 * Add message length
kadonotakashi 0:8fdf9a60065b 347 */
kadonotakashi 0:8fdf9a60065b 348 high = ( ctx->total[0] >> 29 )
kadonotakashi 0:8fdf9a60065b 349 | ( ctx->total[1] << 3 );
kadonotakashi 0:8fdf9a60065b 350 low = ( ctx->total[0] << 3 );
kadonotakashi 0:8fdf9a60065b 351
kadonotakashi 0:8fdf9a60065b 352 PUT_UINT32_LE( low, ctx->buffer, 56 );
kadonotakashi 0:8fdf9a60065b 353 PUT_UINT32_LE( high, ctx->buffer, 60 );
kadonotakashi 0:8fdf9a60065b 354
kadonotakashi 0:8fdf9a60065b 355 if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 356 return( ret );
kadonotakashi 0:8fdf9a60065b 357
kadonotakashi 0:8fdf9a60065b 358 /*
kadonotakashi 0:8fdf9a60065b 359 * Output final state
kadonotakashi 0:8fdf9a60065b 360 */
kadonotakashi 0:8fdf9a60065b 361 PUT_UINT32_LE( ctx->state[0], output, 0 );
kadonotakashi 0:8fdf9a60065b 362 PUT_UINT32_LE( ctx->state[1], output, 4 );
kadonotakashi 0:8fdf9a60065b 363 PUT_UINT32_LE( ctx->state[2], output, 8 );
kadonotakashi 0:8fdf9a60065b 364 PUT_UINT32_LE( ctx->state[3], output, 12 );
kadonotakashi 0:8fdf9a60065b 365
kadonotakashi 0:8fdf9a60065b 366 return( 0 );
kadonotakashi 0:8fdf9a60065b 367 }
kadonotakashi 0:8fdf9a60065b 368
kadonotakashi 0:8fdf9a60065b 369 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
kadonotakashi 0:8fdf9a60065b 370 void mbedtls_md5_finish( mbedtls_md5_context *ctx,
kadonotakashi 0:8fdf9a60065b 371 unsigned char output[16] )
kadonotakashi 0:8fdf9a60065b 372 {
kadonotakashi 0:8fdf9a60065b 373 mbedtls_md5_finish_ret( ctx, output );
kadonotakashi 0:8fdf9a60065b 374 }
kadonotakashi 0:8fdf9a60065b 375 #endif
kadonotakashi 0:8fdf9a60065b 376
kadonotakashi 0:8fdf9a60065b 377 #endif /* !MBEDTLS_MD5_ALT */
kadonotakashi 0:8fdf9a60065b 378
kadonotakashi 0:8fdf9a60065b 379 /*
kadonotakashi 0:8fdf9a60065b 380 * output = MD5( input buffer )
kadonotakashi 0:8fdf9a60065b 381 */
kadonotakashi 0:8fdf9a60065b 382 int mbedtls_md5_ret( const unsigned char *input,
kadonotakashi 0:8fdf9a60065b 383 size_t ilen,
kadonotakashi 0:8fdf9a60065b 384 unsigned char output[16] )
kadonotakashi 0:8fdf9a60065b 385 {
kadonotakashi 0:8fdf9a60065b 386 int ret;
kadonotakashi 0:8fdf9a60065b 387 mbedtls_md5_context ctx;
kadonotakashi 0:8fdf9a60065b 388
kadonotakashi 0:8fdf9a60065b 389 mbedtls_md5_init( &ctx );
kadonotakashi 0:8fdf9a60065b 390
kadonotakashi 0:8fdf9a60065b 391 if( ( ret = mbedtls_md5_starts_ret( &ctx ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 392 goto exit;
kadonotakashi 0:8fdf9a60065b 393
kadonotakashi 0:8fdf9a60065b 394 if( ( ret = mbedtls_md5_update_ret( &ctx, input, ilen ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 395 goto exit;
kadonotakashi 0:8fdf9a60065b 396
kadonotakashi 0:8fdf9a60065b 397 if( ( ret = mbedtls_md5_finish_ret( &ctx, output ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 398 goto exit;
kadonotakashi 0:8fdf9a60065b 399
kadonotakashi 0:8fdf9a60065b 400 exit:
kadonotakashi 0:8fdf9a60065b 401 mbedtls_md5_free( &ctx );
kadonotakashi 0:8fdf9a60065b 402
kadonotakashi 0:8fdf9a60065b 403 return( ret );
kadonotakashi 0:8fdf9a60065b 404 }
kadonotakashi 0:8fdf9a60065b 405
kadonotakashi 0:8fdf9a60065b 406 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
kadonotakashi 0:8fdf9a60065b 407 void mbedtls_md5( const unsigned char *input,
kadonotakashi 0:8fdf9a60065b 408 size_t ilen,
kadonotakashi 0:8fdf9a60065b 409 unsigned char output[16] )
kadonotakashi 0:8fdf9a60065b 410 {
kadonotakashi 0:8fdf9a60065b 411 mbedtls_md5_ret( input, ilen, output );
kadonotakashi 0:8fdf9a60065b 412 }
kadonotakashi 0:8fdf9a60065b 413 #endif
kadonotakashi 0:8fdf9a60065b 414
kadonotakashi 0:8fdf9a60065b 415 #if defined(MBEDTLS_SELF_TEST)
kadonotakashi 0:8fdf9a60065b 416 /*
kadonotakashi 0:8fdf9a60065b 417 * RFC 1321 test vectors
kadonotakashi 0:8fdf9a60065b 418 */
kadonotakashi 0:8fdf9a60065b 419 static const unsigned char md5_test_buf[7][81] =
kadonotakashi 0:8fdf9a60065b 420 {
kadonotakashi 0:8fdf9a60065b 421 { "" },
kadonotakashi 0:8fdf9a60065b 422 { "a" },
kadonotakashi 0:8fdf9a60065b 423 { "abc" },
kadonotakashi 0:8fdf9a60065b 424 { "message digest" },
kadonotakashi 0:8fdf9a60065b 425 { "abcdefghijklmnopqrstuvwxyz" },
kadonotakashi 0:8fdf9a60065b 426 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
kadonotakashi 0:8fdf9a60065b 427 { "12345678901234567890123456789012345678901234567890123456789012"
kadonotakashi 0:8fdf9a60065b 428 "345678901234567890" }
kadonotakashi 0:8fdf9a60065b 429 };
kadonotakashi 0:8fdf9a60065b 430
kadonotakashi 0:8fdf9a60065b 431 static const size_t md5_test_buflen[7] =
kadonotakashi 0:8fdf9a60065b 432 {
kadonotakashi 0:8fdf9a60065b 433 0, 1, 3, 14, 26, 62, 80
kadonotakashi 0:8fdf9a60065b 434 };
kadonotakashi 0:8fdf9a60065b 435
kadonotakashi 0:8fdf9a60065b 436 static const unsigned char md5_test_sum[7][16] =
kadonotakashi 0:8fdf9a60065b 437 {
kadonotakashi 0:8fdf9a60065b 438 { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04,
kadonotakashi 0:8fdf9a60065b 439 0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E },
kadonotakashi 0:8fdf9a60065b 440 { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8,
kadonotakashi 0:8fdf9a60065b 441 0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 },
kadonotakashi 0:8fdf9a60065b 442 { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0,
kadonotakashi 0:8fdf9a60065b 443 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 },
kadonotakashi 0:8fdf9a60065b 444 { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D,
kadonotakashi 0:8fdf9a60065b 445 0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 },
kadonotakashi 0:8fdf9a60065b 446 { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00,
kadonotakashi 0:8fdf9a60065b 447 0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B },
kadonotakashi 0:8fdf9a60065b 448 { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5,
kadonotakashi 0:8fdf9a60065b 449 0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F },
kadonotakashi 0:8fdf9a60065b 450 { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55,
kadonotakashi 0:8fdf9a60065b 451 0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A }
kadonotakashi 0:8fdf9a60065b 452 };
kadonotakashi 0:8fdf9a60065b 453
kadonotakashi 0:8fdf9a60065b 454 /*
kadonotakashi 0:8fdf9a60065b 455 * Checkup routine
kadonotakashi 0:8fdf9a60065b 456 */
kadonotakashi 0:8fdf9a60065b 457 int mbedtls_md5_self_test( int verbose )
kadonotakashi 0:8fdf9a60065b 458 {
kadonotakashi 0:8fdf9a60065b 459 int i, ret = 0;
kadonotakashi 0:8fdf9a60065b 460 unsigned char md5sum[16];
kadonotakashi 0:8fdf9a60065b 461
kadonotakashi 0:8fdf9a60065b 462 for( i = 0; i < 7; i++ )
kadonotakashi 0:8fdf9a60065b 463 {
kadonotakashi 0:8fdf9a60065b 464 if( verbose != 0 )
kadonotakashi 0:8fdf9a60065b 465 mbedtls_printf( " MD5 test #%d: ", i + 1 );
kadonotakashi 0:8fdf9a60065b 466
kadonotakashi 0:8fdf9a60065b 467 ret = mbedtls_md5_ret( md5_test_buf[i], md5_test_buflen[i], md5sum );
kadonotakashi 0:8fdf9a60065b 468 if( ret != 0 )
kadonotakashi 0:8fdf9a60065b 469 goto fail;
kadonotakashi 0:8fdf9a60065b 470
kadonotakashi 0:8fdf9a60065b 471 if( memcmp( md5sum, md5_test_sum[i], 16 ) != 0 )
kadonotakashi 0:8fdf9a60065b 472 {
kadonotakashi 0:8fdf9a60065b 473 ret = 1;
kadonotakashi 0:8fdf9a60065b 474 goto fail;
kadonotakashi 0:8fdf9a60065b 475 }
kadonotakashi 0:8fdf9a60065b 476
kadonotakashi 0:8fdf9a60065b 477 if( verbose != 0 )
kadonotakashi 0:8fdf9a60065b 478 mbedtls_printf( "passed\n" );
kadonotakashi 0:8fdf9a60065b 479 }
kadonotakashi 0:8fdf9a60065b 480
kadonotakashi 0:8fdf9a60065b 481 if( verbose != 0 )
kadonotakashi 0:8fdf9a60065b 482 mbedtls_printf( "\n" );
kadonotakashi 0:8fdf9a60065b 483
kadonotakashi 0:8fdf9a60065b 484 return( 0 );
kadonotakashi 0:8fdf9a60065b 485
kadonotakashi 0:8fdf9a60065b 486 fail:
kadonotakashi 0:8fdf9a60065b 487 if( verbose != 0 )
kadonotakashi 0:8fdf9a60065b 488 mbedtls_printf( "failed\n" );
kadonotakashi 0:8fdf9a60065b 489
kadonotakashi 0:8fdf9a60065b 490 return( ret );
kadonotakashi 0:8fdf9a60065b 491 }
kadonotakashi 0:8fdf9a60065b 492
kadonotakashi 0:8fdf9a60065b 493 #endif /* MBEDTLS_SELF_TEST */
kadonotakashi 0:8fdf9a60065b 494
kadonotakashi 0:8fdf9a60065b 495 #endif /* MBEDTLS_MD5_C */