Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Committer:
dflet
Date:
Tue Sep 15 16:45:04 2015 +0000
Revision:
22:f9b5e0b80bf2
Parent:
0:50cedd586816
Removed some debug.

Who changed what in which revision?

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