Example program to test AES-GCM functionality. Used for a workshop

Dependencies:   mbed

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?

UserRevisionLine numberNew contents of line
HannesTschofenig 0:796d0f61a05b 1 /*
HannesTschofenig 0:796d0f61a05b 2 * Entropy accumulator implementation
HannesTschofenig 0:796d0f61a05b 3 *
HannesTschofenig 0:796d0f61a05b 4 * Copyright (C) 2006-2014, Brainspark B.V.
HannesTschofenig 0:796d0f61a05b 5 *
HannesTschofenig 0:796d0f61a05b 6 * This file is part of PolarSSL (http://www.polarssl.org)
HannesTschofenig 0:796d0f61a05b 7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
HannesTschofenig 0:796d0f61a05b 8 *
HannesTschofenig 0:796d0f61a05b 9 * All rights reserved.
HannesTschofenig 0:796d0f61a05b 10 *
HannesTschofenig 0:796d0f61a05b 11 * This program is free software; you can redistribute it and/or modify
HannesTschofenig 0:796d0f61a05b 12 * it under the terms of the GNU General Public License as published by
HannesTschofenig 0:796d0f61a05b 13 * the Free Software Foundation; either version 2 of the License, or
HannesTschofenig 0:796d0f61a05b 14 * (at your option) any later version.
HannesTschofenig 0:796d0f61a05b 15 *
HannesTschofenig 0:796d0f61a05b 16 * This program is distributed in the hope that it will be useful,
HannesTschofenig 0:796d0f61a05b 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
HannesTschofenig 0:796d0f61a05b 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
HannesTschofenig 0:796d0f61a05b 19 * GNU General Public License for more details.
HannesTschofenig 0:796d0f61a05b 20 *
HannesTschofenig 0:796d0f61a05b 21 * You should have received a copy of the GNU General Public License along
HannesTschofenig 0:796d0f61a05b 22 * with this program; if not, write to the Free Software Foundation, Inc.,
HannesTschofenig 0:796d0f61a05b 23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
HannesTschofenig 0:796d0f61a05b 24 */
HannesTschofenig 0:796d0f61a05b 25
HannesTschofenig 0:796d0f61a05b 26 #if !defined(POLARSSL_CONFIG_FILE)
HannesTschofenig 0:796d0f61a05b 27 #include "polarssl/config.h"
HannesTschofenig 0:796d0f61a05b 28 #else
HannesTschofenig 0:796d0f61a05b 29 #include POLARSSL_CONFIG_FILE
HannesTschofenig 0:796d0f61a05b 30 #endif
HannesTschofenig 0:796d0f61a05b 31
HannesTschofenig 0:796d0f61a05b 32 #if defined(POLARSSL_ENTROPY_C)
HannesTschofenig 0:796d0f61a05b 33
HannesTschofenig 0:796d0f61a05b 34 #include "polarssl/entropy.h"
HannesTschofenig 0:796d0f61a05b 35 #include "polarssl/entropy_poll.h"
HannesTschofenig 0:796d0f61a05b 36
HannesTschofenig 0:796d0f61a05b 37 #if defined(POLARSSL_FS_IO)
HannesTschofenig 0:796d0f61a05b 38 #include <stdio.h>
HannesTschofenig 0:796d0f61a05b 39 #endif
HannesTschofenig 0:796d0f61a05b 40
HannesTschofenig 0:796d0f61a05b 41 #if defined(POLARSSL_HAVEGE_C)
HannesTschofenig 0:796d0f61a05b 42 #include "polarssl/havege.h"
HannesTschofenig 0:796d0f61a05b 43 #endif
HannesTschofenig 0:796d0f61a05b 44
HannesTschofenig 0:796d0f61a05b 45 #define ENTROPY_MAX_LOOP 256 /**< Maximum amount to loop before error */
HannesTschofenig 0:796d0f61a05b 46
HannesTschofenig 0:796d0f61a05b 47 void entropy_init( entropy_context *ctx )
HannesTschofenig 0:796d0f61a05b 48 {
HannesTschofenig 0:796d0f61a05b 49 memset( ctx, 0, sizeof(entropy_context) );
HannesTschofenig 0:796d0f61a05b 50
HannesTschofenig 0:796d0f61a05b 51 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 52 polarssl_mutex_init( &ctx->mutex );
HannesTschofenig 0:796d0f61a05b 53 #endif
HannesTschofenig 0:796d0f61a05b 54
HannesTschofenig 0:796d0f61a05b 55 #if defined(POLARSSL_ENTROPY_SHA512_ACCUMULATOR)
HannesTschofenig 0:796d0f61a05b 56 sha512_starts( &ctx->accumulator, 0 );
HannesTschofenig 0:796d0f61a05b 57 #else
HannesTschofenig 0:796d0f61a05b 58 sha256_starts( &ctx->accumulator, 0 );
HannesTschofenig 0:796d0f61a05b 59 #endif
HannesTschofenig 0:796d0f61a05b 60 #if defined(POLARSSL_HAVEGE_C)
HannesTschofenig 0:796d0f61a05b 61 havege_init( &ctx->havege_data );
HannesTschofenig 0:796d0f61a05b 62 #endif
HannesTschofenig 0:796d0f61a05b 63
HannesTschofenig 0:796d0f61a05b 64 #if !defined(POLARSSL_NO_DEFAULT_ENTROPY_SOURCES)
HannesTschofenig 0:796d0f61a05b 65 #if !defined(POLARSSL_NO_PLATFORM_ENTROPY)
HannesTschofenig 0:796d0f61a05b 66 entropy_add_source( ctx, platform_entropy_poll, NULL,
HannesTschofenig 0:796d0f61a05b 67 ENTROPY_MIN_PLATFORM );
HannesTschofenig 0:796d0f61a05b 68 #endif
HannesTschofenig 0:796d0f61a05b 69 #if defined(POLARSSL_TIMING_C)
HannesTschofenig 0:796d0f61a05b 70 entropy_add_source( ctx, hardclock_poll, NULL, ENTROPY_MIN_HARDCLOCK );
HannesTschofenig 0:796d0f61a05b 71 #endif
HannesTschofenig 0:796d0f61a05b 72 #if defined(POLARSSL_HAVEGE_C)
HannesTschofenig 0:796d0f61a05b 73 entropy_add_source( ctx, havege_poll, &ctx->havege_data,
HannesTschofenig 0:796d0f61a05b 74 ENTROPY_MIN_HAVEGE );
HannesTschofenig 0:796d0f61a05b 75 #endif
HannesTschofenig 0:796d0f61a05b 76 #endif /* POLARSSL_NO_DEFAULT_ENTROPY_SOURCES */
HannesTschofenig 0:796d0f61a05b 77 }
HannesTschofenig 0:796d0f61a05b 78
HannesTschofenig 0:796d0f61a05b 79 void entropy_free( entropy_context *ctx )
HannesTschofenig 0:796d0f61a05b 80 {
HannesTschofenig 0:796d0f61a05b 81 ((void) ctx);
HannesTschofenig 0:796d0f61a05b 82 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 83 polarssl_mutex_free( &ctx->mutex );
HannesTschofenig 0:796d0f61a05b 84 #endif
HannesTschofenig 0:796d0f61a05b 85 }
HannesTschofenig 0:796d0f61a05b 86
HannesTschofenig 0:796d0f61a05b 87 int entropy_add_source( entropy_context *ctx,
HannesTschofenig 0:796d0f61a05b 88 f_source_ptr f_source, void *p_source,
HannesTschofenig 0:796d0f61a05b 89 size_t threshold )
HannesTschofenig 0:796d0f61a05b 90 {
HannesTschofenig 0:796d0f61a05b 91 int index, ret = 0;
HannesTschofenig 0:796d0f61a05b 92
HannesTschofenig 0:796d0f61a05b 93 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 94 if( ( ret = polarssl_mutex_lock( &ctx->mutex ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 95 return( ret );
HannesTschofenig 0:796d0f61a05b 96 #endif
HannesTschofenig 0:796d0f61a05b 97
HannesTschofenig 0:796d0f61a05b 98 index = ctx->source_count;
HannesTschofenig 0:796d0f61a05b 99 if( index >= ENTROPY_MAX_SOURCES )
HannesTschofenig 0:796d0f61a05b 100 {
HannesTschofenig 0:796d0f61a05b 101 ret = POLARSSL_ERR_ENTROPY_MAX_SOURCES;
HannesTschofenig 0:796d0f61a05b 102 goto exit;
HannesTschofenig 0:796d0f61a05b 103 }
HannesTschofenig 0:796d0f61a05b 104
HannesTschofenig 0:796d0f61a05b 105 ctx->source[index].f_source = f_source;
HannesTschofenig 0:796d0f61a05b 106 ctx->source[index].p_source = p_source;
HannesTschofenig 0:796d0f61a05b 107 ctx->source[index].threshold = threshold;
HannesTschofenig 0:796d0f61a05b 108
HannesTschofenig 0:796d0f61a05b 109 ctx->source_count++;
HannesTschofenig 0:796d0f61a05b 110
HannesTschofenig 0:796d0f61a05b 111 exit:
HannesTschofenig 0:796d0f61a05b 112 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 113 if( polarssl_mutex_unlock( &ctx->mutex ) != 0 )
HannesTschofenig 0:796d0f61a05b 114 return( POLARSSL_ERR_THREADING_MUTEX_ERROR );
HannesTschofenig 0:796d0f61a05b 115 #endif
HannesTschofenig 0:796d0f61a05b 116
HannesTschofenig 0:796d0f61a05b 117 return( ret );
HannesTschofenig 0:796d0f61a05b 118 }
HannesTschofenig 0:796d0f61a05b 119
HannesTschofenig 0:796d0f61a05b 120 /*
HannesTschofenig 0:796d0f61a05b 121 * Entropy accumulator update
HannesTschofenig 0:796d0f61a05b 122 */
HannesTschofenig 0:796d0f61a05b 123 static int entropy_update( entropy_context *ctx, unsigned char source_id,
HannesTschofenig 0:796d0f61a05b 124 const unsigned char *data, size_t len )
HannesTschofenig 0:796d0f61a05b 125 {
HannesTschofenig 0:796d0f61a05b 126 unsigned char header[2];
HannesTschofenig 0:796d0f61a05b 127 unsigned char tmp[ENTROPY_BLOCK_SIZE];
HannesTschofenig 0:796d0f61a05b 128 size_t use_len = len;
HannesTschofenig 0:796d0f61a05b 129 const unsigned char *p = data;
HannesTschofenig 0:796d0f61a05b 130
HannesTschofenig 0:796d0f61a05b 131 if( use_len > ENTROPY_BLOCK_SIZE )
HannesTschofenig 0:796d0f61a05b 132 {
HannesTschofenig 0:796d0f61a05b 133 #if defined(POLARSSL_ENTROPY_SHA512_ACCUMULATOR)
HannesTschofenig 0:796d0f61a05b 134 sha512( data, len, tmp, 0 );
HannesTschofenig 0:796d0f61a05b 135 #else
HannesTschofenig 0:796d0f61a05b 136 sha256( data, len, tmp, 0 );
HannesTschofenig 0:796d0f61a05b 137 #endif
HannesTschofenig 0:796d0f61a05b 138 p = tmp;
HannesTschofenig 0:796d0f61a05b 139 use_len = ENTROPY_BLOCK_SIZE;
HannesTschofenig 0:796d0f61a05b 140 }
HannesTschofenig 0:796d0f61a05b 141
HannesTschofenig 0:796d0f61a05b 142 header[0] = source_id;
HannesTschofenig 0:796d0f61a05b 143 header[1] = use_len & 0xFF;
HannesTschofenig 0:796d0f61a05b 144
HannesTschofenig 0:796d0f61a05b 145 #if defined(POLARSSL_ENTROPY_SHA512_ACCUMULATOR)
HannesTschofenig 0:796d0f61a05b 146 sha512_update( &ctx->accumulator, header, 2 );
HannesTschofenig 0:796d0f61a05b 147 sha512_update( &ctx->accumulator, p, use_len );
HannesTschofenig 0:796d0f61a05b 148 #else
HannesTschofenig 0:796d0f61a05b 149 sha256_update( &ctx->accumulator, header, 2 );
HannesTschofenig 0:796d0f61a05b 150 sha256_update( &ctx->accumulator, p, use_len );
HannesTschofenig 0:796d0f61a05b 151 #endif
HannesTschofenig 0:796d0f61a05b 152
HannesTschofenig 0:796d0f61a05b 153 return( 0 );
HannesTschofenig 0:796d0f61a05b 154 }
HannesTschofenig 0:796d0f61a05b 155
HannesTschofenig 0:796d0f61a05b 156 int entropy_update_manual( entropy_context *ctx,
HannesTschofenig 0:796d0f61a05b 157 const unsigned char *data, size_t len )
HannesTschofenig 0:796d0f61a05b 158 {
HannesTschofenig 0:796d0f61a05b 159 int ret;
HannesTschofenig 0:796d0f61a05b 160
HannesTschofenig 0:796d0f61a05b 161 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 162 if( ( ret = polarssl_mutex_lock( &ctx->mutex ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 163 return( ret );
HannesTschofenig 0:796d0f61a05b 164 #endif
HannesTschofenig 0:796d0f61a05b 165
HannesTschofenig 0:796d0f61a05b 166 ret = entropy_update( ctx, ENTROPY_SOURCE_MANUAL, data, len );
HannesTschofenig 0:796d0f61a05b 167
HannesTschofenig 0:796d0f61a05b 168 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 169 if( polarssl_mutex_unlock( &ctx->mutex ) != 0 )
HannesTschofenig 0:796d0f61a05b 170 return( POLARSSL_ERR_THREADING_MUTEX_ERROR );
HannesTschofenig 0:796d0f61a05b 171 #endif
HannesTschofenig 0:796d0f61a05b 172
HannesTschofenig 0:796d0f61a05b 173 return ( ret );
HannesTschofenig 0:796d0f61a05b 174 }
HannesTschofenig 0:796d0f61a05b 175
HannesTschofenig 0:796d0f61a05b 176 /*
HannesTschofenig 0:796d0f61a05b 177 * Run through the different sources to add entropy to our accumulator
HannesTschofenig 0:796d0f61a05b 178 */
HannesTschofenig 0:796d0f61a05b 179 static int entropy_gather_internal( entropy_context *ctx )
HannesTschofenig 0:796d0f61a05b 180 {
HannesTschofenig 0:796d0f61a05b 181 int ret, i;
HannesTschofenig 0:796d0f61a05b 182 unsigned char buf[ENTROPY_MAX_GATHER];
HannesTschofenig 0:796d0f61a05b 183 size_t olen;
HannesTschofenig 0:796d0f61a05b 184
HannesTschofenig 0:796d0f61a05b 185 if( ctx->source_count == 0 )
HannesTschofenig 0:796d0f61a05b 186 return( POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED );
HannesTschofenig 0:796d0f61a05b 187
HannesTschofenig 0:796d0f61a05b 188 /*
HannesTschofenig 0:796d0f61a05b 189 * Run through our entropy sources
HannesTschofenig 0:796d0f61a05b 190 */
HannesTschofenig 0:796d0f61a05b 191 for( i = 0; i < ctx->source_count; i++ )
HannesTschofenig 0:796d0f61a05b 192 {
HannesTschofenig 0:796d0f61a05b 193 olen = 0;
HannesTschofenig 0:796d0f61a05b 194 if ( ( ret = ctx->source[i].f_source( ctx->source[i].p_source,
HannesTschofenig 0:796d0f61a05b 195 buf, ENTROPY_MAX_GATHER, &olen ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 196 {
HannesTschofenig 0:796d0f61a05b 197 return( ret );
HannesTschofenig 0:796d0f61a05b 198 }
HannesTschofenig 0:796d0f61a05b 199
HannesTschofenig 0:796d0f61a05b 200 /*
HannesTschofenig 0:796d0f61a05b 201 * Add if we actually gathered something
HannesTschofenig 0:796d0f61a05b 202 */
HannesTschofenig 0:796d0f61a05b 203 if( olen > 0 )
HannesTschofenig 0:796d0f61a05b 204 {
HannesTschofenig 0:796d0f61a05b 205 entropy_update( ctx, (unsigned char) i, buf, olen );
HannesTschofenig 0:796d0f61a05b 206 ctx->source[i].size += olen;
HannesTschofenig 0:796d0f61a05b 207 }
HannesTschofenig 0:796d0f61a05b 208 }
HannesTschofenig 0:796d0f61a05b 209
HannesTschofenig 0:796d0f61a05b 210 return( 0 );
HannesTschofenig 0:796d0f61a05b 211 }
HannesTschofenig 0:796d0f61a05b 212
HannesTschofenig 0:796d0f61a05b 213 /*
HannesTschofenig 0:796d0f61a05b 214 * Thread-safe wrapper for entropy_gather_internal()
HannesTschofenig 0:796d0f61a05b 215 */
HannesTschofenig 0:796d0f61a05b 216 int entropy_gather( entropy_context *ctx )
HannesTschofenig 0:796d0f61a05b 217 {
HannesTschofenig 0:796d0f61a05b 218 int ret;
HannesTschofenig 0:796d0f61a05b 219
HannesTschofenig 0:796d0f61a05b 220 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 221 if( ( ret = polarssl_mutex_lock( &ctx->mutex ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 222 return( ret );
HannesTschofenig 0:796d0f61a05b 223 #endif
HannesTschofenig 0:796d0f61a05b 224
HannesTschofenig 0:796d0f61a05b 225 ret = entropy_gather_internal( ctx );
HannesTschofenig 0:796d0f61a05b 226
HannesTschofenig 0:796d0f61a05b 227 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 228 if( polarssl_mutex_unlock( &ctx->mutex ) != 0 )
HannesTschofenig 0:796d0f61a05b 229 return( POLARSSL_ERR_THREADING_MUTEX_ERROR );
HannesTschofenig 0:796d0f61a05b 230 #endif
HannesTschofenig 0:796d0f61a05b 231
HannesTschofenig 0:796d0f61a05b 232 return( ret );
HannesTschofenig 0:796d0f61a05b 233 }
HannesTschofenig 0:796d0f61a05b 234
HannesTschofenig 0:796d0f61a05b 235 int entropy_func( void *data, unsigned char *output, size_t len )
HannesTschofenig 0:796d0f61a05b 236 {
HannesTschofenig 0:796d0f61a05b 237 int ret, count = 0, i, reached;
HannesTschofenig 0:796d0f61a05b 238 entropy_context *ctx = (entropy_context *) data;
HannesTschofenig 0:796d0f61a05b 239 unsigned char buf[ENTROPY_BLOCK_SIZE];
HannesTschofenig 0:796d0f61a05b 240
HannesTschofenig 0:796d0f61a05b 241 if( len > ENTROPY_BLOCK_SIZE )
HannesTschofenig 0:796d0f61a05b 242 return( POLARSSL_ERR_ENTROPY_SOURCE_FAILED );
HannesTschofenig 0:796d0f61a05b 243
HannesTschofenig 0:796d0f61a05b 244 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 245 if( ( ret = polarssl_mutex_lock( &ctx->mutex ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 246 return( ret );
HannesTschofenig 0:796d0f61a05b 247 #endif
HannesTschofenig 0:796d0f61a05b 248
HannesTschofenig 0:796d0f61a05b 249 /*
HannesTschofenig 0:796d0f61a05b 250 * Always gather extra entropy before a call
HannesTschofenig 0:796d0f61a05b 251 */
HannesTschofenig 0:796d0f61a05b 252 do
HannesTschofenig 0:796d0f61a05b 253 {
HannesTschofenig 0:796d0f61a05b 254 if( count++ > ENTROPY_MAX_LOOP )
HannesTschofenig 0:796d0f61a05b 255 {
HannesTschofenig 0:796d0f61a05b 256 ret = POLARSSL_ERR_ENTROPY_SOURCE_FAILED;
HannesTschofenig 0:796d0f61a05b 257 goto exit;
HannesTschofenig 0:796d0f61a05b 258 }
HannesTschofenig 0:796d0f61a05b 259
HannesTschofenig 0:796d0f61a05b 260 if( ( ret = entropy_gather_internal( ctx ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 261 goto exit;
HannesTschofenig 0:796d0f61a05b 262
HannesTschofenig 0:796d0f61a05b 263 reached = 0;
HannesTschofenig 0:796d0f61a05b 264
HannesTschofenig 0:796d0f61a05b 265 for( i = 0; i < ctx->source_count; i++ )
HannesTschofenig 0:796d0f61a05b 266 if( ctx->source[i].size >= ctx->source[i].threshold )
HannesTschofenig 0:796d0f61a05b 267 reached++;
HannesTschofenig 0:796d0f61a05b 268 }
HannesTschofenig 0:796d0f61a05b 269 while( reached != ctx->source_count );
HannesTschofenig 0:796d0f61a05b 270
HannesTschofenig 0:796d0f61a05b 271 memset( buf, 0, ENTROPY_BLOCK_SIZE );
HannesTschofenig 0:796d0f61a05b 272
HannesTschofenig 0:796d0f61a05b 273 #if defined(POLARSSL_ENTROPY_SHA512_ACCUMULATOR)
HannesTschofenig 0:796d0f61a05b 274 sha512_finish( &ctx->accumulator, buf );
HannesTschofenig 0:796d0f61a05b 275
HannesTschofenig 0:796d0f61a05b 276 /*
HannesTschofenig 0:796d0f61a05b 277 * Reset accumulator and counters and recycle existing entropy
HannesTschofenig 0:796d0f61a05b 278 */
HannesTschofenig 0:796d0f61a05b 279 memset( &ctx->accumulator, 0, sizeof( sha512_context ) );
HannesTschofenig 0:796d0f61a05b 280 sha512_starts( &ctx->accumulator, 0 );
HannesTschofenig 0:796d0f61a05b 281 sha512_update( &ctx->accumulator, buf, ENTROPY_BLOCK_SIZE );
HannesTschofenig 0:796d0f61a05b 282
HannesTschofenig 0:796d0f61a05b 283 /*
HannesTschofenig 0:796d0f61a05b 284 * Perform second SHA-512 on entropy
HannesTschofenig 0:796d0f61a05b 285 */
HannesTschofenig 0:796d0f61a05b 286 sha512( buf, ENTROPY_BLOCK_SIZE, buf, 0 );
HannesTschofenig 0:796d0f61a05b 287 #else /* POLARSSL_ENTROPY_SHA512_ACCUMULATOR */
HannesTschofenig 0:796d0f61a05b 288 sha256_finish( &ctx->accumulator, buf );
HannesTschofenig 0:796d0f61a05b 289
HannesTschofenig 0:796d0f61a05b 290 /*
HannesTschofenig 0:796d0f61a05b 291 * Reset accumulator and counters and recycle existing entropy
HannesTschofenig 0:796d0f61a05b 292 */
HannesTschofenig 0:796d0f61a05b 293 memset( &ctx->accumulator, 0, sizeof( sha256_context ) );
HannesTschofenig 0:796d0f61a05b 294 sha256_starts( &ctx->accumulator, 0 );
HannesTschofenig 0:796d0f61a05b 295 sha256_update( &ctx->accumulator, buf, ENTROPY_BLOCK_SIZE );
HannesTschofenig 0:796d0f61a05b 296
HannesTschofenig 0:796d0f61a05b 297 /*
HannesTschofenig 0:796d0f61a05b 298 * Perform second SHA-256 on entropy
HannesTschofenig 0:796d0f61a05b 299 */
HannesTschofenig 0:796d0f61a05b 300 sha256( buf, ENTROPY_BLOCK_SIZE, buf, 0 );
HannesTschofenig 0:796d0f61a05b 301 #endif /* POLARSSL_ENTROPY_SHA512_ACCUMULATOR */
HannesTschofenig 0:796d0f61a05b 302
HannesTschofenig 0:796d0f61a05b 303 for( i = 0; i < ctx->source_count; i++ )
HannesTschofenig 0:796d0f61a05b 304 ctx->source[i].size = 0;
HannesTschofenig 0:796d0f61a05b 305
HannesTschofenig 0:796d0f61a05b 306 memcpy( output, buf, len );
HannesTschofenig 0:796d0f61a05b 307
HannesTschofenig 0:796d0f61a05b 308 ret = 0;
HannesTschofenig 0:796d0f61a05b 309
HannesTschofenig 0:796d0f61a05b 310 exit:
HannesTschofenig 0:796d0f61a05b 311 #if defined(POLARSSL_THREADING_C)
HannesTschofenig 0:796d0f61a05b 312 if( polarssl_mutex_unlock( &ctx->mutex ) != 0 )
HannesTschofenig 0:796d0f61a05b 313 return( POLARSSL_ERR_THREADING_MUTEX_ERROR );
HannesTschofenig 0:796d0f61a05b 314 #endif
HannesTschofenig 0:796d0f61a05b 315
HannesTschofenig 0:796d0f61a05b 316 return( ret );
HannesTschofenig 0:796d0f61a05b 317 }
HannesTschofenig 0:796d0f61a05b 318
HannesTschofenig 0:796d0f61a05b 319 #if defined(POLARSSL_FS_IO)
HannesTschofenig 0:796d0f61a05b 320 int entropy_write_seed_file( entropy_context *ctx, const char *path )
HannesTschofenig 0:796d0f61a05b 321 {
HannesTschofenig 0:796d0f61a05b 322 int ret = POLARSSL_ERR_ENTROPY_FILE_IO_ERROR;
HannesTschofenig 0:796d0f61a05b 323 FILE *f;
HannesTschofenig 0:796d0f61a05b 324 unsigned char buf[ENTROPY_BLOCK_SIZE];
HannesTschofenig 0:796d0f61a05b 325
HannesTschofenig 0:796d0f61a05b 326 if( ( f = fopen( path, "wb" ) ) == NULL )
HannesTschofenig 0:796d0f61a05b 327 return( POLARSSL_ERR_ENTROPY_FILE_IO_ERROR );
HannesTschofenig 0:796d0f61a05b 328
HannesTschofenig 0:796d0f61a05b 329 if( ( ret = entropy_func( ctx, buf, ENTROPY_BLOCK_SIZE ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 330 goto exit;
HannesTschofenig 0:796d0f61a05b 331
HannesTschofenig 0:796d0f61a05b 332 if( fwrite( buf, 1, ENTROPY_BLOCK_SIZE, f ) != ENTROPY_BLOCK_SIZE )
HannesTschofenig 0:796d0f61a05b 333 {
HannesTschofenig 0:796d0f61a05b 334 ret = POLARSSL_ERR_ENTROPY_FILE_IO_ERROR;
HannesTschofenig 0:796d0f61a05b 335 goto exit;
HannesTschofenig 0:796d0f61a05b 336 }
HannesTschofenig 0:796d0f61a05b 337
HannesTschofenig 0:796d0f61a05b 338 ret = 0;
HannesTschofenig 0:796d0f61a05b 339
HannesTschofenig 0:796d0f61a05b 340 exit:
HannesTschofenig 0:796d0f61a05b 341 fclose( f );
HannesTschofenig 0:796d0f61a05b 342 return( ret );
HannesTschofenig 0:796d0f61a05b 343 }
HannesTschofenig 0:796d0f61a05b 344
HannesTschofenig 0:796d0f61a05b 345 int entropy_update_seed_file( entropy_context *ctx, const char *path )
HannesTschofenig 0:796d0f61a05b 346 {
HannesTschofenig 0:796d0f61a05b 347 FILE *f;
HannesTschofenig 0:796d0f61a05b 348 size_t n;
HannesTschofenig 0:796d0f61a05b 349 unsigned char buf[ ENTROPY_MAX_SEED_SIZE ];
HannesTschofenig 0:796d0f61a05b 350
HannesTschofenig 0:796d0f61a05b 351 if( ( f = fopen( path, "rb" ) ) == NULL )
HannesTschofenig 0:796d0f61a05b 352 return( POLARSSL_ERR_ENTROPY_FILE_IO_ERROR );
HannesTschofenig 0:796d0f61a05b 353
HannesTschofenig 0:796d0f61a05b 354 fseek( f, 0, SEEK_END );
HannesTschofenig 0:796d0f61a05b 355 n = (size_t) ftell( f );
HannesTschofenig 0:796d0f61a05b 356 fseek( f, 0, SEEK_SET );
HannesTschofenig 0:796d0f61a05b 357
HannesTschofenig 0:796d0f61a05b 358 if( n > ENTROPY_MAX_SEED_SIZE )
HannesTschofenig 0:796d0f61a05b 359 n = ENTROPY_MAX_SEED_SIZE;
HannesTschofenig 0:796d0f61a05b 360
HannesTschofenig 0:796d0f61a05b 361 if( fread( buf, 1, n, f ) != n )
HannesTschofenig 0:796d0f61a05b 362 {
HannesTschofenig 0:796d0f61a05b 363 fclose( f );
HannesTschofenig 0:796d0f61a05b 364 return( POLARSSL_ERR_ENTROPY_FILE_IO_ERROR );
HannesTschofenig 0:796d0f61a05b 365 }
HannesTschofenig 0:796d0f61a05b 366
HannesTschofenig 0:796d0f61a05b 367 fclose( f );
HannesTschofenig 0:796d0f61a05b 368
HannesTschofenig 0:796d0f61a05b 369 entropy_update_manual( ctx, buf, n );
HannesTschofenig 0:796d0f61a05b 370
HannesTschofenig 0:796d0f61a05b 371 return( entropy_write_seed_file( ctx, path ) );
HannesTschofenig 0:796d0f61a05b 372 }
HannesTschofenig 0:796d0f61a05b 373 #endif /* POLARSSL_FS_IO */
HannesTschofenig 0:796d0f61a05b 374
HannesTschofenig 0:796d0f61a05b 375 #endif /* POLARSSL_ENTROPY_C */
HannesTschofenig 0:796d0f61a05b 376
HannesTschofenig 0:796d0f61a05b 377