Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
SSL/library/md.c@0:796d0f61a05b, 2018-09-27 (annotated)
- Committer:
 - HannesTschofenig
 - Date:
 - Thu Sep 27 06:34:22 2018 +0000
 - Revision:
 - 0:796d0f61a05b
 
Example AES-GCM test program
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| HannesTschofenig | 0:796d0f61a05b | 1 | /** | 
| HannesTschofenig | 0:796d0f61a05b | 2 | * \file md.c | 
| HannesTschofenig | 0:796d0f61a05b | 3 | * | 
| HannesTschofenig | 0:796d0f61a05b | 4 | * \brief Generic message digest wrapper for PolarSSL | 
| HannesTschofenig | 0:796d0f61a05b | 5 | * | 
| HannesTschofenig | 0:796d0f61a05b | 6 | * \author Adriaan de Jong <dejong@fox-it.com> | 
| HannesTschofenig | 0:796d0f61a05b | 7 | * | 
| HannesTschofenig | 0:796d0f61a05b | 8 | * Copyright (C) 2006-2014, Brainspark B.V. | 
| HannesTschofenig | 0:796d0f61a05b | 9 | * | 
| HannesTschofenig | 0:796d0f61a05b | 10 | * This file is part of PolarSSL (http://www.polarssl.org) | 
| HannesTschofenig | 0:796d0f61a05b | 11 | * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org> | 
| HannesTschofenig | 0:796d0f61a05b | 12 | * | 
| HannesTschofenig | 0:796d0f61a05b | 13 | * All rights reserved. | 
| HannesTschofenig | 0:796d0f61a05b | 14 | * | 
| HannesTschofenig | 0:796d0f61a05b | 15 | * This program is free software; you can redistribute it and/or modify | 
| HannesTschofenig | 0:796d0f61a05b | 16 | * it under the terms of the GNU General Public License as published by | 
| HannesTschofenig | 0:796d0f61a05b | 17 | * the Free Software Foundation; either version 2 of the License, or | 
| HannesTschofenig | 0:796d0f61a05b | 18 | * (at your option) any later version. | 
| HannesTschofenig | 0:796d0f61a05b | 19 | * | 
| HannesTschofenig | 0:796d0f61a05b | 20 | * This program is distributed in the hope that it will be useful, | 
| HannesTschofenig | 0:796d0f61a05b | 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| HannesTschofenig | 0:796d0f61a05b | 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| HannesTschofenig | 0:796d0f61a05b | 23 | * GNU General Public License for more details. | 
| HannesTschofenig | 0:796d0f61a05b | 24 | * | 
| HannesTschofenig | 0:796d0f61a05b | 25 | * You should have received a copy of the GNU General Public License along | 
| HannesTschofenig | 0:796d0f61a05b | 26 | * with this program; if not, write to the Free Software Foundation, Inc., | 
| HannesTschofenig | 0:796d0f61a05b | 27 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 
| HannesTschofenig | 0:796d0f61a05b | 28 | */ | 
| HannesTschofenig | 0:796d0f61a05b | 29 | |
| HannesTschofenig | 0:796d0f61a05b | 30 | #if !defined(POLARSSL_CONFIG_FILE) | 
| HannesTschofenig | 0:796d0f61a05b | 31 | #include "polarssl/config.h" | 
| HannesTschofenig | 0:796d0f61a05b | 32 | #else | 
| HannesTschofenig | 0:796d0f61a05b | 33 | #include POLARSSL_CONFIG_FILE | 
| HannesTschofenig | 0:796d0f61a05b | 34 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 35 | |
| HannesTschofenig | 0:796d0f61a05b | 36 | #if defined(POLARSSL_MD_C) | 
| HannesTschofenig | 0:796d0f61a05b | 37 | |
| HannesTschofenig | 0:796d0f61a05b | 38 | #include "polarssl/md.h" | 
| HannesTschofenig | 0:796d0f61a05b | 39 | #include "polarssl/md_wrap.h" | 
| HannesTschofenig | 0:796d0f61a05b | 40 | |
| HannesTschofenig | 0:796d0f61a05b | 41 | #include <stdlib.h> | 
| HannesTschofenig | 0:796d0f61a05b | 42 | |
| HannesTschofenig | 0:796d0f61a05b | 43 | #if defined(_MSC_VER) && !defined strcasecmp && !defined(EFIX64) && \ | 
| HannesTschofenig | 0:796d0f61a05b | 44 | !defined(EFI32) | 
| HannesTschofenig | 0:796d0f61a05b | 45 | #define strcasecmp _stricmp | 
| HannesTschofenig | 0:796d0f61a05b | 46 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 47 | |
| HannesTschofenig | 0:796d0f61a05b | 48 | static const int supported_digests[] = { | 
| HannesTschofenig | 0:796d0f61a05b | 49 | |
| HannesTschofenig | 0:796d0f61a05b | 50 | #if defined(POLARSSL_MD2_C) | 
| HannesTschofenig | 0:796d0f61a05b | 51 | POLARSSL_MD_MD2, | 
| HannesTschofenig | 0:796d0f61a05b | 52 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 53 | |
| HannesTschofenig | 0:796d0f61a05b | 54 | #if defined(POLARSSL_MD4_C) | 
| HannesTschofenig | 0:796d0f61a05b | 55 | POLARSSL_MD_MD4, | 
| HannesTschofenig | 0:796d0f61a05b | 56 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 57 | |
| HannesTschofenig | 0:796d0f61a05b | 58 | #if defined(POLARSSL_MD5_C) | 
| HannesTschofenig | 0:796d0f61a05b | 59 | POLARSSL_MD_MD5, | 
| HannesTschofenig | 0:796d0f61a05b | 60 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 61 | |
| HannesTschofenig | 0:796d0f61a05b | 62 | #if defined(POLARSSL_RIPEMD160_C) | 
| HannesTschofenig | 0:796d0f61a05b | 63 | POLARSSL_MD_RIPEMD160, | 
| HannesTschofenig | 0:796d0f61a05b | 64 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 65 | |
| HannesTschofenig | 0:796d0f61a05b | 66 | #if defined(POLARSSL_SHA1_C) | 
| HannesTschofenig | 0:796d0f61a05b | 67 | POLARSSL_MD_SHA1, | 
| HannesTschofenig | 0:796d0f61a05b | 68 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 69 | |
| HannesTschofenig | 0:796d0f61a05b | 70 | #if defined(POLARSSL_SHA256_C) | 
| HannesTschofenig | 0:796d0f61a05b | 71 | POLARSSL_MD_SHA224, | 
| HannesTschofenig | 0:796d0f61a05b | 72 | POLARSSL_MD_SHA256, | 
| HannesTschofenig | 0:796d0f61a05b | 73 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 74 | |
| HannesTschofenig | 0:796d0f61a05b | 75 | #if defined(POLARSSL_SHA512_C) | 
| HannesTschofenig | 0:796d0f61a05b | 76 | POLARSSL_MD_SHA384, | 
| HannesTschofenig | 0:796d0f61a05b | 77 | POLARSSL_MD_SHA512, | 
| HannesTschofenig | 0:796d0f61a05b | 78 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 79 | |
| HannesTschofenig | 0:796d0f61a05b | 80 | 0 | 
| HannesTschofenig | 0:796d0f61a05b | 81 | }; | 
| HannesTschofenig | 0:796d0f61a05b | 82 | |
| HannesTschofenig | 0:796d0f61a05b | 83 | const int *md_list( void ) | 
| HannesTschofenig | 0:796d0f61a05b | 84 | { | 
| HannesTschofenig | 0:796d0f61a05b | 85 | return supported_digests; | 
| HannesTschofenig | 0:796d0f61a05b | 86 | } | 
| HannesTschofenig | 0:796d0f61a05b | 87 | |
| HannesTschofenig | 0:796d0f61a05b | 88 | const md_info_t *md_info_from_string( const char *md_name ) | 
| HannesTschofenig | 0:796d0f61a05b | 89 | { | 
| HannesTschofenig | 0:796d0f61a05b | 90 | if( NULL == md_name ) | 
| HannesTschofenig | 0:796d0f61a05b | 91 | return NULL; | 
| HannesTschofenig | 0:796d0f61a05b | 92 | |
| HannesTschofenig | 0:796d0f61a05b | 93 | /* Get the appropriate digest information */ | 
| HannesTschofenig | 0:796d0f61a05b | 94 | #if defined(POLARSSL_MD2_C) | 
| HannesTschofenig | 0:796d0f61a05b | 95 | if( !strcasecmp( "MD2", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 96 | return md_info_from_type( POLARSSL_MD_MD2 ); | 
| HannesTschofenig | 0:796d0f61a05b | 97 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 98 | #if defined(POLARSSL_MD4_C) | 
| HannesTschofenig | 0:796d0f61a05b | 99 | if( !strcasecmp( "MD4", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 100 | return md_info_from_type( POLARSSL_MD_MD4 ); | 
| HannesTschofenig | 0:796d0f61a05b | 101 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 102 | #if defined(POLARSSL_MD5_C) | 
| HannesTschofenig | 0:796d0f61a05b | 103 | if( !strcasecmp( "MD5", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 104 | return md_info_from_type( POLARSSL_MD_MD5 ); | 
| HannesTschofenig | 0:796d0f61a05b | 105 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 106 | #if defined(POLARSSL_RIPEMD160_C) | 
| HannesTschofenig | 0:796d0f61a05b | 107 | if( !strcasecmp( "RIPEMD160", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 108 | return md_info_from_type( POLARSSL_MD_RIPEMD160 ); | 
| HannesTschofenig | 0:796d0f61a05b | 109 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 110 | #if defined(POLARSSL_SHA1_C) | 
| HannesTschofenig | 0:796d0f61a05b | 111 | if( !strcasecmp( "SHA1", md_name ) || !strcasecmp( "SHA", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 112 | return md_info_from_type( POLARSSL_MD_SHA1 ); | 
| HannesTschofenig | 0:796d0f61a05b | 113 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 114 | #if defined(POLARSSL_SHA256_C) | 
| HannesTschofenig | 0:796d0f61a05b | 115 | if( !strcasecmp( "SHA224", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 116 | return md_info_from_type( POLARSSL_MD_SHA224 ); | 
| HannesTschofenig | 0:796d0f61a05b | 117 | if( !strcasecmp( "SHA256", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 118 | return md_info_from_type( POLARSSL_MD_SHA256 ); | 
| HannesTschofenig | 0:796d0f61a05b | 119 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 120 | #if defined(POLARSSL_SHA512_C) | 
| HannesTschofenig | 0:796d0f61a05b | 121 | if( !strcasecmp( "SHA384", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 122 | return md_info_from_type( POLARSSL_MD_SHA384 ); | 
| HannesTschofenig | 0:796d0f61a05b | 123 | if( !strcasecmp( "SHA512", md_name ) ) | 
| HannesTschofenig | 0:796d0f61a05b | 124 | return md_info_from_type( POLARSSL_MD_SHA512 ); | 
| HannesTschofenig | 0:796d0f61a05b | 125 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 126 | return NULL; | 
| HannesTschofenig | 0:796d0f61a05b | 127 | } | 
| HannesTschofenig | 0:796d0f61a05b | 128 | |
| HannesTschofenig | 0:796d0f61a05b | 129 | const md_info_t *md_info_from_type( md_type_t md_type ) | 
| HannesTschofenig | 0:796d0f61a05b | 130 | { | 
| HannesTschofenig | 0:796d0f61a05b | 131 | switch( md_type ) | 
| HannesTschofenig | 0:796d0f61a05b | 132 | { | 
| HannesTschofenig | 0:796d0f61a05b | 133 | #if defined(POLARSSL_MD2_C) | 
| HannesTschofenig | 0:796d0f61a05b | 134 | case POLARSSL_MD_MD2: | 
| HannesTschofenig | 0:796d0f61a05b | 135 | return &md2_info; | 
| HannesTschofenig | 0:796d0f61a05b | 136 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 137 | #if defined(POLARSSL_MD4_C) | 
| HannesTschofenig | 0:796d0f61a05b | 138 | case POLARSSL_MD_MD4: | 
| HannesTschofenig | 0:796d0f61a05b | 139 | return &md4_info; | 
| HannesTschofenig | 0:796d0f61a05b | 140 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 141 | #if defined(POLARSSL_MD5_C) | 
| HannesTschofenig | 0:796d0f61a05b | 142 | case POLARSSL_MD_MD5: | 
| HannesTschofenig | 0:796d0f61a05b | 143 | return &md5_info; | 
| HannesTschofenig | 0:796d0f61a05b | 144 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 145 | #if defined(POLARSSL_RIPEMD160_C) | 
| HannesTschofenig | 0:796d0f61a05b | 146 | case POLARSSL_MD_RIPEMD160: | 
| HannesTschofenig | 0:796d0f61a05b | 147 | return &ripemd160_info; | 
| HannesTschofenig | 0:796d0f61a05b | 148 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 149 | #if defined(POLARSSL_SHA1_C) | 
| HannesTschofenig | 0:796d0f61a05b | 150 | case POLARSSL_MD_SHA1: | 
| HannesTschofenig | 0:796d0f61a05b | 151 | return &sha1_info; | 
| HannesTschofenig | 0:796d0f61a05b | 152 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 153 | #if defined(POLARSSL_SHA256_C) | 
| HannesTschofenig | 0:796d0f61a05b | 154 | case POLARSSL_MD_SHA224: | 
| HannesTschofenig | 0:796d0f61a05b | 155 | return &sha224_info; | 
| HannesTschofenig | 0:796d0f61a05b | 156 | case POLARSSL_MD_SHA256: | 
| HannesTschofenig | 0:796d0f61a05b | 157 | return &sha256_info; | 
| HannesTschofenig | 0:796d0f61a05b | 158 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 159 | #if defined(POLARSSL_SHA512_C) | 
| HannesTschofenig | 0:796d0f61a05b | 160 | case POLARSSL_MD_SHA384: | 
| HannesTschofenig | 0:796d0f61a05b | 161 | return &sha384_info; | 
| HannesTschofenig | 0:796d0f61a05b | 162 | case POLARSSL_MD_SHA512: | 
| HannesTschofenig | 0:796d0f61a05b | 163 | return &sha512_info; | 
| HannesTschofenig | 0:796d0f61a05b | 164 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 165 | default: | 
| HannesTschofenig | 0:796d0f61a05b | 166 | return NULL; | 
| HannesTschofenig | 0:796d0f61a05b | 167 | } | 
| HannesTschofenig | 0:796d0f61a05b | 168 | } | 
| HannesTschofenig | 0:796d0f61a05b | 169 | |
| HannesTschofenig | 0:796d0f61a05b | 170 | int md_init_ctx( md_context_t *ctx, const md_info_t *md_info ) | 
| HannesTschofenig | 0:796d0f61a05b | 171 | { | 
| HannesTschofenig | 0:796d0f61a05b | 172 | if( md_info == NULL || ctx == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 173 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 174 | |
| HannesTschofenig | 0:796d0f61a05b | 175 | memset( ctx, 0, sizeof( md_context_t ) ); | 
| HannesTschofenig | 0:796d0f61a05b | 176 | |
| HannesTschofenig | 0:796d0f61a05b | 177 | if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 178 | return POLARSSL_ERR_MD_ALLOC_FAILED; | 
| HannesTschofenig | 0:796d0f61a05b | 179 | |
| HannesTschofenig | 0:796d0f61a05b | 180 | ctx->md_info = md_info; | 
| HannesTschofenig | 0:796d0f61a05b | 181 | |
| HannesTschofenig | 0:796d0f61a05b | 182 | md_info->starts_func( ctx->md_ctx ); | 
| HannesTschofenig | 0:796d0f61a05b | 183 | |
| HannesTschofenig | 0:796d0f61a05b | 184 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 185 | } | 
| HannesTschofenig | 0:796d0f61a05b | 186 | |
| HannesTschofenig | 0:796d0f61a05b | 187 | int md_free_ctx( md_context_t *ctx ) | 
| HannesTschofenig | 0:796d0f61a05b | 188 | { | 
| HannesTschofenig | 0:796d0f61a05b | 189 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 190 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 191 | |
| HannesTschofenig | 0:796d0f61a05b | 192 | ctx->md_info->ctx_free_func( ctx->md_ctx ); | 
| HannesTschofenig | 0:796d0f61a05b | 193 | ctx->md_ctx = NULL; | 
| HannesTschofenig | 0:796d0f61a05b | 194 | |
| HannesTschofenig | 0:796d0f61a05b | 195 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 196 | } | 
| HannesTschofenig | 0:796d0f61a05b | 197 | |
| HannesTschofenig | 0:796d0f61a05b | 198 | int md_starts( md_context_t *ctx ) | 
| HannesTschofenig | 0:796d0f61a05b | 199 | { | 
| HannesTschofenig | 0:796d0f61a05b | 200 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 201 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 202 | |
| HannesTschofenig | 0:796d0f61a05b | 203 | ctx->md_info->starts_func( ctx->md_ctx ); | 
| HannesTschofenig | 0:796d0f61a05b | 204 | |
| HannesTschofenig | 0:796d0f61a05b | 205 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 206 | } | 
| HannesTschofenig | 0:796d0f61a05b | 207 | |
| HannesTschofenig | 0:796d0f61a05b | 208 | int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen ) | 
| HannesTschofenig | 0:796d0f61a05b | 209 | { | 
| HannesTschofenig | 0:796d0f61a05b | 210 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 211 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 212 | |
| HannesTschofenig | 0:796d0f61a05b | 213 | ctx->md_info->update_func( ctx->md_ctx, input, ilen ); | 
| HannesTschofenig | 0:796d0f61a05b | 214 | |
| HannesTschofenig | 0:796d0f61a05b | 215 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 216 | } | 
| HannesTschofenig | 0:796d0f61a05b | 217 | |
| HannesTschofenig | 0:796d0f61a05b | 218 | int md_finish( md_context_t *ctx, unsigned char *output ) | 
| HannesTschofenig | 0:796d0f61a05b | 219 | { | 
| HannesTschofenig | 0:796d0f61a05b | 220 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 221 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 222 | |
| HannesTschofenig | 0:796d0f61a05b | 223 | ctx->md_info->finish_func( ctx->md_ctx, output ); | 
| HannesTschofenig | 0:796d0f61a05b | 224 | |
| HannesTschofenig | 0:796d0f61a05b | 225 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 226 | } | 
| HannesTschofenig | 0:796d0f61a05b | 227 | |
| HannesTschofenig | 0:796d0f61a05b | 228 | int md( const md_info_t *md_info, const unsigned char *input, size_t ilen, | 
| HannesTschofenig | 0:796d0f61a05b | 229 | unsigned char *output ) | 
| HannesTschofenig | 0:796d0f61a05b | 230 | { | 
| HannesTschofenig | 0:796d0f61a05b | 231 | if ( md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 232 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 233 | |
| HannesTschofenig | 0:796d0f61a05b | 234 | md_info->digest_func( input, ilen, output ); | 
| HannesTschofenig | 0:796d0f61a05b | 235 | |
| HannesTschofenig | 0:796d0f61a05b | 236 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 237 | } | 
| HannesTschofenig | 0:796d0f61a05b | 238 | |
| HannesTschofenig | 0:796d0f61a05b | 239 | int md_file( const md_info_t *md_info, const char *path, unsigned char *output ) | 
| HannesTschofenig | 0:796d0f61a05b | 240 | { | 
| HannesTschofenig | 0:796d0f61a05b | 241 | #if defined(POLARSSL_FS_IO) | 
| HannesTschofenig | 0:796d0f61a05b | 242 | int ret; | 
| HannesTschofenig | 0:796d0f61a05b | 243 | #endif | 
| HannesTschofenig | 0:796d0f61a05b | 244 | |
| HannesTschofenig | 0:796d0f61a05b | 245 | if( md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 246 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 247 | |
| HannesTschofenig | 0:796d0f61a05b | 248 | #if defined(POLARSSL_FS_IO) | 
| HannesTschofenig | 0:796d0f61a05b | 249 | ret = md_info->file_func( path, output ); | 
| HannesTschofenig | 0:796d0f61a05b | 250 | if( ret != 0 ) | 
| HannesTschofenig | 0:796d0f61a05b | 251 | return( POLARSSL_ERR_MD_FILE_IO_ERROR + ret ); | 
| HannesTschofenig | 0:796d0f61a05b | 252 | |
| HannesTschofenig | 0:796d0f61a05b | 253 | return( ret ); | 
| HannesTschofenig | 0:796d0f61a05b | 254 | #else | 
| HannesTschofenig | 0:796d0f61a05b | 255 | ((void) path); | 
| HannesTschofenig | 0:796d0f61a05b | 256 | ((void) output); | 
| HannesTschofenig | 0:796d0f61a05b | 257 | |
| HannesTschofenig | 0:796d0f61a05b | 258 | return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; | 
| HannesTschofenig | 0:796d0f61a05b | 259 | #endif /* POLARSSL_FS_IO */ | 
| HannesTschofenig | 0:796d0f61a05b | 260 | } | 
| HannesTschofenig | 0:796d0f61a05b | 261 | |
| HannesTschofenig | 0:796d0f61a05b | 262 | int md_hmac_starts( md_context_t *ctx, const unsigned char *key, size_t keylen ) | 
| HannesTschofenig | 0:796d0f61a05b | 263 | { | 
| HannesTschofenig | 0:796d0f61a05b | 264 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 265 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 266 | |
| HannesTschofenig | 0:796d0f61a05b | 267 | ctx->md_info->hmac_starts_func( ctx->md_ctx, key, keylen); | 
| HannesTschofenig | 0:796d0f61a05b | 268 | |
| HannesTschofenig | 0:796d0f61a05b | 269 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 270 | } | 
| HannesTschofenig | 0:796d0f61a05b | 271 | |
| HannesTschofenig | 0:796d0f61a05b | 272 | int md_hmac_update( md_context_t *ctx, const unsigned char *input, size_t ilen ) | 
| HannesTschofenig | 0:796d0f61a05b | 273 | { | 
| HannesTschofenig | 0:796d0f61a05b | 274 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 275 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 276 | |
| HannesTschofenig | 0:796d0f61a05b | 277 | ctx->md_info->hmac_update_func( ctx->md_ctx, input, ilen ); | 
| HannesTschofenig | 0:796d0f61a05b | 278 | |
| HannesTschofenig | 0:796d0f61a05b | 279 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 280 | } | 
| HannesTschofenig | 0:796d0f61a05b | 281 | |
| HannesTschofenig | 0:796d0f61a05b | 282 | int md_hmac_finish( md_context_t *ctx, unsigned char *output) | 
| HannesTschofenig | 0:796d0f61a05b | 283 | { | 
| HannesTschofenig | 0:796d0f61a05b | 284 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 285 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 286 | |
| HannesTschofenig | 0:796d0f61a05b | 287 | ctx->md_info->hmac_finish_func( ctx->md_ctx, output); | 
| HannesTschofenig | 0:796d0f61a05b | 288 | |
| HannesTschofenig | 0:796d0f61a05b | 289 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 290 | } | 
| HannesTschofenig | 0:796d0f61a05b | 291 | |
| HannesTschofenig | 0:796d0f61a05b | 292 | int md_hmac_reset( md_context_t *ctx ) | 
| HannesTschofenig | 0:796d0f61a05b | 293 | { | 
| HannesTschofenig | 0:796d0f61a05b | 294 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 295 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 296 | |
| HannesTschofenig | 0:796d0f61a05b | 297 | ctx->md_info->hmac_reset_func( ctx->md_ctx); | 
| HannesTschofenig | 0:796d0f61a05b | 298 | |
| HannesTschofenig | 0:796d0f61a05b | 299 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 300 | } | 
| HannesTschofenig | 0:796d0f61a05b | 301 | |
| HannesTschofenig | 0:796d0f61a05b | 302 | int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen, | 
| HannesTschofenig | 0:796d0f61a05b | 303 | const unsigned char *input, size_t ilen, | 
| HannesTschofenig | 0:796d0f61a05b | 304 | unsigned char *output ) | 
| HannesTschofenig | 0:796d0f61a05b | 305 | { | 
| HannesTschofenig | 0:796d0f61a05b | 306 | if( md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 307 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 308 | |
| HannesTschofenig | 0:796d0f61a05b | 309 | md_info->hmac_func( key, keylen, input, ilen, output ); | 
| HannesTschofenig | 0:796d0f61a05b | 310 | |
| HannesTschofenig | 0:796d0f61a05b | 311 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 312 | } | 
| HannesTschofenig | 0:796d0f61a05b | 313 | |
| HannesTschofenig | 0:796d0f61a05b | 314 | int md_process( md_context_t *ctx, const unsigned char *data ) | 
| HannesTschofenig | 0:796d0f61a05b | 315 | { | 
| HannesTschofenig | 0:796d0f61a05b | 316 | if( ctx == NULL || ctx->md_info == NULL ) | 
| HannesTschofenig | 0:796d0f61a05b | 317 | return POLARSSL_ERR_MD_BAD_INPUT_DATA; | 
| HannesTschofenig | 0:796d0f61a05b | 318 | |
| HannesTschofenig | 0:796d0f61a05b | 319 | ctx->md_info->process_func( ctx->md_ctx, data ); | 
| HannesTschofenig | 0:796d0f61a05b | 320 | |
| HannesTschofenig | 0:796d0f61a05b | 321 | return 0; | 
| HannesTschofenig | 0:796d0f61a05b | 322 | } | 
| HannesTschofenig | 0:796d0f61a05b | 323 | |
| HannesTschofenig | 0:796d0f61a05b | 324 | #endif /* POLARSSL_MD_C */ | 
| HannesTschofenig | 0:796d0f61a05b | 325 | |
| HannesTschofenig | 0:796d0f61a05b | 326 |