blob: 5decc8fac0c3e06c71dceac770e7e91a3a531406 [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é-Gonnard860b5162015-01-28 17:12:07 +00006 * This file is part of mbed TLS (https://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
Rich Evans00ab4702015-02-06 13:43:58 +000038#include <string.h>
39
40#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +000041#include <stdio.h>
Paul Bakker335db3f2011-04-25 15:28:35 +000042#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000043
Rich Evans00ab4702015-02-06 13:43:58 +000044#if defined(POLARSSL_SELF_TEST)
Paul Bakker7dc4c442014-02-01 22:50:26 +010045#if defined(POLARSSL_PLATFORM_C)
46#include "polarssl/platform.h"
47#else
Rich Evans00ab4702015-02-06 13:43:58 +000048#include <stdio.h>
Paul Bakker7dc4c442014-02-01 22:50:26 +010049#define polarssl_printf printf
Rich Evans00ab4702015-02-06 13:43:58 +000050#endif /* POLARSSL_PLATFORM_C */
51#endif /* POLARSSL_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010052
Paul Bakker34617722014-06-13 17:20:13 +020053/* Implementation that should never be optimized out by the compiler */
54static void polarssl_zeroize( void *v, size_t n ) {
55 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
56}
57
Paul Bakker9e36f042013-06-30 14:34:05 +020058#if !defined(POLARSSL_SHA512_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020059
Paul Bakker5121ce52009-01-03 21:22:43 +000060/*
61 * 64-bit integer manipulation macros (big endian)
62 */
63#ifndef GET_UINT64_BE
64#define GET_UINT64_BE(n,b,i) \
65{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000066 (n) = ( (uint64_t) (b)[(i) ] << 56 ) \
67 | ( (uint64_t) (b)[(i) + 1] << 48 ) \
68 | ( (uint64_t) (b)[(i) + 2] << 40 ) \
69 | ( (uint64_t) (b)[(i) + 3] << 32 ) \
70 | ( (uint64_t) (b)[(i) + 4] << 24 ) \
71 | ( (uint64_t) (b)[(i) + 5] << 16 ) \
72 | ( (uint64_t) (b)[(i) + 6] << 8 ) \
73 | ( (uint64_t) (b)[(i) + 7] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000074}
Paul Bakker9af723c2014-05-01 13:03:14 +020075#endif /* GET_UINT64_BE */
Paul Bakker5121ce52009-01-03 21:22:43 +000076
77#ifndef PUT_UINT64_BE
78#define PUT_UINT64_BE(n,b,i) \
79{ \
80 (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \
81 (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \
82 (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \
83 (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \
84 (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \
85 (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \
86 (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \
87 (b)[(i) + 7] = (unsigned char) ( (n) ); \
88}
Paul Bakker9af723c2014-05-01 13:03:14 +020089#endif /* PUT_UINT64_BE */
Paul Bakker5121ce52009-01-03 21:22:43 +000090
91/*
92 * Round constants
93 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000094static const uint64_t K[80] =
Paul Bakker5121ce52009-01-03 21:22:43 +000095{
96 UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
97 UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
98 UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
99 UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
100 UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
101 UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
102 UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
103 UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
104 UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
105 UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
106 UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
107 UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
108 UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
109 UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
110 UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
111 UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
112 UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
113 UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
114 UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
115 UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
116 UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
117 UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
118 UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
119 UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
120 UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
121 UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
122 UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
123 UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
124 UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
125 UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
126 UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
127 UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
128 UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
129 UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
130 UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
131 UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
132 UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
133 UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
134 UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
135 UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
136};
137
Paul Bakker5b4af392014-06-26 12:09:34 +0200138void sha512_init( sha512_context *ctx )
139{
140 memset( ctx, 0, sizeof( sha512_context ) );
141}
142
143void sha512_free( sha512_context *ctx )
144{
145 if( ctx == NULL )
146 return;
147
148 polarssl_zeroize( ctx, sizeof( sha512_context ) );
149}
150
Paul Bakker5121ce52009-01-03 21:22:43 +0000151/*
152 * SHA-512 context setup
153 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200154void sha512_starts( sha512_context *ctx, int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000155{
156 ctx->total[0] = 0;
157 ctx->total[1] = 0;
158
159 if( is384 == 0 )
160 {
161 /* SHA-512 */
162 ctx->state[0] = UL64(0x6A09E667F3BCC908);
163 ctx->state[1] = UL64(0xBB67AE8584CAA73B);
164 ctx->state[2] = UL64(0x3C6EF372FE94F82B);
165 ctx->state[3] = UL64(0xA54FF53A5F1D36F1);
166 ctx->state[4] = UL64(0x510E527FADE682D1);
167 ctx->state[5] = UL64(0x9B05688C2B3E6C1F);
168 ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);
169 ctx->state[7] = UL64(0x5BE0CD19137E2179);
170 }
171 else
172 {
173 /* SHA-384 */
174 ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
175 ctx->state[1] = UL64(0x629A292A367CD507);
176 ctx->state[2] = UL64(0x9159015A3070DD17);
177 ctx->state[3] = UL64(0x152FECD8F70E5939);
178 ctx->state[4] = UL64(0x67332667FFC00B31);
179 ctx->state[5] = UL64(0x8EB44A8768581511);
180 ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
181 ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
182 }
183
184 ctx->is384 = is384;
185}
186
Paul Bakker9e36f042013-06-30 14:34:05 +0200187void sha512_process( sha512_context *ctx, const unsigned char data[128] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000188{
189 int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000190 uint64_t temp1, temp2, W[80];
191 uint64_t A, B, C, D, E, F, G, H;
Paul Bakker5121ce52009-01-03 21:22:43 +0000192
193#define SHR(x,n) (x >> n)
194#define ROTR(x,n) (SHR(x,n) | (x << (64 - n)))
195
196#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
197#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
198
199#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
200#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
201
202#define F0(x,y,z) ((x & y) | (z & (x | y)))
203#define F1(x,y,z) (z ^ (x & (y ^ z)))
204
205#define P(a,b,c,d,e,f,g,h,x,K) \
206{ \
207 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
208 temp2 = S2(a) + F0(a,b,c); \
209 d += temp1; h = temp1 + temp2; \
210}
211
212 for( i = 0; i < 16; i++ )
213 {
214 GET_UINT64_BE( W[i], data, i << 3 );
215 }
216
217 for( ; i < 80; i++ )
218 {
219 W[i] = S1(W[i - 2]) + W[i - 7] +
220 S0(W[i - 15]) + W[i - 16];
221 }
222
223 A = ctx->state[0];
224 B = ctx->state[1];
225 C = ctx->state[2];
226 D = ctx->state[3];
227 E = ctx->state[4];
228 F = ctx->state[5];
229 G = ctx->state[6];
230 H = ctx->state[7];
231 i = 0;
232
233 do
234 {
235 P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++;
236 P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++;
237 P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++;
238 P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++;
239 P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++;
240 P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++;
241 P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++;
242 P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++;
243 }
244 while( i < 80 );
245
246 ctx->state[0] += A;
247 ctx->state[1] += B;
248 ctx->state[2] += C;
249 ctx->state[3] += D;
250 ctx->state[4] += E;
251 ctx->state[5] += F;
252 ctx->state[6] += G;
253 ctx->state[7] += H;
254}
255
256/*
257 * SHA-512 process buffer
258 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200259void sha512_update( sha512_context *ctx, const unsigned char *input,
260 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000261{
Paul Bakker23986e52011-04-24 08:57:21 +0000262 size_t fill;
Paul Bakkerb8213a12011-07-11 08:16:18 +0000263 unsigned int left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000264
Brian White12895d12014-04-11 11:29:42 -0400265 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000266 return;
267
Paul Bakkerb8213a12011-07-11 08:16:18 +0000268 left = (unsigned int) (ctx->total[0] & 0x7F);
Paul Bakker27fdf462011-06-09 13:55:13 +0000269 fill = 128 - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000270
Paul Bakker5c2364c2012-10-01 14:41:15 +0000271 ctx->total[0] += (uint64_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000272
Paul Bakker5c2364c2012-10-01 14:41:15 +0000273 if( ctx->total[0] < (uint64_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000274 ctx->total[1]++;
275
276 if( left && ilen >= fill )
277 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200278 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker9e36f042013-06-30 14:34:05 +0200279 sha512_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000280 input += fill;
281 ilen -= fill;
282 left = 0;
283 }
284
285 while( ilen >= 128 )
286 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200287 sha512_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000288 input += 128;
289 ilen -= 128;
290 }
291
292 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200293 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000294}
295
Paul Bakker9e36f042013-06-30 14:34:05 +0200296static const unsigned char sha512_padding[128] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000297{
298 0x80, 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 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
302 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
303 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
304 0, 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};
307
308/*
309 * SHA-512 final digest
310 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200311void sha512_finish( sha512_context *ctx, unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000312{
Paul Bakker27fdf462011-06-09 13:55:13 +0000313 size_t last, padn;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000314 uint64_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000315 unsigned char msglen[16];
316
317 high = ( ctx->total[0] >> 61 )
318 | ( ctx->total[1] << 3 );
319 low = ( ctx->total[0] << 3 );
320
321 PUT_UINT64_BE( high, msglen, 0 );
322 PUT_UINT64_BE( low, msglen, 8 );
323
Paul Bakker27fdf462011-06-09 13:55:13 +0000324 last = (size_t)( ctx->total[0] & 0x7F );
Paul Bakker5121ce52009-01-03 21:22:43 +0000325 padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
326
Paul Bakker9e36f042013-06-30 14:34:05 +0200327 sha512_update( ctx, sha512_padding, padn );
328 sha512_update( ctx, msglen, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000329
330 PUT_UINT64_BE( ctx->state[0], output, 0 );
331 PUT_UINT64_BE( ctx->state[1], output, 8 );
332 PUT_UINT64_BE( ctx->state[2], output, 16 );
333 PUT_UINT64_BE( ctx->state[3], output, 24 );
334 PUT_UINT64_BE( ctx->state[4], output, 32 );
335 PUT_UINT64_BE( ctx->state[5], output, 40 );
336
337 if( ctx->is384 == 0 )
338 {
339 PUT_UINT64_BE( ctx->state[6], output, 48 );
340 PUT_UINT64_BE( ctx->state[7], output, 56 );
341 }
342}
343
Paul Bakker9e36f042013-06-30 14:34:05 +0200344#endif /* !POLARSSL_SHA512_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200345
Paul Bakker5121ce52009-01-03 21:22:43 +0000346/*
347 * output = SHA-512( input buffer )
348 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200349void sha512( const unsigned char *input, size_t ilen,
350 unsigned char output[64], int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000351{
Paul Bakker9e36f042013-06-30 14:34:05 +0200352 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000353
Paul Bakker5b4af392014-06-26 12:09:34 +0200354 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200355 sha512_starts( &ctx, is384 );
356 sha512_update( &ctx, input, ilen );
357 sha512_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200358 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000359}
360
Paul Bakker335db3f2011-04-25 15:28:35 +0000361#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000362/*
363 * output = SHA-512( file contents )
364 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200365int sha512_file( const char *path, unsigned char output[64], int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000366{
367 FILE *f;
368 size_t n;
Paul Bakker9e36f042013-06-30 14:34:05 +0200369 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000370 unsigned char buf[1024];
371
372 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker9e36f042013-06-30 14:34:05 +0200373 return( POLARSSL_ERR_SHA512_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000374
Paul Bakker5b4af392014-06-26 12:09:34 +0200375 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200376 sha512_starts( &ctx, is384 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000377
378 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker9e36f042013-06-30 14:34:05 +0200379 sha512_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000380
Paul Bakker9e36f042013-06-30 14:34:05 +0200381 sha512_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200382 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000383
384 if( ferror( f ) != 0 )
385 {
386 fclose( f );
Paul Bakker9e36f042013-06-30 14:34:05 +0200387 return( POLARSSL_ERR_SHA512_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000388 }
389
390 fclose( f );
391 return( 0 );
392}
Paul Bakker335db3f2011-04-25 15:28:35 +0000393#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000394
395/*
396 * SHA-512 HMAC context setup
397 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200398void sha512_hmac_starts( sha512_context *ctx, const unsigned char *key,
399 size_t keylen, int is384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000400{
Paul Bakker23986e52011-04-24 08:57:21 +0000401 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000402 unsigned char sum[64];
403
404 if( keylen > 128 )
405 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200406 sha512( key, keylen, sum, is384 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000407 keylen = ( is384 ) ? 48 : 64;
408 key = sum;
409 }
410
411 memset( ctx->ipad, 0x36, 128 );
412 memset( ctx->opad, 0x5C, 128 );
413
414 for( i = 0; i < keylen; i++ )
415 {
416 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
417 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
418 }
419
Paul Bakker9e36f042013-06-30 14:34:05 +0200420 sha512_starts( ctx, is384 );
421 sha512_update( ctx, ctx->ipad, 128 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
Paul Bakker34617722014-06-13 17:20:13 +0200423 polarssl_zeroize( sum, sizeof( sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000424}
425
426/*
427 * SHA-512 HMAC process buffer
428 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200429void sha512_hmac_update( sha512_context *ctx,
430 const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000431{
Paul Bakker9e36f042013-06-30 14:34:05 +0200432 sha512_update( ctx, input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000433}
434
435/*
436 * SHA-512 HMAC final digest
437 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200438void sha512_hmac_finish( sha512_context *ctx, unsigned char output[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000439{
440 int is384, hlen;
441 unsigned char tmpbuf[64];
442
443 is384 = ctx->is384;
444 hlen = ( is384 == 0 ) ? 64 : 48;
445
Paul Bakker9e36f042013-06-30 14:34:05 +0200446 sha512_finish( ctx, tmpbuf );
447 sha512_starts( ctx, is384 );
448 sha512_update( ctx, ctx->opad, 128 );
449 sha512_update( ctx, tmpbuf, hlen );
450 sha512_finish( ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000451
Paul Bakker34617722014-06-13 17:20:13 +0200452 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000453}
454
455/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000456 * SHA-512 HMAC context reset
457 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200458void sha512_hmac_reset( sha512_context *ctx )
Paul Bakker7d3b6612010-03-21 16:23:13 +0000459{
Paul Bakker9e36f042013-06-30 14:34:05 +0200460 sha512_starts( ctx, ctx->is384 );
461 sha512_update( ctx, ctx->ipad, 128 );
Paul Bakker7d3b6612010-03-21 16:23:13 +0000462}
463
464/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000465 * output = HMAC-SHA-512( hmac key, input buffer )
466 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200467void sha512_hmac( const unsigned char *key, size_t keylen,
Paul Bakker23986e52011-04-24 08:57:21 +0000468 const unsigned char *input, size_t ilen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000469 unsigned char output[64], int is384 )
470{
Paul Bakker9e36f042013-06-30 14:34:05 +0200471 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000472
Paul Bakker5b4af392014-06-26 12:09:34 +0200473 sha512_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200474 sha512_hmac_starts( &ctx, key, keylen, is384 );
475 sha512_hmac_update( &ctx, input, ilen );
476 sha512_hmac_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200477 sha512_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000478}
479
Paul Bakker40e46942009-01-03 21:51:57 +0000480#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000481
482/*
483 * FIPS-180-2 test vectors
484 */
Paul Bakker9af723c2014-05-01 13:03:14 +0200485static unsigned char sha512_test_buf[3][113] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000486{
487 { "abc" },
488 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
489 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
490 { "" }
491};
492
Paul Bakker9e36f042013-06-30 14:34:05 +0200493static const int sha512_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000494{
495 3, 112, 1000
496};
497
Paul Bakker9e36f042013-06-30 14:34:05 +0200498static const unsigned char sha512_test_sum[6][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000499{
500 /*
501 * SHA-384 test vectors
502 */
503 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
504 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
505 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
506 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
507 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
508 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
509 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
510 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
511 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
512 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
513 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
514 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
515 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
516 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
517 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
518 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
519 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
520 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
521
522 /*
523 * SHA-512 test vectors
524 */
525 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
526 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
527 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
528 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
529 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
530 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
531 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
532 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
533 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
534 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
535 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
536 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
537 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
538 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
539 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
540 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
541 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
542 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
543 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
544 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
545 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
546 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
547 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
548 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
549};
550
551/*
552 * RFC 4231 test vectors
553 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200554static unsigned char sha512_hmac_test_key[7][26] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000555{
556 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
557 "\x0B\x0B\x0B\x0B" },
558 { "Jefe" },
559 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
560 "\xAA\xAA\xAA\xAA" },
561 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
562 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
563 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
564 "\x0C\x0C\x0C\x0C" },
565 { "" }, /* 0xAA 131 times */
566 { "" }
567};
568
Paul Bakker9e36f042013-06-30 14:34:05 +0200569static const int sha512_hmac_test_keylen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000570{
571 20, 4, 20, 25, 20, 131, 131
572};
573
Paul Bakker9e36f042013-06-30 14:34:05 +0200574static unsigned char sha512_hmac_test_buf[7][153] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000575{
576 { "Hi There" },
577 { "what do ya want for nothing?" },
578 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
579 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
580 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
581 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
582 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
583 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
584 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
585 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
586 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
587 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
588 { "Test With Truncation" },
589 { "Test Using Larger Than Block-Size Key - Hash Key First" },
590 { "This is a test using a larger than block-size key "
591 "and a larger than block-size data. The key needs to "
592 "be hashed before being used by the HMAC algorithm." }
593};
594
Paul Bakker9e36f042013-06-30 14:34:05 +0200595static const int sha512_hmac_test_buflen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000596{
597 8, 28, 50, 50, 20, 54, 152
598};
599
Paul Bakker9e36f042013-06-30 14:34:05 +0200600static const unsigned char sha512_hmac_test_sum[14][64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000601{
602 /*
603 * HMAC-SHA-384 test vectors
604 */
605 { 0xAF, 0xD0, 0x39, 0x44, 0xD8, 0x48, 0x95, 0x62,
606 0x6B, 0x08, 0x25, 0xF4, 0xAB, 0x46, 0x90, 0x7F,
607 0x15, 0xF9, 0xDA, 0xDB, 0xE4, 0x10, 0x1E, 0xC6,
608 0x82, 0xAA, 0x03, 0x4C, 0x7C, 0xEB, 0xC5, 0x9C,
609 0xFA, 0xEA, 0x9E, 0xA9, 0x07, 0x6E, 0xDE, 0x7F,
610 0x4A, 0xF1, 0x52, 0xE8, 0xB2, 0xFA, 0x9C, 0xB6 },
611 { 0xAF, 0x45, 0xD2, 0xE3, 0x76, 0x48, 0x40, 0x31,
612 0x61, 0x7F, 0x78, 0xD2, 0xB5, 0x8A, 0x6B, 0x1B,
613 0x9C, 0x7E, 0xF4, 0x64, 0xF5, 0xA0, 0x1B, 0x47,
614 0xE4, 0x2E, 0xC3, 0x73, 0x63, 0x22, 0x44, 0x5E,
615 0x8E, 0x22, 0x40, 0xCA, 0x5E, 0x69, 0xE2, 0xC7,
616 0x8B, 0x32, 0x39, 0xEC, 0xFA, 0xB2, 0x16, 0x49 },
617 { 0x88, 0x06, 0x26, 0x08, 0xD3, 0xE6, 0xAD, 0x8A,
618 0x0A, 0xA2, 0xAC, 0xE0, 0x14, 0xC8, 0xA8, 0x6F,
619 0x0A, 0xA6, 0x35, 0xD9, 0x47, 0xAC, 0x9F, 0xEB,
620 0xE8, 0x3E, 0xF4, 0xE5, 0x59, 0x66, 0x14, 0x4B,
621 0x2A, 0x5A, 0xB3, 0x9D, 0xC1, 0x38, 0x14, 0xB9,
622 0x4E, 0x3A, 0xB6, 0xE1, 0x01, 0xA3, 0x4F, 0x27 },
623 { 0x3E, 0x8A, 0x69, 0xB7, 0x78, 0x3C, 0x25, 0x85,
624 0x19, 0x33, 0xAB, 0x62, 0x90, 0xAF, 0x6C, 0xA7,
625 0x7A, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9C,
626 0xC5, 0x57, 0x7C, 0x6E, 0x1F, 0x57, 0x3B, 0x4E,
627 0x68, 0x01, 0xDD, 0x23, 0xC4, 0xA7, 0xD6, 0x79,
628 0xCC, 0xF8, 0xA3, 0x86, 0xC6, 0x74, 0xCF, 0xFB },
629 { 0x3A, 0xBF, 0x34, 0xC3, 0x50, 0x3B, 0x2A, 0x23,
630 0xA4, 0x6E, 0xFC, 0x61, 0x9B, 0xAE, 0xF8, 0x97 },
631 { 0x4E, 0xCE, 0x08, 0x44, 0x85, 0x81, 0x3E, 0x90,
632 0x88, 0xD2, 0xC6, 0x3A, 0x04, 0x1B, 0xC5, 0xB4,
633 0x4F, 0x9E, 0xF1, 0x01, 0x2A, 0x2B, 0x58, 0x8F,
634 0x3C, 0xD1, 0x1F, 0x05, 0x03, 0x3A, 0xC4, 0xC6,
635 0x0C, 0x2E, 0xF6, 0xAB, 0x40, 0x30, 0xFE, 0x82,
636 0x96, 0x24, 0x8D, 0xF1, 0x63, 0xF4, 0x49, 0x52 },
637 { 0x66, 0x17, 0x17, 0x8E, 0x94, 0x1F, 0x02, 0x0D,
638 0x35, 0x1E, 0x2F, 0x25, 0x4E, 0x8F, 0xD3, 0x2C,
639 0x60, 0x24, 0x20, 0xFE, 0xB0, 0xB8, 0xFB, 0x9A,
640 0xDC, 0xCE, 0xBB, 0x82, 0x46, 0x1E, 0x99, 0xC5,
641 0xA6, 0x78, 0xCC, 0x31, 0xE7, 0x99, 0x17, 0x6D,
642 0x38, 0x60, 0xE6, 0x11, 0x0C, 0x46, 0x52, 0x3E },
643
644 /*
645 * HMAC-SHA-512 test vectors
646 */
647 { 0x87, 0xAA, 0x7C, 0xDE, 0xA5, 0xEF, 0x61, 0x9D,
648 0x4F, 0xF0, 0xB4, 0x24, 0x1A, 0x1D, 0x6C, 0xB0,
649 0x23, 0x79, 0xF4, 0xE2, 0xCE, 0x4E, 0xC2, 0x78,
650 0x7A, 0xD0, 0xB3, 0x05, 0x45, 0xE1, 0x7C, 0xDE,
651 0xDA, 0xA8, 0x33, 0xB7, 0xD6, 0xB8, 0xA7, 0x02,
652 0x03, 0x8B, 0x27, 0x4E, 0xAE, 0xA3, 0xF4, 0xE4,
653 0xBE, 0x9D, 0x91, 0x4E, 0xEB, 0x61, 0xF1, 0x70,
654 0x2E, 0x69, 0x6C, 0x20, 0x3A, 0x12, 0x68, 0x54 },
655 { 0x16, 0x4B, 0x7A, 0x7B, 0xFC, 0xF8, 0x19, 0xE2,
656 0xE3, 0x95, 0xFB, 0xE7, 0x3B, 0x56, 0xE0, 0xA3,
657 0x87, 0xBD, 0x64, 0x22, 0x2E, 0x83, 0x1F, 0xD6,
658 0x10, 0x27, 0x0C, 0xD7, 0xEA, 0x25, 0x05, 0x54,
659 0x97, 0x58, 0xBF, 0x75, 0xC0, 0x5A, 0x99, 0x4A,
660 0x6D, 0x03, 0x4F, 0x65, 0xF8, 0xF0, 0xE6, 0xFD,
661 0xCA, 0xEA, 0xB1, 0xA3, 0x4D, 0x4A, 0x6B, 0x4B,
662 0x63, 0x6E, 0x07, 0x0A, 0x38, 0xBC, 0xE7, 0x37 },
663 { 0xFA, 0x73, 0xB0, 0x08, 0x9D, 0x56, 0xA2, 0x84,
664 0xEF, 0xB0, 0xF0, 0x75, 0x6C, 0x89, 0x0B, 0xE9,
665 0xB1, 0xB5, 0xDB, 0xDD, 0x8E, 0xE8, 0x1A, 0x36,
666 0x55, 0xF8, 0x3E, 0x33, 0xB2, 0x27, 0x9D, 0x39,
667 0xBF, 0x3E, 0x84, 0x82, 0x79, 0xA7, 0x22, 0xC8,
668 0x06, 0xB4, 0x85, 0xA4, 0x7E, 0x67, 0xC8, 0x07,
669 0xB9, 0x46, 0xA3, 0x37, 0xBE, 0xE8, 0x94, 0x26,
670 0x74, 0x27, 0x88, 0x59, 0xE1, 0x32, 0x92, 0xFB },
671 { 0xB0, 0xBA, 0x46, 0x56, 0x37, 0x45, 0x8C, 0x69,
672 0x90, 0xE5, 0xA8, 0xC5, 0xF6, 0x1D, 0x4A, 0xF7,
673 0xE5, 0x76, 0xD9, 0x7F, 0xF9, 0x4B, 0x87, 0x2D,
674 0xE7, 0x6F, 0x80, 0x50, 0x36, 0x1E, 0xE3, 0xDB,
675 0xA9, 0x1C, 0xA5, 0xC1, 0x1A, 0xA2, 0x5E, 0xB4,
676 0xD6, 0x79, 0x27, 0x5C, 0xC5, 0x78, 0x80, 0x63,
677 0xA5, 0xF1, 0x97, 0x41, 0x12, 0x0C, 0x4F, 0x2D,
678 0xE2, 0xAD, 0xEB, 0xEB, 0x10, 0xA2, 0x98, 0xDD },
679 { 0x41, 0x5F, 0xAD, 0x62, 0x71, 0x58, 0x0A, 0x53,
680 0x1D, 0x41, 0x79, 0xBC, 0x89, 0x1D, 0x87, 0xA6 },
681 { 0x80, 0xB2, 0x42, 0x63, 0xC7, 0xC1, 0xA3, 0xEB,
682 0xB7, 0x14, 0x93, 0xC1, 0xDD, 0x7B, 0xE8, 0xB4,
683 0x9B, 0x46, 0xD1, 0xF4, 0x1B, 0x4A, 0xEE, 0xC1,
684 0x12, 0x1B, 0x01, 0x37, 0x83, 0xF8, 0xF3, 0x52,
685 0x6B, 0x56, 0xD0, 0x37, 0xE0, 0x5F, 0x25, 0x98,
686 0xBD, 0x0F, 0xD2, 0x21, 0x5D, 0x6A, 0x1E, 0x52,
687 0x95, 0xE6, 0x4F, 0x73, 0xF6, 0x3F, 0x0A, 0xEC,
688 0x8B, 0x91, 0x5A, 0x98, 0x5D, 0x78, 0x65, 0x98 },
689 { 0xE3, 0x7B, 0x6A, 0x77, 0x5D, 0xC8, 0x7D, 0xBA,
690 0xA4, 0xDF, 0xA9, 0xF9, 0x6E, 0x5E, 0x3F, 0xFD,
691 0xDE, 0xBD, 0x71, 0xF8, 0x86, 0x72, 0x89, 0x86,
692 0x5D, 0xF5, 0xA3, 0x2D, 0x20, 0xCD, 0xC9, 0x44,
693 0xB6, 0x02, 0x2C, 0xAC, 0x3C, 0x49, 0x82, 0xB1,
694 0x0D, 0x5E, 0xEB, 0x55, 0xC3, 0xE4, 0xDE, 0x15,
695 0x13, 0x46, 0x76, 0xFB, 0x6D, 0xE0, 0x44, 0x60,
696 0x65, 0xC9, 0x74, 0x40, 0xFA, 0x8C, 0x6A, 0x58 }
697};
698
699/*
700 * Checkup routine
701 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200702int sha512_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000703{
Paul Bakker5b4af392014-06-26 12:09:34 +0200704 int i, j, k, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000705 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200706 unsigned char sha512sum[64];
707 sha512_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000708
Paul Bakker5b4af392014-06-26 12:09:34 +0200709 sha512_init( &ctx );
710
Paul Bakker5121ce52009-01-03 21:22:43 +0000711 for( i = 0; i < 6; i++ )
712 {
713 j = i % 3;
714 k = i < 3;
715
716 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100717 polarssl_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000718
Paul Bakker9e36f042013-06-30 14:34:05 +0200719 sha512_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000720
721 if( j == 2 )
722 {
723 memset( buf, 'a', buflen = 1000 );
724
725 for( j = 0; j < 1000; j++ )
Paul Bakker9e36f042013-06-30 14:34:05 +0200726 sha512_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000727 }
728 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200729 sha512_update( &ctx, sha512_test_buf[j],
730 sha512_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000731
Paul Bakker9e36f042013-06-30 14:34:05 +0200732 sha512_finish( &ctx, sha512sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000733
Paul Bakker9e36f042013-06-30 14:34:05 +0200734 if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000735 {
736 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100737 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000738
Paul Bakker5b4af392014-06-26 12:09:34 +0200739 ret = 1;
740 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000741 }
742
743 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100744 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000745 }
746
747 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100748 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000749
750 for( i = 0; i < 14; i++ )
751 {
752 j = i % 7;
753 k = i < 7;
754
755 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100756 polarssl_printf( " HMAC-SHA-%d test #%d: ", 512 - k * 128, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000757
758 if( j == 5 || j == 6 )
759 {
Manuel Pégourié-Gonnardd48bf682015-02-14 15:05:32 +0000760 memset( buf, 0xAA, buflen = 131 );
Paul Bakker9e36f042013-06-30 14:34:05 +0200761 sha512_hmac_starts( &ctx, buf, buflen, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000762 }
763 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200764 sha512_hmac_starts( &ctx, sha512_hmac_test_key[j],
765 sha512_hmac_test_keylen[j], k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000766
Paul Bakker9e36f042013-06-30 14:34:05 +0200767 sha512_hmac_update( &ctx, sha512_hmac_test_buf[j],
768 sha512_hmac_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000769
Paul Bakker9e36f042013-06-30 14:34:05 +0200770 sha512_hmac_finish( &ctx, sha512sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000771
772 buflen = ( j == 4 ) ? 16 : 64 - k * 16;
773
Paul Bakker9e36f042013-06-30 14:34:05 +0200774 if( memcmp( sha512sum, sha512_hmac_test_sum[i], buflen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000775 {
776 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100777 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000778
Paul Bakker5b4af392014-06-26 12:09:34 +0200779 ret = 1;
780 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000781 }
782
783 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100784 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000785 }
786
787 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100788 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000789
Paul Bakker5b4af392014-06-26 12:09:34 +0200790exit:
791 sha512_free( &ctx );
792
793 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000794}
795
Paul Bakker9af723c2014-05-01 13:03:14 +0200796#endif /* POLARSSL_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000797
Paul Bakker9af723c2014-05-01 13:03:14 +0200798#endif /* POLARSSL_SHA512_C */