TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.

Dependencies:   mbed

Committer:
dflet
Date:
Fri Sep 11 15:38:33 2015 +0000
Revision:
1:e448e81c416f
Parent:
0:400d8e75a8d0
Removed some debud.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:400d8e75a8d0 1 /*
dflet 0:400d8e75a8d0 2 * FIPS-180-2 compliant SHA-256 implementation
dflet 0:400d8e75a8d0 3 *
dflet 0:400d8e75a8d0 4 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
dflet 0:400d8e75a8d0 5 *
dflet 0:400d8e75a8d0 6 * This file is part of mbed TLS (https://tls.mbed.org)
dflet 0:400d8e75a8d0 7 *
dflet 0:400d8e75a8d0 8 * This program is free software; you can redistribute it and/or modify
dflet 0:400d8e75a8d0 9 * it under the terms of the GNU General Public License as published by
dflet 0:400d8e75a8d0 10 * the Free Software Foundation; either version 2 of the License, or
dflet 0:400d8e75a8d0 11 * (at your option) any later version.
dflet 0:400d8e75a8d0 12 *
dflet 0:400d8e75a8d0 13 * This program is distributed in the hope that it will be useful,
dflet 0:400d8e75a8d0 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dflet 0:400d8e75a8d0 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dflet 0:400d8e75a8d0 16 * GNU General Public License for more details.
dflet 0:400d8e75a8d0 17 *
dflet 0:400d8e75a8d0 18 * You should have received a copy of the GNU General Public License along
dflet 0:400d8e75a8d0 19 * with this program; if not, write to the Free Software Foundation, Inc.,
dflet 0:400d8e75a8d0 20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
dflet 0:400d8e75a8d0 21 */
dflet 0:400d8e75a8d0 22 /*
dflet 0:400d8e75a8d0 23 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
dflet 0:400d8e75a8d0 24 *
dflet 0:400d8e75a8d0 25 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
dflet 0:400d8e75a8d0 26 */
dflet 0:400d8e75a8d0 27
dflet 0:400d8e75a8d0 28 #if !defined(POLARSSL_CONFIG_FILE)
dflet 0:400d8e75a8d0 29 #include "polarssl/config.h"
dflet 0:400d8e75a8d0 30 #else
dflet 0:400d8e75a8d0 31 #include POLARSSL_CONFIG_FILE
dflet 0:400d8e75a8d0 32 #endif
dflet 0:400d8e75a8d0 33
dflet 0:400d8e75a8d0 34 #if defined(POLARSSL_SHA256_C)
dflet 0:400d8e75a8d0 35
dflet 0:400d8e75a8d0 36 #include "polarssl/sha256.h"
dflet 0:400d8e75a8d0 37
dflet 0:400d8e75a8d0 38 #include <string.h>
dflet 0:400d8e75a8d0 39
dflet 0:400d8e75a8d0 40 #if defined(POLARSSL_FS_IO)
dflet 0:400d8e75a8d0 41 #include <stdio.h>
dflet 0:400d8e75a8d0 42 #endif
dflet 0:400d8e75a8d0 43
dflet 0:400d8e75a8d0 44 #if defined(POLARSSL_SELF_TEST)
dflet 0:400d8e75a8d0 45 #if defined(POLARSSL_PLATFORM_C)
dflet 0:400d8e75a8d0 46 #include "polarssl/platform.h"
dflet 0:400d8e75a8d0 47 #else
dflet 0:400d8e75a8d0 48 #include <stdio.h>
dflet 0:400d8e75a8d0 49 #define polarssl_printf printf
dflet 0:400d8e75a8d0 50 #endif /* POLARSSL_PLATFORM_C */
dflet 0:400d8e75a8d0 51 #endif /* POLARSSL_SELF_TEST */
dflet 0:400d8e75a8d0 52
dflet 0:400d8e75a8d0 53 /* Implementation that should never be optimized out by the compiler */
dflet 0:400d8e75a8d0 54 static void polarssl_zeroize( void *v, size_t n ) {
dflet 0:400d8e75a8d0 55 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
dflet 0:400d8e75a8d0 56 }
dflet 0:400d8e75a8d0 57
dflet 0:400d8e75a8d0 58 #if !defined(POLARSSL_SHA256_ALT)
dflet 0:400d8e75a8d0 59
dflet 0:400d8e75a8d0 60 /*
dflet 0:400d8e75a8d0 61 * 32-bit integer manipulation macros (big endian)
dflet 0:400d8e75a8d0 62 */
dflet 0:400d8e75a8d0 63 #ifndef GET_UINT32_BE
dflet 0:400d8e75a8d0 64 #define GET_UINT32_BE(n,b,i) \
dflet 0:400d8e75a8d0 65 { \
dflet 0:400d8e75a8d0 66 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
dflet 0:400d8e75a8d0 67 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
dflet 0:400d8e75a8d0 68 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
dflet 0:400d8e75a8d0 69 | ( (uint32_t) (b)[(i) + 3] ); \
dflet 0:400d8e75a8d0 70 }
dflet 0:400d8e75a8d0 71 #endif
dflet 0:400d8e75a8d0 72
dflet 0:400d8e75a8d0 73 #ifndef PUT_UINT32_BE
dflet 0:400d8e75a8d0 74 #define PUT_UINT32_BE(n,b,i) \
dflet 0:400d8e75a8d0 75 { \
dflet 0:400d8e75a8d0 76 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
dflet 0:400d8e75a8d0 77 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
dflet 0:400d8e75a8d0 78 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
dflet 0:400d8e75a8d0 79 (b)[(i) + 3] = (unsigned char) ( (n) ); \
dflet 0:400d8e75a8d0 80 }
dflet 0:400d8e75a8d0 81 #endif
dflet 0:400d8e75a8d0 82
dflet 0:400d8e75a8d0 83 void sha256_init( sha256_context *ctx )
dflet 0:400d8e75a8d0 84 {
dflet 0:400d8e75a8d0 85 memset( ctx, 0, sizeof( sha256_context ) );
dflet 0:400d8e75a8d0 86 }
dflet 0:400d8e75a8d0 87
dflet 0:400d8e75a8d0 88 void sha256_free( sha256_context *ctx )
dflet 0:400d8e75a8d0 89 {
dflet 0:400d8e75a8d0 90 if( ctx == NULL )
dflet 0:400d8e75a8d0 91 return;
dflet 0:400d8e75a8d0 92
dflet 0:400d8e75a8d0 93 polarssl_zeroize( ctx, sizeof( sha256_context ) );
dflet 0:400d8e75a8d0 94 }
dflet 0:400d8e75a8d0 95
dflet 0:400d8e75a8d0 96 /*
dflet 0:400d8e75a8d0 97 * SHA-256 context setup
dflet 0:400d8e75a8d0 98 */
dflet 0:400d8e75a8d0 99 void sha256_starts( sha256_context *ctx, int is224 )
dflet 0:400d8e75a8d0 100 {
dflet 0:400d8e75a8d0 101 ctx->total[0] = 0;
dflet 0:400d8e75a8d0 102 ctx->total[1] = 0;
dflet 0:400d8e75a8d0 103
dflet 0:400d8e75a8d0 104 if( is224 == 0 )
dflet 0:400d8e75a8d0 105 {
dflet 0:400d8e75a8d0 106 /* SHA-256 */
dflet 0:400d8e75a8d0 107 ctx->state[0] = 0x6A09E667;
dflet 0:400d8e75a8d0 108 ctx->state[1] = 0xBB67AE85;
dflet 0:400d8e75a8d0 109 ctx->state[2] = 0x3C6EF372;
dflet 0:400d8e75a8d0 110 ctx->state[3] = 0xA54FF53A;
dflet 0:400d8e75a8d0 111 ctx->state[4] = 0x510E527F;
dflet 0:400d8e75a8d0 112 ctx->state[5] = 0x9B05688C;
dflet 0:400d8e75a8d0 113 ctx->state[6] = 0x1F83D9AB;
dflet 0:400d8e75a8d0 114 ctx->state[7] = 0x5BE0CD19;
dflet 0:400d8e75a8d0 115 }
dflet 0:400d8e75a8d0 116 else
dflet 0:400d8e75a8d0 117 {
dflet 0:400d8e75a8d0 118 /* SHA-224 */
dflet 0:400d8e75a8d0 119 ctx->state[0] = 0xC1059ED8;
dflet 0:400d8e75a8d0 120 ctx->state[1] = 0x367CD507;
dflet 0:400d8e75a8d0 121 ctx->state[2] = 0x3070DD17;
dflet 0:400d8e75a8d0 122 ctx->state[3] = 0xF70E5939;
dflet 0:400d8e75a8d0 123 ctx->state[4] = 0xFFC00B31;
dflet 0:400d8e75a8d0 124 ctx->state[5] = 0x68581511;
dflet 0:400d8e75a8d0 125 ctx->state[6] = 0x64F98FA7;
dflet 0:400d8e75a8d0 126 ctx->state[7] = 0xBEFA4FA4;
dflet 0:400d8e75a8d0 127 }
dflet 0:400d8e75a8d0 128
dflet 0:400d8e75a8d0 129 ctx->is224 = is224;
dflet 0:400d8e75a8d0 130 }
dflet 0:400d8e75a8d0 131
dflet 0:400d8e75a8d0 132 void sha256_process( sha256_context *ctx, const unsigned char data[64] )
dflet 0:400d8e75a8d0 133 {
dflet 0:400d8e75a8d0 134 uint32_t temp1, temp2, W[64];
dflet 0:400d8e75a8d0 135 uint32_t A, B, C, D, E, F, G, H;
dflet 0:400d8e75a8d0 136
dflet 0:400d8e75a8d0 137 GET_UINT32_BE( W[ 0], data, 0 );
dflet 0:400d8e75a8d0 138 GET_UINT32_BE( W[ 1], data, 4 );
dflet 0:400d8e75a8d0 139 GET_UINT32_BE( W[ 2], data, 8 );
dflet 0:400d8e75a8d0 140 GET_UINT32_BE( W[ 3], data, 12 );
dflet 0:400d8e75a8d0 141 GET_UINT32_BE( W[ 4], data, 16 );
dflet 0:400d8e75a8d0 142 GET_UINT32_BE( W[ 5], data, 20 );
dflet 0:400d8e75a8d0 143 GET_UINT32_BE( W[ 6], data, 24 );
dflet 0:400d8e75a8d0 144 GET_UINT32_BE( W[ 7], data, 28 );
dflet 0:400d8e75a8d0 145 GET_UINT32_BE( W[ 8], data, 32 );
dflet 0:400d8e75a8d0 146 GET_UINT32_BE( W[ 9], data, 36 );
dflet 0:400d8e75a8d0 147 GET_UINT32_BE( W[10], data, 40 );
dflet 0:400d8e75a8d0 148 GET_UINT32_BE( W[11], data, 44 );
dflet 0:400d8e75a8d0 149 GET_UINT32_BE( W[12], data, 48 );
dflet 0:400d8e75a8d0 150 GET_UINT32_BE( W[13], data, 52 );
dflet 0:400d8e75a8d0 151 GET_UINT32_BE( W[14], data, 56 );
dflet 0:400d8e75a8d0 152 GET_UINT32_BE( W[15], data, 60 );
dflet 0:400d8e75a8d0 153
dflet 0:400d8e75a8d0 154 #define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
dflet 0:400d8e75a8d0 155 #define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
dflet 0:400d8e75a8d0 156
dflet 0:400d8e75a8d0 157 #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
dflet 0:400d8e75a8d0 158 #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
dflet 0:400d8e75a8d0 159
dflet 0:400d8e75a8d0 160 #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
dflet 0:400d8e75a8d0 161 #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
dflet 0:400d8e75a8d0 162
dflet 0:400d8e75a8d0 163 #define F0(x,y,z) ((x & y) | (z & (x | y)))
dflet 0:400d8e75a8d0 164 #define F1(x,y,z) (z ^ (x & (y ^ z)))
dflet 0:400d8e75a8d0 165
dflet 0:400d8e75a8d0 166 #define R(t) \
dflet 0:400d8e75a8d0 167 ( \
dflet 0:400d8e75a8d0 168 W[t] = S1(W[t - 2]) + W[t - 7] + \
dflet 0:400d8e75a8d0 169 S0(W[t - 15]) + W[t - 16] \
dflet 0:400d8e75a8d0 170 )
dflet 0:400d8e75a8d0 171
dflet 0:400d8e75a8d0 172 #define P(a,b,c,d,e,f,g,h,x,K) \
dflet 0:400d8e75a8d0 173 { \
dflet 0:400d8e75a8d0 174 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
dflet 0:400d8e75a8d0 175 temp2 = S2(a) + F0(a,b,c); \
dflet 0:400d8e75a8d0 176 d += temp1; h = temp1 + temp2; \
dflet 0:400d8e75a8d0 177 }
dflet 0:400d8e75a8d0 178
dflet 0:400d8e75a8d0 179 A = ctx->state[0];
dflet 0:400d8e75a8d0 180 B = ctx->state[1];
dflet 0:400d8e75a8d0 181 C = ctx->state[2];
dflet 0:400d8e75a8d0 182 D = ctx->state[3];
dflet 0:400d8e75a8d0 183 E = ctx->state[4];
dflet 0:400d8e75a8d0 184 F = ctx->state[5];
dflet 0:400d8e75a8d0 185 G = ctx->state[6];
dflet 0:400d8e75a8d0 186 H = ctx->state[7];
dflet 0:400d8e75a8d0 187
dflet 0:400d8e75a8d0 188 P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
dflet 0:400d8e75a8d0 189 P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
dflet 0:400d8e75a8d0 190 P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
dflet 0:400d8e75a8d0 191 P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
dflet 0:400d8e75a8d0 192 P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
dflet 0:400d8e75a8d0 193 P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
dflet 0:400d8e75a8d0 194 P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
dflet 0:400d8e75a8d0 195 P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
dflet 0:400d8e75a8d0 196 P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
dflet 0:400d8e75a8d0 197 P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
dflet 0:400d8e75a8d0 198 P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
dflet 0:400d8e75a8d0 199 P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
dflet 0:400d8e75a8d0 200 P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
dflet 0:400d8e75a8d0 201 P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
dflet 0:400d8e75a8d0 202 P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
dflet 0:400d8e75a8d0 203 P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
dflet 0:400d8e75a8d0 204 P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
dflet 0:400d8e75a8d0 205 P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
dflet 0:400d8e75a8d0 206 P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
dflet 0:400d8e75a8d0 207 P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
dflet 0:400d8e75a8d0 208 P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
dflet 0:400d8e75a8d0 209 P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
dflet 0:400d8e75a8d0 210 P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
dflet 0:400d8e75a8d0 211 P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
dflet 0:400d8e75a8d0 212 P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
dflet 0:400d8e75a8d0 213 P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
dflet 0:400d8e75a8d0 214 P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
dflet 0:400d8e75a8d0 215 P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
dflet 0:400d8e75a8d0 216 P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
dflet 0:400d8e75a8d0 217 P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
dflet 0:400d8e75a8d0 218 P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
dflet 0:400d8e75a8d0 219 P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
dflet 0:400d8e75a8d0 220 P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
dflet 0:400d8e75a8d0 221 P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
dflet 0:400d8e75a8d0 222 P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
dflet 0:400d8e75a8d0 223 P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
dflet 0:400d8e75a8d0 224 P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
dflet 0:400d8e75a8d0 225 P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
dflet 0:400d8e75a8d0 226 P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
dflet 0:400d8e75a8d0 227 P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
dflet 0:400d8e75a8d0 228 P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
dflet 0:400d8e75a8d0 229 P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
dflet 0:400d8e75a8d0 230 P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
dflet 0:400d8e75a8d0 231 P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
dflet 0:400d8e75a8d0 232 P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
dflet 0:400d8e75a8d0 233 P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
dflet 0:400d8e75a8d0 234 P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
dflet 0:400d8e75a8d0 235 P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
dflet 0:400d8e75a8d0 236 P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
dflet 0:400d8e75a8d0 237 P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
dflet 0:400d8e75a8d0 238 P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
dflet 0:400d8e75a8d0 239 P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
dflet 0:400d8e75a8d0 240 P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
dflet 0:400d8e75a8d0 241 P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
dflet 0:400d8e75a8d0 242 P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
dflet 0:400d8e75a8d0 243 P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
dflet 0:400d8e75a8d0 244 P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
dflet 0:400d8e75a8d0 245 P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
dflet 0:400d8e75a8d0 246 P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
dflet 0:400d8e75a8d0 247 P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
dflet 0:400d8e75a8d0 248 P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
dflet 0:400d8e75a8d0 249 P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
dflet 0:400d8e75a8d0 250 P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
dflet 0:400d8e75a8d0 251 P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
dflet 0:400d8e75a8d0 252
dflet 0:400d8e75a8d0 253 ctx->state[0] += A;
dflet 0:400d8e75a8d0 254 ctx->state[1] += B;
dflet 0:400d8e75a8d0 255 ctx->state[2] += C;
dflet 0:400d8e75a8d0 256 ctx->state[3] += D;
dflet 0:400d8e75a8d0 257 ctx->state[4] += E;
dflet 0:400d8e75a8d0 258 ctx->state[5] += F;
dflet 0:400d8e75a8d0 259 ctx->state[6] += G;
dflet 0:400d8e75a8d0 260 ctx->state[7] += H;
dflet 0:400d8e75a8d0 261 }
dflet 0:400d8e75a8d0 262
dflet 0:400d8e75a8d0 263 /*
dflet 0:400d8e75a8d0 264 * SHA-256 process buffer
dflet 0:400d8e75a8d0 265 */
dflet 0:400d8e75a8d0 266 void sha256_update( sha256_context *ctx, const unsigned char *input,
dflet 0:400d8e75a8d0 267 size_t ilen )
dflet 0:400d8e75a8d0 268 {
dflet 0:400d8e75a8d0 269 size_t fill;
dflet 0:400d8e75a8d0 270 uint32_t left;
dflet 0:400d8e75a8d0 271
dflet 0:400d8e75a8d0 272 if( ilen == 0 )
dflet 0:400d8e75a8d0 273 return;
dflet 0:400d8e75a8d0 274
dflet 0:400d8e75a8d0 275 left = ctx->total[0] & 0x3F;
dflet 0:400d8e75a8d0 276 fill = 64 - left;
dflet 0:400d8e75a8d0 277
dflet 0:400d8e75a8d0 278 ctx->total[0] += (uint32_t) ilen;
dflet 0:400d8e75a8d0 279 ctx->total[0] &= 0xFFFFFFFF;
dflet 0:400d8e75a8d0 280
dflet 0:400d8e75a8d0 281 if( ctx->total[0] < (uint32_t) ilen )
dflet 0:400d8e75a8d0 282 ctx->total[1]++;
dflet 0:400d8e75a8d0 283
dflet 0:400d8e75a8d0 284 if( left && ilen >= fill )
dflet 0:400d8e75a8d0 285 {
dflet 0:400d8e75a8d0 286 memcpy( (void *) (ctx->buffer + left), input, fill );
dflet 0:400d8e75a8d0 287 sha256_process( ctx, ctx->buffer );
dflet 0:400d8e75a8d0 288 input += fill;
dflet 0:400d8e75a8d0 289 ilen -= fill;
dflet 0:400d8e75a8d0 290 left = 0;
dflet 0:400d8e75a8d0 291 }
dflet 0:400d8e75a8d0 292
dflet 0:400d8e75a8d0 293 while( ilen >= 64 )
dflet 0:400d8e75a8d0 294 {
dflet 0:400d8e75a8d0 295 sha256_process( ctx, input );
dflet 0:400d8e75a8d0 296 input += 64;
dflet 0:400d8e75a8d0 297 ilen -= 64;
dflet 0:400d8e75a8d0 298 }
dflet 0:400d8e75a8d0 299
dflet 0:400d8e75a8d0 300 if( ilen > 0 )
dflet 0:400d8e75a8d0 301 memcpy( (void *) (ctx->buffer + left), input, ilen );
dflet 0:400d8e75a8d0 302 }
dflet 0:400d8e75a8d0 303
dflet 0:400d8e75a8d0 304 static const unsigned char sha256_padding[64] =
dflet 0:400d8e75a8d0 305 {
dflet 0:400d8e75a8d0 306 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:400d8e75a8d0 307 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:400d8e75a8d0 308 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:400d8e75a8d0 309 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
dflet 0:400d8e75a8d0 310 };
dflet 0:400d8e75a8d0 311
dflet 0:400d8e75a8d0 312 /*
dflet 0:400d8e75a8d0 313 * SHA-256 final digest
dflet 0:400d8e75a8d0 314 */
dflet 0:400d8e75a8d0 315 void sha256_finish( sha256_context *ctx, unsigned char output[32] )
dflet 0:400d8e75a8d0 316 {
dflet 0:400d8e75a8d0 317 uint32_t last, padn;
dflet 0:400d8e75a8d0 318 uint32_t high, low;
dflet 0:400d8e75a8d0 319 unsigned char msglen[8];
dflet 0:400d8e75a8d0 320
dflet 0:400d8e75a8d0 321 high = ( ctx->total[0] >> 29 )
dflet 0:400d8e75a8d0 322 | ( ctx->total[1] << 3 );
dflet 0:400d8e75a8d0 323 low = ( ctx->total[0] << 3 );
dflet 0:400d8e75a8d0 324
dflet 0:400d8e75a8d0 325 PUT_UINT32_BE( high, msglen, 0 );
dflet 0:400d8e75a8d0 326 PUT_UINT32_BE( low, msglen, 4 );
dflet 0:400d8e75a8d0 327
dflet 0:400d8e75a8d0 328 last = ctx->total[0] & 0x3F;
dflet 0:400d8e75a8d0 329 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
dflet 0:400d8e75a8d0 330
dflet 0:400d8e75a8d0 331 sha256_update( ctx, sha256_padding, padn );
dflet 0:400d8e75a8d0 332 sha256_update( ctx, msglen, 8 );
dflet 0:400d8e75a8d0 333
dflet 0:400d8e75a8d0 334 PUT_UINT32_BE( ctx->state[0], output, 0 );
dflet 0:400d8e75a8d0 335 PUT_UINT32_BE( ctx->state[1], output, 4 );
dflet 0:400d8e75a8d0 336 PUT_UINT32_BE( ctx->state[2], output, 8 );
dflet 0:400d8e75a8d0 337 PUT_UINT32_BE( ctx->state[3], output, 12 );
dflet 0:400d8e75a8d0 338 PUT_UINT32_BE( ctx->state[4], output, 16 );
dflet 0:400d8e75a8d0 339 PUT_UINT32_BE( ctx->state[5], output, 20 );
dflet 0:400d8e75a8d0 340 PUT_UINT32_BE( ctx->state[6], output, 24 );
dflet 0:400d8e75a8d0 341
dflet 0:400d8e75a8d0 342 if( ctx->is224 == 0 )
dflet 0:400d8e75a8d0 343 PUT_UINT32_BE( ctx->state[7], output, 28 );
dflet 0:400d8e75a8d0 344 }
dflet 0:400d8e75a8d0 345
dflet 0:400d8e75a8d0 346 #endif /* !POLARSSL_SHA256_ALT */
dflet 0:400d8e75a8d0 347
dflet 0:400d8e75a8d0 348 /*
dflet 0:400d8e75a8d0 349 * output = SHA-256( input buffer )
dflet 0:400d8e75a8d0 350 */
dflet 0:400d8e75a8d0 351 void sha256( const unsigned char *input, size_t ilen,
dflet 0:400d8e75a8d0 352 unsigned char output[32], int is224 )
dflet 0:400d8e75a8d0 353 {
dflet 0:400d8e75a8d0 354 sha256_context ctx;
dflet 0:400d8e75a8d0 355
dflet 0:400d8e75a8d0 356 sha256_init( &ctx );
dflet 0:400d8e75a8d0 357 sha256_starts( &ctx, is224 );
dflet 0:400d8e75a8d0 358 sha256_update( &ctx, input, ilen );
dflet 0:400d8e75a8d0 359 sha256_finish( &ctx, output );
dflet 0:400d8e75a8d0 360 sha256_free( &ctx );
dflet 0:400d8e75a8d0 361 }
dflet 0:400d8e75a8d0 362
dflet 0:400d8e75a8d0 363 #if defined(POLARSSL_FS_IO)
dflet 0:400d8e75a8d0 364 /*
dflet 0:400d8e75a8d0 365 * output = SHA-256( file contents )
dflet 0:400d8e75a8d0 366 */
dflet 0:400d8e75a8d0 367 int sha256_file( const char *path, unsigned char output[32], int is224 )
dflet 0:400d8e75a8d0 368 {
dflet 0:400d8e75a8d0 369 FILE *f;
dflet 0:400d8e75a8d0 370 size_t n;
dflet 0:400d8e75a8d0 371 sha256_context ctx;
dflet 0:400d8e75a8d0 372 unsigned char buf[1024];
dflet 0:400d8e75a8d0 373
dflet 0:400d8e75a8d0 374 if( ( f = fopen( path, "rb" ) ) == NULL )
dflet 0:400d8e75a8d0 375 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
dflet 0:400d8e75a8d0 376
dflet 0:400d8e75a8d0 377 sha256_init( &ctx );
dflet 0:400d8e75a8d0 378 sha256_starts( &ctx, is224 );
dflet 0:400d8e75a8d0 379
dflet 0:400d8e75a8d0 380 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
dflet 0:400d8e75a8d0 381 sha256_update( &ctx, buf, n );
dflet 0:400d8e75a8d0 382
dflet 0:400d8e75a8d0 383 sha256_finish( &ctx, output );
dflet 0:400d8e75a8d0 384 sha256_free( &ctx );
dflet 0:400d8e75a8d0 385
dflet 0:400d8e75a8d0 386 if( ferror( f ) != 0 )
dflet 0:400d8e75a8d0 387 {
dflet 0:400d8e75a8d0 388 fclose( f );
dflet 0:400d8e75a8d0 389 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
dflet 0:400d8e75a8d0 390 }
dflet 0:400d8e75a8d0 391
dflet 0:400d8e75a8d0 392 fclose( f );
dflet 0:400d8e75a8d0 393 return( 0 );
dflet 0:400d8e75a8d0 394 }
dflet 0:400d8e75a8d0 395 #endif /* POLARSSL_FS_IO */
dflet 0:400d8e75a8d0 396
dflet 0:400d8e75a8d0 397 /*
dflet 0:400d8e75a8d0 398 * SHA-256 HMAC context setup
dflet 0:400d8e75a8d0 399 */
dflet 0:400d8e75a8d0 400 void sha256_hmac_starts( sha256_context *ctx, const unsigned char *key,
dflet 0:400d8e75a8d0 401 size_t keylen, int is224 )
dflet 0:400d8e75a8d0 402 {
dflet 0:400d8e75a8d0 403 size_t i;
dflet 0:400d8e75a8d0 404 unsigned char sum[32];
dflet 0:400d8e75a8d0 405
dflet 0:400d8e75a8d0 406 if( keylen > 64 )
dflet 0:400d8e75a8d0 407 {
dflet 0:400d8e75a8d0 408 sha256( key, keylen, sum, is224 );
dflet 0:400d8e75a8d0 409 keylen = ( is224 ) ? 28 : 32;
dflet 0:400d8e75a8d0 410 key = sum;
dflet 0:400d8e75a8d0 411 }
dflet 0:400d8e75a8d0 412
dflet 0:400d8e75a8d0 413 memset( ctx->ipad, 0x36, 64 );
dflet 0:400d8e75a8d0 414 memset( ctx->opad, 0x5C, 64 );
dflet 0:400d8e75a8d0 415
dflet 0:400d8e75a8d0 416 for( i = 0; i < keylen; i++ )
dflet 0:400d8e75a8d0 417 {
dflet 0:400d8e75a8d0 418 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
dflet 0:400d8e75a8d0 419 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
dflet 0:400d8e75a8d0 420 }
dflet 0:400d8e75a8d0 421
dflet 0:400d8e75a8d0 422 sha256_starts( ctx, is224 );
dflet 0:400d8e75a8d0 423 sha256_update( ctx, ctx->ipad, 64 );
dflet 0:400d8e75a8d0 424
dflet 0:400d8e75a8d0 425 polarssl_zeroize( sum, sizeof( sum ) );
dflet 0:400d8e75a8d0 426 }
dflet 0:400d8e75a8d0 427
dflet 0:400d8e75a8d0 428 /*
dflet 0:400d8e75a8d0 429 * SHA-256 HMAC process buffer
dflet 0:400d8e75a8d0 430 */
dflet 0:400d8e75a8d0 431 void sha256_hmac_update( sha256_context *ctx, const unsigned char *input,
dflet 0:400d8e75a8d0 432 size_t ilen )
dflet 0:400d8e75a8d0 433 {
dflet 0:400d8e75a8d0 434 sha256_update( ctx, input, ilen );
dflet 0:400d8e75a8d0 435 }
dflet 0:400d8e75a8d0 436
dflet 0:400d8e75a8d0 437 /*
dflet 0:400d8e75a8d0 438 * SHA-256 HMAC final digest
dflet 0:400d8e75a8d0 439 */
dflet 0:400d8e75a8d0 440 void sha256_hmac_finish( sha256_context *ctx, unsigned char output[32] )
dflet 0:400d8e75a8d0 441 {
dflet 0:400d8e75a8d0 442 int is224, hlen;
dflet 0:400d8e75a8d0 443 unsigned char tmpbuf[32];
dflet 0:400d8e75a8d0 444
dflet 0:400d8e75a8d0 445 is224 = ctx->is224;
dflet 0:400d8e75a8d0 446 hlen = ( is224 == 0 ) ? 32 : 28;
dflet 0:400d8e75a8d0 447
dflet 0:400d8e75a8d0 448 sha256_finish( ctx, tmpbuf );
dflet 0:400d8e75a8d0 449 sha256_starts( ctx, is224 );
dflet 0:400d8e75a8d0 450 sha256_update( ctx, ctx->opad, 64 );
dflet 0:400d8e75a8d0 451 sha256_update( ctx, tmpbuf, hlen );
dflet 0:400d8e75a8d0 452 sha256_finish( ctx, output );
dflet 0:400d8e75a8d0 453
dflet 0:400d8e75a8d0 454 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
dflet 0:400d8e75a8d0 455 }
dflet 0:400d8e75a8d0 456
dflet 0:400d8e75a8d0 457 /*
dflet 0:400d8e75a8d0 458 * SHA-256 HMAC context reset
dflet 0:400d8e75a8d0 459 */
dflet 0:400d8e75a8d0 460 void sha256_hmac_reset( sha256_context *ctx )
dflet 0:400d8e75a8d0 461 {
dflet 0:400d8e75a8d0 462 sha256_starts( ctx, ctx->is224 );
dflet 0:400d8e75a8d0 463 sha256_update( ctx, ctx->ipad, 64 );
dflet 0:400d8e75a8d0 464 }
dflet 0:400d8e75a8d0 465
dflet 0:400d8e75a8d0 466 /*
dflet 0:400d8e75a8d0 467 * output = HMAC-SHA-256( hmac key, input buffer )
dflet 0:400d8e75a8d0 468 */
dflet 0:400d8e75a8d0 469 void sha256_hmac( const unsigned char *key, size_t keylen,
dflet 0:400d8e75a8d0 470 const unsigned char *input, size_t ilen,
dflet 0:400d8e75a8d0 471 unsigned char output[32], int is224 )
dflet 0:400d8e75a8d0 472 {
dflet 0:400d8e75a8d0 473 sha256_context ctx;
dflet 0:400d8e75a8d0 474
dflet 0:400d8e75a8d0 475 sha256_init( &ctx );
dflet 0:400d8e75a8d0 476 sha256_hmac_starts( &ctx, key, keylen, is224 );
dflet 0:400d8e75a8d0 477 sha256_hmac_update( &ctx, input, ilen );
dflet 0:400d8e75a8d0 478 sha256_hmac_finish( &ctx, output );
dflet 0:400d8e75a8d0 479 sha256_free( &ctx );
dflet 0:400d8e75a8d0 480 }
dflet 0:400d8e75a8d0 481
dflet 0:400d8e75a8d0 482 #if defined(POLARSSL_SELF_TEST)
dflet 0:400d8e75a8d0 483 /*
dflet 0:400d8e75a8d0 484 * FIPS-180-2 test vectors
dflet 0:400d8e75a8d0 485 */
dflet 0:400d8e75a8d0 486 static const unsigned char sha256_test_buf[3][57] =
dflet 0:400d8e75a8d0 487 {
dflet 0:400d8e75a8d0 488 { "abc" },
dflet 0:400d8e75a8d0 489 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
dflet 0:400d8e75a8d0 490 { "" }
dflet 0:400d8e75a8d0 491 };
dflet 0:400d8e75a8d0 492
dflet 0:400d8e75a8d0 493 static const int sha256_test_buflen[3] =
dflet 0:400d8e75a8d0 494 {
dflet 0:400d8e75a8d0 495 3, 56, 1000
dflet 0:400d8e75a8d0 496 };
dflet 0:400d8e75a8d0 497
dflet 0:400d8e75a8d0 498 static const unsigned char sha256_test_sum[6][32] =
dflet 0:400d8e75a8d0 499 {
dflet 0:400d8e75a8d0 500 /*
dflet 0:400d8e75a8d0 501 * SHA-224 test vectors
dflet 0:400d8e75a8d0 502 */
dflet 0:400d8e75a8d0 503 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
dflet 0:400d8e75a8d0 504 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
dflet 0:400d8e75a8d0 505 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
dflet 0:400d8e75a8d0 506 0xE3, 0x6C, 0x9D, 0xA7 },
dflet 0:400d8e75a8d0 507 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
dflet 0:400d8e75a8d0 508 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
dflet 0:400d8e75a8d0 509 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
dflet 0:400d8e75a8d0 510 0x52, 0x52, 0x25, 0x25 },
dflet 0:400d8e75a8d0 511 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
dflet 0:400d8e75a8d0 512 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
dflet 0:400d8e75a8d0 513 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
dflet 0:400d8e75a8d0 514 0x4E, 0xE7, 0xAD, 0x67 },
dflet 0:400d8e75a8d0 515
dflet 0:400d8e75a8d0 516 /*
dflet 0:400d8e75a8d0 517 * SHA-256 test vectors
dflet 0:400d8e75a8d0 518 */
dflet 0:400d8e75a8d0 519 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
dflet 0:400d8e75a8d0 520 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
dflet 0:400d8e75a8d0 521 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
dflet 0:400d8e75a8d0 522 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
dflet 0:400d8e75a8d0 523 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
dflet 0:400d8e75a8d0 524 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
dflet 0:400d8e75a8d0 525 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
dflet 0:400d8e75a8d0 526 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
dflet 0:400d8e75a8d0 527 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
dflet 0:400d8e75a8d0 528 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
dflet 0:400d8e75a8d0 529 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
dflet 0:400d8e75a8d0 530 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
dflet 0:400d8e75a8d0 531 };
dflet 0:400d8e75a8d0 532
dflet 0:400d8e75a8d0 533 /*
dflet 0:400d8e75a8d0 534 * RFC 4231 test vectors
dflet 0:400d8e75a8d0 535 */
dflet 0:400d8e75a8d0 536 static const unsigned char sha256_hmac_test_key[7][26] =
dflet 0:400d8e75a8d0 537 {
dflet 0:400d8e75a8d0 538 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
dflet 0:400d8e75a8d0 539 "\x0B\x0B\x0B\x0B" },
dflet 0:400d8e75a8d0 540 { "Jefe" },
dflet 0:400d8e75a8d0 541 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
dflet 0:400d8e75a8d0 542 "\xAA\xAA\xAA\xAA" },
dflet 0:400d8e75a8d0 543 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
dflet 0:400d8e75a8d0 544 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
dflet 0:400d8e75a8d0 545 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
dflet 0:400d8e75a8d0 546 "\x0C\x0C\x0C\x0C" },
dflet 0:400d8e75a8d0 547 { "" }, /* 0xAA 131 times */
dflet 0:400d8e75a8d0 548 { "" }
dflet 0:400d8e75a8d0 549 };
dflet 0:400d8e75a8d0 550
dflet 0:400d8e75a8d0 551 static const int sha256_hmac_test_keylen[7] =
dflet 0:400d8e75a8d0 552 {
dflet 0:400d8e75a8d0 553 20, 4, 20, 25, 20, 131, 131
dflet 0:400d8e75a8d0 554 };
dflet 0:400d8e75a8d0 555
dflet 0:400d8e75a8d0 556 static const unsigned char sha256_hmac_test_buf[7][153] =
dflet 0:400d8e75a8d0 557 {
dflet 0:400d8e75a8d0 558 { "Hi There" },
dflet 0:400d8e75a8d0 559 { "what do ya want for nothing?" },
dflet 0:400d8e75a8d0 560 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
dflet 0:400d8e75a8d0 561 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
dflet 0:400d8e75a8d0 562 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
dflet 0:400d8e75a8d0 563 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
dflet 0:400d8e75a8d0 564 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
dflet 0:400d8e75a8d0 565 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
dflet 0:400d8e75a8d0 566 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
dflet 0:400d8e75a8d0 567 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
dflet 0:400d8e75a8d0 568 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
dflet 0:400d8e75a8d0 569 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
dflet 0:400d8e75a8d0 570 { "Test With Truncation" },
dflet 0:400d8e75a8d0 571 { "Test Using Larger Than Block-Size Key - Hash Key First" },
dflet 0:400d8e75a8d0 572 { "This is a test using a larger than block-size key "
dflet 0:400d8e75a8d0 573 "and a larger than block-size data. The key needs to "
dflet 0:400d8e75a8d0 574 "be hashed before being used by the HMAC algorithm." }
dflet 0:400d8e75a8d0 575 };
dflet 0:400d8e75a8d0 576
dflet 0:400d8e75a8d0 577 static const int sha256_hmac_test_buflen[7] =
dflet 0:400d8e75a8d0 578 {
dflet 0:400d8e75a8d0 579 8, 28, 50, 50, 20, 54, 152
dflet 0:400d8e75a8d0 580 };
dflet 0:400d8e75a8d0 581
dflet 0:400d8e75a8d0 582 static const unsigned char sha256_hmac_test_sum[14][32] =
dflet 0:400d8e75a8d0 583 {
dflet 0:400d8e75a8d0 584 /*
dflet 0:400d8e75a8d0 585 * HMAC-SHA-224 test vectors
dflet 0:400d8e75a8d0 586 */
dflet 0:400d8e75a8d0 587 { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19,
dflet 0:400d8e75a8d0 588 0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F,
dflet 0:400d8e75a8d0 589 0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F,
dflet 0:400d8e75a8d0 590 0x53, 0x68, 0x4B, 0x22 },
dflet 0:400d8e75a8d0 591 { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF,
dflet 0:400d8e75a8d0 592 0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F,
dflet 0:400d8e75a8d0 593 0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00,
dflet 0:400d8e75a8d0 594 0x8F, 0xD0, 0x5E, 0x44 },
dflet 0:400d8e75a8d0 595 { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6,
dflet 0:400d8e75a8d0 596 0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64,
dflet 0:400d8e75a8d0 597 0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1,
dflet 0:400d8e75a8d0 598 0xEC, 0x83, 0x33, 0xEA },
dflet 0:400d8e75a8d0 599 { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC,
dflet 0:400d8e75a8d0 600 0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C,
dflet 0:400d8e75a8d0 601 0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D,
dflet 0:400d8e75a8d0 602 0xE7, 0xAF, 0xEC, 0x5A },
dflet 0:400d8e75a8d0 603 { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37,
dflet 0:400d8e75a8d0 604 0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 },
dflet 0:400d8e75a8d0 605 { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD,
dflet 0:400d8e75a8d0 606 0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2,
dflet 0:400d8e75a8d0 607 0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27,
dflet 0:400d8e75a8d0 608 0x3F, 0xA6, 0x87, 0x0E },
dflet 0:400d8e75a8d0 609 { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02,
dflet 0:400d8e75a8d0 610 0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD,
dflet 0:400d8e75a8d0 611 0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9,
dflet 0:400d8e75a8d0 612 0xF6, 0xF5, 0x65, 0xD1 },
dflet 0:400d8e75a8d0 613
dflet 0:400d8e75a8d0 614 /*
dflet 0:400d8e75a8d0 615 * HMAC-SHA-256 test vectors
dflet 0:400d8e75a8d0 616 */
dflet 0:400d8e75a8d0 617 { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53,
dflet 0:400d8e75a8d0 618 0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B,
dflet 0:400d8e75a8d0 619 0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7,
dflet 0:400d8e75a8d0 620 0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 },
dflet 0:400d8e75a8d0 621 { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E,
dflet 0:400d8e75a8d0 622 0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7,
dflet 0:400d8e75a8d0 623 0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83,
dflet 0:400d8e75a8d0 624 0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 },
dflet 0:400d8e75a8d0 625 { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46,
dflet 0:400d8e75a8d0 626 0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7,
dflet 0:400d8e75a8d0 627 0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22,
dflet 0:400d8e75a8d0 628 0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE },
dflet 0:400d8e75a8d0 629 { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E,
dflet 0:400d8e75a8d0 630 0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A,
dflet 0:400d8e75a8d0 631 0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07,
dflet 0:400d8e75a8d0 632 0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B },
dflet 0:400d8e75a8d0 633 { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0,
dflet 0:400d8e75a8d0 634 0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B },
dflet 0:400d8e75a8d0 635 { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F,
dflet 0:400d8e75a8d0 636 0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F,
dflet 0:400d8e75a8d0 637 0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14,
dflet 0:400d8e75a8d0 638 0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 },
dflet 0:400d8e75a8d0 639 { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB,
dflet 0:400d8e75a8d0 640 0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44,
dflet 0:400d8e75a8d0 641 0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93,
dflet 0:400d8e75a8d0 642 0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 }
dflet 0:400d8e75a8d0 643 };
dflet 0:400d8e75a8d0 644
dflet 0:400d8e75a8d0 645 /*
dflet 0:400d8e75a8d0 646 * Checkup routine
dflet 0:400d8e75a8d0 647 */
dflet 0:400d8e75a8d0 648 int sha256_self_test( int verbose )
dflet 0:400d8e75a8d0 649 {
dflet 0:400d8e75a8d0 650 int i, j, k, buflen, ret = 0;
dflet 0:400d8e75a8d0 651 unsigned char buf[1024];
dflet 0:400d8e75a8d0 652 unsigned char sha256sum[32];
dflet 0:400d8e75a8d0 653 sha256_context ctx;
dflet 0:400d8e75a8d0 654
dflet 0:400d8e75a8d0 655 sha256_init( &ctx );
dflet 0:400d8e75a8d0 656
dflet 0:400d8e75a8d0 657 for( i = 0; i < 6; i++ )
dflet 0:400d8e75a8d0 658 {
dflet 0:400d8e75a8d0 659 j = i % 3;
dflet 0:400d8e75a8d0 660 k = i < 3;
dflet 0:400d8e75a8d0 661
dflet 0:400d8e75a8d0 662 if( verbose != 0 )
dflet 0:400d8e75a8d0 663 polarssl_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
dflet 0:400d8e75a8d0 664
dflet 0:400d8e75a8d0 665 sha256_starts( &ctx, k );
dflet 0:400d8e75a8d0 666
dflet 0:400d8e75a8d0 667 if( j == 2 )
dflet 0:400d8e75a8d0 668 {
dflet 0:400d8e75a8d0 669 memset( buf, 'a', buflen = 1000 );
dflet 0:400d8e75a8d0 670
dflet 0:400d8e75a8d0 671 for( j = 0; j < 1000; j++ )
dflet 0:400d8e75a8d0 672 sha256_update( &ctx, buf, buflen );
dflet 0:400d8e75a8d0 673 }
dflet 0:400d8e75a8d0 674 else
dflet 0:400d8e75a8d0 675 sha256_update( &ctx, sha256_test_buf[j],
dflet 0:400d8e75a8d0 676 sha256_test_buflen[j] );
dflet 0:400d8e75a8d0 677
dflet 0:400d8e75a8d0 678 sha256_finish( &ctx, sha256sum );
dflet 0:400d8e75a8d0 679
dflet 0:400d8e75a8d0 680 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
dflet 0:400d8e75a8d0 681 {
dflet 0:400d8e75a8d0 682 if( verbose != 0 )
dflet 0:400d8e75a8d0 683 polarssl_printf( "failed\n" );
dflet 0:400d8e75a8d0 684
dflet 0:400d8e75a8d0 685 ret = 1;
dflet 0:400d8e75a8d0 686 goto exit;
dflet 0:400d8e75a8d0 687 }
dflet 0:400d8e75a8d0 688
dflet 0:400d8e75a8d0 689 if( verbose != 0 )
dflet 0:400d8e75a8d0 690 polarssl_printf( "passed\n" );
dflet 0:400d8e75a8d0 691 }
dflet 0:400d8e75a8d0 692
dflet 0:400d8e75a8d0 693 if( verbose != 0 )
dflet 0:400d8e75a8d0 694 polarssl_printf( "\n" );
dflet 0:400d8e75a8d0 695
dflet 0:400d8e75a8d0 696 for( i = 0; i < 14; i++ )
dflet 0:400d8e75a8d0 697 {
dflet 0:400d8e75a8d0 698 j = i % 7;
dflet 0:400d8e75a8d0 699 k = i < 7;
dflet 0:400d8e75a8d0 700
dflet 0:400d8e75a8d0 701 if( verbose != 0 )
dflet 0:400d8e75a8d0 702 polarssl_printf( " HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 );
dflet 0:400d8e75a8d0 703
dflet 0:400d8e75a8d0 704 if( j == 5 || j == 6 )
dflet 0:400d8e75a8d0 705 {
dflet 0:400d8e75a8d0 706 memset( buf, 0xAA, buflen = 131 );
dflet 0:400d8e75a8d0 707 sha256_hmac_starts( &ctx, buf, buflen, k );
dflet 0:400d8e75a8d0 708 }
dflet 0:400d8e75a8d0 709 else
dflet 0:400d8e75a8d0 710 sha256_hmac_starts( &ctx, sha256_hmac_test_key[j],
dflet 0:400d8e75a8d0 711 sha256_hmac_test_keylen[j], k );
dflet 0:400d8e75a8d0 712
dflet 0:400d8e75a8d0 713 sha256_hmac_update( &ctx, sha256_hmac_test_buf[j],
dflet 0:400d8e75a8d0 714 sha256_hmac_test_buflen[j] );
dflet 0:400d8e75a8d0 715
dflet 0:400d8e75a8d0 716 sha256_hmac_finish( &ctx, sha256sum );
dflet 0:400d8e75a8d0 717
dflet 0:400d8e75a8d0 718 buflen = ( j == 4 ) ? 16 : 32 - k * 4;
dflet 0:400d8e75a8d0 719
dflet 0:400d8e75a8d0 720 if( memcmp( sha256sum, sha256_hmac_test_sum[i], buflen ) != 0 )
dflet 0:400d8e75a8d0 721 {
dflet 0:400d8e75a8d0 722 if( verbose != 0 )
dflet 0:400d8e75a8d0 723 polarssl_printf( "failed\n" );
dflet 0:400d8e75a8d0 724
dflet 0:400d8e75a8d0 725 ret = 1;
dflet 0:400d8e75a8d0 726 goto exit;
dflet 0:400d8e75a8d0 727 }
dflet 0:400d8e75a8d0 728
dflet 0:400d8e75a8d0 729 if( verbose != 0 )
dflet 0:400d8e75a8d0 730 polarssl_printf( "passed\n" );
dflet 0:400d8e75a8d0 731 }
dflet 0:400d8e75a8d0 732
dflet 0:400d8e75a8d0 733 if( verbose != 0 )
dflet 0:400d8e75a8d0 734 polarssl_printf( "\n" );
dflet 0:400d8e75a8d0 735
dflet 0:400d8e75a8d0 736 exit:
dflet 0:400d8e75a8d0 737 sha256_free( &ctx );
dflet 0:400d8e75a8d0 738
dflet 0:400d8e75a8d0 739 return( ret );
dflet 0:400d8e75a8d0 740 }
dflet 0:400d8e75a8d0 741
dflet 0:400d8e75a8d0 742 #endif /* POLARSSL_SELF_TEST */
dflet 0:400d8e75a8d0 743
dflet 0:400d8e75a8d0 744 #endif /* POLARSSL_SHA256_C */
dflet 0:400d8e75a8d0 745