blob: 1ef088f2f0d4694b1cfbf68a85c6428d484fd731 [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é-Gonnardfe446432015-03-06 13:17:10 +00006 * This file is part of mbed TLS (https://tls.mbed.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)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/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
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000036#include "mbedtls/sha512.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Manuel Pégourié-Gonnard1dd16742015-03-05 16:13:04 +000038#if defined(_MSC_VER) || defined(__WATCOMC__)
39 #define UL64(x) x##ui64
40#else
41 #define UL64(x) x##ULL
42#endif
43
Rich Evans00ab4702015-02-06 13:43:58 +000044#include <string.h>
45
46#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +000047#include <stdio.h>
Paul Bakker335db3f2011-04-25 15:28:35 +000048#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000049
Rich Evans00ab4702015-02-06 13:43:58 +000050#if defined(POLARSSL_SELF_TEST)
Paul Bakker7dc4c442014-02-01 22:50:26 +010051#if defined(POLARSSL_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000052#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010053#else
Rich Evans00ab4702015-02-06 13:43:58 +000054#include <stdio.h>
Paul Bakker7dc4c442014-02-01 22:50:26 +010055#define polarssl_printf printf
Rich Evans00ab4702015-02-06 13:43:58 +000056#endif /* POLARSSL_PLATFORM_C */
57#endif /* POLARSSL_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010058
Paul Bakker34617722014-06-13 17:20:13 +020059/* Implementation that should never be optimized out by the compiler */
60static void polarssl_zeroize( void *v, size_t n ) {
61 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
62}
63
Paul Bakker9e36f042013-06-30 14:34:05 +020064#if !defined(POLARSSL_SHA512_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020065
Paul Bakker5121ce52009-01-03 21:22:43 +000066/*
67 * 64-bit integer manipulation macros (big endian)
68 */
69#ifndef GET_UINT64_BE
70#define GET_UINT64_BE(n,b,i) \
71{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000072 (n) = ( (uint64_t) (b)[(i) ] << 56 ) \
73 | ( (uint64_t) (b)[(i) + 1] << 48 ) \
74 | ( (uint64_t) (b)[(i) + 2] << 40 ) \
75 | ( (uint64_t) (b)[(i) + 3] << 32 ) \
76 | ( (uint64_t) (b)[(i) + 4] << 24 ) \
77 | ( (uint64_t) (b)[(i) + 5] << 16 ) \
78 | ( (uint64_t) (b)[(i) + 6] << 8 ) \
79 | ( (uint64_t) (b)[(i) + 7] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000080}
Paul Bakker9af723c2014-05-01 13:03:14 +020081#endif /* GET_UINT64_BE */
Paul Bakker5121ce52009-01-03 21:22:43 +000082
83#ifndef PUT_UINT64_BE
84#define PUT_UINT64_BE(n,b,i) \
85{ \
86 (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \
87 (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \
88 (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \
89 (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \
90 (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \
91 (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \
92 (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \
93 (b)[(i) + 7] = (unsigned char) ( (n) ); \
94}
Paul Bakker9af723c2014-05-01 13:03:14 +020095#endif /* PUT_UINT64_BE */
Paul Bakker5121ce52009-01-03 21:22:43 +000096
97/*
98 * Round constants
99 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000100static const uint64_t K[80] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000101{
102 UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
103 UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
104 UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
105 UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
106 UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
107 UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
108 UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
109 UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
110 UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
111 UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
112 UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
113 UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
114 UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
115 UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
116 UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
117 UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
118 UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
119 UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
120 UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
121 UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
122 UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
123 UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
124 UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
125 UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
126 UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
127 UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
128 UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
129 UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
130 UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
131 UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
132 UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
133 UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
134 UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
135 UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
136 UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
137 UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
138 UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
139 UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
140 UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
141 UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
142};
143
Paul Bakker5b4af392014-06-26 12:09:34 +0200144void sha512_init( sha512_context *ctx )
145{
146 memset( ctx, 0, sizeof( sha512_context ) );
147}
148
149void sha512_free( sha512_context *ctx )
150{
151 if( ctx == NULL )
152 return;
153
154 polarssl_zeroize( ctx, sizeof( sha512_context ) );
155}
156
Paul Bakker5121ce52009-01-03 21:22:43 +0000157/*
158 * SHA-512 context setup
159 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200160void sha512_starts( sha512_context *ctx, int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000161{
162 ctx->total[0] = 0;
163 ctx->total[1] = 0;
164
165 if( is384 == 0 )
166 {
167 /* SHA-512 */
168 ctx->state[0] = UL64(0x6A09E667F3BCC908);
169 ctx->state[1] = UL64(0xBB67AE8584CAA73B);
170 ctx->state[2] = UL64(0x3C6EF372FE94F82B);
171 ctx->state[3] = UL64(0xA54FF53A5F1D36F1);
172 ctx->state[4] = UL64(0x510E527FADE682D1);
173 ctx->state[5] = UL64(0x9B05688C2B3E6C1F);
174 ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);
175 ctx->state[7] = UL64(0x5BE0CD19137E2179);
176 }
177 else
178 {
179 /* SHA-384 */
180 ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
181 ctx->state[1] = UL64(0x629A292A367CD507);
182 ctx->state[2] = UL64(0x9159015A3070DD17);
183 ctx->state[3] = UL64(0x152FECD8F70E5939);
184 ctx->state[4] = UL64(0x67332667FFC00B31);
185 ctx->state[5] = UL64(0x8EB44A8768581511);
186 ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
187 ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
188 }
189
190 ctx->is384 = is384;
191}
192
Paul Bakker9e36f042013-06-30 14:34:05 +0200193void sha512_process( sha512_context *ctx, const unsigned char data[128] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000194{
195 int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000196 uint64_t temp1, temp2, W[80];
197 uint64_t A, B, C, D, E, F, G, H;
Paul Bakker5121ce52009-01-03 21:22:43 +0000198
199#define SHR(x,n) (x >> n)
200#define ROTR(x,n) (SHR(x,n) | (x << (64 - n)))
201
202#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
203#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
204
205#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
206#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
207
208#define F0(x,y,z) ((x & y) | (z & (x | y)))
209#define F1(x,y,z) (z ^ (x & (y ^ z)))
210
211#define P(a,b,c,d,e,f,g,h,x,K) \
212{ \
213 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
214 temp2 = S2(a) + F0(a,b,c); \
215 d += temp1; h = temp1 + temp2; \
216}
217
218 for( i = 0; i < 16; i++ )
219 {
220 GET_UINT64_BE( W[i], data, i << 3 );
221 }
222
223 for( ; i < 80; i++ )
224 {
225 W[i] = S1(W[i - 2]) + W[i - 7] +
226 S0(W[i - 15]) + W[i - 16];
227 }
228
229 A = ctx->state[0];
230 B = ctx->state[1];
231 C = ctx->state[2];
232 D = ctx->state[3];
233 E = ctx->state[4];
234 F = ctx->state[5];
235 G = ctx->state[6];
236 H = ctx->state[7];
237 i = 0;
238
239 do
240 {
241 P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++;
242 P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++;
243 P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++;
244 P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++;
245 P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++;
246 P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++;
247 P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++;
248 P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++;
249 }
250 while( i < 80 );
251
252 ctx->state[0] += A;
253 ctx->state[1] += B;
254 ctx->state[2] += C;
255 ctx->state[3] += D;
256 ctx->state[4] += E;
257 ctx->state[5] += F;
258 ctx->state[6] += G;
259 ctx->state[7] += H;
260}
261
262/*
263 * SHA-512 process buffer
264 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200265void sha512_update( sha512_context *ctx, const unsigned char *input,
266 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000267{
Paul Bakker23986e52011-04-24 08:57:21 +0000268 size_t fill;
Paul Bakkerb8213a12011-07-11 08:16:18 +0000269 unsigned int left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000270
Brian White12895d12014-04-11 11:29:42 -0400271 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000272 return;
273
Paul Bakkerb8213a12011-07-11 08:16:18 +0000274 left = (unsigned int) (ctx->total[0] & 0x7F);
Paul Bakker27fdf462011-06-09 13:55:13 +0000275 fill = 128 - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000276
Paul Bakker5c2364c2012-10-01 14:41:15 +0000277 ctx->total[0] += (uint64_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000278
Paul Bakker5c2364c2012-10-01 14:41:15 +0000279 if( ctx->total[0] < (uint64_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000280 ctx->total[1]++;
281
282 if( left && ilen >= fill )
283 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200284 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker9e36f042013-06-30 14:34:05 +0200285 sha512_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000286 input += fill;
287 ilen -= fill;
288 left = 0;
289 }
290
291 while( ilen >= 128 )
292 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200293 sha512_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000294 input += 128;
295 ilen -= 128;
296 }
297
298 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200299 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000300}
301
Paul Bakker9e36f042013-06-30 14:34:05 +0200302static const unsigned char sha512_padding[128] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000303{
304 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
305 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
306 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
307 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
308 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
309 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
310 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
311 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
312};
313
314/*
315 * SHA-512 final digest
316 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200317void sha512_finish( sha512_context *ctx, unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000318{
Paul Bakker27fdf462011-06-09 13:55:13 +0000319 size_t last, padn;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000320 uint64_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000321 unsigned char msglen[16];
322
323 high = ( ctx->total[0] >> 61 )
324 | ( ctx->total[1] << 3 );
325 low = ( ctx->total[0] << 3 );
326
327 PUT_UINT64_BE( high, msglen, 0 );
328 PUT_UINT64_BE( low, msglen, 8 );
329
Paul Bakker27fdf462011-06-09 13:55:13 +0000330 last = (size_t)( ctx->total[0] & 0x7F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000331 padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
332
Paul Bakker9e36f042013-06-30 14:34:05 +0200333 sha512_update( ctx, sha512_padding, padn );
334 sha512_update( ctx, msglen, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000335
336 PUT_UINT64_BE( ctx->state[0], output, 0 );
337 PUT_UINT64_BE( ctx->state[1], output, 8 );
338 PUT_UINT64_BE( ctx->state[2], output, 16 );
339 PUT_UINT64_BE( ctx->state[3], output, 24 );
340 PUT_UINT64_BE( ctx->state[4], output, 32 );
341 PUT_UINT64_BE( ctx->state[5], output, 40 );
342
343 if( ctx->is384 == 0 )
344 {
345 PUT_UINT64_BE( ctx->state[6], output, 48 );
346 PUT_UINT64_BE( ctx->state[7], output, 56 );
347 }
348}
349
Paul Bakker9e36f042013-06-30 14:34:05 +0200350#endif /* !POLARSSL_SHA512_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200351
Paul Bakker5121ce52009-01-03 21:22:43 +0000352/*
353 * output = SHA-512( input buffer )
354 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200355void sha512( const unsigned char *input, size_t ilen,
356 unsigned char output[64], int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000357{
Paul Bakker9e36f042013-06-30 14:34:05 +0200358 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000359
Paul Bakker5b4af392014-06-26 12:09:34 +0200360 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200361 sha512_starts( &ctx, is384 );
362 sha512_update( &ctx, input, ilen );
363 sha512_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200364 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000365}
366
Paul Bakker335db3f2011-04-25 15:28:35 +0000367#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000368/*
369 * output = SHA-512( file contents )
370 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200371int sha512_file( const char *path, unsigned char output[64], int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000372{
373 FILE *f;
374 size_t n;
Paul Bakker9e36f042013-06-30 14:34:05 +0200375 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000376 unsigned char buf[1024];
377
378 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker9e36f042013-06-30 14:34:05 +0200379 return( POLARSSL_ERR_SHA512_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000380
Paul Bakker5b4af392014-06-26 12:09:34 +0200381 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200382 sha512_starts( &ctx, is384 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000383
384 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker9e36f042013-06-30 14:34:05 +0200385 sha512_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000386
Paul Bakker9e36f042013-06-30 14:34:05 +0200387 sha512_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200388 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000389
390 if( ferror( f ) != 0 )
391 {
392 fclose( f );
Paul Bakker9e36f042013-06-30 14:34:05 +0200393 return( POLARSSL_ERR_SHA512_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000394 }
395
396 fclose( f );
397 return( 0 );
398}
Paul Bakker335db3f2011-04-25 15:28:35 +0000399#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000400
401/*
402 * SHA-512 HMAC context setup
403 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200404void sha512_hmac_starts( sha512_context *ctx, const unsigned char *key,
405 size_t keylen, int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000406{
Paul Bakker23986e52011-04-24 08:57:21 +0000407 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000408 unsigned char sum[64];
409
410 if( keylen > 128 )
411 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200412 sha512( key, keylen, sum, is384 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000413 keylen = ( is384 ) ? 48 : 64;
414 key = sum;
415 }
416
417 memset( ctx->ipad, 0x36, 128 );
418 memset( ctx->opad, 0x5C, 128 );
419
420 for( i = 0; i < keylen; i++ )
421 {
422 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
423 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
424 }
425
Paul Bakker9e36f042013-06-30 14:34:05 +0200426 sha512_starts( ctx, is384 );
427 sha512_update( ctx, ctx->ipad, 128 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000428
Paul Bakker34617722014-06-13 17:20:13 +0200429 polarssl_zeroize( sum, sizeof( sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000430}
431
432/*
433 * SHA-512 HMAC process buffer
434 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200435void sha512_hmac_update( sha512_context *ctx,
436 const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000437{
Paul Bakker9e36f042013-06-30 14:34:05 +0200438 sha512_update( ctx, input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000439}
440
441/*
442 * SHA-512 HMAC final digest
443 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200444void sha512_hmac_finish( sha512_context *ctx, unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000445{
446 int is384, hlen;
447 unsigned char tmpbuf[64];
448
449 is384 = ctx->is384;
450 hlen = ( is384 == 0 ) ? 64 : 48;
451
Paul Bakker9e36f042013-06-30 14:34:05 +0200452 sha512_finish( ctx, tmpbuf );
453 sha512_starts( ctx, is384 );
454 sha512_update( ctx, ctx->opad, 128 );
455 sha512_update( ctx, tmpbuf, hlen );
456 sha512_finish( ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000457
Paul Bakker34617722014-06-13 17:20:13 +0200458 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000459}
460
461/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000462 * SHA-512 HMAC context reset
463 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200464void sha512_hmac_reset( sha512_context *ctx )
Paul Bakker7d3b6612010-03-21 16:23:13 +0000465{
Paul Bakker9e36f042013-06-30 14:34:05 +0200466 sha512_starts( ctx, ctx->is384 );
467 sha512_update( ctx, ctx->ipad, 128 );
Paul Bakker7d3b6612010-03-21 16:23:13 +0000468}
469
470/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000471 * output = HMAC-SHA-512( hmac key, input buffer )
472 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200473void sha512_hmac( const unsigned char *key, size_t keylen,
Paul Bakker23986e52011-04-24 08:57:21 +0000474 const unsigned char *input, size_t ilen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000475 unsigned char output[64], int is384 )
476{
Paul Bakker9e36f042013-06-30 14:34:05 +0200477 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000478
Paul Bakker5b4af392014-06-26 12:09:34 +0200479 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200480 sha512_hmac_starts( &ctx, key, keylen, is384 );
481 sha512_hmac_update( &ctx, input, ilen );
482 sha512_hmac_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200483 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000484}
485
Paul Bakker40e46942009-01-03 21:51:57 +0000486#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000487
488/*
489 * FIPS-180-2 test vectors
490 */
Paul Bakker9af723c2014-05-01 13:03:14 +0200491static unsigned char sha512_test_buf[3][113] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000492{
493 { "abc" },
494 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
495 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
496 { "" }
497};
498
Paul Bakker9e36f042013-06-30 14:34:05 +0200499static const int sha512_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000500{
501 3, 112, 1000
502};
503
Paul Bakker9e36f042013-06-30 14:34:05 +0200504static const unsigned char sha512_test_sum[6][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000505{
506 /*
507 * SHA-384 test vectors
508 */
509 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
510 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
511 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
512 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
513 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
514 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
515 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
516 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
517 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
518 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
519 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
520 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
521 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
522 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
523 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
524 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
525 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
526 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
527
528 /*
529 * SHA-512 test vectors
530 */
531 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
532 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
533 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
534 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
535 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
536 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
537 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
538 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
539 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
540 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
541 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
542 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
543 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
544 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
545 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
546 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
547 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
548 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
549 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
550 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
551 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
552 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
553 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
554 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
555};
556
557/*
558 * RFC 4231 test vectors
559 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200560static unsigned char sha512_hmac_test_key[7][26] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000561{
562 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
563 "\x0B\x0B\x0B\x0B" },
564 { "Jefe" },
565 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
566 "\xAA\xAA\xAA\xAA" },
567 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
568 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
569 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
570 "\x0C\x0C\x0C\x0C" },
571 { "" }, /* 0xAA 131 times */
572 { "" }
573};
574
Paul Bakker9e36f042013-06-30 14:34:05 +0200575static const int sha512_hmac_test_keylen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000576{
577 20, 4, 20, 25, 20, 131, 131
578};
579
Paul Bakker9e36f042013-06-30 14:34:05 +0200580static unsigned char sha512_hmac_test_buf[7][153] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000581{
582 { "Hi There" },
583 { "what do ya want for nothing?" },
584 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
585 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
586 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
587 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
588 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
589 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
590 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
591 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
592 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
593 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
594 { "Test With Truncation" },
595 { "Test Using Larger Than Block-Size Key - Hash Key First" },
596 { "This is a test using a larger than block-size key "
597 "and a larger than block-size data. The key needs to "
598 "be hashed before being used by the HMAC algorithm." }
599};
600
Paul Bakker9e36f042013-06-30 14:34:05 +0200601static const int sha512_hmac_test_buflen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000602{
603 8, 28, 50, 50, 20, 54, 152
604};
605
Paul Bakker9e36f042013-06-30 14:34:05 +0200606static const unsigned char sha512_hmac_test_sum[14][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000607{
608 /*
609 * HMAC-SHA-384 test vectors
610 */
611 { 0xAF, 0xD0, 0x39, 0x44, 0xD8, 0x48, 0x95, 0x62,
612 0x6B, 0x08, 0x25, 0xF4, 0xAB, 0x46, 0x90, 0x7F,
613 0x15, 0xF9, 0xDA, 0xDB, 0xE4, 0x10, 0x1E, 0xC6,
614 0x82, 0xAA, 0x03, 0x4C, 0x7C, 0xEB, 0xC5, 0x9C,
615 0xFA, 0xEA, 0x9E, 0xA9, 0x07, 0x6E, 0xDE, 0x7F,
616 0x4A, 0xF1, 0x52, 0xE8, 0xB2, 0xFA, 0x9C, 0xB6 },
617 { 0xAF, 0x45, 0xD2, 0xE3, 0x76, 0x48, 0x40, 0x31,
618 0x61, 0x7F, 0x78, 0xD2, 0xB5, 0x8A, 0x6B, 0x1B,
619 0x9C, 0x7E, 0xF4, 0x64, 0xF5, 0xA0, 0x1B, 0x47,
620 0xE4, 0x2E, 0xC3, 0x73, 0x63, 0x22, 0x44, 0x5E,
621 0x8E, 0x22, 0x40, 0xCA, 0x5E, 0x69, 0xE2, 0xC7,
622 0x8B, 0x32, 0x39, 0xEC, 0xFA, 0xB2, 0x16, 0x49 },
623 { 0x88, 0x06, 0x26, 0x08, 0xD3, 0xE6, 0xAD, 0x8A,
624 0x0A, 0xA2, 0xAC, 0xE0, 0x14, 0xC8, 0xA8, 0x6F,
625 0x0A, 0xA6, 0x35, 0xD9, 0x47, 0xAC, 0x9F, 0xEB,
626 0xE8, 0x3E, 0xF4, 0xE5, 0x59, 0x66, 0x14, 0x4B,
627 0x2A, 0x5A, 0xB3, 0x9D, 0xC1, 0x38, 0x14, 0xB9,
628 0x4E, 0x3A, 0xB6, 0xE1, 0x01, 0xA3, 0x4F, 0x27 },
629 { 0x3E, 0x8A, 0x69, 0xB7, 0x78, 0x3C, 0x25, 0x85,
630 0x19, 0x33, 0xAB, 0x62, 0x90, 0xAF, 0x6C, 0xA7,
631 0x7A, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9C,
632 0xC5, 0x57, 0x7C, 0x6E, 0x1F, 0x57, 0x3B, 0x4E,
633 0x68, 0x01, 0xDD, 0x23, 0xC4, 0xA7, 0xD6, 0x79,
634 0xCC, 0xF8, 0xA3, 0x86, 0xC6, 0x74, 0xCF, 0xFB },
635 { 0x3A, 0xBF, 0x34, 0xC3, 0x50, 0x3B, 0x2A, 0x23,
636 0xA4, 0x6E, 0xFC, 0x61, 0x9B, 0xAE, 0xF8, 0x97 },
637 { 0x4E, 0xCE, 0x08, 0x44, 0x85, 0x81, 0x3E, 0x90,
638 0x88, 0xD2, 0xC6, 0x3A, 0x04, 0x1B, 0xC5, 0xB4,
639 0x4F, 0x9E, 0xF1, 0x01, 0x2A, 0x2B, 0x58, 0x8F,
640 0x3C, 0xD1, 0x1F, 0x05, 0x03, 0x3A, 0xC4, 0xC6,
641 0x0C, 0x2E, 0xF6, 0xAB, 0x40, 0x30, 0xFE, 0x82,
642 0x96, 0x24, 0x8D, 0xF1, 0x63, 0xF4, 0x49, 0x52 },
643 { 0x66, 0x17, 0x17, 0x8E, 0x94, 0x1F, 0x02, 0x0D,
644 0x35, 0x1E, 0x2F, 0x25, 0x4E, 0x8F, 0xD3, 0x2C,
645 0x60, 0x24, 0x20, 0xFE, 0xB0, 0xB8, 0xFB, 0x9A,
646 0xDC, 0xCE, 0xBB, 0x82, 0x46, 0x1E, 0x99, 0xC5,
647 0xA6, 0x78, 0xCC, 0x31, 0xE7, 0x99, 0x17, 0x6D,
648 0x38, 0x60, 0xE6, 0x11, 0x0C, 0x46, 0x52, 0x3E },
649
650 /*
651 * HMAC-SHA-512 test vectors
652 */
653 { 0x87, 0xAA, 0x7C, 0xDE, 0xA5, 0xEF, 0x61, 0x9D,
654 0x4F, 0xF0, 0xB4, 0x24, 0x1A, 0x1D, 0x6C, 0xB0,
655 0x23, 0x79, 0xF4, 0xE2, 0xCE, 0x4E, 0xC2, 0x78,
656 0x7A, 0xD0, 0xB3, 0x05, 0x45, 0xE1, 0x7C, 0xDE,
657 0xDA, 0xA8, 0x33, 0xB7, 0xD6, 0xB8, 0xA7, 0x02,
658 0x03, 0x8B, 0x27, 0x4E, 0xAE, 0xA3, 0xF4, 0xE4,
659 0xBE, 0x9D, 0x91, 0x4E, 0xEB, 0x61, 0xF1, 0x70,
660 0x2E, 0x69, 0x6C, 0x20, 0x3A, 0x12, 0x68, 0x54 },
661 { 0x16, 0x4B, 0x7A, 0x7B, 0xFC, 0xF8, 0x19, 0xE2,
662 0xE3, 0x95, 0xFB, 0xE7, 0x3B, 0x56, 0xE0, 0xA3,
663 0x87, 0xBD, 0x64, 0x22, 0x2E, 0x83, 0x1F, 0xD6,
664 0x10, 0x27, 0x0C, 0xD7, 0xEA, 0x25, 0x05, 0x54,
665 0x97, 0x58, 0xBF, 0x75, 0xC0, 0x5A, 0x99, 0x4A,
666 0x6D, 0x03, 0x4F, 0x65, 0xF8, 0xF0, 0xE6, 0xFD,
667 0xCA, 0xEA, 0xB1, 0xA3, 0x4D, 0x4A, 0x6B, 0x4B,
668 0x63, 0x6E, 0x07, 0x0A, 0x38, 0xBC, 0xE7, 0x37 },
669 { 0xFA, 0x73, 0xB0, 0x08, 0x9D, 0x56, 0xA2, 0x84,
670 0xEF, 0xB0, 0xF0, 0x75, 0x6C, 0x89, 0x0B, 0xE9,
671 0xB1, 0xB5, 0xDB, 0xDD, 0x8E, 0xE8, 0x1A, 0x36,
672 0x55, 0xF8, 0x3E, 0x33, 0xB2, 0x27, 0x9D, 0x39,
673 0xBF, 0x3E, 0x84, 0x82, 0x79, 0xA7, 0x22, 0xC8,
674 0x06, 0xB4, 0x85, 0xA4, 0x7E, 0x67, 0xC8, 0x07,
675 0xB9, 0x46, 0xA3, 0x37, 0xBE, 0xE8, 0x94, 0x26,
676 0x74, 0x27, 0x88, 0x59, 0xE1, 0x32, 0x92, 0xFB },
677 { 0xB0, 0xBA, 0x46, 0x56, 0x37, 0x45, 0x8C, 0x69,
678 0x90, 0xE5, 0xA8, 0xC5, 0xF6, 0x1D, 0x4A, 0xF7,
679 0xE5, 0x76, 0xD9, 0x7F, 0xF9, 0x4B, 0x87, 0x2D,
680 0xE7, 0x6F, 0x80, 0x50, 0x36, 0x1E, 0xE3, 0xDB,
681 0xA9, 0x1C, 0xA5, 0xC1, 0x1A, 0xA2, 0x5E, 0xB4,
682 0xD6, 0x79, 0x27, 0x5C, 0xC5, 0x78, 0x80, 0x63,
683 0xA5, 0xF1, 0x97, 0x41, 0x12, 0x0C, 0x4F, 0x2D,
684 0xE2, 0xAD, 0xEB, 0xEB, 0x10, 0xA2, 0x98, 0xDD },
685 { 0x41, 0x5F, 0xAD, 0x62, 0x71, 0x58, 0x0A, 0x53,
686 0x1D, 0x41, 0x79, 0xBC, 0x89, 0x1D, 0x87, 0xA6 },
687 { 0x80, 0xB2, 0x42, 0x63, 0xC7, 0xC1, 0xA3, 0xEB,
688 0xB7, 0x14, 0x93, 0xC1, 0xDD, 0x7B, 0xE8, 0xB4,
689 0x9B, 0x46, 0xD1, 0xF4, 0x1B, 0x4A, 0xEE, 0xC1,
690 0x12, 0x1B, 0x01, 0x37, 0x83, 0xF8, 0xF3, 0x52,
691 0x6B, 0x56, 0xD0, 0x37, 0xE0, 0x5F, 0x25, 0x98,
692 0xBD, 0x0F, 0xD2, 0x21, 0x5D, 0x6A, 0x1E, 0x52,
693 0x95, 0xE6, 0x4F, 0x73, 0xF6, 0x3F, 0x0A, 0xEC,
694 0x8B, 0x91, 0x5A, 0x98, 0x5D, 0x78, 0x65, 0x98 },
695 { 0xE3, 0x7B, 0x6A, 0x77, 0x5D, 0xC8, 0x7D, 0xBA,
696 0xA4, 0xDF, 0xA9, 0xF9, 0x6E, 0x5E, 0x3F, 0xFD,
697 0xDE, 0xBD, 0x71, 0xF8, 0x86, 0x72, 0x89, 0x86,
698 0x5D, 0xF5, 0xA3, 0x2D, 0x20, 0xCD, 0xC9, 0x44,
699 0xB6, 0x02, 0x2C, 0xAC, 0x3C, 0x49, 0x82, 0xB1,
700 0x0D, 0x5E, 0xEB, 0x55, 0xC3, 0xE4, 0xDE, 0x15,
701 0x13, 0x46, 0x76, 0xFB, 0x6D, 0xE0, 0x44, 0x60,
702 0x65, 0xC9, 0x74, 0x40, 0xFA, 0x8C, 0x6A, 0x58 }
703};
704
705/*
706 * Checkup routine
707 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200708int sha512_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000709{
Paul Bakker5b4af392014-06-26 12:09:34 +0200710 int i, j, k, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000711 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200712 unsigned char sha512sum[64];
713 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000714
Paul Bakker5b4af392014-06-26 12:09:34 +0200715 sha512_init( &ctx );
716
Paul Bakker5121ce52009-01-03 21:22:43 +0000717 for( i = 0; i < 6; i++ )
718 {
719 j = i % 3;
720 k = i < 3;
721
722 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100723 polarssl_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000724
Paul Bakker9e36f042013-06-30 14:34:05 +0200725 sha512_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000726
727 if( j == 2 )
728 {
729 memset( buf, 'a', buflen = 1000 );
730
731 for( j = 0; j < 1000; j++ )
Paul Bakker9e36f042013-06-30 14:34:05 +0200732 sha512_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000733 }
734 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200735 sha512_update( &ctx, sha512_test_buf[j],
736 sha512_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000737
Paul Bakker9e36f042013-06-30 14:34:05 +0200738 sha512_finish( &ctx, sha512sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000739
Paul Bakker9e36f042013-06-30 14:34:05 +0200740 if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000741 {
742 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100743 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000744
Paul Bakker5b4af392014-06-26 12:09:34 +0200745 ret = 1;
746 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000747 }
748
749 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100750 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000751 }
752
753 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100754 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000755
756 for( i = 0; i < 14; i++ )
757 {
758 j = i % 7;
759 k = i < 7;
760
761 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100762 polarssl_printf( " HMAC-SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000763
764 if( j == 5 || j == 6 )
765 {
Manuel Pégourié-Gonnardd48bf682015-02-14 15:05:32 +0000766 memset( buf, 0xAA, buflen = 131 );
Paul Bakker9e36f042013-06-30 14:34:05 +0200767 sha512_hmac_starts( &ctx, buf, buflen, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000768 }
769 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200770 sha512_hmac_starts( &ctx, sha512_hmac_test_key[j],
771 sha512_hmac_test_keylen[j], k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000772
Paul Bakker9e36f042013-06-30 14:34:05 +0200773 sha512_hmac_update( &ctx, sha512_hmac_test_buf[j],
774 sha512_hmac_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000775
Paul Bakker9e36f042013-06-30 14:34:05 +0200776 sha512_hmac_finish( &ctx, sha512sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000777
778 buflen = ( j == 4 ) ? 16 : 64 - k * 16;
779
Paul Bakker9e36f042013-06-30 14:34:05 +0200780 if( memcmp( sha512sum, sha512_hmac_test_sum[i], buflen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000781 {
782 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100783 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000784
Paul Bakker5b4af392014-06-26 12:09:34 +0200785 ret = 1;
786 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000787 }
788
789 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100790 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000791 }
792
793 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100794 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000795
Paul Bakker5b4af392014-06-26 12:09:34 +0200796exit:
797 sha512_free( &ctx );
798
799 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000800}
801
Paul Bakker9af723c2014-05-01 13:03:14 +0200802#endif /* POLARSSL_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000803
Paul Bakker9af723c2014-05-01 13:03:14 +0200804#endif /* POLARSSL_SHA512_C */