1c6672fdcSEdison Ai // SPDX-License-Identifier: Apache-2.0 2817466cbSJens Wiklander /** 3817466cbSJens Wiklander * \file mbedtls_md.c 4817466cbSJens Wiklander * 5817466cbSJens Wiklander * \brief Generic message digest wrapper for mbed TLS 6817466cbSJens Wiklander * 7817466cbSJens Wiklander * \author Adriaan de Jong <dejong@fox-it.com> 8817466cbSJens Wiklander * 9817466cbSJens Wiklander * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 10817466cbSJens Wiklander * 11817466cbSJens Wiklander * Licensed under the Apache License, Version 2.0 (the "License"); you may 12817466cbSJens Wiklander * not use this file except in compliance with the License. 13817466cbSJens Wiklander * You may obtain a copy of the License at 14817466cbSJens Wiklander * 15817466cbSJens Wiklander * http://www.apache.org/licenses/LICENSE-2.0 16817466cbSJens Wiklander * 17817466cbSJens Wiklander * Unless required by applicable law or agreed to in writing, software 18817466cbSJens Wiklander * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 19817466cbSJens Wiklander * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20817466cbSJens Wiklander * See the License for the specific language governing permissions and 21817466cbSJens Wiklander * limitations under the License. 22817466cbSJens Wiklander * 23817466cbSJens Wiklander * This file is part of mbed TLS (https://tls.mbed.org) 24817466cbSJens Wiklander */ 25817466cbSJens Wiklander 26817466cbSJens Wiklander #if !defined(MBEDTLS_CONFIG_FILE) 27817466cbSJens Wiklander #include "mbedtls/config.h" 28817466cbSJens Wiklander #else 29817466cbSJens Wiklander #include MBEDTLS_CONFIG_FILE 30817466cbSJens Wiklander #endif 31817466cbSJens Wiklander 32817466cbSJens Wiklander #if defined(MBEDTLS_MD_C) 33817466cbSJens Wiklander 34817466cbSJens Wiklander #include "mbedtls/md.h" 35817466cbSJens Wiklander #include "mbedtls/md_internal.h" 363d3b0591SJens Wiklander #include "mbedtls/platform_util.h" 37*11fa71b9SJerome Forissier #include "mbedtls/error.h" 38*11fa71b9SJerome Forissier 39*11fa71b9SJerome Forissier #include "mbedtls/md2.h" 40*11fa71b9SJerome Forissier #include "mbedtls/md4.h" 41*11fa71b9SJerome Forissier #include "mbedtls/md5.h" 42*11fa71b9SJerome Forissier #include "mbedtls/ripemd160.h" 43*11fa71b9SJerome Forissier #include "mbedtls/sha1.h" 44*11fa71b9SJerome Forissier #include "mbedtls/sha256.h" 45*11fa71b9SJerome Forissier #include "mbedtls/sha512.h" 46817466cbSJens Wiklander 47817466cbSJens Wiklander #if defined(MBEDTLS_PLATFORM_C) 48817466cbSJens Wiklander #include "mbedtls/platform.h" 49817466cbSJens Wiklander #else 50817466cbSJens Wiklander #include <stdlib.h> 51817466cbSJens Wiklander #define mbedtls_calloc calloc 52817466cbSJens Wiklander #define mbedtls_free free 53817466cbSJens Wiklander #endif 54817466cbSJens Wiklander 55817466cbSJens Wiklander #include <string.h> 56817466cbSJens Wiklander 57817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO) 58817466cbSJens Wiklander #include <stdio.h> 59817466cbSJens Wiklander #endif 60817466cbSJens Wiklander 61*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 62*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_md2_info = { 63*11fa71b9SJerome Forissier "MD2", 64*11fa71b9SJerome Forissier MBEDTLS_MD_MD2, 65*11fa71b9SJerome Forissier 16, 66*11fa71b9SJerome Forissier 16, 67*11fa71b9SJerome Forissier }; 68*11fa71b9SJerome Forissier #endif 69*11fa71b9SJerome Forissier 70*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 71*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_md4_info = { 72*11fa71b9SJerome Forissier "MD4", 73*11fa71b9SJerome Forissier MBEDTLS_MD_MD4, 74*11fa71b9SJerome Forissier 16, 75*11fa71b9SJerome Forissier 64, 76*11fa71b9SJerome Forissier }; 77*11fa71b9SJerome Forissier #endif 78*11fa71b9SJerome Forissier 79*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 80*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_md5_info = { 81*11fa71b9SJerome Forissier "MD5", 82*11fa71b9SJerome Forissier MBEDTLS_MD_MD5, 83*11fa71b9SJerome Forissier 16, 84*11fa71b9SJerome Forissier 64, 85*11fa71b9SJerome Forissier }; 86*11fa71b9SJerome Forissier #endif 87*11fa71b9SJerome Forissier 88*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 89*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_ripemd160_info = { 90*11fa71b9SJerome Forissier "RIPEMD160", 91*11fa71b9SJerome Forissier MBEDTLS_MD_RIPEMD160, 92*11fa71b9SJerome Forissier 20, 93*11fa71b9SJerome Forissier 64, 94*11fa71b9SJerome Forissier }; 95*11fa71b9SJerome Forissier #endif 96*11fa71b9SJerome Forissier 97*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 98*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha1_info = { 99*11fa71b9SJerome Forissier "SHA1", 100*11fa71b9SJerome Forissier MBEDTLS_MD_SHA1, 101*11fa71b9SJerome Forissier 20, 102*11fa71b9SJerome Forissier 64, 103*11fa71b9SJerome Forissier }; 104*11fa71b9SJerome Forissier #endif 105*11fa71b9SJerome Forissier 106*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 107*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha224_info = { 108*11fa71b9SJerome Forissier "SHA224", 109*11fa71b9SJerome Forissier MBEDTLS_MD_SHA224, 110*11fa71b9SJerome Forissier 28, 111*11fa71b9SJerome Forissier 64, 112*11fa71b9SJerome Forissier }; 113*11fa71b9SJerome Forissier 114*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha256_info = { 115*11fa71b9SJerome Forissier "SHA256", 116*11fa71b9SJerome Forissier MBEDTLS_MD_SHA256, 117*11fa71b9SJerome Forissier 32, 118*11fa71b9SJerome Forissier 64, 119*11fa71b9SJerome Forissier }; 120*11fa71b9SJerome Forissier #endif 121*11fa71b9SJerome Forissier 122*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 123*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 124*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha384_info = { 125*11fa71b9SJerome Forissier "SHA384", 126*11fa71b9SJerome Forissier MBEDTLS_MD_SHA384, 127*11fa71b9SJerome Forissier 48, 128*11fa71b9SJerome Forissier 128, 129*11fa71b9SJerome Forissier }; 130*11fa71b9SJerome Forissier #endif 131*11fa71b9SJerome Forissier 132*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha512_info = { 133*11fa71b9SJerome Forissier "SHA512", 134*11fa71b9SJerome Forissier MBEDTLS_MD_SHA512, 135*11fa71b9SJerome Forissier 64, 136*11fa71b9SJerome Forissier 128, 137*11fa71b9SJerome Forissier }; 138*11fa71b9SJerome Forissier #endif 139*11fa71b9SJerome Forissier 140817466cbSJens Wiklander /* 141817466cbSJens Wiklander * Reminder: update profiles in x509_crt.c when adding a new hash! 142817466cbSJens Wiklander */ 143817466cbSJens Wiklander static const int supported_digests[] = { 144817466cbSJens Wiklander 145817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C) 146817466cbSJens Wiklander MBEDTLS_MD_SHA512, 147*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 148817466cbSJens Wiklander MBEDTLS_MD_SHA384, 149817466cbSJens Wiklander #endif 150*11fa71b9SJerome Forissier #endif 151817466cbSJens Wiklander 152817466cbSJens Wiklander #if defined(MBEDTLS_SHA256_C) 153817466cbSJens Wiklander MBEDTLS_MD_SHA256, 154817466cbSJens Wiklander MBEDTLS_MD_SHA224, 155817466cbSJens Wiklander #endif 156817466cbSJens Wiklander 157817466cbSJens Wiklander #if defined(MBEDTLS_SHA1_C) 158817466cbSJens Wiklander MBEDTLS_MD_SHA1, 159817466cbSJens Wiklander #endif 160817466cbSJens Wiklander 161817466cbSJens Wiklander #if defined(MBEDTLS_RIPEMD160_C) 162817466cbSJens Wiklander MBEDTLS_MD_RIPEMD160, 163817466cbSJens Wiklander #endif 164817466cbSJens Wiklander 165817466cbSJens Wiklander #if defined(MBEDTLS_MD5_C) 166817466cbSJens Wiklander MBEDTLS_MD_MD5, 167817466cbSJens Wiklander #endif 168817466cbSJens Wiklander 169817466cbSJens Wiklander #if defined(MBEDTLS_MD4_C) 170817466cbSJens Wiklander MBEDTLS_MD_MD4, 171817466cbSJens Wiklander #endif 172817466cbSJens Wiklander 173817466cbSJens Wiklander #if defined(MBEDTLS_MD2_C) 174817466cbSJens Wiklander MBEDTLS_MD_MD2, 175817466cbSJens Wiklander #endif 176817466cbSJens Wiklander 177817466cbSJens Wiklander MBEDTLS_MD_NONE 178817466cbSJens Wiklander }; 179817466cbSJens Wiklander 180817466cbSJens Wiklander const int *mbedtls_md_list( void ) 181817466cbSJens Wiklander { 182817466cbSJens Wiklander return( supported_digests ); 183817466cbSJens Wiklander } 184817466cbSJens Wiklander 185817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ) 186817466cbSJens Wiklander { 187817466cbSJens Wiklander if( NULL == md_name ) 188817466cbSJens Wiklander return( NULL ); 189817466cbSJens Wiklander 190817466cbSJens Wiklander /* Get the appropriate digest information */ 191817466cbSJens Wiklander #if defined(MBEDTLS_MD2_C) 192817466cbSJens Wiklander if( !strcmp( "MD2", md_name ) ) 193817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 ); 194817466cbSJens Wiklander #endif 195817466cbSJens Wiklander #if defined(MBEDTLS_MD4_C) 196817466cbSJens Wiklander if( !strcmp( "MD4", md_name ) ) 197817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 ); 198817466cbSJens Wiklander #endif 199817466cbSJens Wiklander #if defined(MBEDTLS_MD5_C) 200817466cbSJens Wiklander if( !strcmp( "MD5", md_name ) ) 201817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ); 202817466cbSJens Wiklander #endif 203817466cbSJens Wiklander #if defined(MBEDTLS_RIPEMD160_C) 204817466cbSJens Wiklander if( !strcmp( "RIPEMD160", md_name ) ) 205817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 ); 206817466cbSJens Wiklander #endif 207817466cbSJens Wiklander #if defined(MBEDTLS_SHA1_C) 208817466cbSJens Wiklander if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) ) 209817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ); 210817466cbSJens Wiklander #endif 211817466cbSJens Wiklander #if defined(MBEDTLS_SHA256_C) 212817466cbSJens Wiklander if( !strcmp( "SHA224", md_name ) ) 213817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 ); 214817466cbSJens Wiklander if( !strcmp( "SHA256", md_name ) ) 215817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ); 216817466cbSJens Wiklander #endif 217817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C) 218*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 219817466cbSJens Wiklander if( !strcmp( "SHA384", md_name ) ) 220817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 ); 221*11fa71b9SJerome Forissier #endif 222817466cbSJens Wiklander if( !strcmp( "SHA512", md_name ) ) 223817466cbSJens Wiklander return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 ); 224817466cbSJens Wiklander #endif 225817466cbSJens Wiklander return( NULL ); 226817466cbSJens Wiklander } 227817466cbSJens Wiklander 228817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ) 229817466cbSJens Wiklander { 230817466cbSJens Wiklander switch( md_type ) 231817466cbSJens Wiklander { 232817466cbSJens Wiklander #if defined(MBEDTLS_MD2_C) 233817466cbSJens Wiklander case MBEDTLS_MD_MD2: 234817466cbSJens Wiklander return( &mbedtls_md2_info ); 235817466cbSJens Wiklander #endif 236817466cbSJens Wiklander #if defined(MBEDTLS_MD4_C) 237817466cbSJens Wiklander case MBEDTLS_MD_MD4: 238817466cbSJens Wiklander return( &mbedtls_md4_info ); 239817466cbSJens Wiklander #endif 240817466cbSJens Wiklander #if defined(MBEDTLS_MD5_C) 241817466cbSJens Wiklander case MBEDTLS_MD_MD5: 242817466cbSJens Wiklander return( &mbedtls_md5_info ); 243817466cbSJens Wiklander #endif 244817466cbSJens Wiklander #if defined(MBEDTLS_RIPEMD160_C) 245817466cbSJens Wiklander case MBEDTLS_MD_RIPEMD160: 246817466cbSJens Wiklander return( &mbedtls_ripemd160_info ); 247817466cbSJens Wiklander #endif 248817466cbSJens Wiklander #if defined(MBEDTLS_SHA1_C) 249817466cbSJens Wiklander case MBEDTLS_MD_SHA1: 250817466cbSJens Wiklander return( &mbedtls_sha1_info ); 251817466cbSJens Wiklander #endif 252817466cbSJens Wiklander #if defined(MBEDTLS_SHA256_C) 253817466cbSJens Wiklander case MBEDTLS_MD_SHA224: 254817466cbSJens Wiklander return( &mbedtls_sha224_info ); 255817466cbSJens Wiklander case MBEDTLS_MD_SHA256: 256817466cbSJens Wiklander return( &mbedtls_sha256_info ); 257817466cbSJens Wiklander #endif 258817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C) 259*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 260817466cbSJens Wiklander case MBEDTLS_MD_SHA384: 261817466cbSJens Wiklander return( &mbedtls_sha384_info ); 262*11fa71b9SJerome Forissier #endif 263817466cbSJens Wiklander case MBEDTLS_MD_SHA512: 264817466cbSJens Wiklander return( &mbedtls_sha512_info ); 265817466cbSJens Wiklander #endif 266817466cbSJens Wiklander default: 267817466cbSJens Wiklander return( NULL ); 268817466cbSJens Wiklander } 269817466cbSJens Wiklander } 270817466cbSJens Wiklander 271817466cbSJens Wiklander void mbedtls_md_init( mbedtls_md_context_t *ctx ) 272817466cbSJens Wiklander { 273817466cbSJens Wiklander memset( ctx, 0, sizeof( mbedtls_md_context_t ) ); 274817466cbSJens Wiklander } 275817466cbSJens Wiklander 276817466cbSJens Wiklander void mbedtls_md_free( mbedtls_md_context_t *ctx ) 277817466cbSJens Wiklander { 278817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL ) 279817466cbSJens Wiklander return; 280817466cbSJens Wiklander 281817466cbSJens Wiklander if( ctx->md_ctx != NULL ) 282*11fa71b9SJerome Forissier { 283*11fa71b9SJerome Forissier switch( ctx->md_info->type ) 284*11fa71b9SJerome Forissier { 285*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 286*11fa71b9SJerome Forissier case MBEDTLS_MD_MD2: 287*11fa71b9SJerome Forissier mbedtls_md2_free( ctx->md_ctx ); 288*11fa71b9SJerome Forissier break; 289*11fa71b9SJerome Forissier #endif 290*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 291*11fa71b9SJerome Forissier case MBEDTLS_MD_MD4: 292*11fa71b9SJerome Forissier mbedtls_md4_free( ctx->md_ctx ); 293*11fa71b9SJerome Forissier break; 294*11fa71b9SJerome Forissier #endif 295*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 296*11fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 297*11fa71b9SJerome Forissier mbedtls_md5_free( ctx->md_ctx ); 298*11fa71b9SJerome Forissier break; 299*11fa71b9SJerome Forissier #endif 300*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 301*11fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 302*11fa71b9SJerome Forissier mbedtls_ripemd160_free( ctx->md_ctx ); 303*11fa71b9SJerome Forissier break; 304*11fa71b9SJerome Forissier #endif 305*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 306*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 307*11fa71b9SJerome Forissier mbedtls_sha1_free( ctx->md_ctx ); 308*11fa71b9SJerome Forissier break; 309*11fa71b9SJerome Forissier #endif 310*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 311*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 312*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 313*11fa71b9SJerome Forissier mbedtls_sha256_free( ctx->md_ctx ); 314*11fa71b9SJerome Forissier break; 315*11fa71b9SJerome Forissier #endif 316*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 317*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 318*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 319*11fa71b9SJerome Forissier #endif 320*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 321*11fa71b9SJerome Forissier mbedtls_sha512_free( ctx->md_ctx ); 322*11fa71b9SJerome Forissier break; 323*11fa71b9SJerome Forissier #endif 324*11fa71b9SJerome Forissier default: 325*11fa71b9SJerome Forissier /* Shouldn't happen */ 326*11fa71b9SJerome Forissier break; 327*11fa71b9SJerome Forissier } 328*11fa71b9SJerome Forissier mbedtls_free( ctx->md_ctx ); 329*11fa71b9SJerome Forissier } 330817466cbSJens Wiklander 331817466cbSJens Wiklander if( ctx->hmac_ctx != NULL ) 332817466cbSJens Wiklander { 3333d3b0591SJens Wiklander mbedtls_platform_zeroize( ctx->hmac_ctx, 3343d3b0591SJens Wiklander 2 * ctx->md_info->block_size ); 335817466cbSJens Wiklander mbedtls_free( ctx->hmac_ctx ); 336817466cbSJens Wiklander } 337817466cbSJens Wiklander 3383d3b0591SJens Wiklander mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) ); 339817466cbSJens Wiklander } 340817466cbSJens Wiklander 341817466cbSJens Wiklander int mbedtls_md_clone( mbedtls_md_context_t *dst, 342817466cbSJens Wiklander const mbedtls_md_context_t *src ) 343817466cbSJens Wiklander { 344817466cbSJens Wiklander if( dst == NULL || dst->md_info == NULL || 345817466cbSJens Wiklander src == NULL || src->md_info == NULL || 346817466cbSJens Wiklander dst->md_info != src->md_info ) 347817466cbSJens Wiklander { 348817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 349817466cbSJens Wiklander } 350817466cbSJens Wiklander 351*11fa71b9SJerome Forissier switch( src->md_info->type ) 352*11fa71b9SJerome Forissier { 353*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 354*11fa71b9SJerome Forissier case MBEDTLS_MD_MD2: 355*11fa71b9SJerome Forissier mbedtls_md2_clone( dst->md_ctx, src->md_ctx ); 356*11fa71b9SJerome Forissier break; 357*11fa71b9SJerome Forissier #endif 358*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 359*11fa71b9SJerome Forissier case MBEDTLS_MD_MD4: 360*11fa71b9SJerome Forissier mbedtls_md4_clone( dst->md_ctx, src->md_ctx ); 361*11fa71b9SJerome Forissier break; 362*11fa71b9SJerome Forissier #endif 363*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 364*11fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 365*11fa71b9SJerome Forissier mbedtls_md5_clone( dst->md_ctx, src->md_ctx ); 366*11fa71b9SJerome Forissier break; 367*11fa71b9SJerome Forissier #endif 368*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 369*11fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 370*11fa71b9SJerome Forissier mbedtls_ripemd160_clone( dst->md_ctx, src->md_ctx ); 371*11fa71b9SJerome Forissier break; 372*11fa71b9SJerome Forissier #endif 373*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 374*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 375*11fa71b9SJerome Forissier mbedtls_sha1_clone( dst->md_ctx, src->md_ctx ); 376*11fa71b9SJerome Forissier break; 377*11fa71b9SJerome Forissier #endif 378*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 379*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 380*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 381*11fa71b9SJerome Forissier mbedtls_sha256_clone( dst->md_ctx, src->md_ctx ); 382*11fa71b9SJerome Forissier break; 383*11fa71b9SJerome Forissier #endif 384*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 385*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 386*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 387*11fa71b9SJerome Forissier #endif 388*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 389*11fa71b9SJerome Forissier mbedtls_sha512_clone( dst->md_ctx, src->md_ctx ); 390*11fa71b9SJerome Forissier break; 391*11fa71b9SJerome Forissier #endif 392*11fa71b9SJerome Forissier default: 393*11fa71b9SJerome Forissier return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 394*11fa71b9SJerome Forissier } 395817466cbSJens Wiklander 39612484fc7SEdison Ai if( dst->hmac_ctx != NULL && src->hmac_ctx != NULL ) 39712484fc7SEdison Ai memcpy( dst->hmac_ctx, src->hmac_ctx, 2 * src->md_info->block_size ); 39812484fc7SEdison Ai 399817466cbSJens Wiklander return( 0 ); 400817466cbSJens Wiklander } 401817466cbSJens Wiklander 402817466cbSJens Wiklander #if ! defined(MBEDTLS_DEPRECATED_REMOVED) 403817466cbSJens Wiklander int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) 404817466cbSJens Wiklander { 405817466cbSJens Wiklander return mbedtls_md_setup( ctx, md_info, 1 ); 406817466cbSJens Wiklander } 407817466cbSJens Wiklander #endif 408817466cbSJens Wiklander 409*11fa71b9SJerome Forissier #define ALLOC( type ) \ 410*11fa71b9SJerome Forissier do { \ 411*11fa71b9SJerome Forissier ctx->md_ctx = mbedtls_calloc( 1, sizeof( mbedtls_##type##_context ) ); \ 412*11fa71b9SJerome Forissier if( ctx->md_ctx == NULL ) \ 413*11fa71b9SJerome Forissier return( MBEDTLS_ERR_MD_ALLOC_FAILED ); \ 414*11fa71b9SJerome Forissier mbedtls_##type##_init( ctx->md_ctx ); \ 415*11fa71b9SJerome Forissier } \ 416*11fa71b9SJerome Forissier while( 0 ) 417*11fa71b9SJerome Forissier 418817466cbSJens Wiklander int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ) 419817466cbSJens Wiklander { 420817466cbSJens Wiklander if( md_info == NULL || ctx == NULL ) 421817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 422817466cbSJens Wiklander 423*11fa71b9SJerome Forissier switch( md_info->type ) 424*11fa71b9SJerome Forissier { 425*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 426*11fa71b9SJerome Forissier case MBEDTLS_MD_MD2: 427*11fa71b9SJerome Forissier ALLOC( md2 ); 428*11fa71b9SJerome Forissier break; 429*11fa71b9SJerome Forissier #endif 430*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 431*11fa71b9SJerome Forissier case MBEDTLS_MD_MD4: 432*11fa71b9SJerome Forissier ALLOC( md4 ); 433*11fa71b9SJerome Forissier break; 434*11fa71b9SJerome Forissier #endif 435*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 436*11fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 437*11fa71b9SJerome Forissier ALLOC( md5 ); 438*11fa71b9SJerome Forissier break; 439*11fa71b9SJerome Forissier #endif 440*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 441*11fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 442*11fa71b9SJerome Forissier ALLOC( ripemd160 ); 443*11fa71b9SJerome Forissier break; 444*11fa71b9SJerome Forissier #endif 445*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 446*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 447*11fa71b9SJerome Forissier ALLOC( sha1 ); 448*11fa71b9SJerome Forissier break; 449*11fa71b9SJerome Forissier #endif 450*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 451*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 452*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 453*11fa71b9SJerome Forissier ALLOC( sha256 ); 454*11fa71b9SJerome Forissier break; 455*11fa71b9SJerome Forissier #endif 456*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 457*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 458*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 459*11fa71b9SJerome Forissier #endif 460*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 461*11fa71b9SJerome Forissier ALLOC( sha512 ); 462*11fa71b9SJerome Forissier break; 463*11fa71b9SJerome Forissier #endif 464*11fa71b9SJerome Forissier default: 465*11fa71b9SJerome Forissier return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 466*11fa71b9SJerome Forissier } 467817466cbSJens Wiklander 468817466cbSJens Wiklander if( hmac != 0 ) 469817466cbSJens Wiklander { 470817466cbSJens Wiklander ctx->hmac_ctx = mbedtls_calloc( 2, md_info->block_size ); 471817466cbSJens Wiklander if( ctx->hmac_ctx == NULL ) 472817466cbSJens Wiklander { 473*11fa71b9SJerome Forissier mbedtls_md_free( ctx ); 474817466cbSJens Wiklander return( MBEDTLS_ERR_MD_ALLOC_FAILED ); 475817466cbSJens Wiklander } 476817466cbSJens Wiklander } 477817466cbSJens Wiklander 478817466cbSJens Wiklander ctx->md_info = md_info; 479817466cbSJens Wiklander 480817466cbSJens Wiklander return( 0 ); 481817466cbSJens Wiklander } 482*11fa71b9SJerome Forissier #undef ALLOC 483817466cbSJens Wiklander 484817466cbSJens Wiklander int mbedtls_md_starts( mbedtls_md_context_t *ctx ) 485817466cbSJens Wiklander { 486817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL ) 487817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 488817466cbSJens Wiklander 489*11fa71b9SJerome Forissier switch( ctx->md_info->type ) 490*11fa71b9SJerome Forissier { 491*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 492*11fa71b9SJerome Forissier case MBEDTLS_MD_MD2: 493*11fa71b9SJerome Forissier return( mbedtls_md2_starts_ret( ctx->md_ctx ) ); 494*11fa71b9SJerome Forissier #endif 495*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 496*11fa71b9SJerome Forissier case MBEDTLS_MD_MD4: 497*11fa71b9SJerome Forissier return( mbedtls_md4_starts_ret( ctx->md_ctx ) ); 498*11fa71b9SJerome Forissier #endif 499*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 500*11fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 501*11fa71b9SJerome Forissier return( mbedtls_md5_starts_ret( ctx->md_ctx ) ); 502*11fa71b9SJerome Forissier #endif 503*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 504*11fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 505*11fa71b9SJerome Forissier return( mbedtls_ripemd160_starts_ret( ctx->md_ctx ) ); 506*11fa71b9SJerome Forissier #endif 507*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 508*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 509*11fa71b9SJerome Forissier return( mbedtls_sha1_starts_ret( ctx->md_ctx ) ); 510*11fa71b9SJerome Forissier #endif 511*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 512*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 513*11fa71b9SJerome Forissier return( mbedtls_sha256_starts_ret( ctx->md_ctx, 1 ) ); 514*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 515*11fa71b9SJerome Forissier return( mbedtls_sha256_starts_ret( ctx->md_ctx, 0 ) ); 516*11fa71b9SJerome Forissier #endif 517*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 518*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 519*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 520*11fa71b9SJerome Forissier return( mbedtls_sha512_starts_ret( ctx->md_ctx, 1 ) ); 521*11fa71b9SJerome Forissier #endif 522*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 523*11fa71b9SJerome Forissier return( mbedtls_sha512_starts_ret( ctx->md_ctx, 0 ) ); 524*11fa71b9SJerome Forissier #endif 525*11fa71b9SJerome Forissier default: 526*11fa71b9SJerome Forissier return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 527*11fa71b9SJerome Forissier } 528817466cbSJens Wiklander } 529817466cbSJens Wiklander 530817466cbSJens Wiklander int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ) 531817466cbSJens Wiklander { 532817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL ) 533817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 534817466cbSJens Wiklander 535*11fa71b9SJerome Forissier switch( ctx->md_info->type ) 536*11fa71b9SJerome Forissier { 537*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 538*11fa71b9SJerome Forissier case MBEDTLS_MD_MD2: 539*11fa71b9SJerome Forissier return( mbedtls_md2_update_ret( ctx->md_ctx, input, ilen ) ); 540*11fa71b9SJerome Forissier #endif 541*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 542*11fa71b9SJerome Forissier case MBEDTLS_MD_MD4: 543*11fa71b9SJerome Forissier return( mbedtls_md4_update_ret( ctx->md_ctx, input, ilen ) ); 544*11fa71b9SJerome Forissier #endif 545*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 546*11fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 547*11fa71b9SJerome Forissier return( mbedtls_md5_update_ret( ctx->md_ctx, input, ilen ) ); 548*11fa71b9SJerome Forissier #endif 549*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 550*11fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 551*11fa71b9SJerome Forissier return( mbedtls_ripemd160_update_ret( ctx->md_ctx, input, ilen ) ); 552*11fa71b9SJerome Forissier #endif 553*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 554*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 555*11fa71b9SJerome Forissier return( mbedtls_sha1_update_ret( ctx->md_ctx, input, ilen ) ); 556*11fa71b9SJerome Forissier #endif 557*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 558*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 559*11fa71b9SJerome Forissier return( mbedtls_sha256_update_ret( ctx->md_ctx, input, ilen ) ); 560*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 561*11fa71b9SJerome Forissier return( mbedtls_sha256_update_ret( ctx->md_ctx, input, ilen ) ); 562*11fa71b9SJerome Forissier #endif 563*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 564*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 565*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 566*11fa71b9SJerome Forissier return( mbedtls_sha512_update_ret( ctx->md_ctx, input, ilen ) ); 567*11fa71b9SJerome Forissier #endif 568*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 569*11fa71b9SJerome Forissier return( mbedtls_sha512_update_ret( ctx->md_ctx, input, ilen ) ); 570*11fa71b9SJerome Forissier #endif 571*11fa71b9SJerome Forissier default: 572*11fa71b9SJerome Forissier return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 573*11fa71b9SJerome Forissier } 574817466cbSJens Wiklander } 575817466cbSJens Wiklander 576817466cbSJens Wiklander int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ) 577817466cbSJens Wiklander { 578817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL ) 579817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 580817466cbSJens Wiklander 581*11fa71b9SJerome Forissier switch( ctx->md_info->type ) 582*11fa71b9SJerome Forissier { 583*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 584*11fa71b9SJerome Forissier case MBEDTLS_MD_MD2: 585*11fa71b9SJerome Forissier return( mbedtls_md2_finish_ret( ctx->md_ctx, output ) ); 586*11fa71b9SJerome Forissier #endif 587*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 588*11fa71b9SJerome Forissier case MBEDTLS_MD_MD4: 589*11fa71b9SJerome Forissier return( mbedtls_md4_finish_ret( ctx->md_ctx, output ) ); 590*11fa71b9SJerome Forissier #endif 591*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 592*11fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 593*11fa71b9SJerome Forissier return( mbedtls_md5_finish_ret( ctx->md_ctx, output ) ); 594*11fa71b9SJerome Forissier #endif 595*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 596*11fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 597*11fa71b9SJerome Forissier return( mbedtls_ripemd160_finish_ret( ctx->md_ctx, output ) ); 598*11fa71b9SJerome Forissier #endif 599*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 600*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 601*11fa71b9SJerome Forissier return( mbedtls_sha1_finish_ret( ctx->md_ctx, output ) ); 602*11fa71b9SJerome Forissier #endif 603*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 604*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 605*11fa71b9SJerome Forissier return( mbedtls_sha256_finish_ret( ctx->md_ctx, output ) ); 606*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 607*11fa71b9SJerome Forissier return( mbedtls_sha256_finish_ret( ctx->md_ctx, output ) ); 608*11fa71b9SJerome Forissier #endif 609*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 610*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 611*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 612*11fa71b9SJerome Forissier return( mbedtls_sha512_finish_ret( ctx->md_ctx, output ) ); 613*11fa71b9SJerome Forissier #endif 614*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 615*11fa71b9SJerome Forissier return( mbedtls_sha512_finish_ret( ctx->md_ctx, output ) ); 616*11fa71b9SJerome Forissier #endif 617*11fa71b9SJerome Forissier default: 618*11fa71b9SJerome Forissier return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 619*11fa71b9SJerome Forissier } 620817466cbSJens Wiklander } 621817466cbSJens Wiklander 622817466cbSJens Wiklander int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, 623817466cbSJens Wiklander unsigned char *output ) 624817466cbSJens Wiklander { 625817466cbSJens Wiklander if( md_info == NULL ) 626817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 627817466cbSJens Wiklander 628*11fa71b9SJerome Forissier switch( md_info->type ) 629*11fa71b9SJerome Forissier { 630*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 631*11fa71b9SJerome Forissier case MBEDTLS_MD_MD2: 632*11fa71b9SJerome Forissier return( mbedtls_md2_ret( input, ilen, output ) ); 633*11fa71b9SJerome Forissier #endif 634*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 635*11fa71b9SJerome Forissier case MBEDTLS_MD_MD4: 636*11fa71b9SJerome Forissier return( mbedtls_md4_ret( input, ilen, output ) ); 637*11fa71b9SJerome Forissier #endif 638*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 639*11fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 640*11fa71b9SJerome Forissier return( mbedtls_md5_ret( input, ilen, output ) ); 641*11fa71b9SJerome Forissier #endif 642*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 643*11fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 644*11fa71b9SJerome Forissier return( mbedtls_ripemd160_ret( input, ilen, output ) ); 645*11fa71b9SJerome Forissier #endif 646*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 647*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 648*11fa71b9SJerome Forissier return( mbedtls_sha1_ret( input, ilen, output ) ); 649*11fa71b9SJerome Forissier #endif 650*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 651*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 652*11fa71b9SJerome Forissier return( mbedtls_sha256_ret( input, ilen, output, 1 ) ); 653*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 654*11fa71b9SJerome Forissier return( mbedtls_sha256_ret( input, ilen, output, 0 ) ); 655*11fa71b9SJerome Forissier #endif 656*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 657*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 658*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 659*11fa71b9SJerome Forissier return( mbedtls_sha512_ret( input, ilen, output, 1 ) ); 660*11fa71b9SJerome Forissier #endif 661*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 662*11fa71b9SJerome Forissier return( mbedtls_sha512_ret( input, ilen, output, 0 ) ); 663*11fa71b9SJerome Forissier #endif 664*11fa71b9SJerome Forissier default: 665*11fa71b9SJerome Forissier return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 666*11fa71b9SJerome Forissier } 667817466cbSJens Wiklander } 668817466cbSJens Wiklander 669817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO) 670817466cbSJens Wiklander int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output ) 671817466cbSJens Wiklander { 672*11fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 673817466cbSJens Wiklander FILE *f; 674817466cbSJens Wiklander size_t n; 675817466cbSJens Wiklander mbedtls_md_context_t ctx; 676817466cbSJens Wiklander unsigned char buf[1024]; 677817466cbSJens Wiklander 678817466cbSJens Wiklander if( md_info == NULL ) 679817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 680817466cbSJens Wiklander 681817466cbSJens Wiklander if( ( f = fopen( path, "rb" ) ) == NULL ) 682817466cbSJens Wiklander return( MBEDTLS_ERR_MD_FILE_IO_ERROR ); 683817466cbSJens Wiklander 684817466cbSJens Wiklander mbedtls_md_init( &ctx ); 685817466cbSJens Wiklander 686817466cbSJens Wiklander if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 ) 687817466cbSJens Wiklander goto cleanup; 688817466cbSJens Wiklander 689*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 ) 6903d3b0591SJens Wiklander goto cleanup; 691817466cbSJens Wiklander 692817466cbSJens Wiklander while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) 693*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_update( &ctx, buf, n ) ) != 0 ) 6943d3b0591SJens Wiklander goto cleanup; 695817466cbSJens Wiklander 696817466cbSJens Wiklander if( ferror( f ) != 0 ) 697817466cbSJens Wiklander ret = MBEDTLS_ERR_MD_FILE_IO_ERROR; 6983d3b0591SJens Wiklander else 699*11fa71b9SJerome Forissier ret = mbedtls_md_finish( &ctx, output ); 700817466cbSJens Wiklander 701817466cbSJens Wiklander cleanup: 7023d3b0591SJens Wiklander mbedtls_platform_zeroize( buf, sizeof( buf ) ); 703817466cbSJens Wiklander fclose( f ); 704817466cbSJens Wiklander mbedtls_md_free( &ctx ); 705817466cbSJens Wiklander 706817466cbSJens Wiklander return( ret ); 707817466cbSJens Wiklander } 708817466cbSJens Wiklander #endif /* MBEDTLS_FS_IO */ 709817466cbSJens Wiklander 710817466cbSJens Wiklander int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen ) 711817466cbSJens Wiklander { 712*11fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 713817466cbSJens Wiklander unsigned char sum[MBEDTLS_MD_MAX_SIZE]; 714817466cbSJens Wiklander unsigned char *ipad, *opad; 715817466cbSJens Wiklander size_t i; 716817466cbSJens Wiklander 717817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) 718817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 719817466cbSJens Wiklander 720817466cbSJens Wiklander if( keylen > (size_t) ctx->md_info->block_size ) 721817466cbSJens Wiklander { 722*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_starts( ctx ) ) != 0 ) 7233d3b0591SJens Wiklander goto cleanup; 724*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_update( ctx, key, keylen ) ) != 0 ) 7253d3b0591SJens Wiklander goto cleanup; 726*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_finish( ctx, sum ) ) != 0 ) 7273d3b0591SJens Wiklander goto cleanup; 728817466cbSJens Wiklander 729817466cbSJens Wiklander keylen = ctx->md_info->size; 730817466cbSJens Wiklander key = sum; 731817466cbSJens Wiklander } 732817466cbSJens Wiklander 733817466cbSJens Wiklander ipad = (unsigned char *) ctx->hmac_ctx; 734817466cbSJens Wiklander opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; 735817466cbSJens Wiklander 736817466cbSJens Wiklander memset( ipad, 0x36, ctx->md_info->block_size ); 737817466cbSJens Wiklander memset( opad, 0x5C, ctx->md_info->block_size ); 738817466cbSJens Wiklander 739817466cbSJens Wiklander for( i = 0; i < keylen; i++ ) 740817466cbSJens Wiklander { 741817466cbSJens Wiklander ipad[i] = (unsigned char)( ipad[i] ^ key[i] ); 742817466cbSJens Wiklander opad[i] = (unsigned char)( opad[i] ^ key[i] ); 743817466cbSJens Wiklander } 744817466cbSJens Wiklander 745*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_starts( ctx ) ) != 0 ) 7463d3b0591SJens Wiklander goto cleanup; 747*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_update( ctx, ipad, 7483d3b0591SJens Wiklander ctx->md_info->block_size ) ) != 0 ) 7493d3b0591SJens Wiklander goto cleanup; 750817466cbSJens Wiklander 7513d3b0591SJens Wiklander cleanup: 7523d3b0591SJens Wiklander mbedtls_platform_zeroize( sum, sizeof( sum ) ); 753817466cbSJens Wiklander 7543d3b0591SJens Wiklander return( ret ); 755817466cbSJens Wiklander } 756817466cbSJens Wiklander 757817466cbSJens Wiklander int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ) 758817466cbSJens Wiklander { 759817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) 760817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 761817466cbSJens Wiklander 762*11fa71b9SJerome Forissier return( mbedtls_md_update( ctx, input, ilen ) ); 763817466cbSJens Wiklander } 764817466cbSJens Wiklander 765817466cbSJens Wiklander int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output ) 766817466cbSJens Wiklander { 767*11fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 768817466cbSJens Wiklander unsigned char tmp[MBEDTLS_MD_MAX_SIZE]; 769817466cbSJens Wiklander unsigned char *opad; 770817466cbSJens Wiklander 771817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) 772817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 773817466cbSJens Wiklander 774817466cbSJens Wiklander opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; 775817466cbSJens Wiklander 776*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_finish( ctx, tmp ) ) != 0 ) 7773d3b0591SJens Wiklander return( ret ); 778*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_starts( ctx ) ) != 0 ) 7793d3b0591SJens Wiklander return( ret ); 780*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_update( ctx, opad, 7813d3b0591SJens Wiklander ctx->md_info->block_size ) ) != 0 ) 7823d3b0591SJens Wiklander return( ret ); 783*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_update( ctx, tmp, 7843d3b0591SJens Wiklander ctx->md_info->size ) ) != 0 ) 7853d3b0591SJens Wiklander return( ret ); 786*11fa71b9SJerome Forissier return( mbedtls_md_finish( ctx, output ) ); 787817466cbSJens Wiklander } 788817466cbSJens Wiklander 789817466cbSJens Wiklander int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ) 790817466cbSJens Wiklander { 791*11fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 792817466cbSJens Wiklander unsigned char *ipad; 793817466cbSJens Wiklander 794817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) 795817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 796817466cbSJens Wiklander 797817466cbSJens Wiklander ipad = (unsigned char *) ctx->hmac_ctx; 798817466cbSJens Wiklander 799*11fa71b9SJerome Forissier if( ( ret = mbedtls_md_starts( ctx ) ) != 0 ) 8003d3b0591SJens Wiklander return( ret ); 801*11fa71b9SJerome Forissier return( mbedtls_md_update( ctx, ipad, ctx->md_info->block_size ) ); 802817466cbSJens Wiklander } 803817466cbSJens Wiklander 8043d3b0591SJens Wiklander int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, 8053d3b0591SJens Wiklander const unsigned char *key, size_t keylen, 806817466cbSJens Wiklander const unsigned char *input, size_t ilen, 807817466cbSJens Wiklander unsigned char *output ) 808817466cbSJens Wiklander { 809817466cbSJens Wiklander mbedtls_md_context_t ctx; 810*11fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 811817466cbSJens Wiklander 812817466cbSJens Wiklander if( md_info == NULL ) 813817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 814817466cbSJens Wiklander 815817466cbSJens Wiklander mbedtls_md_init( &ctx ); 816817466cbSJens Wiklander 817817466cbSJens Wiklander if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 ) 8183d3b0591SJens Wiklander goto cleanup; 819817466cbSJens Wiklander 8203d3b0591SJens Wiklander if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 ) 8213d3b0591SJens Wiklander goto cleanup; 8223d3b0591SJens Wiklander if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 ) 8233d3b0591SJens Wiklander goto cleanup; 8243d3b0591SJens Wiklander if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 ) 8253d3b0591SJens Wiklander goto cleanup; 826817466cbSJens Wiklander 8273d3b0591SJens Wiklander cleanup: 828817466cbSJens Wiklander mbedtls_md_free( &ctx ); 829817466cbSJens Wiklander 8303d3b0591SJens Wiklander return( ret ); 831817466cbSJens Wiklander } 832817466cbSJens Wiklander 833817466cbSJens Wiklander int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ) 834817466cbSJens Wiklander { 835817466cbSJens Wiklander if( ctx == NULL || ctx->md_info == NULL ) 836817466cbSJens Wiklander return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 837817466cbSJens Wiklander 838*11fa71b9SJerome Forissier switch( ctx->md_info->type ) 839*11fa71b9SJerome Forissier { 840*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C) 841*11fa71b9SJerome Forissier case MBEDTLS_MD_MD2: 842*11fa71b9SJerome Forissier return( mbedtls_internal_md2_process( ctx->md_ctx ) ); 843*11fa71b9SJerome Forissier #endif 844*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C) 845*11fa71b9SJerome Forissier case MBEDTLS_MD_MD4: 846*11fa71b9SJerome Forissier return( mbedtls_internal_md4_process( ctx->md_ctx, data ) ); 847*11fa71b9SJerome Forissier #endif 848*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 849*11fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 850*11fa71b9SJerome Forissier return( mbedtls_internal_md5_process( ctx->md_ctx, data ) ); 851*11fa71b9SJerome Forissier #endif 852*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 853*11fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 854*11fa71b9SJerome Forissier return( mbedtls_internal_ripemd160_process( ctx->md_ctx, data ) ); 855*11fa71b9SJerome Forissier #endif 856*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 857*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 858*11fa71b9SJerome Forissier return( mbedtls_internal_sha1_process( ctx->md_ctx, data ) ); 859*11fa71b9SJerome Forissier #endif 860*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 861*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 862*11fa71b9SJerome Forissier return( mbedtls_internal_sha256_process( ctx->md_ctx, data ) ); 863*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 864*11fa71b9SJerome Forissier return( mbedtls_internal_sha256_process( ctx->md_ctx, data ) ); 865*11fa71b9SJerome Forissier #endif 866*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 867*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384) 868*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 869*11fa71b9SJerome Forissier return( mbedtls_internal_sha512_process( ctx->md_ctx, data ) ); 870*11fa71b9SJerome Forissier #endif 871*11fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 872*11fa71b9SJerome Forissier return( mbedtls_internal_sha512_process( ctx->md_ctx, data ) ); 873*11fa71b9SJerome Forissier #endif 874*11fa71b9SJerome Forissier default: 875*11fa71b9SJerome Forissier return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); 876*11fa71b9SJerome Forissier } 877817466cbSJens Wiklander } 878817466cbSJens Wiklander 879817466cbSJens Wiklander unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ) 880817466cbSJens Wiklander { 881817466cbSJens Wiklander if( md_info == NULL ) 882817466cbSJens Wiklander return( 0 ); 883817466cbSJens Wiklander 884817466cbSJens Wiklander return md_info->size; 885817466cbSJens Wiklander } 886817466cbSJens Wiklander 887817466cbSJens Wiklander mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ) 888817466cbSJens Wiklander { 889817466cbSJens Wiklander if( md_info == NULL ) 890817466cbSJens Wiklander return( MBEDTLS_MD_NONE ); 891817466cbSJens Wiklander 892817466cbSJens Wiklander return md_info->type; 893817466cbSJens Wiklander } 894817466cbSJens Wiklander 895817466cbSJens Wiklander const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ) 896817466cbSJens Wiklander { 897817466cbSJens Wiklander if( md_info == NULL ) 898817466cbSJens Wiklander return( NULL ); 899817466cbSJens Wiklander 900817466cbSJens Wiklander return md_info->name; 901817466cbSJens Wiklander } 902817466cbSJens Wiklander 903817466cbSJens Wiklander #endif /* MBEDTLS_MD_C */ 904