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-384/512 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-512 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_SHA512_C)
dflet 0:400d8e75a8d0 35
dflet 0:400d8e75a8d0 36 #include "polarssl/sha512.h"
dflet 0:400d8e75a8d0 37
dflet 0:400d8e75a8d0 38 #if defined(_MSC_VER) || defined(__WATCOMC__)
dflet 0:400d8e75a8d0 39 #define UL64(x) x##ui64
dflet 0:400d8e75a8d0 40 #else
dflet 0:400d8e75a8d0 41 #define UL64(x) x##ULL
dflet 0:400d8e75a8d0 42 #endif
dflet 0:400d8e75a8d0 43
dflet 0:400d8e75a8d0 44 #include <string.h>
dflet 0:400d8e75a8d0 45
dflet 0:400d8e75a8d0 46 #if defined(POLARSSL_FS_IO)
dflet 0:400d8e75a8d0 47 #include <stdio.h>
dflet 0:400d8e75a8d0 48 #endif
dflet 0:400d8e75a8d0 49
dflet 0:400d8e75a8d0 50 #if defined(POLARSSL_SELF_TEST)
dflet 0:400d8e75a8d0 51 #if defined(POLARSSL_PLATFORM_C)
dflet 0:400d8e75a8d0 52 #include "polarssl/platform.h"
dflet 0:400d8e75a8d0 53 #else
dflet 0:400d8e75a8d0 54 #include <stdio.h>
dflet 0:400d8e75a8d0 55 #define polarssl_printf printf
dflet 0:400d8e75a8d0 56 #endif /* POLARSSL_PLATFORM_C */
dflet 0:400d8e75a8d0 57 #endif /* POLARSSL_SELF_TEST */
dflet 0:400d8e75a8d0 58
dflet 0:400d8e75a8d0 59 /* Implementation that should never be optimized out by the compiler */
dflet 0:400d8e75a8d0 60 static void polarssl_zeroize( void *v, size_t n ) {
dflet 0:400d8e75a8d0 61 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
dflet 0:400d8e75a8d0 62 }
dflet 0:400d8e75a8d0 63
dflet 0:400d8e75a8d0 64 #if !defined(POLARSSL_SHA512_ALT)
dflet 0:400d8e75a8d0 65
dflet 0:400d8e75a8d0 66 /*
dflet 0:400d8e75a8d0 67 * 64-bit integer manipulation macros (big endian)
dflet 0:400d8e75a8d0 68 */
dflet 0:400d8e75a8d0 69 #ifndef GET_UINT64_BE
dflet 0:400d8e75a8d0 70 #define GET_UINT64_BE(n,b,i) \
dflet 0:400d8e75a8d0 71 { \
dflet 0:400d8e75a8d0 72 (n) = ( (uint64_t) (b)[(i) ] << 56 ) \
dflet 0:400d8e75a8d0 73 | ( (uint64_t) (b)[(i) + 1] << 48 ) \
dflet 0:400d8e75a8d0 74 | ( (uint64_t) (b)[(i) + 2] << 40 ) \
dflet 0:400d8e75a8d0 75 | ( (uint64_t) (b)[(i) + 3] << 32 ) \
dflet 0:400d8e75a8d0 76 | ( (uint64_t) (b)[(i) + 4] << 24 ) \
dflet 0:400d8e75a8d0 77 | ( (uint64_t) (b)[(i) + 5] << 16 ) \
dflet 0:400d8e75a8d0 78 | ( (uint64_t) (b)[(i) + 6] << 8 ) \
dflet 0:400d8e75a8d0 79 | ( (uint64_t) (b)[(i) + 7] ); \
dflet 0:400d8e75a8d0 80 }
dflet 0:400d8e75a8d0 81 #endif /* GET_UINT64_BE */
dflet 0:400d8e75a8d0 82
dflet 0:400d8e75a8d0 83 #ifndef PUT_UINT64_BE
dflet 0:400d8e75a8d0 84 #define PUT_UINT64_BE(n,b,i) \
dflet 0:400d8e75a8d0 85 { \
dflet 0:400d8e75a8d0 86 (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \
dflet 0:400d8e75a8d0 87 (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \
dflet 0:400d8e75a8d0 88 (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \
dflet 0:400d8e75a8d0 89 (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \
dflet 0:400d8e75a8d0 90 (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \
dflet 0:400d8e75a8d0 91 (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \
dflet 0:400d8e75a8d0 92 (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \
dflet 0:400d8e75a8d0 93 (b)[(i) + 7] = (unsigned char) ( (n) ); \
dflet 0:400d8e75a8d0 94 }
dflet 0:400d8e75a8d0 95 #endif /* PUT_UINT64_BE */
dflet 0:400d8e75a8d0 96
dflet 0:400d8e75a8d0 97 /*
dflet 0:400d8e75a8d0 98 * Round constants
dflet 0:400d8e75a8d0 99 */
dflet 0:400d8e75a8d0 100 static const uint64_t K[80] =
dflet 0:400d8e75a8d0 101 {
dflet 0:400d8e75a8d0 102 UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
dflet 0:400d8e75a8d0 103 UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
dflet 0:400d8e75a8d0 104 UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
dflet 0:400d8e75a8d0 105 UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
dflet 0:400d8e75a8d0 106 UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
dflet 0:400d8e75a8d0 107 UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
dflet 0:400d8e75a8d0 108 UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
dflet 0:400d8e75a8d0 109 UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
dflet 0:400d8e75a8d0 110 UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
dflet 0:400d8e75a8d0 111 UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
dflet 0:400d8e75a8d0 112 UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
dflet 0:400d8e75a8d0 113 UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
dflet 0:400d8e75a8d0 114 UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
dflet 0:400d8e75a8d0 115 UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
dflet 0:400d8e75a8d0 116 UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
dflet 0:400d8e75a8d0 117 UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
dflet 0:400d8e75a8d0 118 UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
dflet 0:400d8e75a8d0 119 UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
dflet 0:400d8e75a8d0 120 UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
dflet 0:400d8e75a8d0 121 UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
dflet 0:400d8e75a8d0 122 UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
dflet 0:400d8e75a8d0 123 UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
dflet 0:400d8e75a8d0 124 UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
dflet 0:400d8e75a8d0 125 UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
dflet 0:400d8e75a8d0 126 UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
dflet 0:400d8e75a8d0 127 UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
dflet 0:400d8e75a8d0 128 UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
dflet 0:400d8e75a8d0 129 UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
dflet 0:400d8e75a8d0 130 UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
dflet 0:400d8e75a8d0 131 UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
dflet 0:400d8e75a8d0 132 UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
dflet 0:400d8e75a8d0 133 UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
dflet 0:400d8e75a8d0 134 UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
dflet 0:400d8e75a8d0 135 UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
dflet 0:400d8e75a8d0 136 UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
dflet 0:400d8e75a8d0 137 UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
dflet 0:400d8e75a8d0 138 UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
dflet 0:400d8e75a8d0 139 UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
dflet 0:400d8e75a8d0 140 UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
dflet 0:400d8e75a8d0 141 UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
dflet 0:400d8e75a8d0 142 };
dflet 0:400d8e75a8d0 143
dflet 0:400d8e75a8d0 144 void sha512_init( sha512_context *ctx )
dflet 0:400d8e75a8d0 145 {
dflet 0:400d8e75a8d0 146 memset( ctx, 0, sizeof( sha512_context ) );
dflet 0:400d8e75a8d0 147 }
dflet 0:400d8e75a8d0 148
dflet 0:400d8e75a8d0 149 void sha512_free( sha512_context *ctx )
dflet 0:400d8e75a8d0 150 {
dflet 0:400d8e75a8d0 151 if( ctx == NULL )
dflet 0:400d8e75a8d0 152 return;
dflet 0:400d8e75a8d0 153
dflet 0:400d8e75a8d0 154 polarssl_zeroize( ctx, sizeof( sha512_context ) );
dflet 0:400d8e75a8d0 155 }
dflet 0:400d8e75a8d0 156
dflet 0:400d8e75a8d0 157 /*
dflet 0:400d8e75a8d0 158 * SHA-512 context setup
dflet 0:400d8e75a8d0 159 */
dflet 0:400d8e75a8d0 160 void sha512_starts( sha512_context *ctx, int is384 )
dflet 0:400d8e75a8d0 161 {
dflet 0:400d8e75a8d0 162 ctx->total[0] = 0;
dflet 0:400d8e75a8d0 163 ctx->total[1] = 0;
dflet 0:400d8e75a8d0 164
dflet 0:400d8e75a8d0 165 if( is384 == 0 )
dflet 0:400d8e75a8d0 166 {
dflet 0:400d8e75a8d0 167 /* SHA-512 */
dflet 0:400d8e75a8d0 168 ctx->state[0] = UL64(0x6A09E667F3BCC908);
dflet 0:400d8e75a8d0 169 ctx->state[1] = UL64(0xBB67AE8584CAA73B);
dflet 0:400d8e75a8d0 170 ctx->state[2] = UL64(0x3C6EF372FE94F82B);
dflet 0:400d8e75a8d0 171 ctx->state[3] = UL64(0xA54FF53A5F1D36F1);
dflet 0:400d8e75a8d0 172 ctx->state[4] = UL64(0x510E527FADE682D1);
dflet 0:400d8e75a8d0 173 ctx->state[5] = UL64(0x9B05688C2B3E6C1F);
dflet 0:400d8e75a8d0 174 ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);
dflet 0:400d8e75a8d0 175 ctx->state[7] = UL64(0x5BE0CD19137E2179);
dflet 0:400d8e75a8d0 176 }
dflet 0:400d8e75a8d0 177 else
dflet 0:400d8e75a8d0 178 {
dflet 0:400d8e75a8d0 179 /* SHA-384 */
dflet 0:400d8e75a8d0 180 ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
dflet 0:400d8e75a8d0 181 ctx->state[1] = UL64(0x629A292A367CD507);
dflet 0:400d8e75a8d0 182 ctx->state[2] = UL64(0x9159015A3070DD17);
dflet 0:400d8e75a8d0 183 ctx->state[3] = UL64(0x152FECD8F70E5939);
dflet 0:400d8e75a8d0 184 ctx->state[4] = UL64(0x67332667FFC00B31);
dflet 0:400d8e75a8d0 185 ctx->state[5] = UL64(0x8EB44A8768581511);
dflet 0:400d8e75a8d0 186 ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
dflet 0:400d8e75a8d0 187 ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
dflet 0:400d8e75a8d0 188 }
dflet 0:400d8e75a8d0 189
dflet 0:400d8e75a8d0 190 ctx->is384 = is384;
dflet 0:400d8e75a8d0 191 }
dflet 0:400d8e75a8d0 192
dflet 0:400d8e75a8d0 193 void sha512_process( sha512_context *ctx, const unsigned char data[128] )
dflet 0:400d8e75a8d0 194 {
dflet 0:400d8e75a8d0 195 int i;
dflet 0:400d8e75a8d0 196 uint64_t temp1, temp2, W[80];
dflet 0:400d8e75a8d0 197 uint64_t A, B, C, D, E, F, G, H;
dflet 0:400d8e75a8d0 198
dflet 0:400d8e75a8d0 199 #define SHR(x,n) (x >> n)
dflet 0:400d8e75a8d0 200 #define ROTR(x,n) (SHR(x,n) | (x << (64 - n)))
dflet 0:400d8e75a8d0 201
dflet 0:400d8e75a8d0 202 #define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
dflet 0:400d8e75a8d0 203 #define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
dflet 0:400d8e75a8d0 204
dflet 0:400d8e75a8d0 205 #define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
dflet 0:400d8e75a8d0 206 #define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
dflet 0:400d8e75a8d0 207
dflet 0:400d8e75a8d0 208 #define F0(x,y,z) ((x & y) | (z & (x | y)))
dflet 0:400d8e75a8d0 209 #define F1(x,y,z) (z ^ (x & (y ^ z)))
dflet 0:400d8e75a8d0 210
dflet 0:400d8e75a8d0 211 #define P(a,b,c,d,e,f,g,h,x,K) \
dflet 0:400d8e75a8d0 212 { \
dflet 0:400d8e75a8d0 213 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
dflet 0:400d8e75a8d0 214 temp2 = S2(a) + F0(a,b,c); \
dflet 0:400d8e75a8d0 215 d += temp1; h = temp1 + temp2; \
dflet 0:400d8e75a8d0 216 }
dflet 0:400d8e75a8d0 217
dflet 0:400d8e75a8d0 218 for( i = 0; i < 16; i++ )
dflet 0:400d8e75a8d0 219 {
dflet 0:400d8e75a8d0 220 GET_UINT64_BE( W[i], data, i << 3 );
dflet 0:400d8e75a8d0 221 }
dflet 0:400d8e75a8d0 222
dflet 0:400d8e75a8d0 223 for( ; i < 80; i++ )
dflet 0:400d8e75a8d0 224 {
dflet 0:400d8e75a8d0 225 W[i] = S1(W[i - 2]) + W[i - 7] +
dflet 0:400d8e75a8d0 226 S0(W[i - 15]) + W[i - 16];
dflet 0:400d8e75a8d0 227 }
dflet 0:400d8e75a8d0 228
dflet 0:400d8e75a8d0 229 A = ctx->state[0];
dflet 0:400d8e75a8d0 230 B = ctx->state[1];
dflet 0:400d8e75a8d0 231 C = ctx->state[2];
dflet 0:400d8e75a8d0 232 D = ctx->state[3];
dflet 0:400d8e75a8d0 233 E = ctx->state[4];
dflet 0:400d8e75a8d0 234 F = ctx->state[5];
dflet 0:400d8e75a8d0 235 G = ctx->state[6];
dflet 0:400d8e75a8d0 236 H = ctx->state[7];
dflet 0:400d8e75a8d0 237 i = 0;
dflet 0:400d8e75a8d0 238
dflet 0:400d8e75a8d0 239 do
dflet 0:400d8e75a8d0 240 {
dflet 0:400d8e75a8d0 241 P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++;
dflet 0:400d8e75a8d0 242 P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++;
dflet 0:400d8e75a8d0 243 P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++;
dflet 0:400d8e75a8d0 244 P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++;
dflet 0:400d8e75a8d0 245 P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++;
dflet 0:400d8e75a8d0 246 P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++;
dflet 0:400d8e75a8d0 247 P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++;
dflet 0:400d8e75a8d0 248 P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++;
dflet 0:400d8e75a8d0 249 }
dflet 0:400d8e75a8d0 250 while( i < 80 );
dflet 0:400d8e75a8d0 251
dflet 0:400d8e75a8d0 252 ctx->state[0] += A;
dflet 0:400d8e75a8d0 253 ctx->state[1] += B;
dflet 0:400d8e75a8d0 254 ctx->state[2] += C;
dflet 0:400d8e75a8d0 255 ctx->state[3] += D;
dflet 0:400d8e75a8d0 256 ctx->state[4] += E;
dflet 0:400d8e75a8d0 257 ctx->state[5] += F;
dflet 0:400d8e75a8d0 258 ctx->state[6] += G;
dflet 0:400d8e75a8d0 259 ctx->state[7] += H;
dflet 0:400d8e75a8d0 260 }
dflet 0:400d8e75a8d0 261
dflet 0:400d8e75a8d0 262 /*
dflet 0:400d8e75a8d0 263 * SHA-512 process buffer
dflet 0:400d8e75a8d0 264 */
dflet 0:400d8e75a8d0 265 void sha512_update( sha512_context *ctx, const unsigned char *input,
dflet 0:400d8e75a8d0 266 size_t ilen )
dflet 0:400d8e75a8d0 267 {
dflet 0:400d8e75a8d0 268 size_t fill;
dflet 0:400d8e75a8d0 269 unsigned int left;
dflet 0:400d8e75a8d0 270
dflet 0:400d8e75a8d0 271 if( ilen == 0 )
dflet 0:400d8e75a8d0 272 return;
dflet 0:400d8e75a8d0 273
dflet 0:400d8e75a8d0 274 left = (unsigned int) (ctx->total[0] & 0x7F);
dflet 0:400d8e75a8d0 275 fill = 128 - left;
dflet 0:400d8e75a8d0 276
dflet 0:400d8e75a8d0 277 ctx->total[0] += (uint64_t) ilen;
dflet 0:400d8e75a8d0 278
dflet 0:400d8e75a8d0 279 if( ctx->total[0] < (uint64_t) ilen )
dflet 0:400d8e75a8d0 280 ctx->total[1]++;
dflet 0:400d8e75a8d0 281
dflet 0:400d8e75a8d0 282 if( left && ilen >= fill )
dflet 0:400d8e75a8d0 283 {
dflet 0:400d8e75a8d0 284 memcpy( (void *) (ctx->buffer + left), input, fill );
dflet 0:400d8e75a8d0 285 sha512_process( ctx, ctx->buffer );
dflet 0:400d8e75a8d0 286 input += fill;
dflet 0:400d8e75a8d0 287 ilen -= fill;
dflet 0:400d8e75a8d0 288 left = 0;
dflet 0:400d8e75a8d0 289 }
dflet 0:400d8e75a8d0 290
dflet 0:400d8e75a8d0 291 while( ilen >= 128 )
dflet 0:400d8e75a8d0 292 {
dflet 0:400d8e75a8d0 293 sha512_process( ctx, input );
dflet 0:400d8e75a8d0 294 input += 128;
dflet 0:400d8e75a8d0 295 ilen -= 128;
dflet 0:400d8e75a8d0 296 }
dflet 0:400d8e75a8d0 297
dflet 0:400d8e75a8d0 298 if( ilen > 0 )
dflet 0:400d8e75a8d0 299 memcpy( (void *) (ctx->buffer + left), input, ilen );
dflet 0:400d8e75a8d0 300 }
dflet 0:400d8e75a8d0 301
dflet 0:400d8e75a8d0 302 static const unsigned char sha512_padding[128] =
dflet 0:400d8e75a8d0 303 {
dflet 0:400d8e75a8d0 304 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:400d8e75a8d0 305 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:400d8e75a8d0 306 0, 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 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:400d8e75a8d0 311 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
dflet 0:400d8e75a8d0 312 };
dflet 0:400d8e75a8d0 313
dflet 0:400d8e75a8d0 314 /*
dflet 0:400d8e75a8d0 315 * SHA-512 final digest
dflet 0:400d8e75a8d0 316 */
dflet 0:400d8e75a8d0 317 void sha512_finish( sha512_context *ctx, unsigned char output[64] )
dflet 0:400d8e75a8d0 318 {
dflet 0:400d8e75a8d0 319 size_t last, padn;
dflet 0:400d8e75a8d0 320 uint64_t high, low;
dflet 0:400d8e75a8d0 321 unsigned char msglen[16];
dflet 0:400d8e75a8d0 322
dflet 0:400d8e75a8d0 323 high = ( ctx->total[0] >> 61 )
dflet 0:400d8e75a8d0 324 | ( ctx->total[1] << 3 );
dflet 0:400d8e75a8d0 325 low = ( ctx->total[0] << 3 );
dflet 0:400d8e75a8d0 326
dflet 0:400d8e75a8d0 327 PUT_UINT64_BE( high, msglen, 0 );
dflet 0:400d8e75a8d0 328 PUT_UINT64_BE( low, msglen, 8 );
dflet 0:400d8e75a8d0 329
dflet 0:400d8e75a8d0 330 last = (size_t)( ctx->total[0] & 0x7F );
dflet 0:400d8e75a8d0 331 padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
dflet 0:400d8e75a8d0 332
dflet 0:400d8e75a8d0 333 sha512_update( ctx, sha512_padding, padn );
dflet 0:400d8e75a8d0 334 sha512_update( ctx, msglen, 16 );
dflet 0:400d8e75a8d0 335
dflet 0:400d8e75a8d0 336 PUT_UINT64_BE( ctx->state[0], output, 0 );
dflet 0:400d8e75a8d0 337 PUT_UINT64_BE( ctx->state[1], output, 8 );
dflet 0:400d8e75a8d0 338 PUT_UINT64_BE( ctx->state[2], output, 16 );
dflet 0:400d8e75a8d0 339 PUT_UINT64_BE( ctx->state[3], output, 24 );
dflet 0:400d8e75a8d0 340 PUT_UINT64_BE( ctx->state[4], output, 32 );
dflet 0:400d8e75a8d0 341 PUT_UINT64_BE( ctx->state[5], output, 40 );
dflet 0:400d8e75a8d0 342
dflet 0:400d8e75a8d0 343 if( ctx->is384 == 0 )
dflet 0:400d8e75a8d0 344 {
dflet 0:400d8e75a8d0 345 PUT_UINT64_BE( ctx->state[6], output, 48 );
dflet 0:400d8e75a8d0 346 PUT_UINT64_BE( ctx->state[7], output, 56 );
dflet 0:400d8e75a8d0 347 }
dflet 0:400d8e75a8d0 348 }
dflet 0:400d8e75a8d0 349
dflet 0:400d8e75a8d0 350 #endif /* !POLARSSL_SHA512_ALT */
dflet 0:400d8e75a8d0 351
dflet 0:400d8e75a8d0 352 /*
dflet 0:400d8e75a8d0 353 * output = SHA-512( input buffer )
dflet 0:400d8e75a8d0 354 */
dflet 0:400d8e75a8d0 355 void sha512( const unsigned char *input, size_t ilen,
dflet 0:400d8e75a8d0 356 unsigned char output[64], int is384 )
dflet 0:400d8e75a8d0 357 {
dflet 0:400d8e75a8d0 358 sha512_context ctx;
dflet 0:400d8e75a8d0 359
dflet 0:400d8e75a8d0 360 sha512_init( &ctx );
dflet 0:400d8e75a8d0 361 sha512_starts( &ctx, is384 );
dflet 0:400d8e75a8d0 362 sha512_update( &ctx, input, ilen );
dflet 0:400d8e75a8d0 363 sha512_finish( &ctx, output );
dflet 0:400d8e75a8d0 364 sha512_free( &ctx );
dflet 0:400d8e75a8d0 365 }
dflet 0:400d8e75a8d0 366
dflet 0:400d8e75a8d0 367 #if defined(POLARSSL_FS_IO)
dflet 0:400d8e75a8d0 368 /*
dflet 0:400d8e75a8d0 369 * output = SHA-512( file contents )
dflet 0:400d8e75a8d0 370 */
dflet 0:400d8e75a8d0 371 int sha512_file( const char *path, unsigned char output[64], int is384 )
dflet 0:400d8e75a8d0 372 {
dflet 0:400d8e75a8d0 373 FILE *f;
dflet 0:400d8e75a8d0 374 size_t n;
dflet 0:400d8e75a8d0 375 sha512_context ctx;
dflet 0:400d8e75a8d0 376 unsigned char buf[1024];
dflet 0:400d8e75a8d0 377
dflet 0:400d8e75a8d0 378 if( ( f = fopen( path, "rb" ) ) == NULL )
dflet 0:400d8e75a8d0 379 return( POLARSSL_ERR_SHA512_FILE_IO_ERROR );
dflet 0:400d8e75a8d0 380
dflet 0:400d8e75a8d0 381 sha512_init( &ctx );
dflet 0:400d8e75a8d0 382 sha512_starts( &ctx, is384 );
dflet 0:400d8e75a8d0 383
dflet 0:400d8e75a8d0 384 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
dflet 0:400d8e75a8d0 385 sha512_update( &ctx, buf, n );
dflet 0:400d8e75a8d0 386
dflet 0:400d8e75a8d0 387 sha512_finish( &ctx, output );
dflet 0:400d8e75a8d0 388 sha512_free( &ctx );
dflet 0:400d8e75a8d0 389
dflet 0:400d8e75a8d0 390 if( ferror( f ) != 0 )
dflet 0:400d8e75a8d0 391 {
dflet 0:400d8e75a8d0 392 fclose( f );
dflet 0:400d8e75a8d0 393 return( POLARSSL_ERR_SHA512_FILE_IO_ERROR );
dflet 0:400d8e75a8d0 394 }
dflet 0:400d8e75a8d0 395
dflet 0:400d8e75a8d0 396 fclose( f );
dflet 0:400d8e75a8d0 397 return( 0 );
dflet 0:400d8e75a8d0 398 }
dflet 0:400d8e75a8d0 399 #endif /* POLARSSL_FS_IO */
dflet 0:400d8e75a8d0 400
dflet 0:400d8e75a8d0 401 /*
dflet 0:400d8e75a8d0 402 * SHA-512 HMAC context setup
dflet 0:400d8e75a8d0 403 */
dflet 0:400d8e75a8d0 404 void sha512_hmac_starts( sha512_context *ctx, const unsigned char *key,
dflet 0:400d8e75a8d0 405 size_t keylen, int is384 )
dflet 0:400d8e75a8d0 406 {
dflet 0:400d8e75a8d0 407 size_t i;
dflet 0:400d8e75a8d0 408 unsigned char sum[64];
dflet 0:400d8e75a8d0 409
dflet 0:400d8e75a8d0 410 if( keylen > 128 )
dflet 0:400d8e75a8d0 411 {
dflet 0:400d8e75a8d0 412 sha512( key, keylen, sum, is384 );
dflet 0:400d8e75a8d0 413 keylen = ( is384 ) ? 48 : 64;
dflet 0:400d8e75a8d0 414 key = sum;
dflet 0:400d8e75a8d0 415 }
dflet 0:400d8e75a8d0 416
dflet 0:400d8e75a8d0 417 memset( ctx->ipad, 0x36, 128 );
dflet 0:400d8e75a8d0 418 memset( ctx->opad, 0x5C, 128 );
dflet 0:400d8e75a8d0 419
dflet 0:400d8e75a8d0 420 for( i = 0; i < keylen; i++ )
dflet 0:400d8e75a8d0 421 {
dflet 0:400d8e75a8d0 422 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
dflet 0:400d8e75a8d0 423 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
dflet 0:400d8e75a8d0 424 }
dflet 0:400d8e75a8d0 425
dflet 0:400d8e75a8d0 426 sha512_starts( ctx, is384 );
dflet 0:400d8e75a8d0 427 sha512_update( ctx, ctx->ipad, 128 );
dflet 0:400d8e75a8d0 428
dflet 0:400d8e75a8d0 429 polarssl_zeroize( sum, sizeof( sum ) );
dflet 0:400d8e75a8d0 430 }
dflet 0:400d8e75a8d0 431
dflet 0:400d8e75a8d0 432 /*
dflet 0:400d8e75a8d0 433 * SHA-512 HMAC process buffer
dflet 0:400d8e75a8d0 434 */
dflet 0:400d8e75a8d0 435 void sha512_hmac_update( sha512_context *ctx,
dflet 0:400d8e75a8d0 436 const unsigned char *input, size_t ilen )
dflet 0:400d8e75a8d0 437 {
dflet 0:400d8e75a8d0 438 sha512_update( ctx, input, ilen );
dflet 0:400d8e75a8d0 439 }
dflet 0:400d8e75a8d0 440
dflet 0:400d8e75a8d0 441 /*
dflet 0:400d8e75a8d0 442 * SHA-512 HMAC final digest
dflet 0:400d8e75a8d0 443 */
dflet 0:400d8e75a8d0 444 void sha512_hmac_finish( sha512_context *ctx, unsigned char output[64] )
dflet 0:400d8e75a8d0 445 {
dflet 0:400d8e75a8d0 446 int is384, hlen;
dflet 0:400d8e75a8d0 447 unsigned char tmpbuf[64];
dflet 0:400d8e75a8d0 448
dflet 0:400d8e75a8d0 449 is384 = ctx->is384;
dflet 0:400d8e75a8d0 450 hlen = ( is384 == 0 ) ? 64 : 48;
dflet 0:400d8e75a8d0 451
dflet 0:400d8e75a8d0 452 sha512_finish( ctx, tmpbuf );
dflet 0:400d8e75a8d0 453 sha512_starts( ctx, is384 );
dflet 0:400d8e75a8d0 454 sha512_update( ctx, ctx->opad, 128 );
dflet 0:400d8e75a8d0 455 sha512_update( ctx, tmpbuf, hlen );
dflet 0:400d8e75a8d0 456 sha512_finish( ctx, output );
dflet 0:400d8e75a8d0 457
dflet 0:400d8e75a8d0 458 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
dflet 0:400d8e75a8d0 459 }
dflet 0:400d8e75a8d0 460
dflet 0:400d8e75a8d0 461 /*
dflet 0:400d8e75a8d0 462 * SHA-512 HMAC context reset
dflet 0:400d8e75a8d0 463 */
dflet 0:400d8e75a8d0 464 void sha512_hmac_reset( sha512_context *ctx )
dflet 0:400d8e75a8d0 465 {
dflet 0:400d8e75a8d0 466 sha512_starts( ctx, ctx->is384 );
dflet 0:400d8e75a8d0 467 sha512_update( ctx, ctx->ipad, 128 );
dflet 0:400d8e75a8d0 468 }
dflet 0:400d8e75a8d0 469
dflet 0:400d8e75a8d0 470 /*
dflet 0:400d8e75a8d0 471 * output = HMAC-SHA-512( hmac key, input buffer )
dflet 0:400d8e75a8d0 472 */
dflet 0:400d8e75a8d0 473 void sha512_hmac( const unsigned char *key, size_t keylen,
dflet 0:400d8e75a8d0 474 const unsigned char *input, size_t ilen,
dflet 0:400d8e75a8d0 475 unsigned char output[64], int is384 )
dflet 0:400d8e75a8d0 476 {
dflet 0:400d8e75a8d0 477 sha512_context ctx;
dflet 0:400d8e75a8d0 478
dflet 0:400d8e75a8d0 479 sha512_init( &ctx );
dflet 0:400d8e75a8d0 480 sha512_hmac_starts( &ctx, key, keylen, is384 );
dflet 0:400d8e75a8d0 481 sha512_hmac_update( &ctx, input, ilen );
dflet 0:400d8e75a8d0 482 sha512_hmac_finish( &ctx, output );
dflet 0:400d8e75a8d0 483 sha512_free( &ctx );
dflet 0:400d8e75a8d0 484 }
dflet 0:400d8e75a8d0 485
dflet 0:400d8e75a8d0 486 #if defined(POLARSSL_SELF_TEST)
dflet 0:400d8e75a8d0 487
dflet 0:400d8e75a8d0 488 /*
dflet 0:400d8e75a8d0 489 * FIPS-180-2 test vectors
dflet 0:400d8e75a8d0 490 */
dflet 0:400d8e75a8d0 491 static const unsigned char sha512_test_buf[3][113] =
dflet 0:400d8e75a8d0 492 {
dflet 0:400d8e75a8d0 493 { "abc" },
dflet 0:400d8e75a8d0 494 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
dflet 0:400d8e75a8d0 495 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
dflet 0:400d8e75a8d0 496 { "" }
dflet 0:400d8e75a8d0 497 };
dflet 0:400d8e75a8d0 498
dflet 0:400d8e75a8d0 499 static const int sha512_test_buflen[3] =
dflet 0:400d8e75a8d0 500 {
dflet 0:400d8e75a8d0 501 3, 112, 1000
dflet 0:400d8e75a8d0 502 };
dflet 0:400d8e75a8d0 503
dflet 0:400d8e75a8d0 504 static const unsigned char sha512_test_sum[6][64] =
dflet 0:400d8e75a8d0 505 {
dflet 0:400d8e75a8d0 506 /*
dflet 0:400d8e75a8d0 507 * SHA-384 test vectors
dflet 0:400d8e75a8d0 508 */
dflet 0:400d8e75a8d0 509 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
dflet 0:400d8e75a8d0 510 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
dflet 0:400d8e75a8d0 511 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
dflet 0:400d8e75a8d0 512 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
dflet 0:400d8e75a8d0 513 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
dflet 0:400d8e75a8d0 514 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
dflet 0:400d8e75a8d0 515 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
dflet 0:400d8e75a8d0 516 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
dflet 0:400d8e75a8d0 517 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
dflet 0:400d8e75a8d0 518 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
dflet 0:400d8e75a8d0 519 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
dflet 0:400d8e75a8d0 520 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
dflet 0:400d8e75a8d0 521 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
dflet 0:400d8e75a8d0 522 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
dflet 0:400d8e75a8d0 523 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
dflet 0:400d8e75a8d0 524 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
dflet 0:400d8e75a8d0 525 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
dflet 0:400d8e75a8d0 526 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
dflet 0:400d8e75a8d0 527
dflet 0:400d8e75a8d0 528 /*
dflet 0:400d8e75a8d0 529 * SHA-512 test vectors
dflet 0:400d8e75a8d0 530 */
dflet 0:400d8e75a8d0 531 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
dflet 0:400d8e75a8d0 532 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
dflet 0:400d8e75a8d0 533 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
dflet 0:400d8e75a8d0 534 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
dflet 0:400d8e75a8d0 535 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
dflet 0:400d8e75a8d0 536 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
dflet 0:400d8e75a8d0 537 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
dflet 0:400d8e75a8d0 538 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
dflet 0:400d8e75a8d0 539 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
dflet 0:400d8e75a8d0 540 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
dflet 0:400d8e75a8d0 541 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
dflet 0:400d8e75a8d0 542 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
dflet 0:400d8e75a8d0 543 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
dflet 0:400d8e75a8d0 544 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
dflet 0:400d8e75a8d0 545 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
dflet 0:400d8e75a8d0 546 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
dflet 0:400d8e75a8d0 547 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
dflet 0:400d8e75a8d0 548 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
dflet 0:400d8e75a8d0 549 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
dflet 0:400d8e75a8d0 550 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
dflet 0:400d8e75a8d0 551 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
dflet 0:400d8e75a8d0 552 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
dflet 0:400d8e75a8d0 553 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
dflet 0:400d8e75a8d0 554 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
dflet 0:400d8e75a8d0 555 };
dflet 0:400d8e75a8d0 556
dflet 0:400d8e75a8d0 557 /*
dflet 0:400d8e75a8d0 558 * RFC 4231 test vectors
dflet 0:400d8e75a8d0 559 */
dflet 0:400d8e75a8d0 560 static const unsigned char sha512_hmac_test_key[7][26] =
dflet 0:400d8e75a8d0 561 {
dflet 0:400d8e75a8d0 562 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
dflet 0:400d8e75a8d0 563 "\x0B\x0B\x0B\x0B" },
dflet 0:400d8e75a8d0 564 { "Jefe" },
dflet 0:400d8e75a8d0 565 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
dflet 0:400d8e75a8d0 566 "\xAA\xAA\xAA\xAA" },
dflet 0:400d8e75a8d0 567 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
dflet 0:400d8e75a8d0 568 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
dflet 0:400d8e75a8d0 569 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
dflet 0:400d8e75a8d0 570 "\x0C\x0C\x0C\x0C" },
dflet 0:400d8e75a8d0 571 { "" }, /* 0xAA 131 times */
dflet 0:400d8e75a8d0 572 { "" }
dflet 0:400d8e75a8d0 573 };
dflet 0:400d8e75a8d0 574
dflet 0:400d8e75a8d0 575 static const int sha512_hmac_test_keylen[7] =
dflet 0:400d8e75a8d0 576 {
dflet 0:400d8e75a8d0 577 20, 4, 20, 25, 20, 131, 131
dflet 0:400d8e75a8d0 578 };
dflet 0:400d8e75a8d0 579
dflet 0:400d8e75a8d0 580 static const unsigned char sha512_hmac_test_buf[7][153] =
dflet 0:400d8e75a8d0 581 {
dflet 0:400d8e75a8d0 582 { "Hi There" },
dflet 0:400d8e75a8d0 583 { "what do ya want for nothing?" },
dflet 0:400d8e75a8d0 584 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
dflet 0:400d8e75a8d0 585 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
dflet 0:400d8e75a8d0 586 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
dflet 0:400d8e75a8d0 587 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
dflet 0:400d8e75a8d0 588 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
dflet 0:400d8e75a8d0 589 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
dflet 0:400d8e75a8d0 590 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
dflet 0:400d8e75a8d0 591 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
dflet 0:400d8e75a8d0 592 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
dflet 0:400d8e75a8d0 593 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
dflet 0:400d8e75a8d0 594 { "Test With Truncation" },
dflet 0:400d8e75a8d0 595 { "Test Using Larger Than Block-Size Key - Hash Key First" },
dflet 0:400d8e75a8d0 596 { "This is a test using a larger than block-size key "
dflet 0:400d8e75a8d0 597 "and a larger than block-size data. The key needs to "
dflet 0:400d8e75a8d0 598 "be hashed before being used by the HMAC algorithm." }
dflet 0:400d8e75a8d0 599 };
dflet 0:400d8e75a8d0 600
dflet 0:400d8e75a8d0 601 static const int sha512_hmac_test_buflen[7] =
dflet 0:400d8e75a8d0 602 {
dflet 0:400d8e75a8d0 603 8, 28, 50, 50, 20, 54, 152
dflet 0:400d8e75a8d0 604 };
dflet 0:400d8e75a8d0 605
dflet 0:400d8e75a8d0 606 static const unsigned char sha512_hmac_test_sum[14][64] =
dflet 0:400d8e75a8d0 607 {
dflet 0:400d8e75a8d0 608 /*
dflet 0:400d8e75a8d0 609 * HMAC-SHA-384 test vectors
dflet 0:400d8e75a8d0 610 */
dflet 0:400d8e75a8d0 611 { 0xAF, 0xD0, 0x39, 0x44, 0xD8, 0x48, 0x95, 0x62,
dflet 0:400d8e75a8d0 612 0x6B, 0x08, 0x25, 0xF4, 0xAB, 0x46, 0x90, 0x7F,
dflet 0:400d8e75a8d0 613 0x15, 0xF9, 0xDA, 0xDB, 0xE4, 0x10, 0x1E, 0xC6,
dflet 0:400d8e75a8d0 614 0x82, 0xAA, 0x03, 0x4C, 0x7C, 0xEB, 0xC5, 0x9C,
dflet 0:400d8e75a8d0 615 0xFA, 0xEA, 0x9E, 0xA9, 0x07, 0x6E, 0xDE, 0x7F,
dflet 0:400d8e75a8d0 616 0x4A, 0xF1, 0x52, 0xE8, 0xB2, 0xFA, 0x9C, 0xB6 },
dflet 0:400d8e75a8d0 617 { 0xAF, 0x45, 0xD2, 0xE3, 0x76, 0x48, 0x40, 0x31,
dflet 0:400d8e75a8d0 618 0x61, 0x7F, 0x78, 0xD2, 0xB5, 0x8A, 0x6B, 0x1B,
dflet 0:400d8e75a8d0 619 0x9C, 0x7E, 0xF4, 0x64, 0xF5, 0xA0, 0x1B, 0x47,
dflet 0:400d8e75a8d0 620 0xE4, 0x2E, 0xC3, 0x73, 0x63, 0x22, 0x44, 0x5E,
dflet 0:400d8e75a8d0 621 0x8E, 0x22, 0x40, 0xCA, 0x5E, 0x69, 0xE2, 0xC7,
dflet 0:400d8e75a8d0 622 0x8B, 0x32, 0x39, 0xEC, 0xFA, 0xB2, 0x16, 0x49 },
dflet 0:400d8e75a8d0 623 { 0x88, 0x06, 0x26, 0x08, 0xD3, 0xE6, 0xAD, 0x8A,
dflet 0:400d8e75a8d0 624 0x0A, 0xA2, 0xAC, 0xE0, 0x14, 0xC8, 0xA8, 0x6F,
dflet 0:400d8e75a8d0 625 0x0A, 0xA6, 0x35, 0xD9, 0x47, 0xAC, 0x9F, 0xEB,
dflet 0:400d8e75a8d0 626 0xE8, 0x3E, 0xF4, 0xE5, 0x59, 0x66, 0x14, 0x4B,
dflet 0:400d8e75a8d0 627 0x2A, 0x5A, 0xB3, 0x9D, 0xC1, 0x38, 0x14, 0xB9,
dflet 0:400d8e75a8d0 628 0x4E, 0x3A, 0xB6, 0xE1, 0x01, 0xA3, 0x4F, 0x27 },
dflet 0:400d8e75a8d0 629 { 0x3E, 0x8A, 0x69, 0xB7, 0x78, 0x3C, 0x25, 0x85,
dflet 0:400d8e75a8d0 630 0x19, 0x33, 0xAB, 0x62, 0x90, 0xAF, 0x6C, 0xA7,
dflet 0:400d8e75a8d0 631 0x7A, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9C,
dflet 0:400d8e75a8d0 632 0xC5, 0x57, 0x7C, 0x6E, 0x1F, 0x57, 0x3B, 0x4E,
dflet 0:400d8e75a8d0 633 0x68, 0x01, 0xDD, 0x23, 0xC4, 0xA7, 0xD6, 0x79,
dflet 0:400d8e75a8d0 634 0xCC, 0xF8, 0xA3, 0x86, 0xC6, 0x74, 0xCF, 0xFB },
dflet 0:400d8e75a8d0 635 { 0x3A, 0xBF, 0x34, 0xC3, 0x50, 0x3B, 0x2A, 0x23,
dflet 0:400d8e75a8d0 636 0xA4, 0x6E, 0xFC, 0x61, 0x9B, 0xAE, 0xF8, 0x97 },
dflet 0:400d8e75a8d0 637 { 0x4E, 0xCE, 0x08, 0x44, 0x85, 0x81, 0x3E, 0x90,
dflet 0:400d8e75a8d0 638 0x88, 0xD2, 0xC6, 0x3A, 0x04, 0x1B, 0xC5, 0xB4,
dflet 0:400d8e75a8d0 639 0x4F, 0x9E, 0xF1, 0x01, 0x2A, 0x2B, 0x58, 0x8F,
dflet 0:400d8e75a8d0 640 0x3C, 0xD1, 0x1F, 0x05, 0x03, 0x3A, 0xC4, 0xC6,
dflet 0:400d8e75a8d0 641 0x0C, 0x2E, 0xF6, 0xAB, 0x40, 0x30, 0xFE, 0x82,
dflet 0:400d8e75a8d0 642 0x96, 0x24, 0x8D, 0xF1, 0x63, 0xF4, 0x49, 0x52 },
dflet 0:400d8e75a8d0 643 { 0x66, 0x17, 0x17, 0x8E, 0x94, 0x1F, 0x02, 0x0D,
dflet 0:400d8e75a8d0 644 0x35, 0x1E, 0x2F, 0x25, 0x4E, 0x8F, 0xD3, 0x2C,
dflet 0:400d8e75a8d0 645 0x60, 0x24, 0x20, 0xFE, 0xB0, 0xB8, 0xFB, 0x9A,
dflet 0:400d8e75a8d0 646 0xDC, 0xCE, 0xBB, 0x82, 0x46, 0x1E, 0x99, 0xC5,
dflet 0:400d8e75a8d0 647 0xA6, 0x78, 0xCC, 0x31, 0xE7, 0x99, 0x17, 0x6D,
dflet 0:400d8e75a8d0 648 0x38, 0x60, 0xE6, 0x11, 0x0C, 0x46, 0x52, 0x3E },
dflet 0:400d8e75a8d0 649
dflet 0:400d8e75a8d0 650 /*
dflet 0:400d8e75a8d0 651 * HMAC-SHA-512 test vectors
dflet 0:400d8e75a8d0 652 */
dflet 0:400d8e75a8d0 653 { 0x87, 0xAA, 0x7C, 0xDE, 0xA5, 0xEF, 0x61, 0x9D,
dflet 0:400d8e75a8d0 654 0x4F, 0xF0, 0xB4, 0x24, 0x1A, 0x1D, 0x6C, 0xB0,
dflet 0:400d8e75a8d0 655 0x23, 0x79, 0xF4, 0xE2, 0xCE, 0x4E, 0xC2, 0x78,
dflet 0:400d8e75a8d0 656 0x7A, 0xD0, 0xB3, 0x05, 0x45, 0xE1, 0x7C, 0xDE,
dflet 0:400d8e75a8d0 657 0xDA, 0xA8, 0x33, 0xB7, 0xD6, 0xB8, 0xA7, 0x02,
dflet 0:400d8e75a8d0 658 0x03, 0x8B, 0x27, 0x4E, 0xAE, 0xA3, 0xF4, 0xE4,
dflet 0:400d8e75a8d0 659 0xBE, 0x9D, 0x91, 0x4E, 0xEB, 0x61, 0xF1, 0x70,
dflet 0:400d8e75a8d0 660 0x2E, 0x69, 0x6C, 0x20, 0x3A, 0x12, 0x68, 0x54 },
dflet 0:400d8e75a8d0 661 { 0x16, 0x4B, 0x7A, 0x7B, 0xFC, 0xF8, 0x19, 0xE2,
dflet 0:400d8e75a8d0 662 0xE3, 0x95, 0xFB, 0xE7, 0x3B, 0x56, 0xE0, 0xA3,
dflet 0:400d8e75a8d0 663 0x87, 0xBD, 0x64, 0x22, 0x2E, 0x83, 0x1F, 0xD6,
dflet 0:400d8e75a8d0 664 0x10, 0x27, 0x0C, 0xD7, 0xEA, 0x25, 0x05, 0x54,
dflet 0:400d8e75a8d0 665 0x97, 0x58, 0xBF, 0x75, 0xC0, 0x5A, 0x99, 0x4A,
dflet 0:400d8e75a8d0 666 0x6D, 0x03, 0x4F, 0x65, 0xF8, 0xF0, 0xE6, 0xFD,
dflet 0:400d8e75a8d0 667 0xCA, 0xEA, 0xB1, 0xA3, 0x4D, 0x4A, 0x6B, 0x4B,
dflet 0:400d8e75a8d0 668 0x63, 0x6E, 0x07, 0x0A, 0x38, 0xBC, 0xE7, 0x37 },
dflet 0:400d8e75a8d0 669 { 0xFA, 0x73, 0xB0, 0x08, 0x9D, 0x56, 0xA2, 0x84,
dflet 0:400d8e75a8d0 670 0xEF, 0xB0, 0xF0, 0x75, 0x6C, 0x89, 0x0B, 0xE9,
dflet 0:400d8e75a8d0 671 0xB1, 0xB5, 0xDB, 0xDD, 0x8E, 0xE8, 0x1A, 0x36,
dflet 0:400d8e75a8d0 672 0x55, 0xF8, 0x3E, 0x33, 0xB2, 0x27, 0x9D, 0x39,
dflet 0:400d8e75a8d0 673 0xBF, 0x3E, 0x84, 0x82, 0x79, 0xA7, 0x22, 0xC8,
dflet 0:400d8e75a8d0 674 0x06, 0xB4, 0x85, 0xA4, 0x7E, 0x67, 0xC8, 0x07,
dflet 0:400d8e75a8d0 675 0xB9, 0x46, 0xA3, 0x37, 0xBE, 0xE8, 0x94, 0x26,
dflet 0:400d8e75a8d0 676 0x74, 0x27, 0x88, 0x59, 0xE1, 0x32, 0x92, 0xFB },
dflet 0:400d8e75a8d0 677 { 0xB0, 0xBA, 0x46, 0x56, 0x37, 0x45, 0x8C, 0x69,
dflet 0:400d8e75a8d0 678 0x90, 0xE5, 0xA8, 0xC5, 0xF6, 0x1D, 0x4A, 0xF7,
dflet 0:400d8e75a8d0 679 0xE5, 0x76, 0xD9, 0x7F, 0xF9, 0x4B, 0x87, 0x2D,
dflet 0:400d8e75a8d0 680 0xE7, 0x6F, 0x80, 0x50, 0x36, 0x1E, 0xE3, 0xDB,
dflet 0:400d8e75a8d0 681 0xA9, 0x1C, 0xA5, 0xC1, 0x1A, 0xA2, 0x5E, 0xB4,
dflet 0:400d8e75a8d0 682 0xD6, 0x79, 0x27, 0x5C, 0xC5, 0x78, 0x80, 0x63,
dflet 0:400d8e75a8d0 683 0xA5, 0xF1, 0x97, 0x41, 0x12, 0x0C, 0x4F, 0x2D,
dflet 0:400d8e75a8d0 684 0xE2, 0xAD, 0xEB, 0xEB, 0x10, 0xA2, 0x98, 0xDD },
dflet 0:400d8e75a8d0 685 { 0x41, 0x5F, 0xAD, 0x62, 0x71, 0x58, 0x0A, 0x53,
dflet 0:400d8e75a8d0 686 0x1D, 0x41, 0x79, 0xBC, 0x89, 0x1D, 0x87, 0xA6 },
dflet 0:400d8e75a8d0 687 { 0x80, 0xB2, 0x42, 0x63, 0xC7, 0xC1, 0xA3, 0xEB,
dflet 0:400d8e75a8d0 688 0xB7, 0x14, 0x93, 0xC1, 0xDD, 0x7B, 0xE8, 0xB4,
dflet 0:400d8e75a8d0 689 0x9B, 0x46, 0xD1, 0xF4, 0x1B, 0x4A, 0xEE, 0xC1,
dflet 0:400d8e75a8d0 690 0x12, 0x1B, 0x01, 0x37, 0x83, 0xF8, 0xF3, 0x52,
dflet 0:400d8e75a8d0 691 0x6B, 0x56, 0xD0, 0x37, 0xE0, 0x5F, 0x25, 0x98,
dflet 0:400d8e75a8d0 692 0xBD, 0x0F, 0xD2, 0x21, 0x5D, 0x6A, 0x1E, 0x52,
dflet 0:400d8e75a8d0 693 0x95, 0xE6, 0x4F, 0x73, 0xF6, 0x3F, 0x0A, 0xEC,
dflet 0:400d8e75a8d0 694 0x8B, 0x91, 0x5A, 0x98, 0x5D, 0x78, 0x65, 0x98 },
dflet 0:400d8e75a8d0 695 { 0xE3, 0x7B, 0x6A, 0x77, 0x5D, 0xC8, 0x7D, 0xBA,
dflet 0:400d8e75a8d0 696 0xA4, 0xDF, 0xA9, 0xF9, 0x6E, 0x5E, 0x3F, 0xFD,
dflet 0:400d8e75a8d0 697 0xDE, 0xBD, 0x71, 0xF8, 0x86, 0x72, 0x89, 0x86,
dflet 0:400d8e75a8d0 698 0x5D, 0xF5, 0xA3, 0x2D, 0x20, 0xCD, 0xC9, 0x44,
dflet 0:400d8e75a8d0 699 0xB6, 0x02, 0x2C, 0xAC, 0x3C, 0x49, 0x82, 0xB1,
dflet 0:400d8e75a8d0 700 0x0D, 0x5E, 0xEB, 0x55, 0xC3, 0xE4, 0xDE, 0x15,
dflet 0:400d8e75a8d0 701 0x13, 0x46, 0x76, 0xFB, 0x6D, 0xE0, 0x44, 0x60,
dflet 0:400d8e75a8d0 702 0x65, 0xC9, 0x74, 0x40, 0xFA, 0x8C, 0x6A, 0x58 }
dflet 0:400d8e75a8d0 703 };
dflet 0:400d8e75a8d0 704
dflet 0:400d8e75a8d0 705 /*
dflet 0:400d8e75a8d0 706 * Checkup routine
dflet 0:400d8e75a8d0 707 */
dflet 0:400d8e75a8d0 708 int sha512_self_test( int verbose )
dflet 0:400d8e75a8d0 709 {
dflet 0:400d8e75a8d0 710 int i, j, k, buflen, ret = 0;
dflet 0:400d8e75a8d0 711 unsigned char buf[1024];
dflet 0:400d8e75a8d0 712 unsigned char sha512sum[64];
dflet 0:400d8e75a8d0 713 sha512_context ctx;
dflet 0:400d8e75a8d0 714
dflet 0:400d8e75a8d0 715 sha512_init( &ctx );
dflet 0:400d8e75a8d0 716
dflet 0:400d8e75a8d0 717 for( i = 0; i < 6; i++ )
dflet 0:400d8e75a8d0 718 {
dflet 0:400d8e75a8d0 719 j = i % 3;
dflet 0:400d8e75a8d0 720 k = i < 3;
dflet 0:400d8e75a8d0 721
dflet 0:400d8e75a8d0 722 if( verbose != 0 )
dflet 0:400d8e75a8d0 723 polarssl_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 );
dflet 0:400d8e75a8d0 724
dflet 0:400d8e75a8d0 725 sha512_starts( &ctx, k );
dflet 0:400d8e75a8d0 726
dflet 0:400d8e75a8d0 727 if( j == 2 )
dflet 0:400d8e75a8d0 728 {
dflet 0:400d8e75a8d0 729 memset( buf, 'a', buflen = 1000 );
dflet 0:400d8e75a8d0 730
dflet 0:400d8e75a8d0 731 for( j = 0; j < 1000; j++ )
dflet 0:400d8e75a8d0 732 sha512_update( &ctx, buf, buflen );
dflet 0:400d8e75a8d0 733 }
dflet 0:400d8e75a8d0 734 else
dflet 0:400d8e75a8d0 735 sha512_update( &ctx, sha512_test_buf[j],
dflet 0:400d8e75a8d0 736 sha512_test_buflen[j] );
dflet 0:400d8e75a8d0 737
dflet 0:400d8e75a8d0 738 sha512_finish( &ctx, sha512sum );
dflet 0:400d8e75a8d0 739
dflet 0:400d8e75a8d0 740 if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
dflet 0:400d8e75a8d0 741 {
dflet 0:400d8e75a8d0 742 if( verbose != 0 )
dflet 0:400d8e75a8d0 743 polarssl_printf( "failed\n" );
dflet 0:400d8e75a8d0 744
dflet 0:400d8e75a8d0 745 ret = 1;
dflet 0:400d8e75a8d0 746 goto exit;
dflet 0:400d8e75a8d0 747 }
dflet 0:400d8e75a8d0 748
dflet 0:400d8e75a8d0 749 if( verbose != 0 )
dflet 0:400d8e75a8d0 750 polarssl_printf( "passed\n" );
dflet 0:400d8e75a8d0 751 }
dflet 0:400d8e75a8d0 752
dflet 0:400d8e75a8d0 753 if( verbose != 0 )
dflet 0:400d8e75a8d0 754 polarssl_printf( "\n" );
dflet 0:400d8e75a8d0 755
dflet 0:400d8e75a8d0 756 for( i = 0; i < 14; i++ )
dflet 0:400d8e75a8d0 757 {
dflet 0:400d8e75a8d0 758 j = i % 7;
dflet 0:400d8e75a8d0 759 k = i < 7;
dflet 0:400d8e75a8d0 760
dflet 0:400d8e75a8d0 761 if( verbose != 0 )
dflet 0:400d8e75a8d0 762 polarssl_printf( " HMAC-SHA-%d test #%d: ", 512 - k * 128, j + 1 );
dflet 0:400d8e75a8d0 763
dflet 0:400d8e75a8d0 764 if( j == 5 || j == 6 )
dflet 0:400d8e75a8d0 765 {
dflet 0:400d8e75a8d0 766 memset( buf, 0xAA, buflen = 131 );
dflet 0:400d8e75a8d0 767 sha512_hmac_starts( &ctx, buf, buflen, k );
dflet 0:400d8e75a8d0 768 }
dflet 0:400d8e75a8d0 769 else
dflet 0:400d8e75a8d0 770 sha512_hmac_starts( &ctx, sha512_hmac_test_key[j],
dflet 0:400d8e75a8d0 771 sha512_hmac_test_keylen[j], k );
dflet 0:400d8e75a8d0 772
dflet 0:400d8e75a8d0 773 sha512_hmac_update( &ctx, sha512_hmac_test_buf[j],
dflet 0:400d8e75a8d0 774 sha512_hmac_test_buflen[j] );
dflet 0:400d8e75a8d0 775
dflet 0:400d8e75a8d0 776 sha512_hmac_finish( &ctx, sha512sum );
dflet 0:400d8e75a8d0 777
dflet 0:400d8e75a8d0 778 buflen = ( j == 4 ) ? 16 : 64 - k * 16;
dflet 0:400d8e75a8d0 779
dflet 0:400d8e75a8d0 780 if( memcmp( sha512sum, sha512_hmac_test_sum[i], buflen ) != 0 )
dflet 0:400d8e75a8d0 781 {
dflet 0:400d8e75a8d0 782 if( verbose != 0 )
dflet 0:400d8e75a8d0 783 polarssl_printf( "failed\n" );
dflet 0:400d8e75a8d0 784
dflet 0:400d8e75a8d0 785 ret = 1;
dflet 0:400d8e75a8d0 786 goto exit;
dflet 0:400d8e75a8d0 787 }
dflet 0:400d8e75a8d0 788
dflet 0:400d8e75a8d0 789 if( verbose != 0 )
dflet 0:400d8e75a8d0 790 polarssl_printf( "passed\n" );
dflet 0:400d8e75a8d0 791 }
dflet 0:400d8e75a8d0 792
dflet 0:400d8e75a8d0 793 if( verbose != 0 )
dflet 0:400d8e75a8d0 794 polarssl_printf( "\n" );
dflet 0:400d8e75a8d0 795
dflet 0:400d8e75a8d0 796 exit:
dflet 0:400d8e75a8d0 797 sha512_free( &ctx );
dflet 0:400d8e75a8d0 798
dflet 0:400d8e75a8d0 799 return( ret );
dflet 0:400d8e75a8d0 800 }
dflet 0:400d8e75a8d0 801
dflet 0:400d8e75a8d0 802 #endif /* POLARSSL_SELF_TEST */
dflet 0:400d8e75a8d0 803
dflet 0:400d8e75a8d0 804 #endif /* POLARSSL_SHA512_C */
dflet 0:400d8e75a8d0 805