blob: 674fdf25e3982eb1ba13e2b58caf3b3afcc6aeb9 [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é-Gonnardfe446432015-03-06 13:17:10 +00006 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakkerb96f1542010-07-18 20:36:00 +00007 *
Paul Bakker5121ce52009-01-03 21:22:43 +00008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22/*
23 * The SHA-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
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
Manuel Pégourié-Gonnarde217cee2015-08-31 11:22:01 +020053#if !defined(POLARSSL_SHA256_ALT)
54
Paul Bakker34617722014-06-13 17:20:13 +020055/* Implementation that should never be optimized out by the compiler */
56static void polarssl_zeroize( void *v, size_t n ) {
57 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
58}
59
Paul Bakker5121ce52009-01-03 21:22:43 +000060/*
61 * 32-bit integer manipulation macros (big endian)
62 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000063#ifndef GET_UINT32_BE
64#define GET_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000065{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000066 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
67 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
68 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
69 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000070}
71#endif
72
Paul Bakker5c2364c2012-10-01 14:41:15 +000073#ifndef PUT_UINT32_BE
74#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000075{ \
76 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
77 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
78 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
79 (b)[(i) + 3] = (unsigned char) ( (n) ); \
80}
81#endif
82
Paul Bakker5b4af392014-06-26 12:09:34 +020083void sha256_init( sha256_context *ctx )
84{
85 memset( ctx, 0, sizeof( sha256_context ) );
86}
87
88void sha256_free( sha256_context *ctx )
89{
90 if( ctx == NULL )
91 return;
92
93 polarssl_zeroize( ctx, sizeof( sha256_context ) );
94}
95
Paul Bakker5121ce52009-01-03 21:22:43 +000096/*
97 * SHA-256 context setup
98 */
Paul Bakker9e36f042013-06-30 14:34:05 +020099void sha256_starts( sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000100{
101 ctx->total[0] = 0;
102 ctx->total[1] = 0;
103
104 if( is224 == 0 )
105 {
106 /* SHA-256 */
107 ctx->state[0] = 0x6A09E667;
108 ctx->state[1] = 0xBB67AE85;
109 ctx->state[2] = 0x3C6EF372;
110 ctx->state[3] = 0xA54FF53A;
111 ctx->state[4] = 0x510E527F;
112 ctx->state[5] = 0x9B05688C;
113 ctx->state[6] = 0x1F83D9AB;
114 ctx->state[7] = 0x5BE0CD19;
115 }
116 else
117 {
118 /* SHA-224 */
119 ctx->state[0] = 0xC1059ED8;
120 ctx->state[1] = 0x367CD507;
121 ctx->state[2] = 0x3070DD17;
122 ctx->state[3] = 0xF70E5939;
123 ctx->state[4] = 0xFFC00B31;
124 ctx->state[5] = 0x68581511;
125 ctx->state[6] = 0x64F98FA7;
126 ctx->state[7] = 0xBEFA4FA4;
127 }
128
129 ctx->is224 = is224;
130}
131
Paul Bakker9e36f042013-06-30 14:34:05 +0200132void sha256_process( sha256_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000133{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000134 uint32_t temp1, temp2, W[64];
135 uint32_t A, B, C, D, E, F, G, H;
Paul Bakker5121ce52009-01-03 21:22:43 +0000136
Paul Bakker5c2364c2012-10-01 14:41:15 +0000137 GET_UINT32_BE( W[ 0], data, 0 );
138 GET_UINT32_BE( W[ 1], data, 4 );
139 GET_UINT32_BE( W[ 2], data, 8 );
140 GET_UINT32_BE( W[ 3], data, 12 );
141 GET_UINT32_BE( W[ 4], data, 16 );
142 GET_UINT32_BE( W[ 5], data, 20 );
143 GET_UINT32_BE( W[ 6], data, 24 );
144 GET_UINT32_BE( W[ 7], data, 28 );
145 GET_UINT32_BE( W[ 8], data, 32 );
146 GET_UINT32_BE( W[ 9], data, 36 );
147 GET_UINT32_BE( W[10], data, 40 );
148 GET_UINT32_BE( W[11], data, 44 );
149 GET_UINT32_BE( W[12], data, 48 );
150 GET_UINT32_BE( W[13], data, 52 );
151 GET_UINT32_BE( W[14], data, 56 );
152 GET_UINT32_BE( W[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000153
154#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
155#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
156
157#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
158#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
159
160#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
161#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
162
163#define F0(x,y,z) ((x & y) | (z & (x | y)))
164#define F1(x,y,z) (z ^ (x & (y ^ z)))
165
166#define R(t) \
167( \
168 W[t] = S1(W[t - 2]) + W[t - 7] + \
169 S0(W[t - 15]) + W[t - 16] \
170)
171
172#define P(a,b,c,d,e,f,g,h,x,K) \
173{ \
174 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
175 temp2 = S2(a) + F0(a,b,c); \
176 d += temp1; h = temp1 + temp2; \
177}
178
179 A = ctx->state[0];
180 B = ctx->state[1];
181 C = ctx->state[2];
182 D = ctx->state[3];
183 E = ctx->state[4];
184 F = ctx->state[5];
185 G = ctx->state[6];
186 H = ctx->state[7];
187
188 P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
189 P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
190 P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
191 P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
192 P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
193 P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
194 P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
195 P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
196 P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
197 P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
198 P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
199 P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
200 P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
201 P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
202 P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
203 P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
204 P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
205 P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
206 P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
207 P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
208 P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
209 P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
210 P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
211 P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
212 P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
213 P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
214 P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
215 P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
216 P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
217 P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
218 P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
219 P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
220 P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
221 P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
222 P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
223 P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
224 P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
225 P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
226 P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
227 P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
228 P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
229 P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
230 P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
231 P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
232 P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
233 P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
234 P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
235 P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
236 P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
237 P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
238 P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
239 P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
240 P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
241 P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
242 P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
243 P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
244 P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
245 P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
246 P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
247 P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
248 P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
249 P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
250 P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
251 P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
252
253 ctx->state[0] += A;
254 ctx->state[1] += B;
255 ctx->state[2] += C;
256 ctx->state[3] += D;
257 ctx->state[4] += E;
258 ctx->state[5] += F;
259 ctx->state[6] += G;
260 ctx->state[7] += H;
261}
262
263/*
264 * SHA-256 process buffer
265 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200266void sha256_update( sha256_context *ctx, const unsigned char *input,
267 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000268{
Paul Bakker23986e52011-04-24 08:57:21 +0000269 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000270 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000271
Brian White12895d12014-04-11 11:29:42 -0400272 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000273 return;
274
275 left = ctx->total[0] & 0x3F;
276 fill = 64 - left;
277
Paul Bakker5c2364c2012-10-01 14:41:15 +0000278 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000279 ctx->total[0] &= 0xFFFFFFFF;
280
Paul Bakker5c2364c2012-10-01 14:41:15 +0000281 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000282 ctx->total[1]++;
283
284 if( left && ilen >= fill )
285 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200286 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker9e36f042013-06-30 14:34:05 +0200287 sha256_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000288 input += fill;
289 ilen -= fill;
290 left = 0;
291 }
292
293 while( ilen >= 64 )
294 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200295 sha256_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000296 input += 64;
297 ilen -= 64;
298 }
299
300 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200301 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000302}
303
Paul Bakker9e36f042013-06-30 14:34:05 +0200304static const unsigned char sha256_padding[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000305{
306 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
307 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
308 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
309 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
310};
311
312/*
313 * SHA-256 final digest
314 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200315void sha256_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000316{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000317 uint32_t last, padn;
318 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000319 unsigned char msglen[8];
320
321 high = ( ctx->total[0] >> 29 )
322 | ( ctx->total[1] << 3 );
323 low = ( ctx->total[0] << 3 );
324
Paul Bakker5c2364c2012-10-01 14:41:15 +0000325 PUT_UINT32_BE( high, msglen, 0 );
326 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000327
328 last = ctx->total[0] & 0x3F;
329 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
330
Paul Bakker9e36f042013-06-30 14:34:05 +0200331 sha256_update( ctx, sha256_padding, padn );
332 sha256_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000333
Paul Bakker5c2364c2012-10-01 14:41:15 +0000334 PUT_UINT32_BE( ctx->state[0], output, 0 );
335 PUT_UINT32_BE( ctx->state[1], output, 4 );
336 PUT_UINT32_BE( ctx->state[2], output, 8 );
337 PUT_UINT32_BE( ctx->state[3], output, 12 );
338 PUT_UINT32_BE( ctx->state[4], output, 16 );
339 PUT_UINT32_BE( ctx->state[5], output, 20 );
340 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000341
342 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000343 PUT_UINT32_BE( ctx->state[7], output, 28 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000344}
345
Paul Bakker9e36f042013-06-30 14:34:05 +0200346#endif /* !POLARSSL_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200347
Paul Bakker5121ce52009-01-03 21:22:43 +0000348/*
349 * output = SHA-256( input buffer )
350 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200351void sha256( const unsigned char *input, size_t ilen,
352 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000353{
Paul Bakker9e36f042013-06-30 14:34:05 +0200354 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000355
Paul Bakker5b4af392014-06-26 12:09:34 +0200356 sha256_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200357 sha256_starts( &ctx, is224 );
358 sha256_update( &ctx, input, ilen );
359 sha256_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200360 sha256_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000361}
362
Paul Bakker335db3f2011-04-25 15:28:35 +0000363#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000364/*
365 * output = SHA-256( file contents )
366 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200367int sha256_file( const char *path, unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000368{
369 FILE *f;
370 size_t n;
Paul Bakker9e36f042013-06-30 14:34:05 +0200371 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000372 unsigned char buf[1024];
373
374 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker9e36f042013-06-30 14:34:05 +0200375 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
Paul Bakker5b4af392014-06-26 12:09:34 +0200377 sha256_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200378 sha256_starts( &ctx, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000379
380 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker9e36f042013-06-30 14:34:05 +0200381 sha256_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000382
Paul Bakker9e36f042013-06-30 14:34:05 +0200383 sha256_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200384 sha256_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000385
386 if( ferror( f ) != 0 )
387 {
388 fclose( f );
Paul Bakker9e36f042013-06-30 14:34:05 +0200389 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000390 }
391
392 fclose( f );
393 return( 0 );
394}
Paul Bakker335db3f2011-04-25 15:28:35 +0000395#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000396
397/*
398 * SHA-256 HMAC context setup
399 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200400void sha256_hmac_starts( sha256_context *ctx, const unsigned char *key,
401 size_t keylen, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000402{
Paul Bakker23986e52011-04-24 08:57:21 +0000403 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000404 unsigned char sum[32];
405
406 if( keylen > 64 )
407 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200408 sha256( key, keylen, sum, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000409 keylen = ( is224 ) ? 28 : 32;
410 key = sum;
411 }
412
413 memset( ctx->ipad, 0x36, 64 );
414 memset( ctx->opad, 0x5C, 64 );
415
416 for( i = 0; i < keylen; i++ )
417 {
418 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
419 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
420 }
421
Paul Bakker9e36f042013-06-30 14:34:05 +0200422 sha256_starts( ctx, is224 );
423 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000424
Paul Bakker34617722014-06-13 17:20:13 +0200425 polarssl_zeroize( sum, sizeof( sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000426}
427
428/*
429 * SHA-256 HMAC process buffer
430 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200431void sha256_hmac_update( sha256_context *ctx, const unsigned char *input,
432 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000433{
Paul Bakker9e36f042013-06-30 14:34:05 +0200434 sha256_update( ctx, input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000435}
436
437/*
438 * SHA-256 HMAC final digest
439 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200440void sha256_hmac_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000441{
442 int is224, hlen;
443 unsigned char tmpbuf[32];
444
445 is224 = ctx->is224;
446 hlen = ( is224 == 0 ) ? 32 : 28;
447
Paul Bakker9e36f042013-06-30 14:34:05 +0200448 sha256_finish( ctx, tmpbuf );
449 sha256_starts( ctx, is224 );
450 sha256_update( ctx, ctx->opad, 64 );
451 sha256_update( ctx, tmpbuf, hlen );
452 sha256_finish( ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000453
Paul Bakker34617722014-06-13 17:20:13 +0200454 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000455}
456
457/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000458 * SHA-256 HMAC context reset
459 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200460void sha256_hmac_reset( sha256_context *ctx )
Paul Bakker7d3b6612010-03-21 16:23:13 +0000461{
Paul Bakker9e36f042013-06-30 14:34:05 +0200462 sha256_starts( ctx, ctx->is224 );
463 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker7d3b6612010-03-21 16:23:13 +0000464}
465
466/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000467 * output = HMAC-SHA-256( hmac key, input buffer )
468 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200469void sha256_hmac( const unsigned char *key, size_t keylen,
470 const unsigned char *input, size_t ilen,
471 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000472{
Paul Bakker9e36f042013-06-30 14:34:05 +0200473 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000474
Paul Bakker5b4af392014-06-26 12:09:34 +0200475 sha256_init( &ctx );
Paul Bakker9e36f042013-06-30 14:34:05 +0200476 sha256_hmac_starts( &ctx, key, keylen, is224 );
477 sha256_hmac_update( &ctx, input, ilen );
478 sha256_hmac_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200479 sha256_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000480}
481
Paul Bakker40e46942009-01-03 21:51:57 +0000482#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000483/*
484 * FIPS-180-2 test vectors
485 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000486static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000487{
488 { "abc" },
489 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
490 { "" }
491};
492
Paul Bakker9e36f042013-06-30 14:34:05 +0200493static const int sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000494{
495 3, 56, 1000
496};
497
Paul Bakker9e36f042013-06-30 14:34:05 +0200498static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000499{
500 /*
501 * SHA-224 test vectors
502 */
503 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
504 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
505 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
506 0xE3, 0x6C, 0x9D, 0xA7 },
507 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
508 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
509 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
510 0x52, 0x52, 0x25, 0x25 },
511 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
512 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
513 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
514 0x4E, 0xE7, 0xAD, 0x67 },
515
516 /*
517 * SHA-256 test vectors
518 */
519 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
520 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
521 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
522 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
523 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
524 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
525 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
526 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
527 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
528 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
529 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
530 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
531};
532
533/*
534 * RFC 4231 test vectors
535 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000536static const unsigned char sha256_hmac_test_key[7][26] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000537{
538 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
539 "\x0B\x0B\x0B\x0B" },
540 { "Jefe" },
541 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
542 "\xAA\xAA\xAA\xAA" },
543 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
544 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
545 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
546 "\x0C\x0C\x0C\x0C" },
547 { "" }, /* 0xAA 131 times */
548 { "" }
549};
550
Paul Bakker9e36f042013-06-30 14:34:05 +0200551static const int sha256_hmac_test_keylen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000552{
553 20, 4, 20, 25, 20, 131, 131
554};
555
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000556static const unsigned char sha256_hmac_test_buf[7][153] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000557{
558 { "Hi There" },
559 { "what do ya want for nothing?" },
560 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
561 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
562 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
563 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
564 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
565 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
566 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
567 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
568 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
569 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
570 { "Test With Truncation" },
571 { "Test Using Larger Than Block-Size Key - Hash Key First" },
572 { "This is a test using a larger than block-size key "
573 "and a larger than block-size data. The key needs to "
574 "be hashed before being used by the HMAC algorithm." }
575};
576
Paul Bakker9e36f042013-06-30 14:34:05 +0200577static const int sha256_hmac_test_buflen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000578{
579 8, 28, 50, 50, 20, 54, 152
580};
581
Paul Bakker9e36f042013-06-30 14:34:05 +0200582static const unsigned char sha256_hmac_test_sum[14][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000583{
584 /*
585 * HMAC-SHA-224 test vectors
586 */
587 { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19,
588 0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F,
589 0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F,
590 0x53, 0x68, 0x4B, 0x22 },
591 { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF,
592 0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F,
593 0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00,
594 0x8F, 0xD0, 0x5E, 0x44 },
595 { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6,
596 0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64,
597 0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1,
598 0xEC, 0x83, 0x33, 0xEA },
599 { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC,
600 0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C,
601 0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D,
602 0xE7, 0xAF, 0xEC, 0x5A },
603 { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37,
604 0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 },
605 { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD,
606 0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2,
607 0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27,
608 0x3F, 0xA6, 0x87, 0x0E },
609 { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02,
610 0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD,
611 0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9,
612 0xF6, 0xF5, 0x65, 0xD1 },
613
614 /*
615 * HMAC-SHA-256 test vectors
616 */
617 { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53,
618 0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B,
619 0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7,
620 0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 },
621 { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E,
622 0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7,
623 0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83,
624 0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 },
625 { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46,
626 0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7,
627 0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22,
628 0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE },
629 { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E,
630 0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A,
631 0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07,
632 0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B },
633 { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0,
634 0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B },
635 { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F,
636 0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F,
637 0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14,
638 0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 },
639 { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB,
640 0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44,
641 0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93,
642 0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 }
643};
644
645/*
646 * Checkup routine
647 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200648int sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000649{
Paul Bakker5b4af392014-06-26 12:09:34 +0200650 int i, j, k, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000651 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200652 unsigned char sha256sum[32];
653 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000654
Paul Bakker5b4af392014-06-26 12:09:34 +0200655 sha256_init( &ctx );
656
Paul Bakker5121ce52009-01-03 21:22:43 +0000657 for( i = 0; i < 6; i++ )
658 {
659 j = i % 3;
660 k = i < 3;
661
662 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100663 polarssl_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000664
Paul Bakker9e36f042013-06-30 14:34:05 +0200665 sha256_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000666
667 if( j == 2 )
668 {
669 memset( buf, 'a', buflen = 1000 );
670
671 for( j = 0; j < 1000; j++ )
Paul Bakker9e36f042013-06-30 14:34:05 +0200672 sha256_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000673 }
674 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200675 sha256_update( &ctx, sha256_test_buf[j],
676 sha256_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000677
Paul Bakker9e36f042013-06-30 14:34:05 +0200678 sha256_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000679
Paul Bakker9e36f042013-06-30 14:34:05 +0200680 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000681 {
682 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100683 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000684
Paul Bakker5b4af392014-06-26 12:09:34 +0200685 ret = 1;
686 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000687 }
688
689 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100690 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000691 }
692
693 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100694 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000695
696 for( i = 0; i < 14; i++ )
697 {
698 j = i % 7;
699 k = i < 7;
700
701 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100702 polarssl_printf( " HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000703
704 if( j == 5 || j == 6 )
705 {
Manuel Pégourié-Gonnardd48bf682015-02-14 15:05:32 +0000706 memset( buf, 0xAA, buflen = 131 );
Paul Bakker9e36f042013-06-30 14:34:05 +0200707 sha256_hmac_starts( &ctx, buf, buflen, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000708 }
709 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200710 sha256_hmac_starts( &ctx, sha256_hmac_test_key[j],
711 sha256_hmac_test_keylen[j], k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000712
Paul Bakker9e36f042013-06-30 14:34:05 +0200713 sha256_hmac_update( &ctx, sha256_hmac_test_buf[j],
714 sha256_hmac_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000715
Paul Bakker9e36f042013-06-30 14:34:05 +0200716 sha256_hmac_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000717
718 buflen = ( j == 4 ) ? 16 : 32 - k * 4;
719
Paul Bakker9e36f042013-06-30 14:34:05 +0200720 if( memcmp( sha256sum, sha256_hmac_test_sum[i], buflen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000721 {
722 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100723 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000724
Paul Bakker5b4af392014-06-26 12:09:34 +0200725 ret = 1;
726 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000727 }
728
729 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100730 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000731 }
732
733 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100734 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000735
Paul Bakker5b4af392014-06-26 12:09:34 +0200736exit:
737 sha256_free( &ctx );
738
739 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000740}
741
Paul Bakker9af723c2014-05-01 13:03:14 +0200742#endif /* POLARSSL_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000743
Paul Bakker9af723c2014-05-01 13:03:14 +0200744#endif /* POLARSSL_SHA256_C */