blob: 422bf443c5df8e30f34e427e8c1ba1b68ad4a19b [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 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-256 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_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakkerd2681d82013-06-30 14:49:12 +020036#include "polarssl/sha256.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_SHA256_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020054
Paul Bakker5121ce52009-01-03 21:22:43 +000055/*
56 * 32-bit integer manipulation macros (big endian)
57 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000058#ifndef GET_UINT32_BE
59#define GET_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000060{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000061 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
62 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
63 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
64 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000065}
66#endif
67
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef PUT_UINT32_BE
69#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000070{ \
71 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
72 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
73 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
74 (b)[(i) + 3] = (unsigned char) ( (n) ); \
75}
76#endif
77
Paul Bakker5b4af392014-06-26 12:09:34 +020078void sha256_init( sha256_context *ctx )
79{
80 memset( ctx, 0, sizeof( sha256_context ) );
81}
82
83void sha256_free( sha256_context *ctx )
84{
85 if( ctx == NULL )
86 return;
87
88 polarssl_zeroize( ctx, sizeof( sha256_context ) );
89}
90
Paul Bakker5121ce52009-01-03 21:22:43 +000091/*
92 * SHA-256 context setup
93 */
Paul Bakker9e36f042013-06-30 14:34:05 +020094void sha256_starts( sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +000095{
96 ctx->total[0] = 0;
97 ctx->total[1] = 0;
98
99 if( is224 == 0 )
100 {
101 /* SHA-256 */
102 ctx->state[0] = 0x6A09E667;
103 ctx->state[1] = 0xBB67AE85;
104 ctx->state[2] = 0x3C6EF372;
105 ctx->state[3] = 0xA54FF53A;
106 ctx->state[4] = 0x510E527F;
107 ctx->state[5] = 0x9B05688C;
108 ctx->state[6] = 0x1F83D9AB;
109 ctx->state[7] = 0x5BE0CD19;
110 }
111 else
112 {
113 /* SHA-224 */
114 ctx->state[0] = 0xC1059ED8;
115 ctx->state[1] = 0x367CD507;
116 ctx->state[2] = 0x3070DD17;
117 ctx->state[3] = 0xF70E5939;
118 ctx->state[4] = 0xFFC00B31;
119 ctx->state[5] = 0x68581511;
120 ctx->state[6] = 0x64F98FA7;
121 ctx->state[7] = 0xBEFA4FA4;
122 }
123
124 ctx->is224 = is224;
125}
126
Paul Bakker9e36f042013-06-30 14:34:05 +0200127void sha256_process( sha256_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000128{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000129 uint32_t temp1, temp2, W[64];
130 uint32_t A, B, C, D, E, F, G, H;
Paul Bakker5121ce52009-01-03 21:22:43 +0000131
Paul Bakker5c2364c2012-10-01 14:41:15 +0000132 GET_UINT32_BE( W[ 0], data, 0 );
133 GET_UINT32_BE( W[ 1], data, 4 );
134 GET_UINT32_BE( W[ 2], data, 8 );
135 GET_UINT32_BE( W[ 3], data, 12 );
136 GET_UINT32_BE( W[ 4], data, 16 );
137 GET_UINT32_BE( W[ 5], data, 20 );
138 GET_UINT32_BE( W[ 6], data, 24 );
139 GET_UINT32_BE( W[ 7], data, 28 );
140 GET_UINT32_BE( W[ 8], data, 32 );
141 GET_UINT32_BE( W[ 9], data, 36 );
142 GET_UINT32_BE( W[10], data, 40 );
143 GET_UINT32_BE( W[11], data, 44 );
144 GET_UINT32_BE( W[12], data, 48 );
145 GET_UINT32_BE( W[13], data, 52 );
146 GET_UINT32_BE( W[14], data, 56 );
147 GET_UINT32_BE( W[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000148
149#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
150#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
151
152#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
153#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
154
155#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
156#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
157
158#define F0(x,y,z) ((x & y) | (z & (x | y)))
159#define F1(x,y,z) (z ^ (x & (y ^ z)))
160
161#define R(t) \
162( \
163 W[t] = S1(W[t - 2]) + W[t - 7] + \
164 S0(W[t - 15]) + W[t - 16] \
165)
166
167#define P(a,b,c,d,e,f,g,h,x,K) \
168{ \
169 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
170 temp2 = S2(a) + F0(a,b,c); \
171 d += temp1; h = temp1 + temp2; \
172}
173
174 A = ctx->state[0];
175 B = ctx->state[1];
176 C = ctx->state[2];
177 D = ctx->state[3];
178 E = ctx->state[4];
179 F = ctx->state[5];
180 G = ctx->state[6];
181 H = ctx->state[7];
182
183 P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
184 P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
185 P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
186 P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
187 P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
188 P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
189 P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
190 P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
191 P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
192 P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
193 P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
194 P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
195 P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
196 P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
197 P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
198 P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
199 P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
200 P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
201 P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
202 P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
203 P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
204 P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
205 P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
206 P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
207 P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
208 P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
209 P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
210 P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
211 P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
212 P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
213 P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
214 P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
215 P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
216 P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
217 P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
218 P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
219 P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
220 P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
221 P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
222 P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
223 P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
224 P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
225 P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
226 P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
227 P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
228 P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
229 P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
230 P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
231 P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
232 P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
233 P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
234 P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
235 P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
236 P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
237 P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
238 P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
239 P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
240 P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
241 P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
242 P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
243 P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
244 P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
245 P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
246 P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
247
248 ctx->state[0] += A;
249 ctx->state[1] += B;
250 ctx->state[2] += C;
251 ctx->state[3] += D;
252 ctx->state[4] += E;
253 ctx->state[5] += F;
254 ctx->state[6] += G;
255 ctx->state[7] += H;
256}
257
258/*
259 * SHA-256 process buffer
260 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200261void sha256_update( sha256_context *ctx, const unsigned char *input,
262 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000263{
Paul Bakker23986e52011-04-24 08:57:21 +0000264 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000265 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000266
Brian White12895d12014-04-11 11:29:42 -0400267 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000268 return;
269
270 left = ctx->total[0] & 0x3F;
271 fill = 64 - left;
272
Paul Bakker5c2364c2012-10-01 14:41:15 +0000273 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000274 ctx->total[0] &= 0xFFFFFFFF;
275
Paul Bakker5c2364c2012-10-01 14:41:15 +0000276 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000277 ctx->total[1]++;
278
279 if( left && ilen >= fill )
280 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200281 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker9e36f042013-06-30 14:34:05 +0200282 sha256_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000283 input += fill;
284 ilen -= fill;
285 left = 0;
286 }
287
288 while( ilen >= 64 )
289 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200290 sha256_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000291 input += 64;
292 ilen -= 64;
293 }
294
295 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200296 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000297}
298
Paul Bakker9e36f042013-06-30 14:34:05 +0200299static const unsigned char sha256_padding[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000300{
301 0x80, 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};
306
307/*
308 * SHA-256 final digest
309 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200310void sha256_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000311{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000312 uint32_t last, padn;
313 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000314 unsigned char msglen[8];
315
316 high = ( ctx->total[0] >> 29 )
317 | ( ctx->total[1] << 3 );
318 low = ( ctx->total[0] << 3 );
319
Paul Bakker5c2364c2012-10-01 14:41:15 +0000320 PUT_UINT32_BE( high, msglen, 0 );
321 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000322
323 last = ctx->total[0] & 0x3F;
324 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
325
Paul Bakker9e36f042013-06-30 14:34:05 +0200326 sha256_update( ctx, sha256_padding, padn );
327 sha256_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000328
Paul Bakker5c2364c2012-10-01 14:41:15 +0000329 PUT_UINT32_BE( ctx->state[0], output, 0 );
330 PUT_UINT32_BE( ctx->state[1], output, 4 );
331 PUT_UINT32_BE( ctx->state[2], output, 8 );
332 PUT_UINT32_BE( ctx->state[3], output, 12 );
333 PUT_UINT32_BE( ctx->state[4], output, 16 );
334 PUT_UINT32_BE( ctx->state[5], output, 20 );
335 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000336
337 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000338 PUT_UINT32_BE( ctx->state[7], output, 28 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000339}
340
Paul Bakker9e36f042013-06-30 14:34:05 +0200341#endif /* !POLARSSL_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200342
Paul Bakker5121ce52009-01-03 21:22:43 +0000343/*
344 * output = SHA-256( input buffer )
345 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200346void sha256( const unsigned char *input, size_t ilen,
347 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000348{
Paul Bakker9e36f042013-06-30 14:34:05 +0200349 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000350
Paul Bakker5b4af392014-06-26 12:09:34 +0200351 sha256_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200352 sha256_starts( &ctx, is224 );
353 sha256_update( &ctx, input, ilen );
354 sha256_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200355 sha256_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000356}
357
Paul Bakker335db3f2011-04-25 15:28:35 +0000358#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000359/*
360 * output = SHA-256( file contents )
361 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200362int sha256_file( const char *path, unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000363{
364 FILE *f;
365 size_t n;
Paul Bakker9e36f042013-06-30 14:34:05 +0200366 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000367 unsigned char buf[1024];
368
369 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker9e36f042013-06-30 14:34:05 +0200370 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000371
Paul Bakker5b4af392014-06-26 12:09:34 +0200372 sha256_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200373 sha256_starts( &ctx, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000374
375 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker9e36f042013-06-30 14:34:05 +0200376 sha256_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000377
Paul Bakker9e36f042013-06-30 14:34:05 +0200378 sha256_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200379 sha256_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000380
381 if( ferror( f ) != 0 )
382 {
383 fclose( f );
Paul Bakker9e36f042013-06-30 14:34:05 +0200384 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000385 }
386
387 fclose( f );
388 return( 0 );
389}
Paul Bakker335db3f2011-04-25 15:28:35 +0000390#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000391
392/*
393 * SHA-256 HMAC context setup
394 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200395void sha256_hmac_starts( sha256_context *ctx, const unsigned char *key,
396 size_t keylen, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000397{
Paul Bakker23986e52011-04-24 08:57:21 +0000398 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000399 unsigned char sum[32];
400
401 if( keylen > 64 )
402 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200403 sha256( key, keylen, sum, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000404 keylen = ( is224 ) ? 28 : 32;
405 key = sum;
406 }
407
408 memset( ctx->ipad, 0x36, 64 );
409 memset( ctx->opad, 0x5C, 64 );
410
411 for( i = 0; i < keylen; i++ )
412 {
413 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
414 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
415 }
416
Paul Bakker9e36f042013-06-30 14:34:05 +0200417 sha256_starts( ctx, is224 );
418 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000419
Paul Bakker34617722014-06-13 17:20:13 +0200420 polarssl_zeroize( sum, sizeof( sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000421}
422
423/*
424 * SHA-256 HMAC process buffer
425 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200426void sha256_hmac_update( sha256_context *ctx, const unsigned char *input,
427 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000428{
Paul Bakker9e36f042013-06-30 14:34:05 +0200429 sha256_update( ctx, input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000430}
431
432/*
433 * SHA-256 HMAC final digest
434 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200435void sha256_hmac_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000436{
437 int is224, hlen;
438 unsigned char tmpbuf[32];
439
440 is224 = ctx->is224;
441 hlen = ( is224 == 0 ) ? 32 : 28;
442
Paul Bakker9e36f042013-06-30 14:34:05 +0200443 sha256_finish( ctx, tmpbuf );
444 sha256_starts( ctx, is224 );
445 sha256_update( ctx, ctx->opad, 64 );
446 sha256_update( ctx, tmpbuf, hlen );
447 sha256_finish( ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000448
Paul Bakker34617722014-06-13 17:20:13 +0200449 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000450}
451
452/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000453 * SHA-256 HMAC context reset
454 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200455void sha256_hmac_reset( sha256_context *ctx )
Paul Bakker7d3b6612010-03-21 16:23:13 +0000456{
Paul Bakker9e36f042013-06-30 14:34:05 +0200457 sha256_starts( ctx, ctx->is224 );
458 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker7d3b6612010-03-21 16:23:13 +0000459}
460
461/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000462 * output = HMAC-SHA-256( hmac key, input buffer )
463 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200464void sha256_hmac( const unsigned char *key, size_t keylen,
465 const unsigned char *input, size_t ilen,
466 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000467{
Paul Bakker9e36f042013-06-30 14:34:05 +0200468 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000469
Paul Bakker5b4af392014-06-26 12:09:34 +0200470 sha256_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200471 sha256_hmac_starts( &ctx, key, keylen, is224 );
472 sha256_hmac_update( &ctx, input, ilen );
473 sha256_hmac_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200474 sha256_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000475}
476
Paul Bakker40e46942009-01-03 21:51:57 +0000477#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000478/*
479 * FIPS-180-2 test vectors
480 */
Paul Bakker9af723c2014-05-01 13:03:14 +0200481static unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000482{
483 { "abc" },
484 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
485 { "" }
486};
487
Paul Bakker9e36f042013-06-30 14:34:05 +0200488static const int sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000489{
490 3, 56, 1000
491};
492
Paul Bakker9e36f042013-06-30 14:34:05 +0200493static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000494{
495 /*
496 * SHA-224 test vectors
497 */
498 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
499 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
500 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
501 0xE3, 0x6C, 0x9D, 0xA7 },
502 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
503 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
504 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
505 0x52, 0x52, 0x25, 0x25 },
506 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
507 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
508 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
509 0x4E, 0xE7, 0xAD, 0x67 },
510
511 /*
512 * SHA-256 test vectors
513 */
514 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
515 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
516 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
517 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
518 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
519 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
520 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
521 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
522 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
523 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
524 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
525 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
526};
527
528/*
529 * RFC 4231 test vectors
530 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200531static unsigned char sha256_hmac_test_key[7][26] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000532{
533 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
534 "\x0B\x0B\x0B\x0B" },
535 { "Jefe" },
536 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
537 "\xAA\xAA\xAA\xAA" },
538 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
539 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
540 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
541 "\x0C\x0C\x0C\x0C" },
542 { "" }, /* 0xAA 131 times */
543 { "" }
544};
545
Paul Bakker9e36f042013-06-30 14:34:05 +0200546static const int sha256_hmac_test_keylen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000547{
548 20, 4, 20, 25, 20, 131, 131
549};
550
Paul Bakker9e36f042013-06-30 14:34:05 +0200551static unsigned char sha256_hmac_test_buf[7][153] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000552{
553 { "Hi There" },
554 { "what do ya want for nothing?" },
555 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
556 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
557 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
558 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
559 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
560 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
561 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
562 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
563 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
564 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
565 { "Test With Truncation" },
566 { "Test Using Larger Than Block-Size Key - Hash Key First" },
567 { "This is a test using a larger than block-size key "
568 "and a larger than block-size data. The key needs to "
569 "be hashed before being used by the HMAC algorithm." }
570};
571
Paul Bakker9e36f042013-06-30 14:34:05 +0200572static const int sha256_hmac_test_buflen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000573{
574 8, 28, 50, 50, 20, 54, 152
575};
576
Paul Bakker9e36f042013-06-30 14:34:05 +0200577static const unsigned char sha256_hmac_test_sum[14][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000578{
579 /*
580 * HMAC-SHA-224 test vectors
581 */
582 { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19,
583 0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F,
584 0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F,
585 0x53, 0x68, 0x4B, 0x22 },
586 { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF,
587 0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F,
588 0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00,
589 0x8F, 0xD0, 0x5E, 0x44 },
590 { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6,
591 0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64,
592 0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1,
593 0xEC, 0x83, 0x33, 0xEA },
594 { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC,
595 0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C,
596 0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D,
597 0xE7, 0xAF, 0xEC, 0x5A },
598 { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37,
599 0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 },
600 { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD,
601 0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2,
602 0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27,
603 0x3F, 0xA6, 0x87, 0x0E },
604 { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02,
605 0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD,
606 0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9,
607 0xF6, 0xF5, 0x65, 0xD1 },
608
609 /*
610 * HMAC-SHA-256 test vectors
611 */
612 { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53,
613 0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B,
614 0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7,
615 0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 },
616 { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E,
617 0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7,
618 0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83,
619 0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 },
620 { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46,
621 0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7,
622 0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22,
623 0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE },
624 { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E,
625 0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A,
626 0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07,
627 0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B },
628 { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0,
629 0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B },
630 { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F,
631 0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F,
632 0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14,
633 0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 },
634 { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB,
635 0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44,
636 0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93,
637 0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 }
638};
639
640/*
641 * Checkup routine
642 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200643int sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000644{
Paul Bakker5b4af392014-06-26 12:09:34 +0200645 int i, j, k, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000646 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200647 unsigned char sha256sum[32];
648 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000649
Paul Bakker5b4af392014-06-26 12:09:34 +0200650 sha256_init( &ctx );
651
Paul Bakker5121ce52009-01-03 21:22:43 +0000652 for( i = 0; i < 6; i++ )
653 {
654 j = i % 3;
655 k = i < 3;
656
657 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100658 polarssl_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000659
Paul Bakker9e36f042013-06-30 14:34:05 +0200660 sha256_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000661
662 if( j == 2 )
663 {
664 memset( buf, 'a', buflen = 1000 );
665
666 for( j = 0; j < 1000; j++ )
Paul Bakker9e36f042013-06-30 14:34:05 +0200667 sha256_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000668 }
669 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200670 sha256_update( &ctx, sha256_test_buf[j],
671 sha256_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000672
Paul Bakker9e36f042013-06-30 14:34:05 +0200673 sha256_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000674
Paul Bakker9e36f042013-06-30 14:34:05 +0200675 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000676 {
677 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100678 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000679
Paul Bakker5b4af392014-06-26 12:09:34 +0200680 ret = 1;
681 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000682 }
683
684 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100685 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000686 }
687
688 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100689 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000690
691 for( i = 0; i < 14; i++ )
692 {
693 j = i % 7;
694 k = i < 7;
695
696 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100697 polarssl_printf( " HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000698
699 if( j == 5 || j == 6 )
700 {
701 memset( buf, '\xAA', buflen = 131 );
Paul Bakker9e36f042013-06-30 14:34:05 +0200702 sha256_hmac_starts( &ctx, buf, buflen, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000703 }
704 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200705 sha256_hmac_starts( &ctx, sha256_hmac_test_key[j],
706 sha256_hmac_test_keylen[j], k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000707
Paul Bakker9e36f042013-06-30 14:34:05 +0200708 sha256_hmac_update( &ctx, sha256_hmac_test_buf[j],
709 sha256_hmac_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000710
Paul Bakker9e36f042013-06-30 14:34:05 +0200711 sha256_hmac_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000712
713 buflen = ( j == 4 ) ? 16 : 32 - k * 4;
714
Paul Bakker9e36f042013-06-30 14:34:05 +0200715 if( memcmp( sha256sum, sha256_hmac_test_sum[i], buflen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000716 {
717 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100718 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000719
Paul Bakker5b4af392014-06-26 12:09:34 +0200720 ret = 1;
721 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000722 }
723
724 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100725 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000726 }
727
728 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100729 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000730
Paul Bakker5b4af392014-06-26 12:09:34 +0200731exit:
732 sha256_free( &ctx );
733
734 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000735}
736
Paul Bakker9af723c2014-05-01 13:03:14 +0200737#endif /* POLARSSL_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000738
Paul Bakker9af723c2014-05-01 13:03:14 +0200739#endif /* POLARSSL_SHA256_C */