blob: 638188f5348cdf95c95836c05ae71770eda1b782 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Paul Bakker7dc4c442014-02-01 22:50:26 +01004 * Copyright (C) 2006-2014, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25/*
26 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
27 *
28 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
29 */
30
Paul Bakker40e46942009-01-03 21:51:57 +000031#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000032
Paul Bakker9e36f042013-06-30 14:34:05 +020033#if defined(POLARSSL_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000034
Paul Bakkerd2681d82013-06-30 14:49:12 +020035#include "polarssl/sha256.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000036
Paul Bakker335db3f2011-04-25 15:28:35 +000037#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +000038#include <stdio.h>
Paul Bakker335db3f2011-04-25 15:28:35 +000039#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000040
Paul Bakker7dc4c442014-02-01 22:50:26 +010041#if defined(POLARSSL_PLATFORM_C)
42#include "polarssl/platform.h"
43#else
44#define polarssl_printf printf
45#endif
46
Paul Bakker9e36f042013-06-30 14:34:05 +020047#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020048
Paul Bakker5121ce52009-01-03 21:22:43 +000049/*
50 * 32-bit integer manipulation macros (big endian)
51 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000052#ifndef GET_UINT32_BE
53#define GET_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000054{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000055 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
56 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
57 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
58 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000059}
60#endif
61
Paul Bakker5c2364c2012-10-01 14:41:15 +000062#ifndef PUT_UINT32_BE
63#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000064{ \
65 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
66 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
67 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
68 (b)[(i) + 3] = (unsigned char) ( (n) ); \
69}
70#endif
71
72/*
73 * SHA-256 context setup
74 */
Paul Bakker9e36f042013-06-30 14:34:05 +020075void sha256_starts( sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +000076{
77 ctx->total[0] = 0;
78 ctx->total[1] = 0;
79
80 if( is224 == 0 )
81 {
82 /* SHA-256 */
83 ctx->state[0] = 0x6A09E667;
84 ctx->state[1] = 0xBB67AE85;
85 ctx->state[2] = 0x3C6EF372;
86 ctx->state[3] = 0xA54FF53A;
87 ctx->state[4] = 0x510E527F;
88 ctx->state[5] = 0x9B05688C;
89 ctx->state[6] = 0x1F83D9AB;
90 ctx->state[7] = 0x5BE0CD19;
91 }
92 else
93 {
94 /* SHA-224 */
95 ctx->state[0] = 0xC1059ED8;
96 ctx->state[1] = 0x367CD507;
97 ctx->state[2] = 0x3070DD17;
98 ctx->state[3] = 0xF70E5939;
99 ctx->state[4] = 0xFFC00B31;
100 ctx->state[5] = 0x68581511;
101 ctx->state[6] = 0x64F98FA7;
102 ctx->state[7] = 0xBEFA4FA4;
103 }
104
105 ctx->is224 = is224;
106}
107
Paul Bakker9e36f042013-06-30 14:34:05 +0200108void sha256_process( sha256_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000109{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000110 uint32_t temp1, temp2, W[64];
111 uint32_t A, B, C, D, E, F, G, H;
Paul Bakker5121ce52009-01-03 21:22:43 +0000112
Paul Bakker5c2364c2012-10-01 14:41:15 +0000113 GET_UINT32_BE( W[ 0], data, 0 );
114 GET_UINT32_BE( W[ 1], data, 4 );
115 GET_UINT32_BE( W[ 2], data, 8 );
116 GET_UINT32_BE( W[ 3], data, 12 );
117 GET_UINT32_BE( W[ 4], data, 16 );
118 GET_UINT32_BE( W[ 5], data, 20 );
119 GET_UINT32_BE( W[ 6], data, 24 );
120 GET_UINT32_BE( W[ 7], data, 28 );
121 GET_UINT32_BE( W[ 8], data, 32 );
122 GET_UINT32_BE( W[ 9], data, 36 );
123 GET_UINT32_BE( W[10], data, 40 );
124 GET_UINT32_BE( W[11], data, 44 );
125 GET_UINT32_BE( W[12], data, 48 );
126 GET_UINT32_BE( W[13], data, 52 );
127 GET_UINT32_BE( W[14], data, 56 );
128 GET_UINT32_BE( W[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000129
130#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
131#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
132
133#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
134#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
135
136#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
137#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
138
139#define F0(x,y,z) ((x & y) | (z & (x | y)))
140#define F1(x,y,z) (z ^ (x & (y ^ z)))
141
142#define R(t) \
143( \
144 W[t] = S1(W[t - 2]) + W[t - 7] + \
145 S0(W[t - 15]) + W[t - 16] \
146)
147
148#define P(a,b,c,d,e,f,g,h,x,K) \
149{ \
150 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
151 temp2 = S2(a) + F0(a,b,c); \
152 d += temp1; h = temp1 + temp2; \
153}
154
155 A = ctx->state[0];
156 B = ctx->state[1];
157 C = ctx->state[2];
158 D = ctx->state[3];
159 E = ctx->state[4];
160 F = ctx->state[5];
161 G = ctx->state[6];
162 H = ctx->state[7];
163
164 P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
165 P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
166 P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
167 P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
168 P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
169 P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
170 P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
171 P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
172 P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
173 P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
174 P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
175 P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
176 P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
177 P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
178 P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
179 P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
180 P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
181 P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
182 P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
183 P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
184 P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
185 P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
186 P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
187 P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
188 P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
189 P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
190 P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
191 P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
192 P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
193 P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
194 P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
195 P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
196 P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
197 P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
198 P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
199 P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
200 P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
201 P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
202 P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
203 P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
204 P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
205 P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
206 P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
207 P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
208 P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
209 P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
210 P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
211 P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
212 P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
213 P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
214 P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
215 P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
216 P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
217 P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
218 P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
219 P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
220 P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
221 P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
222 P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
223 P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
224 P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
225 P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
226 P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
227 P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
228
229 ctx->state[0] += A;
230 ctx->state[1] += B;
231 ctx->state[2] += C;
232 ctx->state[3] += D;
233 ctx->state[4] += E;
234 ctx->state[5] += F;
235 ctx->state[6] += G;
236 ctx->state[7] += H;
237}
238
239/*
240 * SHA-256 process buffer
241 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200242void sha256_update( sha256_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000243{
Paul Bakker23986e52011-04-24 08:57:21 +0000244 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000245 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000246
247 if( ilen <= 0 )
248 return;
249
250 left = ctx->total[0] & 0x3F;
251 fill = 64 - left;
252
Paul Bakker5c2364c2012-10-01 14:41:15 +0000253 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000254 ctx->total[0] &= 0xFFFFFFFF;
255
Paul Bakker5c2364c2012-10-01 14:41:15 +0000256 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000257 ctx->total[1]++;
258
259 if( left && ilen >= fill )
260 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200261 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker9e36f042013-06-30 14:34:05 +0200262 sha256_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000263 input += fill;
264 ilen -= fill;
265 left = 0;
266 }
267
268 while( ilen >= 64 )
269 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200270 sha256_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000271 input += 64;
272 ilen -= 64;
273 }
274
275 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200276 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000277}
278
Paul Bakker9e36f042013-06-30 14:34:05 +0200279static const unsigned char sha256_padding[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000280{
281 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
282 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
283 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
285};
286
287/*
288 * SHA-256 final digest
289 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200290void sha256_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000291{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000292 uint32_t last, padn;
293 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000294 unsigned char msglen[8];
295
296 high = ( ctx->total[0] >> 29 )
297 | ( ctx->total[1] << 3 );
298 low = ( ctx->total[0] << 3 );
299
Paul Bakker5c2364c2012-10-01 14:41:15 +0000300 PUT_UINT32_BE( high, msglen, 0 );
301 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000302
303 last = ctx->total[0] & 0x3F;
304 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
305
Paul Bakker9e36f042013-06-30 14:34:05 +0200306 sha256_update( ctx, sha256_padding, padn );
307 sha256_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000308
Paul Bakker5c2364c2012-10-01 14:41:15 +0000309 PUT_UINT32_BE( ctx->state[0], output, 0 );
310 PUT_UINT32_BE( ctx->state[1], output, 4 );
311 PUT_UINT32_BE( ctx->state[2], output, 8 );
312 PUT_UINT32_BE( ctx->state[3], output, 12 );
313 PUT_UINT32_BE( ctx->state[4], output, 16 );
314 PUT_UINT32_BE( ctx->state[5], output, 20 );
315 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000316
317 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000318 PUT_UINT32_BE( ctx->state[7], output, 28 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000319}
320
Paul Bakker9e36f042013-06-30 14:34:05 +0200321#endif /* !POLARSSL_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200322
Paul Bakker5121ce52009-01-03 21:22:43 +0000323/*
324 * output = SHA-256( input buffer )
325 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200326void sha256( const unsigned char *input, size_t ilen,
327 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000328{
Paul Bakker9e36f042013-06-30 14:34:05 +0200329 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000330
Paul Bakker9e36f042013-06-30 14:34:05 +0200331 sha256_starts( &ctx, is224 );
332 sha256_update( &ctx, input, ilen );
333 sha256_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000334
Paul Bakker9e36f042013-06-30 14:34:05 +0200335 memset( &ctx, 0, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000336}
337
Paul Bakker335db3f2011-04-25 15:28:35 +0000338#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000339/*
340 * output = SHA-256( file contents )
341 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200342int sha256_file( const char *path, unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000343{
344 FILE *f;
345 size_t n;
Paul Bakker9e36f042013-06-30 14:34:05 +0200346 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000347 unsigned char buf[1024];
348
349 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker9e36f042013-06-30 14:34:05 +0200350 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000351
Paul Bakker9e36f042013-06-30 14:34:05 +0200352 sha256_starts( &ctx, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000353
354 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker9e36f042013-06-30 14:34:05 +0200355 sha256_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000356
Paul Bakker9e36f042013-06-30 14:34:05 +0200357 sha256_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000358
Paul Bakker9e36f042013-06-30 14:34:05 +0200359 memset( &ctx, 0, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000360
361 if( ferror( f ) != 0 )
362 {
363 fclose( f );
Paul Bakker9e36f042013-06-30 14:34:05 +0200364 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000365 }
366
367 fclose( f );
368 return( 0 );
369}
Paul Bakker335db3f2011-04-25 15:28:35 +0000370#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000371
372/*
373 * SHA-256 HMAC context setup
374 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200375void sha256_hmac_starts( sha256_context *ctx, const unsigned char *key,
376 size_t keylen, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000377{
Paul Bakker23986e52011-04-24 08:57:21 +0000378 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000379 unsigned char sum[32];
380
381 if( keylen > 64 )
382 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200383 sha256( key, keylen, sum, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000384 keylen = ( is224 ) ? 28 : 32;
385 key = sum;
386 }
387
388 memset( ctx->ipad, 0x36, 64 );
389 memset( ctx->opad, 0x5C, 64 );
390
391 for( i = 0; i < keylen; i++ )
392 {
393 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
394 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
395 }
396
Paul Bakker9e36f042013-06-30 14:34:05 +0200397 sha256_starts( ctx, is224 );
398 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000399
400 memset( sum, 0, sizeof( sum ) );
401}
402
403/*
404 * SHA-256 HMAC process buffer
405 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200406void sha256_hmac_update( sha256_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000407{
Paul Bakker9e36f042013-06-30 14:34:05 +0200408 sha256_update( ctx, input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000409}
410
411/*
412 * SHA-256 HMAC final digest
413 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200414void sha256_hmac_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000415{
416 int is224, hlen;
417 unsigned char tmpbuf[32];
418
419 is224 = ctx->is224;
420 hlen = ( is224 == 0 ) ? 32 : 28;
421
Paul Bakker9e36f042013-06-30 14:34:05 +0200422 sha256_finish( ctx, tmpbuf );
423 sha256_starts( ctx, is224 );
424 sha256_update( ctx, ctx->opad, 64 );
425 sha256_update( ctx, tmpbuf, hlen );
426 sha256_finish( ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000427
428 memset( tmpbuf, 0, sizeof( tmpbuf ) );
429}
430
431/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000432 * SHA-256 HMAC context reset
433 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200434void sha256_hmac_reset( sha256_context *ctx )
Paul Bakker7d3b6612010-03-21 16:23:13 +0000435{
Paul Bakker9e36f042013-06-30 14:34:05 +0200436 sha256_starts( ctx, ctx->is224 );
437 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker7d3b6612010-03-21 16:23:13 +0000438}
439
440/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000441 * output = HMAC-SHA-256( hmac key, input buffer )
442 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200443void sha256_hmac( const unsigned char *key, size_t keylen,
444 const unsigned char *input, size_t ilen,
445 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000446{
Paul Bakker9e36f042013-06-30 14:34:05 +0200447 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000448
Paul Bakker9e36f042013-06-30 14:34:05 +0200449 sha256_hmac_starts( &ctx, key, keylen, is224 );
450 sha256_hmac_update( &ctx, input, ilen );
451 sha256_hmac_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000452
Paul Bakker9e36f042013-06-30 14:34:05 +0200453 memset( &ctx, 0, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000454}
455
Paul Bakker40e46942009-01-03 21:51:57 +0000456#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000457/*
458 * FIPS-180-2 test vectors
459 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200460static unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000461{
462 { "abc" },
463 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
464 { "" }
465};
466
Paul Bakker9e36f042013-06-30 14:34:05 +0200467static const int sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000468{
469 3, 56, 1000
470};
471
Paul Bakker9e36f042013-06-30 14:34:05 +0200472static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000473{
474 /*
475 * SHA-224 test vectors
476 */
477 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
478 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
479 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
480 0xE3, 0x6C, 0x9D, 0xA7 },
481 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
482 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
483 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
484 0x52, 0x52, 0x25, 0x25 },
485 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
486 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
487 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
488 0x4E, 0xE7, 0xAD, 0x67 },
489
490 /*
491 * SHA-256 test vectors
492 */
493 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
494 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
495 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
496 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
497 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
498 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
499 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
500 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
501 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
502 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
503 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
504 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
505};
506
507/*
508 * RFC 4231 test vectors
509 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200510static unsigned char sha256_hmac_test_key[7][26] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000511{
512 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
513 "\x0B\x0B\x0B\x0B" },
514 { "Jefe" },
515 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
516 "\xAA\xAA\xAA\xAA" },
517 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
518 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
519 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
520 "\x0C\x0C\x0C\x0C" },
521 { "" }, /* 0xAA 131 times */
522 { "" }
523};
524
Paul Bakker9e36f042013-06-30 14:34:05 +0200525static const int sha256_hmac_test_keylen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000526{
527 20, 4, 20, 25, 20, 131, 131
528};
529
Paul Bakker9e36f042013-06-30 14:34:05 +0200530static unsigned char sha256_hmac_test_buf[7][153] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000531{
532 { "Hi There" },
533 { "what do ya want for nothing?" },
534 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
535 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
536 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
537 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
538 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
539 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
540 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
541 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
542 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
543 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
544 { "Test With Truncation" },
545 { "Test Using Larger Than Block-Size Key - Hash Key First" },
546 { "This is a test using a larger than block-size key "
547 "and a larger than block-size data. The key needs to "
548 "be hashed before being used by the HMAC algorithm." }
549};
550
Paul Bakker9e36f042013-06-30 14:34:05 +0200551static const int sha256_hmac_test_buflen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000552{
553 8, 28, 50, 50, 20, 54, 152
554};
555
Paul Bakker9e36f042013-06-30 14:34:05 +0200556static const unsigned char sha256_hmac_test_sum[14][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000557{
558 /*
559 * HMAC-SHA-224 test vectors
560 */
561 { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19,
562 0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F,
563 0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F,
564 0x53, 0x68, 0x4B, 0x22 },
565 { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF,
566 0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F,
567 0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00,
568 0x8F, 0xD0, 0x5E, 0x44 },
569 { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6,
570 0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64,
571 0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1,
572 0xEC, 0x83, 0x33, 0xEA },
573 { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC,
574 0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C,
575 0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D,
576 0xE7, 0xAF, 0xEC, 0x5A },
577 { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37,
578 0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 },
579 { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD,
580 0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2,
581 0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27,
582 0x3F, 0xA6, 0x87, 0x0E },
583 { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02,
584 0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD,
585 0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9,
586 0xF6, 0xF5, 0x65, 0xD1 },
587
588 /*
589 * HMAC-SHA-256 test vectors
590 */
591 { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53,
592 0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B,
593 0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7,
594 0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 },
595 { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E,
596 0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7,
597 0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83,
598 0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 },
599 { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46,
600 0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7,
601 0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22,
602 0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE },
603 { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E,
604 0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A,
605 0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07,
606 0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B },
607 { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0,
608 0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B },
609 { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F,
610 0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F,
611 0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14,
612 0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 },
613 { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB,
614 0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44,
615 0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93,
616 0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 }
617};
618
619/*
620 * Checkup routine
621 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200622int sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000623{
624 int i, j, k, buflen;
625 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200626 unsigned char sha256sum[32];
627 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000628
629 for( i = 0; i < 6; i++ )
630 {
631 j = i % 3;
632 k = i < 3;
633
634 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100635 polarssl_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000636
Paul Bakker9e36f042013-06-30 14:34:05 +0200637 sha256_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000638
639 if( j == 2 )
640 {
641 memset( buf, 'a', buflen = 1000 );
642
643 for( j = 0; j < 1000; j++ )
Paul Bakker9e36f042013-06-30 14:34:05 +0200644 sha256_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000645 }
646 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200647 sha256_update( &ctx, sha256_test_buf[j],
648 sha256_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000649
Paul Bakker9e36f042013-06-30 14:34:05 +0200650 sha256_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
Paul Bakker9e36f042013-06-30 14:34:05 +0200652 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000653 {
654 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100655 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000656
657 return( 1 );
658 }
659
660 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100661 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000662 }
663
664 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100665 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000666
667 for( i = 0; i < 14; i++ )
668 {
669 j = i % 7;
670 k = i < 7;
671
672 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100673 polarssl_printf( " HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000674
675 if( j == 5 || j == 6 )
676 {
677 memset( buf, '\xAA', buflen = 131 );
Paul Bakker9e36f042013-06-30 14:34:05 +0200678 sha256_hmac_starts( &ctx, buf, buflen, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000679 }
680 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200681 sha256_hmac_starts( &ctx, sha256_hmac_test_key[j],
682 sha256_hmac_test_keylen[j], k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000683
Paul Bakker9e36f042013-06-30 14:34:05 +0200684 sha256_hmac_update( &ctx, sha256_hmac_test_buf[j],
685 sha256_hmac_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000686
Paul Bakker9e36f042013-06-30 14:34:05 +0200687 sha256_hmac_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000688
689 buflen = ( j == 4 ) ? 16 : 32 - k * 4;
690
Paul Bakker9e36f042013-06-30 14:34:05 +0200691 if( memcmp( sha256sum, sha256_hmac_test_sum[i], buflen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000692 {
693 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100694 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000695
696 return( 1 );
697 }
698
699 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100700 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000701 }
702
703 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100704 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000705
706 return( 0 );
707}
708
709#endif
710
711#endif