Knight KE / Mbed OS Game_Master
Committer:
WFKnight
Date:
Thu Jun 21 13:51:43 2018 +0000
Revision:
0:9b3d4731edbb
UART, RTOS, LED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WFKnight 0:9b3d4731edbb 1 /**
WFKnight 0:9b3d4731edbb 2 * \file mbedtls_md.c
WFKnight 0:9b3d4731edbb 3 *
WFKnight 0:9b3d4731edbb 4 * \brief Generic message digest wrapper for mbed TLS
WFKnight 0:9b3d4731edbb 5 *
WFKnight 0:9b3d4731edbb 6 * \author Adriaan de Jong <dejong@fox-it.com>
WFKnight 0:9b3d4731edbb 7 *
WFKnight 0:9b3d4731edbb 8 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
WFKnight 0:9b3d4731edbb 9 * SPDX-License-Identifier: Apache-2.0
WFKnight 0:9b3d4731edbb 10 *
WFKnight 0:9b3d4731edbb 11 * Licensed under the Apache License, Version 2.0 (the "License"); you may
WFKnight 0:9b3d4731edbb 12 * not use this file except in compliance with the License.
WFKnight 0:9b3d4731edbb 13 * You may obtain a copy of the License at
WFKnight 0:9b3d4731edbb 14 *
WFKnight 0:9b3d4731edbb 15 * http://www.apache.org/licenses/LICENSE-2.0
WFKnight 0:9b3d4731edbb 16 *
WFKnight 0:9b3d4731edbb 17 * Unless required by applicable law or agreed to in writing, software
WFKnight 0:9b3d4731edbb 18 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WFKnight 0:9b3d4731edbb 19 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
WFKnight 0:9b3d4731edbb 20 * See the License for the specific language governing permissions and
WFKnight 0:9b3d4731edbb 21 * limitations under the License.
WFKnight 0:9b3d4731edbb 22 *
WFKnight 0:9b3d4731edbb 23 * This file is part of mbed TLS (https://tls.mbed.org)
WFKnight 0:9b3d4731edbb 24 */
WFKnight 0:9b3d4731edbb 25
WFKnight 0:9b3d4731edbb 26 #if !defined(MBEDTLS_CONFIG_FILE)
WFKnight 0:9b3d4731edbb 27 #include "mbedtls/config.h"
WFKnight 0:9b3d4731edbb 28 #else
WFKnight 0:9b3d4731edbb 29 #include MBEDTLS_CONFIG_FILE
WFKnight 0:9b3d4731edbb 30 #endif
WFKnight 0:9b3d4731edbb 31
WFKnight 0:9b3d4731edbb 32 #if defined(MBEDTLS_MD_C)
WFKnight 0:9b3d4731edbb 33
WFKnight 0:9b3d4731edbb 34 #include "mbedtls/md.h"
WFKnight 0:9b3d4731edbb 35 #include "mbedtls/md_internal.h"
WFKnight 0:9b3d4731edbb 36 #include "mbedtls/platform_util.h"
WFKnight 0:9b3d4731edbb 37
WFKnight 0:9b3d4731edbb 38 #if defined(MBEDTLS_PLATFORM_C)
WFKnight 0:9b3d4731edbb 39 #include "mbedtls/platform.h"
WFKnight 0:9b3d4731edbb 40 #else
WFKnight 0:9b3d4731edbb 41 #include <stdlib.h>
WFKnight 0:9b3d4731edbb 42 #define mbedtls_calloc calloc
WFKnight 0:9b3d4731edbb 43 #define mbedtls_free free
WFKnight 0:9b3d4731edbb 44 #endif
WFKnight 0:9b3d4731edbb 45
WFKnight 0:9b3d4731edbb 46 #include <string.h>
WFKnight 0:9b3d4731edbb 47
WFKnight 0:9b3d4731edbb 48 #if defined(MBEDTLS_FS_IO)
WFKnight 0:9b3d4731edbb 49 #include <stdio.h>
WFKnight 0:9b3d4731edbb 50 #endif
WFKnight 0:9b3d4731edbb 51
WFKnight 0:9b3d4731edbb 52 /*
WFKnight 0:9b3d4731edbb 53 * Reminder: update profiles in x509_crt.c when adding a new hash!
WFKnight 0:9b3d4731edbb 54 */
WFKnight 0:9b3d4731edbb 55 static const int supported_digests[] = {
WFKnight 0:9b3d4731edbb 56
WFKnight 0:9b3d4731edbb 57 #if defined(MBEDTLS_SHA512_C)
WFKnight 0:9b3d4731edbb 58 MBEDTLS_MD_SHA512,
WFKnight 0:9b3d4731edbb 59 MBEDTLS_MD_SHA384,
WFKnight 0:9b3d4731edbb 60 #endif
WFKnight 0:9b3d4731edbb 61
WFKnight 0:9b3d4731edbb 62 #if defined(MBEDTLS_SHA256_C)
WFKnight 0:9b3d4731edbb 63 MBEDTLS_MD_SHA256,
WFKnight 0:9b3d4731edbb 64 MBEDTLS_MD_SHA224,
WFKnight 0:9b3d4731edbb 65 #endif
WFKnight 0:9b3d4731edbb 66
WFKnight 0:9b3d4731edbb 67 #if defined(MBEDTLS_SHA1_C)
WFKnight 0:9b3d4731edbb 68 MBEDTLS_MD_SHA1,
WFKnight 0:9b3d4731edbb 69 #endif
WFKnight 0:9b3d4731edbb 70
WFKnight 0:9b3d4731edbb 71 #if defined(MBEDTLS_RIPEMD160_C)
WFKnight 0:9b3d4731edbb 72 MBEDTLS_MD_RIPEMD160,
WFKnight 0:9b3d4731edbb 73 #endif
WFKnight 0:9b3d4731edbb 74
WFKnight 0:9b3d4731edbb 75 #if defined(MBEDTLS_MD5_C)
WFKnight 0:9b3d4731edbb 76 MBEDTLS_MD_MD5,
WFKnight 0:9b3d4731edbb 77 #endif
WFKnight 0:9b3d4731edbb 78
WFKnight 0:9b3d4731edbb 79 #if defined(MBEDTLS_MD4_C)
WFKnight 0:9b3d4731edbb 80 MBEDTLS_MD_MD4,
WFKnight 0:9b3d4731edbb 81 #endif
WFKnight 0:9b3d4731edbb 82
WFKnight 0:9b3d4731edbb 83 #if defined(MBEDTLS_MD2_C)
WFKnight 0:9b3d4731edbb 84 MBEDTLS_MD_MD2,
WFKnight 0:9b3d4731edbb 85 #endif
WFKnight 0:9b3d4731edbb 86
WFKnight 0:9b3d4731edbb 87 MBEDTLS_MD_NONE
WFKnight 0:9b3d4731edbb 88 };
WFKnight 0:9b3d4731edbb 89
WFKnight 0:9b3d4731edbb 90 const int *mbedtls_md_list( void )
WFKnight 0:9b3d4731edbb 91 {
WFKnight 0:9b3d4731edbb 92 return( supported_digests );
WFKnight 0:9b3d4731edbb 93 }
WFKnight 0:9b3d4731edbb 94
WFKnight 0:9b3d4731edbb 95 const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name )
WFKnight 0:9b3d4731edbb 96 {
WFKnight 0:9b3d4731edbb 97 if( NULL == md_name )
WFKnight 0:9b3d4731edbb 98 return( NULL );
WFKnight 0:9b3d4731edbb 99
WFKnight 0:9b3d4731edbb 100 /* Get the appropriate digest information */
WFKnight 0:9b3d4731edbb 101 #if defined(MBEDTLS_MD2_C)
WFKnight 0:9b3d4731edbb 102 if( !strcmp( "MD2", md_name ) )
WFKnight 0:9b3d4731edbb 103 return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 );
WFKnight 0:9b3d4731edbb 104 #endif
WFKnight 0:9b3d4731edbb 105 #if defined(MBEDTLS_MD4_C)
WFKnight 0:9b3d4731edbb 106 if( !strcmp( "MD4", md_name ) )
WFKnight 0:9b3d4731edbb 107 return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 );
WFKnight 0:9b3d4731edbb 108 #endif
WFKnight 0:9b3d4731edbb 109 #if defined(MBEDTLS_MD5_C)
WFKnight 0:9b3d4731edbb 110 if( !strcmp( "MD5", md_name ) )
WFKnight 0:9b3d4731edbb 111 return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 );
WFKnight 0:9b3d4731edbb 112 #endif
WFKnight 0:9b3d4731edbb 113 #if defined(MBEDTLS_RIPEMD160_C)
WFKnight 0:9b3d4731edbb 114 if( !strcmp( "RIPEMD160", md_name ) )
WFKnight 0:9b3d4731edbb 115 return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 );
WFKnight 0:9b3d4731edbb 116 #endif
WFKnight 0:9b3d4731edbb 117 #if defined(MBEDTLS_SHA1_C)
WFKnight 0:9b3d4731edbb 118 if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) )
WFKnight 0:9b3d4731edbb 119 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
WFKnight 0:9b3d4731edbb 120 #endif
WFKnight 0:9b3d4731edbb 121 #if defined(MBEDTLS_SHA256_C)
WFKnight 0:9b3d4731edbb 122 if( !strcmp( "SHA224", md_name ) )
WFKnight 0:9b3d4731edbb 123 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 );
WFKnight 0:9b3d4731edbb 124 if( !strcmp( "SHA256", md_name ) )
WFKnight 0:9b3d4731edbb 125 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );
WFKnight 0:9b3d4731edbb 126 #endif
WFKnight 0:9b3d4731edbb 127 #if defined(MBEDTLS_SHA512_C)
WFKnight 0:9b3d4731edbb 128 if( !strcmp( "SHA384", md_name ) )
WFKnight 0:9b3d4731edbb 129 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 );
WFKnight 0:9b3d4731edbb 130 if( !strcmp( "SHA512", md_name ) )
WFKnight 0:9b3d4731edbb 131 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 );
WFKnight 0:9b3d4731edbb 132 #endif
WFKnight 0:9b3d4731edbb 133 return( NULL );
WFKnight 0:9b3d4731edbb 134 }
WFKnight 0:9b3d4731edbb 135
WFKnight 0:9b3d4731edbb 136 const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
WFKnight 0:9b3d4731edbb 137 {
WFKnight 0:9b3d4731edbb 138 switch( md_type )
WFKnight 0:9b3d4731edbb 139 {
WFKnight 0:9b3d4731edbb 140 #if defined(MBEDTLS_MD2_C)
WFKnight 0:9b3d4731edbb 141 case MBEDTLS_MD_MD2:
WFKnight 0:9b3d4731edbb 142 return( &mbedtls_md2_info );
WFKnight 0:9b3d4731edbb 143 #endif
WFKnight 0:9b3d4731edbb 144 #if defined(MBEDTLS_MD4_C)
WFKnight 0:9b3d4731edbb 145 case MBEDTLS_MD_MD4:
WFKnight 0:9b3d4731edbb 146 return( &mbedtls_md4_info );
WFKnight 0:9b3d4731edbb 147 #endif
WFKnight 0:9b3d4731edbb 148 #if defined(MBEDTLS_MD5_C)
WFKnight 0:9b3d4731edbb 149 case MBEDTLS_MD_MD5:
WFKnight 0:9b3d4731edbb 150 return( &mbedtls_md5_info );
WFKnight 0:9b3d4731edbb 151 #endif
WFKnight 0:9b3d4731edbb 152 #if defined(MBEDTLS_RIPEMD160_C)
WFKnight 0:9b3d4731edbb 153 case MBEDTLS_MD_RIPEMD160:
WFKnight 0:9b3d4731edbb 154 return( &mbedtls_ripemd160_info );
WFKnight 0:9b3d4731edbb 155 #endif
WFKnight 0:9b3d4731edbb 156 #if defined(MBEDTLS_SHA1_C)
WFKnight 0:9b3d4731edbb 157 case MBEDTLS_MD_SHA1:
WFKnight 0:9b3d4731edbb 158 return( &mbedtls_sha1_info );
WFKnight 0:9b3d4731edbb 159 #endif
WFKnight 0:9b3d4731edbb 160 #if defined(MBEDTLS_SHA256_C)
WFKnight 0:9b3d4731edbb 161 case MBEDTLS_MD_SHA224:
WFKnight 0:9b3d4731edbb 162 return( &mbedtls_sha224_info );
WFKnight 0:9b3d4731edbb 163 case MBEDTLS_MD_SHA256:
WFKnight 0:9b3d4731edbb 164 return( &mbedtls_sha256_info );
WFKnight 0:9b3d4731edbb 165 #endif
WFKnight 0:9b3d4731edbb 166 #if defined(MBEDTLS_SHA512_C)
WFKnight 0:9b3d4731edbb 167 case MBEDTLS_MD_SHA384:
WFKnight 0:9b3d4731edbb 168 return( &mbedtls_sha384_info );
WFKnight 0:9b3d4731edbb 169 case MBEDTLS_MD_SHA512:
WFKnight 0:9b3d4731edbb 170 return( &mbedtls_sha512_info );
WFKnight 0:9b3d4731edbb 171 #endif
WFKnight 0:9b3d4731edbb 172 default:
WFKnight 0:9b3d4731edbb 173 return( NULL );
WFKnight 0:9b3d4731edbb 174 }
WFKnight 0:9b3d4731edbb 175 }
WFKnight 0:9b3d4731edbb 176
WFKnight 0:9b3d4731edbb 177 void mbedtls_md_init( mbedtls_md_context_t *ctx )
WFKnight 0:9b3d4731edbb 178 {
WFKnight 0:9b3d4731edbb 179 memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
WFKnight 0:9b3d4731edbb 180 }
WFKnight 0:9b3d4731edbb 181
WFKnight 0:9b3d4731edbb 182 void mbedtls_md_free( mbedtls_md_context_t *ctx )
WFKnight 0:9b3d4731edbb 183 {
WFKnight 0:9b3d4731edbb 184 if( ctx == NULL || ctx->md_info == NULL )
WFKnight 0:9b3d4731edbb 185 return;
WFKnight 0:9b3d4731edbb 186
WFKnight 0:9b3d4731edbb 187 if( ctx->md_ctx != NULL )
WFKnight 0:9b3d4731edbb 188 ctx->md_info->ctx_free_func( ctx->md_ctx );
WFKnight 0:9b3d4731edbb 189
WFKnight 0:9b3d4731edbb 190 if( ctx->hmac_ctx != NULL )
WFKnight 0:9b3d4731edbb 191 {
WFKnight 0:9b3d4731edbb 192 mbedtls_platform_zeroize( ctx->hmac_ctx,
WFKnight 0:9b3d4731edbb 193 2 * ctx->md_info->block_size );
WFKnight 0:9b3d4731edbb 194 mbedtls_free( ctx->hmac_ctx );
WFKnight 0:9b3d4731edbb 195 }
WFKnight 0:9b3d4731edbb 196
WFKnight 0:9b3d4731edbb 197 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) );
WFKnight 0:9b3d4731edbb 198 }
WFKnight 0:9b3d4731edbb 199
WFKnight 0:9b3d4731edbb 200 int mbedtls_md_clone( mbedtls_md_context_t *dst,
WFKnight 0:9b3d4731edbb 201 const mbedtls_md_context_t *src )
WFKnight 0:9b3d4731edbb 202 {
WFKnight 0:9b3d4731edbb 203 if( dst == NULL || dst->md_info == NULL ||
WFKnight 0:9b3d4731edbb 204 src == NULL || src->md_info == NULL ||
WFKnight 0:9b3d4731edbb 205 dst->md_info != src->md_info )
WFKnight 0:9b3d4731edbb 206 {
WFKnight 0:9b3d4731edbb 207 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 208 }
WFKnight 0:9b3d4731edbb 209
WFKnight 0:9b3d4731edbb 210 dst->md_info->clone_func( dst->md_ctx, src->md_ctx );
WFKnight 0:9b3d4731edbb 211
WFKnight 0:9b3d4731edbb 212 return( 0 );
WFKnight 0:9b3d4731edbb 213 }
WFKnight 0:9b3d4731edbb 214
WFKnight 0:9b3d4731edbb 215 #if ! defined(MBEDTLS_DEPRECATED_REMOVED)
WFKnight 0:9b3d4731edbb 216 int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info )
WFKnight 0:9b3d4731edbb 217 {
WFKnight 0:9b3d4731edbb 218 return mbedtls_md_setup( ctx, md_info, 1 );
WFKnight 0:9b3d4731edbb 219 }
WFKnight 0:9b3d4731edbb 220 #endif
WFKnight 0:9b3d4731edbb 221
WFKnight 0:9b3d4731edbb 222 int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac )
WFKnight 0:9b3d4731edbb 223 {
WFKnight 0:9b3d4731edbb 224 if( md_info == NULL || ctx == NULL )
WFKnight 0:9b3d4731edbb 225 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 226
WFKnight 0:9b3d4731edbb 227 if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL )
WFKnight 0:9b3d4731edbb 228 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
WFKnight 0:9b3d4731edbb 229
WFKnight 0:9b3d4731edbb 230 if( hmac != 0 )
WFKnight 0:9b3d4731edbb 231 {
WFKnight 0:9b3d4731edbb 232 ctx->hmac_ctx = mbedtls_calloc( 2, md_info->block_size );
WFKnight 0:9b3d4731edbb 233 if( ctx->hmac_ctx == NULL )
WFKnight 0:9b3d4731edbb 234 {
WFKnight 0:9b3d4731edbb 235 md_info->ctx_free_func( ctx->md_ctx );
WFKnight 0:9b3d4731edbb 236 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
WFKnight 0:9b3d4731edbb 237 }
WFKnight 0:9b3d4731edbb 238 }
WFKnight 0:9b3d4731edbb 239
WFKnight 0:9b3d4731edbb 240 ctx->md_info = md_info;
WFKnight 0:9b3d4731edbb 241
WFKnight 0:9b3d4731edbb 242 return( 0 );
WFKnight 0:9b3d4731edbb 243 }
WFKnight 0:9b3d4731edbb 244
WFKnight 0:9b3d4731edbb 245 int mbedtls_md_starts( mbedtls_md_context_t *ctx )
WFKnight 0:9b3d4731edbb 246 {
WFKnight 0:9b3d4731edbb 247 if( ctx == NULL || ctx->md_info == NULL )
WFKnight 0:9b3d4731edbb 248 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 249
WFKnight 0:9b3d4731edbb 250 return( ctx->md_info->starts_func( ctx->md_ctx ) );
WFKnight 0:9b3d4731edbb 251 }
WFKnight 0:9b3d4731edbb 252
WFKnight 0:9b3d4731edbb 253 int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
WFKnight 0:9b3d4731edbb 254 {
WFKnight 0:9b3d4731edbb 255 if( ctx == NULL || ctx->md_info == NULL )
WFKnight 0:9b3d4731edbb 256 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 257
WFKnight 0:9b3d4731edbb 258 return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) );
WFKnight 0:9b3d4731edbb 259 }
WFKnight 0:9b3d4731edbb 260
WFKnight 0:9b3d4731edbb 261 int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
WFKnight 0:9b3d4731edbb 262 {
WFKnight 0:9b3d4731edbb 263 if( ctx == NULL || ctx->md_info == NULL )
WFKnight 0:9b3d4731edbb 264 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 265
WFKnight 0:9b3d4731edbb 266 return( ctx->md_info->finish_func( ctx->md_ctx, output ) );
WFKnight 0:9b3d4731edbb 267 }
WFKnight 0:9b3d4731edbb 268
WFKnight 0:9b3d4731edbb 269 int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
WFKnight 0:9b3d4731edbb 270 unsigned char *output )
WFKnight 0:9b3d4731edbb 271 {
WFKnight 0:9b3d4731edbb 272 if( md_info == NULL )
WFKnight 0:9b3d4731edbb 273 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 274
WFKnight 0:9b3d4731edbb 275 return( md_info->digest_func( input, ilen, output ) );
WFKnight 0:9b3d4731edbb 276 }
WFKnight 0:9b3d4731edbb 277
WFKnight 0:9b3d4731edbb 278 #if defined(MBEDTLS_FS_IO)
WFKnight 0:9b3d4731edbb 279 int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output )
WFKnight 0:9b3d4731edbb 280 {
WFKnight 0:9b3d4731edbb 281 int ret;
WFKnight 0:9b3d4731edbb 282 FILE *f;
WFKnight 0:9b3d4731edbb 283 size_t n;
WFKnight 0:9b3d4731edbb 284 mbedtls_md_context_t ctx;
WFKnight 0:9b3d4731edbb 285 unsigned char buf[1024];
WFKnight 0:9b3d4731edbb 286
WFKnight 0:9b3d4731edbb 287 if( md_info == NULL )
WFKnight 0:9b3d4731edbb 288 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 289
WFKnight 0:9b3d4731edbb 290 if( ( f = fopen( path, "rb" ) ) == NULL )
WFKnight 0:9b3d4731edbb 291 return( MBEDTLS_ERR_MD_FILE_IO_ERROR );
WFKnight 0:9b3d4731edbb 292
WFKnight 0:9b3d4731edbb 293 mbedtls_md_init( &ctx );
WFKnight 0:9b3d4731edbb 294
WFKnight 0:9b3d4731edbb 295 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
WFKnight 0:9b3d4731edbb 296 goto cleanup;
WFKnight 0:9b3d4731edbb 297
WFKnight 0:9b3d4731edbb 298 if( ( ret = md_info->starts_func( ctx.md_ctx ) ) != 0 )
WFKnight 0:9b3d4731edbb 299 goto cleanup;
WFKnight 0:9b3d4731edbb 300
WFKnight 0:9b3d4731edbb 301 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
WFKnight 0:9b3d4731edbb 302 if( ( ret = md_info->update_func( ctx.md_ctx, buf, n ) ) != 0 )
WFKnight 0:9b3d4731edbb 303 goto cleanup;
WFKnight 0:9b3d4731edbb 304
WFKnight 0:9b3d4731edbb 305 if( ferror( f ) != 0 )
WFKnight 0:9b3d4731edbb 306 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
WFKnight 0:9b3d4731edbb 307 else
WFKnight 0:9b3d4731edbb 308 ret = md_info->finish_func( ctx.md_ctx, output );
WFKnight 0:9b3d4731edbb 309
WFKnight 0:9b3d4731edbb 310 cleanup:
WFKnight 0:9b3d4731edbb 311 mbedtls_platform_zeroize( buf, sizeof( buf ) );
WFKnight 0:9b3d4731edbb 312 fclose( f );
WFKnight 0:9b3d4731edbb 313 mbedtls_md_free( &ctx );
WFKnight 0:9b3d4731edbb 314
WFKnight 0:9b3d4731edbb 315 return( ret );
WFKnight 0:9b3d4731edbb 316 }
WFKnight 0:9b3d4731edbb 317 #endif /* MBEDTLS_FS_IO */
WFKnight 0:9b3d4731edbb 318
WFKnight 0:9b3d4731edbb 319 int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )
WFKnight 0:9b3d4731edbb 320 {
WFKnight 0:9b3d4731edbb 321 int ret;
WFKnight 0:9b3d4731edbb 322 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
WFKnight 0:9b3d4731edbb 323 unsigned char *ipad, *opad;
WFKnight 0:9b3d4731edbb 324 size_t i;
WFKnight 0:9b3d4731edbb 325
WFKnight 0:9b3d4731edbb 326 if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
WFKnight 0:9b3d4731edbb 327 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 328
WFKnight 0:9b3d4731edbb 329 if( keylen > (size_t) ctx->md_info->block_size )
WFKnight 0:9b3d4731edbb 330 {
WFKnight 0:9b3d4731edbb 331 if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
WFKnight 0:9b3d4731edbb 332 goto cleanup;
WFKnight 0:9b3d4731edbb 333 if( ( ret = ctx->md_info->update_func( ctx->md_ctx, key, keylen ) ) != 0 )
WFKnight 0:9b3d4731edbb 334 goto cleanup;
WFKnight 0:9b3d4731edbb 335 if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, sum ) ) != 0 )
WFKnight 0:9b3d4731edbb 336 goto cleanup;
WFKnight 0:9b3d4731edbb 337
WFKnight 0:9b3d4731edbb 338 keylen = ctx->md_info->size;
WFKnight 0:9b3d4731edbb 339 key = sum;
WFKnight 0:9b3d4731edbb 340 }
WFKnight 0:9b3d4731edbb 341
WFKnight 0:9b3d4731edbb 342 ipad = (unsigned char *) ctx->hmac_ctx;
WFKnight 0:9b3d4731edbb 343 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
WFKnight 0:9b3d4731edbb 344
WFKnight 0:9b3d4731edbb 345 memset( ipad, 0x36, ctx->md_info->block_size );
WFKnight 0:9b3d4731edbb 346 memset( opad, 0x5C, ctx->md_info->block_size );
WFKnight 0:9b3d4731edbb 347
WFKnight 0:9b3d4731edbb 348 for( i = 0; i < keylen; i++ )
WFKnight 0:9b3d4731edbb 349 {
WFKnight 0:9b3d4731edbb 350 ipad[i] = (unsigned char)( ipad[i] ^ key[i] );
WFKnight 0:9b3d4731edbb 351 opad[i] = (unsigned char)( opad[i] ^ key[i] );
WFKnight 0:9b3d4731edbb 352 }
WFKnight 0:9b3d4731edbb 353
WFKnight 0:9b3d4731edbb 354 if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
WFKnight 0:9b3d4731edbb 355 goto cleanup;
WFKnight 0:9b3d4731edbb 356 if( ( ret = ctx->md_info->update_func( ctx->md_ctx, ipad,
WFKnight 0:9b3d4731edbb 357 ctx->md_info->block_size ) ) != 0 )
WFKnight 0:9b3d4731edbb 358 goto cleanup;
WFKnight 0:9b3d4731edbb 359
WFKnight 0:9b3d4731edbb 360 cleanup:
WFKnight 0:9b3d4731edbb 361 mbedtls_platform_zeroize( sum, sizeof( sum ) );
WFKnight 0:9b3d4731edbb 362
WFKnight 0:9b3d4731edbb 363 return( ret );
WFKnight 0:9b3d4731edbb 364 }
WFKnight 0:9b3d4731edbb 365
WFKnight 0:9b3d4731edbb 366 int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
WFKnight 0:9b3d4731edbb 367 {
WFKnight 0:9b3d4731edbb 368 if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
WFKnight 0:9b3d4731edbb 369 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 370
WFKnight 0:9b3d4731edbb 371 return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) );
WFKnight 0:9b3d4731edbb 372 }
WFKnight 0:9b3d4731edbb 373
WFKnight 0:9b3d4731edbb 374 int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
WFKnight 0:9b3d4731edbb 375 {
WFKnight 0:9b3d4731edbb 376 int ret;
WFKnight 0:9b3d4731edbb 377 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
WFKnight 0:9b3d4731edbb 378 unsigned char *opad;
WFKnight 0:9b3d4731edbb 379
WFKnight 0:9b3d4731edbb 380 if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
WFKnight 0:9b3d4731edbb 381 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 382
WFKnight 0:9b3d4731edbb 383 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
WFKnight 0:9b3d4731edbb 384
WFKnight 0:9b3d4731edbb 385 if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, tmp ) ) != 0 )
WFKnight 0:9b3d4731edbb 386 return( ret );
WFKnight 0:9b3d4731edbb 387 if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
WFKnight 0:9b3d4731edbb 388 return( ret );
WFKnight 0:9b3d4731edbb 389 if( ( ret = ctx->md_info->update_func( ctx->md_ctx, opad,
WFKnight 0:9b3d4731edbb 390 ctx->md_info->block_size ) ) != 0 )
WFKnight 0:9b3d4731edbb 391 return( ret );
WFKnight 0:9b3d4731edbb 392 if( ( ret = ctx->md_info->update_func( ctx->md_ctx, tmp,
WFKnight 0:9b3d4731edbb 393 ctx->md_info->size ) ) != 0 )
WFKnight 0:9b3d4731edbb 394 return( ret );
WFKnight 0:9b3d4731edbb 395 return( ctx->md_info->finish_func( ctx->md_ctx, output ) );
WFKnight 0:9b3d4731edbb 396 }
WFKnight 0:9b3d4731edbb 397
WFKnight 0:9b3d4731edbb 398 int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
WFKnight 0:9b3d4731edbb 399 {
WFKnight 0:9b3d4731edbb 400 int ret;
WFKnight 0:9b3d4731edbb 401 unsigned char *ipad;
WFKnight 0:9b3d4731edbb 402
WFKnight 0:9b3d4731edbb 403 if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
WFKnight 0:9b3d4731edbb 404 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 405
WFKnight 0:9b3d4731edbb 406 ipad = (unsigned char *) ctx->hmac_ctx;
WFKnight 0:9b3d4731edbb 407
WFKnight 0:9b3d4731edbb 408 if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
WFKnight 0:9b3d4731edbb 409 return( ret );
WFKnight 0:9b3d4731edbb 410 return( ctx->md_info->update_func( ctx->md_ctx, ipad,
WFKnight 0:9b3d4731edbb 411 ctx->md_info->block_size ) );
WFKnight 0:9b3d4731edbb 412 }
WFKnight 0:9b3d4731edbb 413
WFKnight 0:9b3d4731edbb 414 int mbedtls_md_hmac( const mbedtls_md_info_t *md_info,
WFKnight 0:9b3d4731edbb 415 const unsigned char *key, size_t keylen,
WFKnight 0:9b3d4731edbb 416 const unsigned char *input, size_t ilen,
WFKnight 0:9b3d4731edbb 417 unsigned char *output )
WFKnight 0:9b3d4731edbb 418 {
WFKnight 0:9b3d4731edbb 419 mbedtls_md_context_t ctx;
WFKnight 0:9b3d4731edbb 420 int ret;
WFKnight 0:9b3d4731edbb 421
WFKnight 0:9b3d4731edbb 422 if( md_info == NULL )
WFKnight 0:9b3d4731edbb 423 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 424
WFKnight 0:9b3d4731edbb 425 mbedtls_md_init( &ctx );
WFKnight 0:9b3d4731edbb 426
WFKnight 0:9b3d4731edbb 427 if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )
WFKnight 0:9b3d4731edbb 428 goto cleanup;
WFKnight 0:9b3d4731edbb 429
WFKnight 0:9b3d4731edbb 430 if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 )
WFKnight 0:9b3d4731edbb 431 goto cleanup;
WFKnight 0:9b3d4731edbb 432 if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 )
WFKnight 0:9b3d4731edbb 433 goto cleanup;
WFKnight 0:9b3d4731edbb 434 if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 )
WFKnight 0:9b3d4731edbb 435 goto cleanup;
WFKnight 0:9b3d4731edbb 436
WFKnight 0:9b3d4731edbb 437 cleanup:
WFKnight 0:9b3d4731edbb 438 mbedtls_md_free( &ctx );
WFKnight 0:9b3d4731edbb 439
WFKnight 0:9b3d4731edbb 440 return( ret );
WFKnight 0:9b3d4731edbb 441 }
WFKnight 0:9b3d4731edbb 442
WFKnight 0:9b3d4731edbb 443 int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
WFKnight 0:9b3d4731edbb 444 {
WFKnight 0:9b3d4731edbb 445 if( ctx == NULL || ctx->md_info == NULL )
WFKnight 0:9b3d4731edbb 446 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
WFKnight 0:9b3d4731edbb 447
WFKnight 0:9b3d4731edbb 448 return( ctx->md_info->process_func( ctx->md_ctx, data ) );
WFKnight 0:9b3d4731edbb 449 }
WFKnight 0:9b3d4731edbb 450
WFKnight 0:9b3d4731edbb 451 unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info )
WFKnight 0:9b3d4731edbb 452 {
WFKnight 0:9b3d4731edbb 453 if( md_info == NULL )
WFKnight 0:9b3d4731edbb 454 return( 0 );
WFKnight 0:9b3d4731edbb 455
WFKnight 0:9b3d4731edbb 456 return md_info->size;
WFKnight 0:9b3d4731edbb 457 }
WFKnight 0:9b3d4731edbb 458
WFKnight 0:9b3d4731edbb 459 mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info )
WFKnight 0:9b3d4731edbb 460 {
WFKnight 0:9b3d4731edbb 461 if( md_info == NULL )
WFKnight 0:9b3d4731edbb 462 return( MBEDTLS_MD_NONE );
WFKnight 0:9b3d4731edbb 463
WFKnight 0:9b3d4731edbb 464 return md_info->type;
WFKnight 0:9b3d4731edbb 465 }
WFKnight 0:9b3d4731edbb 466
WFKnight 0:9b3d4731edbb 467 const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info )
WFKnight 0:9b3d4731edbb 468 {
WFKnight 0:9b3d4731edbb 469 if( md_info == NULL )
WFKnight 0:9b3d4731edbb 470 return( NULL );
WFKnight 0:9b3d4731edbb 471
WFKnight 0:9b3d4731edbb 472 return md_info->name;
WFKnight 0:9b3d4731edbb 473 }
WFKnight 0:9b3d4731edbb 474
WFKnight 0:9b3d4731edbb 475 #endif /* MBEDTLS_MD_C */