blob: ca74e9026fbf2870954e3c50d26bfaf78ededb69 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-384/512 implementation
3 *
Manuel Pégourié-Gonnarda658a402015-01-23 09:45:19 +00004 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
Manuel Pégourié-Gonnard085ab042015-01-23 11:06:27 +00006 * This file is part of mbed TLS (https://www.polarssl.org)
Paul Bakkerb96f1542010-07-18 20:36:00 +00007 *
Paul Bakker5121ce52009-01-03 21:22:43 +00008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22/*
23 * The SHA-512 Secure Hash Standard was published by NIST in 2002.
24 *
25 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
26 */
27
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020028#if !defined(POLARSSL_CONFIG_FILE)
Paul Bakker40e46942009-01-03 21:51:57 +000029#include "polarssl/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
31#include POLARSSL_CONFIG_FILE
32#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Paul Bakker9e36f042013-06-30 14:34:05 +020034#if defined(POLARSSL_SHA512_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakkerd2681d82013-06-30 14:49:12 +020036#include "polarssl/sha512.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Paul Bakker335db3f2011-04-25 15:28:35 +000038#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +000039#include <stdio.h>
Paul Bakker335db3f2011-04-25 15:28:35 +000040#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000041
Paul Bakker7dc4c442014-02-01 22:50:26 +010042#if defined(POLARSSL_PLATFORM_C)
43#include "polarssl/platform.h"
44#else
45#define polarssl_printf printf
46#endif
47
Paul Bakker34617722014-06-13 17:20:13 +020048/* Implementation that should never be optimized out by the compiler */
49static void polarssl_zeroize( void *v, size_t n ) {
50 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
51}
52
Paul Bakker9e36f042013-06-30 14:34:05 +020053#if !defined(POLARSSL_SHA512_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020054
Paul Bakker5121ce52009-01-03 21:22:43 +000055/*
56 * 64-bit integer manipulation macros (big endian)
57 */
58#ifndef GET_UINT64_BE
59#define GET_UINT64_BE(n,b,i) \
60{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000061 (n) = ( (uint64_t) (b)[(i) ] << 56 ) \
62 | ( (uint64_t) (b)[(i) + 1] << 48 ) \
63 | ( (uint64_t) (b)[(i) + 2] << 40 ) \
64 | ( (uint64_t) (b)[(i) + 3] << 32 ) \
65 | ( (uint64_t) (b)[(i) + 4] << 24 ) \
66 | ( (uint64_t) (b)[(i) + 5] << 16 ) \
67 | ( (uint64_t) (b)[(i) + 6] << 8 ) \
68 | ( (uint64_t) (b)[(i) + 7] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000069}
Paul Bakker9af723c2014-05-01 13:03:14 +020070#endif /* GET_UINT64_BE */
Paul Bakker5121ce52009-01-03 21:22:43 +000071
72#ifndef PUT_UINT64_BE
73#define PUT_UINT64_BE(n,b,i) \
74{ \
75 (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \
76 (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \
77 (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \
78 (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \
79 (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \
80 (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \
81 (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \
82 (b)[(i) + 7] = (unsigned char) ( (n) ); \
83}
Paul Bakker9af723c2014-05-01 13:03:14 +020084#endif /* PUT_UINT64_BE */
Paul Bakker5121ce52009-01-03 21:22:43 +000085
86/*
87 * Round constants
88 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000089static const uint64_t K[80] =
Paul Bakker5121ce52009-01-03 21:22:43 +000090{
91 UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
92 UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
93 UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
94 UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
95 UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
96 UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
97 UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
98 UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
99 UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
100 UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
101 UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
102 UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
103 UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
104 UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
105 UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
106 UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
107 UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
108 UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
109 UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
110 UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
111 UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
112 UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
113 UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
114 UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
115 UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
116 UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
117 UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
118 UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
119 UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
120 UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
121 UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
122 UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
123 UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
124 UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
125 UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
126 UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
127 UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
128 UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
129 UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
130 UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
131};
132
Paul Bakker5b4af392014-06-26 12:09:34 +0200133void sha512_init( sha512_context *ctx )
134{
135 memset( ctx, 0, sizeof( sha512_context ) );
136}
137
138void sha512_free( sha512_context *ctx )
139{
140 if( ctx == NULL )
141 return;
142
143 polarssl_zeroize( ctx, sizeof( sha512_context ) );
144}
145
Paul Bakker5121ce52009-01-03 21:22:43 +0000146/*
147 * SHA-512 context setup
148 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200149void sha512_starts( sha512_context *ctx, int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000150{
151 ctx->total[0] = 0;
152 ctx->total[1] = 0;
153
154 if( is384 == 0 )
155 {
156 /* SHA-512 */
157 ctx->state[0] = UL64(0x6A09E667F3BCC908);
158 ctx->state[1] = UL64(0xBB67AE8584CAA73B);
159 ctx->state[2] = UL64(0x3C6EF372FE94F82B);
160 ctx->state[3] = UL64(0xA54FF53A5F1D36F1);
161 ctx->state[4] = UL64(0x510E527FADE682D1);
162 ctx->state[5] = UL64(0x9B05688C2B3E6C1F);
163 ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);
164 ctx->state[7] = UL64(0x5BE0CD19137E2179);
165 }
166 else
167 {
168 /* SHA-384 */
169 ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
170 ctx->state[1] = UL64(0x629A292A367CD507);
171 ctx->state[2] = UL64(0x9159015A3070DD17);
172 ctx->state[3] = UL64(0x152FECD8F70E5939);
173 ctx->state[4] = UL64(0x67332667FFC00B31);
174 ctx->state[5] = UL64(0x8EB44A8768581511);
175 ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
176 ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
177 }
178
179 ctx->is384 = is384;
180}
181
Paul Bakker9e36f042013-06-30 14:34:05 +0200182void sha512_process( sha512_context *ctx, const unsigned char data[128] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000183{
184 int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000185 uint64_t temp1, temp2, W[80];
186 uint64_t A, B, C, D, E, F, G, H;
Paul Bakker5121ce52009-01-03 21:22:43 +0000187
188#define SHR(x,n) (x >> n)
189#define ROTR(x,n) (SHR(x,n) | (x << (64 - n)))
190
191#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
192#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
193
194#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
195#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
196
197#define F0(x,y,z) ((x & y) | (z & (x | y)))
198#define F1(x,y,z) (z ^ (x & (y ^ z)))
199
200#define P(a,b,c,d,e,f,g,h,x,K) \
201{ \
202 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
203 temp2 = S2(a) + F0(a,b,c); \
204 d += temp1; h = temp1 + temp2; \
205}
206
207 for( i = 0; i < 16; i++ )
208 {
209 GET_UINT64_BE( W[i], data, i << 3 );
210 }
211
212 for( ; i < 80; i++ )
213 {
214 W[i] = S1(W[i - 2]) + W[i - 7] +
215 S0(W[i - 15]) + W[i - 16];
216 }
217
218 A = ctx->state[0];
219 B = ctx->state[1];
220 C = ctx->state[2];
221 D = ctx->state[3];
222 E = ctx->state[4];
223 F = ctx->state[5];
224 G = ctx->state[6];
225 H = ctx->state[7];
226 i = 0;
227
228 do
229 {
230 P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++;
231 P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++;
232 P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++;
233 P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++;
234 P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++;
235 P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++;
236 P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++;
237 P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++;
238 }
239 while( i < 80 );
240
241 ctx->state[0] += A;
242 ctx->state[1] += B;
243 ctx->state[2] += C;
244 ctx->state[3] += D;
245 ctx->state[4] += E;
246 ctx->state[5] += F;
247 ctx->state[6] += G;
248 ctx->state[7] += H;
249}
250
251/*
252 * SHA-512 process buffer
253 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200254void sha512_update( sha512_context *ctx, const unsigned char *input,
255 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000256{
Paul Bakker23986e52011-04-24 08:57:21 +0000257 size_t fill;
Paul Bakkerb8213a12011-07-11 08:16:18 +0000258 unsigned int left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000259
Brian White12895d12014-04-11 11:29:42 -0400260 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000261 return;
262
Paul Bakkerb8213a12011-07-11 08:16:18 +0000263 left = (unsigned int) (ctx->total[0] & 0x7F);
Paul Bakker27fdf462011-06-09 13:55:13 +0000264 fill = 128 - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000265
Paul Bakker5c2364c2012-10-01 14:41:15 +0000266 ctx->total[0] += (uint64_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000267
Paul Bakker5c2364c2012-10-01 14:41:15 +0000268 if( ctx->total[0] < (uint64_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000269 ctx->total[1]++;
270
271 if( left && ilen >= fill )
272 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200273 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker9e36f042013-06-30 14:34:05 +0200274 sha512_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000275 input += fill;
276 ilen -= fill;
277 left = 0;
278 }
279
280 while( ilen >= 128 )
281 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200282 sha512_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000283 input += 128;
284 ilen -= 128;
285 }
286
287 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200288 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000289}
290
Paul Bakker9e36f042013-06-30 14:34:05 +0200291static const unsigned char sha512_padding[128] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000292{
293 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
294 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
295 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
296 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
297 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
298 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
299 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
300 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
301};
302
303/*
304 * SHA-512 final digest
305 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200306void sha512_finish( sha512_context *ctx, unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000307{
Paul Bakker27fdf462011-06-09 13:55:13 +0000308 size_t last, padn;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000309 uint64_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000310 unsigned char msglen[16];
311
312 high = ( ctx->total[0] >> 61 )
313 | ( ctx->total[1] << 3 );
314 low = ( ctx->total[0] << 3 );
315
316 PUT_UINT64_BE( high, msglen, 0 );
317 PUT_UINT64_BE( low, msglen, 8 );
318
Paul Bakker27fdf462011-06-09 13:55:13 +0000319 last = (size_t)( ctx->total[0] & 0x7F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000320 padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
321
Paul Bakker9e36f042013-06-30 14:34:05 +0200322 sha512_update( ctx, sha512_padding, padn );
323 sha512_update( ctx, msglen, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000324
325 PUT_UINT64_BE( ctx->state[0], output, 0 );
326 PUT_UINT64_BE( ctx->state[1], output, 8 );
327 PUT_UINT64_BE( ctx->state[2], output, 16 );
328 PUT_UINT64_BE( ctx->state[3], output, 24 );
329 PUT_UINT64_BE( ctx->state[4], output, 32 );
330 PUT_UINT64_BE( ctx->state[5], output, 40 );
331
332 if( ctx->is384 == 0 )
333 {
334 PUT_UINT64_BE( ctx->state[6], output, 48 );
335 PUT_UINT64_BE( ctx->state[7], output, 56 );
336 }
337}
338
Paul Bakker9e36f042013-06-30 14:34:05 +0200339#endif /* !POLARSSL_SHA512_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200340
Paul Bakker5121ce52009-01-03 21:22:43 +0000341/*
342 * output = SHA-512( input buffer )
343 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200344void sha512( const unsigned char *input, size_t ilen,
345 unsigned char output[64], int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000346{
Paul Bakker9e36f042013-06-30 14:34:05 +0200347 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000348
Paul Bakker5b4af392014-06-26 12:09:34 +0200349 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200350 sha512_starts( &ctx, is384 );
351 sha512_update( &ctx, input, ilen );
352 sha512_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200353 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000354}
355
Paul Bakker335db3f2011-04-25 15:28:35 +0000356#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000357/*
358 * output = SHA-512( file contents )
359 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200360int sha512_file( const char *path, unsigned char output[64], int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000361{
362 FILE *f;
363 size_t n;
Paul Bakker9e36f042013-06-30 14:34:05 +0200364 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000365 unsigned char buf[1024];
366
367 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker9e36f042013-06-30 14:34:05 +0200368 return( POLARSSL_ERR_SHA512_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000369
Paul Bakker5b4af392014-06-26 12:09:34 +0200370 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200371 sha512_starts( &ctx, is384 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000372
373 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker9e36f042013-06-30 14:34:05 +0200374 sha512_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000375
Paul Bakker9e36f042013-06-30 14:34:05 +0200376 sha512_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200377 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000378
379 if( ferror( f ) != 0 )
380 {
381 fclose( f );
Paul Bakker9e36f042013-06-30 14:34:05 +0200382 return( POLARSSL_ERR_SHA512_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000383 }
384
385 fclose( f );
386 return( 0 );
387}
Paul Bakker335db3f2011-04-25 15:28:35 +0000388#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000389
390/*
391 * SHA-512 HMAC context setup
392 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200393void sha512_hmac_starts( sha512_context *ctx, const unsigned char *key,
394 size_t keylen, int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000395{
Paul Bakker23986e52011-04-24 08:57:21 +0000396 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000397 unsigned char sum[64];
398
399 if( keylen > 128 )
400 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200401 sha512( key, keylen, sum, is384 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000402 keylen = ( is384 ) ? 48 : 64;
403 key = sum;
404 }
405
406 memset( ctx->ipad, 0x36, 128 );
407 memset( ctx->opad, 0x5C, 128 );
408
409 for( i = 0; i < keylen; i++ )
410 {
411 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
412 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
413 }
414
Paul Bakker9e36f042013-06-30 14:34:05 +0200415 sha512_starts( ctx, is384 );
416 sha512_update( ctx, ctx->ipad, 128 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
Paul Bakker34617722014-06-13 17:20:13 +0200418 polarssl_zeroize( sum, sizeof( sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000419}
420
421/*
422 * SHA-512 HMAC process buffer
423 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200424void sha512_hmac_update( sha512_context *ctx,
425 const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000426{
Paul Bakker9e36f042013-06-30 14:34:05 +0200427 sha512_update( ctx, input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000428}
429
430/*
431 * SHA-512 HMAC final digest
432 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200433void sha512_hmac_finish( sha512_context *ctx, unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000434{
435 int is384, hlen;
436 unsigned char tmpbuf[64];
437
438 is384 = ctx->is384;
439 hlen = ( is384 == 0 ) ? 64 : 48;
440
Paul Bakker9e36f042013-06-30 14:34:05 +0200441 sha512_finish( ctx, tmpbuf );
442 sha512_starts( ctx, is384 );
443 sha512_update( ctx, ctx->opad, 128 );
444 sha512_update( ctx, tmpbuf, hlen );
445 sha512_finish( ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000446
Paul Bakker34617722014-06-13 17:20:13 +0200447 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000448}
449
450/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000451 * SHA-512 HMAC context reset
452 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200453void sha512_hmac_reset( sha512_context *ctx )
Paul Bakker7d3b6612010-03-21 16:23:13 +0000454{
Paul Bakker9e36f042013-06-30 14:34:05 +0200455 sha512_starts( ctx, ctx->is384 );
456 sha512_update( ctx, ctx->ipad, 128 );
Paul Bakker7d3b6612010-03-21 16:23:13 +0000457}
458
459/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000460 * output = HMAC-SHA-512( hmac key, input buffer )
461 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200462void sha512_hmac( const unsigned char *key, size_t keylen,
Paul Bakker23986e52011-04-24 08:57:21 +0000463 const unsigned char *input, size_t ilen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000464 unsigned char output[64], int is384 )
465{
Paul Bakker9e36f042013-06-30 14:34:05 +0200466 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000467
Paul Bakker5b4af392014-06-26 12:09:34 +0200468 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200469 sha512_hmac_starts( &ctx, key, keylen, is384 );
470 sha512_hmac_update( &ctx, input, ilen );
471 sha512_hmac_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200472 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000473}
474
Paul Bakker40e46942009-01-03 21:51:57 +0000475#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000476
477/*
478 * FIPS-180-2 test vectors
479 */
Paul Bakker9af723c2014-05-01 13:03:14 +0200480static unsigned char sha512_test_buf[3][113] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000481{
482 { "abc" },
483 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
484 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
485 { "" }
486};
487
Paul Bakker9e36f042013-06-30 14:34:05 +0200488static const int sha512_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000489{
490 3, 112, 1000
491};
492
Paul Bakker9e36f042013-06-30 14:34:05 +0200493static const unsigned char sha512_test_sum[6][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000494{
495 /*
496 * SHA-384 test vectors
497 */
498 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
499 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
500 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
501 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
502 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
503 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
504 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
505 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
506 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
507 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
508 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
509 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
510 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
511 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
512 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
513 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
514 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
515 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
516
517 /*
518 * SHA-512 test vectors
519 */
520 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
521 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
522 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
523 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
524 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
525 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
526 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
527 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
528 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
529 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
530 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
531 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
532 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
533 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
534 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
535 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
536 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
537 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
538 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
539 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
540 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
541 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
542 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
543 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
544};
545
546/*
547 * RFC 4231 test vectors
548 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200549static unsigned char sha512_hmac_test_key[7][26] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000550{
551 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
552 "\x0B\x0B\x0B\x0B" },
553 { "Jefe" },
554 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
555 "\xAA\xAA\xAA\xAA" },
556 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
557 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
558 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
559 "\x0C\x0C\x0C\x0C" },
560 { "" }, /* 0xAA 131 times */
561 { "" }
562};
563
Paul Bakker9e36f042013-06-30 14:34:05 +0200564static const int sha512_hmac_test_keylen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000565{
566 20, 4, 20, 25, 20, 131, 131
567};
568
Paul Bakker9e36f042013-06-30 14:34:05 +0200569static unsigned char sha512_hmac_test_buf[7][153] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000570{
571 { "Hi There" },
572 { "what do ya want for nothing?" },
573 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
574 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
575 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
576 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
577 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
578 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
579 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
580 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
581 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
582 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
583 { "Test With Truncation" },
584 { "Test Using Larger Than Block-Size Key - Hash Key First" },
585 { "This is a test using a larger than block-size key "
586 "and a larger than block-size data. The key needs to "
587 "be hashed before being used by the HMAC algorithm." }
588};
589
Paul Bakker9e36f042013-06-30 14:34:05 +0200590static const int sha512_hmac_test_buflen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000591{
592 8, 28, 50, 50, 20, 54, 152
593};
594
Paul Bakker9e36f042013-06-30 14:34:05 +0200595static const unsigned char sha512_hmac_test_sum[14][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000596{
597 /*
598 * HMAC-SHA-384 test vectors
599 */
600 { 0xAF, 0xD0, 0x39, 0x44, 0xD8, 0x48, 0x95, 0x62,
601 0x6B, 0x08, 0x25, 0xF4, 0xAB, 0x46, 0x90, 0x7F,
602 0x15, 0xF9, 0xDA, 0xDB, 0xE4, 0x10, 0x1E, 0xC6,
603 0x82, 0xAA, 0x03, 0x4C, 0x7C, 0xEB, 0xC5, 0x9C,
604 0xFA, 0xEA, 0x9E, 0xA9, 0x07, 0x6E, 0xDE, 0x7F,
605 0x4A, 0xF1, 0x52, 0xE8, 0xB2, 0xFA, 0x9C, 0xB6 },
606 { 0xAF, 0x45, 0xD2, 0xE3, 0x76, 0x48, 0x40, 0x31,
607 0x61, 0x7F, 0x78, 0xD2, 0xB5, 0x8A, 0x6B, 0x1B,
608 0x9C, 0x7E, 0xF4, 0x64, 0xF5, 0xA0, 0x1B, 0x47,
609 0xE4, 0x2E, 0xC3, 0x73, 0x63, 0x22, 0x44, 0x5E,
610 0x8E, 0x22, 0x40, 0xCA, 0x5E, 0x69, 0xE2, 0xC7,
611 0x8B, 0x32, 0x39, 0xEC, 0xFA, 0xB2, 0x16, 0x49 },
612 { 0x88, 0x06, 0x26, 0x08, 0xD3, 0xE6, 0xAD, 0x8A,
613 0x0A, 0xA2, 0xAC, 0xE0, 0x14, 0xC8, 0xA8, 0x6F,
614 0x0A, 0xA6, 0x35, 0xD9, 0x47, 0xAC, 0x9F, 0xEB,
615 0xE8, 0x3E, 0xF4, 0xE5, 0x59, 0x66, 0x14, 0x4B,
616 0x2A, 0x5A, 0xB3, 0x9D, 0xC1, 0x38, 0x14, 0xB9,
617 0x4E, 0x3A, 0xB6, 0xE1, 0x01, 0xA3, 0x4F, 0x27 },
618 { 0x3E, 0x8A, 0x69, 0xB7, 0x78, 0x3C, 0x25, 0x85,
619 0x19, 0x33, 0xAB, 0x62, 0x90, 0xAF, 0x6C, 0xA7,
620 0x7A, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9C,
621 0xC5, 0x57, 0x7C, 0x6E, 0x1F, 0x57, 0x3B, 0x4E,
622 0x68, 0x01, 0xDD, 0x23, 0xC4, 0xA7, 0xD6, 0x79,
623 0xCC, 0xF8, 0xA3, 0x86, 0xC6, 0x74, 0xCF, 0xFB },
624 { 0x3A, 0xBF, 0x34, 0xC3, 0x50, 0x3B, 0x2A, 0x23,
625 0xA4, 0x6E, 0xFC, 0x61, 0x9B, 0xAE, 0xF8, 0x97 },
626 { 0x4E, 0xCE, 0x08, 0x44, 0x85, 0x81, 0x3E, 0x90,
627 0x88, 0xD2, 0xC6, 0x3A, 0x04, 0x1B, 0xC5, 0xB4,
628 0x4F, 0x9E, 0xF1, 0x01, 0x2A, 0x2B, 0x58, 0x8F,
629 0x3C, 0xD1, 0x1F, 0x05, 0x03, 0x3A, 0xC4, 0xC6,
630 0x0C, 0x2E, 0xF6, 0xAB, 0x40, 0x30, 0xFE, 0x82,
631 0x96, 0x24, 0x8D, 0xF1, 0x63, 0xF4, 0x49, 0x52 },
632 { 0x66, 0x17, 0x17, 0x8E, 0x94, 0x1F, 0x02, 0x0D,
633 0x35, 0x1E, 0x2F, 0x25, 0x4E, 0x8F, 0xD3, 0x2C,
634 0x60, 0x24, 0x20, 0xFE, 0xB0, 0xB8, 0xFB, 0x9A,
635 0xDC, 0xCE, 0xBB, 0x82, 0x46, 0x1E, 0x99, 0xC5,
636 0xA6, 0x78, 0xCC, 0x31, 0xE7, 0x99, 0x17, 0x6D,
637 0x38, 0x60, 0xE6, 0x11, 0x0C, 0x46, 0x52, 0x3E },
638
639 /*
640 * HMAC-SHA-512 test vectors
641 */
642 { 0x87, 0xAA, 0x7C, 0xDE, 0xA5, 0xEF, 0x61, 0x9D,
643 0x4F, 0xF0, 0xB4, 0x24, 0x1A, 0x1D, 0x6C, 0xB0,
644 0x23, 0x79, 0xF4, 0xE2, 0xCE, 0x4E, 0xC2, 0x78,
645 0x7A, 0xD0, 0xB3, 0x05, 0x45, 0xE1, 0x7C, 0xDE,
646 0xDA, 0xA8, 0x33, 0xB7, 0xD6, 0xB8, 0xA7, 0x02,
647 0x03, 0x8B, 0x27, 0x4E, 0xAE, 0xA3, 0xF4, 0xE4,
648 0xBE, 0x9D, 0x91, 0x4E, 0xEB, 0x61, 0xF1, 0x70,
649 0x2E, 0x69, 0x6C, 0x20, 0x3A, 0x12, 0x68, 0x54 },
650 { 0x16, 0x4B, 0x7A, 0x7B, 0xFC, 0xF8, 0x19, 0xE2,
651 0xE3, 0x95, 0xFB, 0xE7, 0x3B, 0x56, 0xE0, 0xA3,
652 0x87, 0xBD, 0x64, 0x22, 0x2E, 0x83, 0x1F, 0xD6,
653 0x10, 0x27, 0x0C, 0xD7, 0xEA, 0x25, 0x05, 0x54,
654 0x97, 0x58, 0xBF, 0x75, 0xC0, 0x5A, 0x99, 0x4A,
655 0x6D, 0x03, 0x4F, 0x65, 0xF8, 0xF0, 0xE6, 0xFD,
656 0xCA, 0xEA, 0xB1, 0xA3, 0x4D, 0x4A, 0x6B, 0x4B,
657 0x63, 0x6E, 0x07, 0x0A, 0x38, 0xBC, 0xE7, 0x37 },
658 { 0xFA, 0x73, 0xB0, 0x08, 0x9D, 0x56, 0xA2, 0x84,
659 0xEF, 0xB0, 0xF0, 0x75, 0x6C, 0x89, 0x0B, 0xE9,
660 0xB1, 0xB5, 0xDB, 0xDD, 0x8E, 0xE8, 0x1A, 0x36,
661 0x55, 0xF8, 0x3E, 0x33, 0xB2, 0x27, 0x9D, 0x39,
662 0xBF, 0x3E, 0x84, 0x82, 0x79, 0xA7, 0x22, 0xC8,
663 0x06, 0xB4, 0x85, 0xA4, 0x7E, 0x67, 0xC8, 0x07,
664 0xB9, 0x46, 0xA3, 0x37, 0xBE, 0xE8, 0x94, 0x26,
665 0x74, 0x27, 0x88, 0x59, 0xE1, 0x32, 0x92, 0xFB },
666 { 0xB0, 0xBA, 0x46, 0x56, 0x37, 0x45, 0x8C, 0x69,
667 0x90, 0xE5, 0xA8, 0xC5, 0xF6, 0x1D, 0x4A, 0xF7,
668 0xE5, 0x76, 0xD9, 0x7F, 0xF9, 0x4B, 0x87, 0x2D,
669 0xE7, 0x6F, 0x80, 0x50, 0x36, 0x1E, 0xE3, 0xDB,
670 0xA9, 0x1C, 0xA5, 0xC1, 0x1A, 0xA2, 0x5E, 0xB4,
671 0xD6, 0x79, 0x27, 0x5C, 0xC5, 0x78, 0x80, 0x63,
672 0xA5, 0xF1, 0x97, 0x41, 0x12, 0x0C, 0x4F, 0x2D,
673 0xE2, 0xAD, 0xEB, 0xEB, 0x10, 0xA2, 0x98, 0xDD },
674 { 0x41, 0x5F, 0xAD, 0x62, 0x71, 0x58, 0x0A, 0x53,
675 0x1D, 0x41, 0x79, 0xBC, 0x89, 0x1D, 0x87, 0xA6 },
676 { 0x80, 0xB2, 0x42, 0x63, 0xC7, 0xC1, 0xA3, 0xEB,
677 0xB7, 0x14, 0x93, 0xC1, 0xDD, 0x7B, 0xE8, 0xB4,
678 0x9B, 0x46, 0xD1, 0xF4, 0x1B, 0x4A, 0xEE, 0xC1,
679 0x12, 0x1B, 0x01, 0x37, 0x83, 0xF8, 0xF3, 0x52,
680 0x6B, 0x56, 0xD0, 0x37, 0xE0, 0x5F, 0x25, 0x98,
681 0xBD, 0x0F, 0xD2, 0x21, 0x5D, 0x6A, 0x1E, 0x52,
682 0x95, 0xE6, 0x4F, 0x73, 0xF6, 0x3F, 0x0A, 0xEC,
683 0x8B, 0x91, 0x5A, 0x98, 0x5D, 0x78, 0x65, 0x98 },
684 { 0xE3, 0x7B, 0x6A, 0x77, 0x5D, 0xC8, 0x7D, 0xBA,
685 0xA4, 0xDF, 0xA9, 0xF9, 0x6E, 0x5E, 0x3F, 0xFD,
686 0xDE, 0xBD, 0x71, 0xF8, 0x86, 0x72, 0x89, 0x86,
687 0x5D, 0xF5, 0xA3, 0x2D, 0x20, 0xCD, 0xC9, 0x44,
688 0xB6, 0x02, 0x2C, 0xAC, 0x3C, 0x49, 0x82, 0xB1,
689 0x0D, 0x5E, 0xEB, 0x55, 0xC3, 0xE4, 0xDE, 0x15,
690 0x13, 0x46, 0x76, 0xFB, 0x6D, 0xE0, 0x44, 0x60,
691 0x65, 0xC9, 0x74, 0x40, 0xFA, 0x8C, 0x6A, 0x58 }
692};
693
694/*
695 * Checkup routine
696 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200697int sha512_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000698{
Paul Bakker5b4af392014-06-26 12:09:34 +0200699 int i, j, k, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000700 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200701 unsigned char sha512sum[64];
702 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000703
Paul Bakker5b4af392014-06-26 12:09:34 +0200704 sha512_init( &ctx );
705
Paul Bakker5121ce52009-01-03 21:22:43 +0000706 for( i = 0; i < 6; i++ )
707 {
708 j = i % 3;
709 k = i < 3;
710
711 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100712 polarssl_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000713
Paul Bakker9e36f042013-06-30 14:34:05 +0200714 sha512_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000715
716 if( j == 2 )
717 {
718 memset( buf, 'a', buflen = 1000 );
719
720 for( j = 0; j < 1000; j++ )
Paul Bakker9e36f042013-06-30 14:34:05 +0200721 sha512_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000722 }
723 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200724 sha512_update( &ctx, sha512_test_buf[j],
725 sha512_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000726
Paul Bakker9e36f042013-06-30 14:34:05 +0200727 sha512_finish( &ctx, sha512sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000728
Paul Bakker9e36f042013-06-30 14:34:05 +0200729 if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000730 {
731 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100732 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000733
Paul Bakker5b4af392014-06-26 12:09:34 +0200734 ret = 1;
735 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000736 }
737
738 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100739 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000740 }
741
742 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100743 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000744
745 for( i = 0; i < 14; i++ )
746 {
747 j = i % 7;
748 k = i < 7;
749
750 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100751 polarssl_printf( " HMAC-SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000752
753 if( j == 5 || j == 6 )
754 {
755 memset( buf, '\xAA', buflen = 131 );
Paul Bakker9e36f042013-06-30 14:34:05 +0200756 sha512_hmac_starts( &ctx, buf, buflen, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000757 }
758 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200759 sha512_hmac_starts( &ctx, sha512_hmac_test_key[j],
760 sha512_hmac_test_keylen[j], k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000761
Paul Bakker9e36f042013-06-30 14:34:05 +0200762 sha512_hmac_update( &ctx, sha512_hmac_test_buf[j],
763 sha512_hmac_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000764
Paul Bakker9e36f042013-06-30 14:34:05 +0200765 sha512_hmac_finish( &ctx, sha512sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000766
767 buflen = ( j == 4 ) ? 16 : 64 - k * 16;
768
Paul Bakker9e36f042013-06-30 14:34:05 +0200769 if( memcmp( sha512sum, sha512_hmac_test_sum[i], buflen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000770 {
771 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100772 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000773
Paul Bakker5b4af392014-06-26 12:09:34 +0200774 ret = 1;
775 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000776 }
777
778 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100779 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000780 }
781
782 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100783 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000784
Paul Bakker5b4af392014-06-26 12:09:34 +0200785exit:
786 sha512_free( &ctx );
787
788 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000789}
790
Paul Bakker9af723c2014-05-01 13:03:14 +0200791#endif /* POLARSSL_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000792
Paul Bakker9af723c2014-05-01 13:03:14 +0200793#endif /* POLARSSL_SHA512_C */