blob: 5633f9e8fb8414a1633b8b4e1f1583980e68d3bd [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
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020031#if !defined(POLARSSL_CONFIG_FILE)
Paul Bakker40e46942009-01-03 21:51:57 +000032#include "polarssl/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020033#else
34#include POLARSSL_CONFIG_FILE
35#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000036
Paul Bakker9e36f042013-06-30 14:34:05 +020037#if defined(POLARSSL_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000038
Paul Bakkerd2681d82013-06-30 14:49:12 +020039#include "polarssl/sha256.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000040
Paul Bakker335db3f2011-04-25 15:28:35 +000041#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +000042#include <stdio.h>
Paul Bakker335db3f2011-04-25 15:28:35 +000043#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000044
Paul Bakker7dc4c442014-02-01 22:50:26 +010045#if defined(POLARSSL_PLATFORM_C)
46#include "polarssl/platform.h"
47#else
48#define polarssl_printf printf
49#endif
50
Paul Bakker34617722014-06-13 17:20:13 +020051/* Implementation that should never be optimized out by the compiler */
52static void polarssl_zeroize( void *v, size_t n ) {
53 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
54}
55
Paul Bakker9e36f042013-06-30 14:34:05 +020056#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020057
Paul Bakker5121ce52009-01-03 21:22:43 +000058/*
59 * 32-bit integer manipulation macros (big endian)
60 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000061#ifndef GET_UINT32_BE
62#define GET_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000063{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000064 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
65 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
66 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
67 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000068}
69#endif
70
Paul Bakker5c2364c2012-10-01 14:41:15 +000071#ifndef PUT_UINT32_BE
72#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000073{ \
74 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
75 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
76 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
77 (b)[(i) + 3] = (unsigned char) ( (n) ); \
78}
79#endif
80
81/*
82 * SHA-256 context setup
83 */
Paul Bakker9e36f042013-06-30 14:34:05 +020084void sha256_starts( sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +000085{
86 ctx->total[0] = 0;
87 ctx->total[1] = 0;
88
89 if( is224 == 0 )
90 {
91 /* SHA-256 */
92 ctx->state[0] = 0x6A09E667;
93 ctx->state[1] = 0xBB67AE85;
94 ctx->state[2] = 0x3C6EF372;
95 ctx->state[3] = 0xA54FF53A;
96 ctx->state[4] = 0x510E527F;
97 ctx->state[5] = 0x9B05688C;
98 ctx->state[6] = 0x1F83D9AB;
99 ctx->state[7] = 0x5BE0CD19;
100 }
101 else
102 {
103 /* SHA-224 */
104 ctx->state[0] = 0xC1059ED8;
105 ctx->state[1] = 0x367CD507;
106 ctx->state[2] = 0x3070DD17;
107 ctx->state[3] = 0xF70E5939;
108 ctx->state[4] = 0xFFC00B31;
109 ctx->state[5] = 0x68581511;
110 ctx->state[6] = 0x64F98FA7;
111 ctx->state[7] = 0xBEFA4FA4;
112 }
113
114 ctx->is224 = is224;
115}
116
Paul Bakker9e36f042013-06-30 14:34:05 +0200117void sha256_process( sha256_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000118{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000119 uint32_t temp1, temp2, W[64];
120 uint32_t A, B, C, D, E, F, G, H;
Paul Bakker5121ce52009-01-03 21:22:43 +0000121
Paul Bakker5c2364c2012-10-01 14:41:15 +0000122 GET_UINT32_BE( W[ 0], data, 0 );
123 GET_UINT32_BE( W[ 1], data, 4 );
124 GET_UINT32_BE( W[ 2], data, 8 );
125 GET_UINT32_BE( W[ 3], data, 12 );
126 GET_UINT32_BE( W[ 4], data, 16 );
127 GET_UINT32_BE( W[ 5], data, 20 );
128 GET_UINT32_BE( W[ 6], data, 24 );
129 GET_UINT32_BE( W[ 7], data, 28 );
130 GET_UINT32_BE( W[ 8], data, 32 );
131 GET_UINT32_BE( W[ 9], data, 36 );
132 GET_UINT32_BE( W[10], data, 40 );
133 GET_UINT32_BE( W[11], data, 44 );
134 GET_UINT32_BE( W[12], data, 48 );
135 GET_UINT32_BE( W[13], data, 52 );
136 GET_UINT32_BE( W[14], data, 56 );
137 GET_UINT32_BE( W[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000138
139#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
140#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
141
142#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
143#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
144
145#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
146#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
147
148#define F0(x,y,z) ((x & y) | (z & (x | y)))
149#define F1(x,y,z) (z ^ (x & (y ^ z)))
150
151#define R(t) \
152( \
153 W[t] = S1(W[t - 2]) + W[t - 7] + \
154 S0(W[t - 15]) + W[t - 16] \
155)
156
157#define P(a,b,c,d,e,f,g,h,x,K) \
158{ \
159 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
160 temp2 = S2(a) + F0(a,b,c); \
161 d += temp1; h = temp1 + temp2; \
162}
163
164 A = ctx->state[0];
165 B = ctx->state[1];
166 C = ctx->state[2];
167 D = ctx->state[3];
168 E = ctx->state[4];
169 F = ctx->state[5];
170 G = ctx->state[6];
171 H = ctx->state[7];
172
173 P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
174 P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
175 P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
176 P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
177 P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
178 P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
179 P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
180 P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
181 P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
182 P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
183 P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
184 P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
185 P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
186 P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
187 P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
188 P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
189 P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
190 P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
191 P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
192 P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
193 P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
194 P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
195 P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
196 P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
197 P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
198 P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
199 P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
200 P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
201 P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
202 P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
203 P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
204 P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
205 P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
206 P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
207 P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
208 P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
209 P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
210 P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
211 P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
212 P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
213 P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
214 P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
215 P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
216 P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
217 P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
218 P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
219 P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
220 P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
221 P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
222 P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
223 P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
224 P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
225 P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
226 P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
227 P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
228 P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
229 P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
230 P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
231 P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
232 P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
233 P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
234 P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
235 P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
236 P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
237
238 ctx->state[0] += A;
239 ctx->state[1] += B;
240 ctx->state[2] += C;
241 ctx->state[3] += D;
242 ctx->state[4] += E;
243 ctx->state[5] += F;
244 ctx->state[6] += G;
245 ctx->state[7] += H;
246}
247
248/*
249 * SHA-256 process buffer
250 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200251void sha256_update( sha256_context *ctx, const unsigned char *input,
252 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000253{
Paul Bakker23986e52011-04-24 08:57:21 +0000254 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000255 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000256
Brian White12895d12014-04-11 11:29:42 -0400257 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000258 return;
259
260 left = ctx->total[0] & 0x3F;
261 fill = 64 - left;
262
Paul Bakker5c2364c2012-10-01 14:41:15 +0000263 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000264 ctx->total[0] &= 0xFFFFFFFF;
265
Paul Bakker5c2364c2012-10-01 14:41:15 +0000266 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000267 ctx->total[1]++;
268
269 if( left && ilen >= fill )
270 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200271 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker9e36f042013-06-30 14:34:05 +0200272 sha256_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000273 input += fill;
274 ilen -= fill;
275 left = 0;
276 }
277
278 while( ilen >= 64 )
279 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200280 sha256_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000281 input += 64;
282 ilen -= 64;
283 }
284
285 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200286 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000287}
288
Paul Bakker9e36f042013-06-30 14:34:05 +0200289static const unsigned char sha256_padding[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000290{
291 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
292 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
293 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
294 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
295};
296
297/*
298 * SHA-256 final digest
299 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200300void sha256_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000301{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000302 uint32_t last, padn;
303 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000304 unsigned char msglen[8];
305
306 high = ( ctx->total[0] >> 29 )
307 | ( ctx->total[1] << 3 );
308 low = ( ctx->total[0] << 3 );
309
Paul Bakker5c2364c2012-10-01 14:41:15 +0000310 PUT_UINT32_BE( high, msglen, 0 );
311 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000312
313 last = ctx->total[0] & 0x3F;
314 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
315
Paul Bakker9e36f042013-06-30 14:34:05 +0200316 sha256_update( ctx, sha256_padding, padn );
317 sha256_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000318
Paul Bakker5c2364c2012-10-01 14:41:15 +0000319 PUT_UINT32_BE( ctx->state[0], output, 0 );
320 PUT_UINT32_BE( ctx->state[1], output, 4 );
321 PUT_UINT32_BE( ctx->state[2], output, 8 );
322 PUT_UINT32_BE( ctx->state[3], output, 12 );
323 PUT_UINT32_BE( ctx->state[4], output, 16 );
324 PUT_UINT32_BE( ctx->state[5], output, 20 );
325 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000326
327 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000328 PUT_UINT32_BE( ctx->state[7], output, 28 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000329}
330
Paul Bakker9e36f042013-06-30 14:34:05 +0200331#endif /* !POLARSSL_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200332
Paul Bakker5121ce52009-01-03 21:22:43 +0000333/*
334 * output = SHA-256( input buffer )
335 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200336void sha256( const unsigned char *input, size_t ilen,
337 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000338{
Paul Bakker9e36f042013-06-30 14:34:05 +0200339 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000340
Paul Bakker9e36f042013-06-30 14:34:05 +0200341 sha256_starts( &ctx, is224 );
342 sha256_update( &ctx, input, ilen );
343 sha256_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000344
Paul Bakker34617722014-06-13 17:20:13 +0200345 polarssl_zeroize( &ctx, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000346}
347
Paul Bakker335db3f2011-04-25 15:28:35 +0000348#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000349/*
350 * output = SHA-256( file contents )
351 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200352int sha256_file( const char *path, unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000353{
354 FILE *f;
355 size_t n;
Paul Bakker9e36f042013-06-30 14:34:05 +0200356 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000357 unsigned char buf[1024];
358
359 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker9e36f042013-06-30 14:34:05 +0200360 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000361
Paul Bakker9e36f042013-06-30 14:34:05 +0200362 sha256_starts( &ctx, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000363
364 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker9e36f042013-06-30 14:34:05 +0200365 sha256_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000366
Paul Bakker9e36f042013-06-30 14:34:05 +0200367 sha256_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000368
Paul Bakker34617722014-06-13 17:20:13 +0200369 polarssl_zeroize( &ctx, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000370
371 if( ferror( f ) != 0 )
372 {
373 fclose( f );
Paul Bakker9e36f042013-06-30 14:34:05 +0200374 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000375 }
376
377 fclose( f );
378 return( 0 );
379}
Paul Bakker335db3f2011-04-25 15:28:35 +0000380#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000381
382/*
383 * SHA-256 HMAC context setup
384 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200385void sha256_hmac_starts( sha256_context *ctx, const unsigned char *key,
386 size_t keylen, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000387{
Paul Bakker23986e52011-04-24 08:57:21 +0000388 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000389 unsigned char sum[32];
390
391 if( keylen > 64 )
392 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200393 sha256( key, keylen, sum, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000394 keylen = ( is224 ) ? 28 : 32;
395 key = sum;
396 }
397
398 memset( ctx->ipad, 0x36, 64 );
399 memset( ctx->opad, 0x5C, 64 );
400
401 for( i = 0; i < keylen; i++ )
402 {
403 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
404 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
405 }
406
Paul Bakker9e36f042013-06-30 14:34:05 +0200407 sha256_starts( ctx, is224 );
408 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000409
Paul Bakker34617722014-06-13 17:20:13 +0200410 polarssl_zeroize( sum, sizeof( sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000411}
412
413/*
414 * SHA-256 HMAC process buffer
415 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200416void sha256_hmac_update( sha256_context *ctx, const unsigned char *input,
417 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000418{
Paul Bakker9e36f042013-06-30 14:34:05 +0200419 sha256_update( ctx, input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000420}
421
422/*
423 * SHA-256 HMAC final digest
424 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200425void sha256_hmac_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000426{
427 int is224, hlen;
428 unsigned char tmpbuf[32];
429
430 is224 = ctx->is224;
431 hlen = ( is224 == 0 ) ? 32 : 28;
432
Paul Bakker9e36f042013-06-30 14:34:05 +0200433 sha256_finish( ctx, tmpbuf );
434 sha256_starts( ctx, is224 );
435 sha256_update( ctx, ctx->opad, 64 );
436 sha256_update( ctx, tmpbuf, hlen );
437 sha256_finish( ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000438
Paul Bakker34617722014-06-13 17:20:13 +0200439 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000440}
441
442/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000443 * SHA-256 HMAC context reset
444 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200445void sha256_hmac_reset( sha256_context *ctx )
Paul Bakker7d3b6612010-03-21 16:23:13 +0000446{
Paul Bakker9e36f042013-06-30 14:34:05 +0200447 sha256_starts( ctx, ctx->is224 );
448 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker7d3b6612010-03-21 16:23:13 +0000449}
450
451/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000452 * output = HMAC-SHA-256( hmac key, input buffer )
453 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200454void sha256_hmac( const unsigned char *key, size_t keylen,
455 const unsigned char *input, size_t ilen,
456 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000457{
Paul Bakker9e36f042013-06-30 14:34:05 +0200458 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000459
Paul Bakker9e36f042013-06-30 14:34:05 +0200460 sha256_hmac_starts( &ctx, key, keylen, is224 );
461 sha256_hmac_update( &ctx, input, ilen );
462 sha256_hmac_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000463
Paul Bakker34617722014-06-13 17:20:13 +0200464 polarssl_zeroize( &ctx, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000465}
466
Paul Bakker40e46942009-01-03 21:51:57 +0000467#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000468/*
469 * FIPS-180-2 test vectors
470 */
Paul Bakker9af723c2014-05-01 13:03:14 +0200471static unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000472{
473 { "abc" },
474 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
475 { "" }
476};
477
Paul Bakker9e36f042013-06-30 14:34:05 +0200478static const int sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000479{
480 3, 56, 1000
481};
482
Paul Bakker9e36f042013-06-30 14:34:05 +0200483static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000484{
485 /*
486 * SHA-224 test vectors
487 */
488 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
489 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
490 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
491 0xE3, 0x6C, 0x9D, 0xA7 },
492 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
493 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
494 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
495 0x52, 0x52, 0x25, 0x25 },
496 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
497 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
498 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
499 0x4E, 0xE7, 0xAD, 0x67 },
500
501 /*
502 * SHA-256 test vectors
503 */
504 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
505 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
506 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
507 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
508 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
509 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
510 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
511 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
512 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
513 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
514 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
515 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
516};
517
518/*
519 * RFC 4231 test vectors
520 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200521static unsigned char sha256_hmac_test_key[7][26] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000522{
523 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
524 "\x0B\x0B\x0B\x0B" },
525 { "Jefe" },
526 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
527 "\xAA\xAA\xAA\xAA" },
528 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
529 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
530 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
531 "\x0C\x0C\x0C\x0C" },
532 { "" }, /* 0xAA 131 times */
533 { "" }
534};
535
Paul Bakker9e36f042013-06-30 14:34:05 +0200536static const int sha256_hmac_test_keylen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000537{
538 20, 4, 20, 25, 20, 131, 131
539};
540
Paul Bakker9e36f042013-06-30 14:34:05 +0200541static unsigned char sha256_hmac_test_buf[7][153] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000542{
543 { "Hi There" },
544 { "what do ya want for nothing?" },
545 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
546 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
547 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
548 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
549 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
550 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
551 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
552 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
553 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
554 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
555 { "Test With Truncation" },
556 { "Test Using Larger Than Block-Size Key - Hash Key First" },
557 { "This is a test using a larger than block-size key "
558 "and a larger than block-size data. The key needs to "
559 "be hashed before being used by the HMAC algorithm." }
560};
561
Paul Bakker9e36f042013-06-30 14:34:05 +0200562static const int sha256_hmac_test_buflen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000563{
564 8, 28, 50, 50, 20, 54, 152
565};
566
Paul Bakker9e36f042013-06-30 14:34:05 +0200567static const unsigned char sha256_hmac_test_sum[14][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000568{
569 /*
570 * HMAC-SHA-224 test vectors
571 */
572 { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19,
573 0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F,
574 0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F,
575 0x53, 0x68, 0x4B, 0x22 },
576 { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF,
577 0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F,
578 0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00,
579 0x8F, 0xD0, 0x5E, 0x44 },
580 { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6,
581 0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64,
582 0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1,
583 0xEC, 0x83, 0x33, 0xEA },
584 { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC,
585 0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C,
586 0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D,
587 0xE7, 0xAF, 0xEC, 0x5A },
588 { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37,
589 0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 },
590 { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD,
591 0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2,
592 0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27,
593 0x3F, 0xA6, 0x87, 0x0E },
594 { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02,
595 0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD,
596 0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9,
597 0xF6, 0xF5, 0x65, 0xD1 },
598
599 /*
600 * HMAC-SHA-256 test vectors
601 */
602 { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53,
603 0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B,
604 0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7,
605 0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 },
606 { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E,
607 0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7,
608 0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83,
609 0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 },
610 { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46,
611 0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7,
612 0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22,
613 0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE },
614 { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E,
615 0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A,
616 0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07,
617 0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B },
618 { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0,
619 0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B },
620 { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F,
621 0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F,
622 0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14,
623 0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 },
624 { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB,
625 0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44,
626 0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93,
627 0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 }
628};
629
630/*
631 * Checkup routine
632 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200633int sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000634{
635 int i, j, k, buflen;
636 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200637 unsigned char sha256sum[32];
638 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000639
640 for( i = 0; i < 6; i++ )
641 {
642 j = i % 3;
643 k = i < 3;
644
645 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100646 polarssl_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000647
Paul Bakker9e36f042013-06-30 14:34:05 +0200648 sha256_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000649
650 if( j == 2 )
651 {
652 memset( buf, 'a', buflen = 1000 );
653
654 for( j = 0; j < 1000; j++ )
Paul Bakker9e36f042013-06-30 14:34:05 +0200655 sha256_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000656 }
657 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200658 sha256_update( &ctx, sha256_test_buf[j],
659 sha256_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000660
Paul Bakker9e36f042013-06-30 14:34:05 +0200661 sha256_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000662
Paul Bakker9e36f042013-06-30 14:34:05 +0200663 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000664 {
665 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100666 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000667
668 return( 1 );
669 }
670
671 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100672 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000673 }
674
675 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100676 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000677
678 for( i = 0; i < 14; i++ )
679 {
680 j = i % 7;
681 k = i < 7;
682
683 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100684 polarssl_printf( " HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000685
686 if( j == 5 || j == 6 )
687 {
688 memset( buf, '\xAA', buflen = 131 );
Paul Bakker9e36f042013-06-30 14:34:05 +0200689 sha256_hmac_starts( &ctx, buf, buflen, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000690 }
691 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200692 sha256_hmac_starts( &ctx, sha256_hmac_test_key[j],
693 sha256_hmac_test_keylen[j], k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000694
Paul Bakker9e36f042013-06-30 14:34:05 +0200695 sha256_hmac_update( &ctx, sha256_hmac_test_buf[j],
696 sha256_hmac_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000697
Paul Bakker9e36f042013-06-30 14:34:05 +0200698 sha256_hmac_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000699
700 buflen = ( j == 4 ) ? 16 : 32 - k * 4;
701
Paul Bakker9e36f042013-06-30 14:34:05 +0200702 if( memcmp( sha256sum, sha256_hmac_test_sum[i], buflen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000703 {
704 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100705 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000706
707 return( 1 );
708 }
709
710 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100711 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000712 }
713
714 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100715 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000716
717 return( 0 );
718}
719
Paul Bakker9af723c2014-05-01 13:03:14 +0200720#endif /* POLARSSL_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000721
Paul Bakker9af723c2014-05-01 13:03:14 +0200722#endif /* POLARSSL_SHA256_C */