blob: e3d3ea826af4f6d5926f0f0df47f94e96c152c22 [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 Bakker9e36f042013-06-30 14:34:05 +020051#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020052
Paul Bakker5121ce52009-01-03 21:22:43 +000053/*
54 * 32-bit integer manipulation macros (big endian)
55 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000056#ifndef GET_UINT32_BE
57#define GET_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000058{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000059 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
60 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
61 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
62 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000063}
64#endif
65
Paul Bakker5c2364c2012-10-01 14:41:15 +000066#ifndef PUT_UINT32_BE
67#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000068{ \
69 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
70 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
71 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
72 (b)[(i) + 3] = (unsigned char) ( (n) ); \
73}
74#endif
75
76/*
77 * SHA-256 context setup
78 */
Paul Bakker9e36f042013-06-30 14:34:05 +020079void sha256_starts( sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +000080{
81 ctx->total[0] = 0;
82 ctx->total[1] = 0;
83
84 if( is224 == 0 )
85 {
86 /* SHA-256 */
87 ctx->state[0] = 0x6A09E667;
88 ctx->state[1] = 0xBB67AE85;
89 ctx->state[2] = 0x3C6EF372;
90 ctx->state[3] = 0xA54FF53A;
91 ctx->state[4] = 0x510E527F;
92 ctx->state[5] = 0x9B05688C;
93 ctx->state[6] = 0x1F83D9AB;
94 ctx->state[7] = 0x5BE0CD19;
95 }
96 else
97 {
98 /* SHA-224 */
99 ctx->state[0] = 0xC1059ED8;
100 ctx->state[1] = 0x367CD507;
101 ctx->state[2] = 0x3070DD17;
102 ctx->state[3] = 0xF70E5939;
103 ctx->state[4] = 0xFFC00B31;
104 ctx->state[5] = 0x68581511;
105 ctx->state[6] = 0x64F98FA7;
106 ctx->state[7] = 0xBEFA4FA4;
107 }
108
109 ctx->is224 = is224;
110}
111
Paul Bakker9e36f042013-06-30 14:34:05 +0200112void sha256_process( sha256_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000113{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000114 uint32_t temp1, temp2, W[64];
115 uint32_t A, B, C, D, E, F, G, H;
Paul Bakker5121ce52009-01-03 21:22:43 +0000116
Paul Bakker5c2364c2012-10-01 14:41:15 +0000117 GET_UINT32_BE( W[ 0], data, 0 );
118 GET_UINT32_BE( W[ 1], data, 4 );
119 GET_UINT32_BE( W[ 2], data, 8 );
120 GET_UINT32_BE( W[ 3], data, 12 );
121 GET_UINT32_BE( W[ 4], data, 16 );
122 GET_UINT32_BE( W[ 5], data, 20 );
123 GET_UINT32_BE( W[ 6], data, 24 );
124 GET_UINT32_BE( W[ 7], data, 28 );
125 GET_UINT32_BE( W[ 8], data, 32 );
126 GET_UINT32_BE( W[ 9], data, 36 );
127 GET_UINT32_BE( W[10], data, 40 );
128 GET_UINT32_BE( W[11], data, 44 );
129 GET_UINT32_BE( W[12], data, 48 );
130 GET_UINT32_BE( W[13], data, 52 );
131 GET_UINT32_BE( W[14], data, 56 );
132 GET_UINT32_BE( W[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000133
134#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
135#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
136
137#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
138#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
139
140#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
141#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
142
143#define F0(x,y,z) ((x & y) | (z & (x | y)))
144#define F1(x,y,z) (z ^ (x & (y ^ z)))
145
146#define R(t) \
147( \
148 W[t] = S1(W[t - 2]) + W[t - 7] + \
149 S0(W[t - 15]) + W[t - 16] \
150)
151
152#define P(a,b,c,d,e,f,g,h,x,K) \
153{ \
154 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
155 temp2 = S2(a) + F0(a,b,c); \
156 d += temp1; h = temp1 + temp2; \
157}
158
159 A = ctx->state[0];
160 B = ctx->state[1];
161 C = ctx->state[2];
162 D = ctx->state[3];
163 E = ctx->state[4];
164 F = ctx->state[5];
165 G = ctx->state[6];
166 H = ctx->state[7];
167
168 P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
169 P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
170 P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
171 P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
172 P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
173 P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
174 P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
175 P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
176 P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
177 P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
178 P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
179 P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
180 P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
181 P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
182 P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
183 P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
184 P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
185 P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
186 P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
187 P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
188 P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
189 P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
190 P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
191 P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
192 P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
193 P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
194 P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
195 P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
196 P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
197 P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
198 P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
199 P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
200 P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
201 P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
202 P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
203 P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
204 P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
205 P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
206 P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
207 P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
208 P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
209 P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
210 P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
211 P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
212 P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
213 P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
214 P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
215 P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
216 P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
217 P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
218 P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
219 P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
220 P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
221 P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
222 P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
223 P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
224 P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
225 P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
226 P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
227 P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
228 P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
229 P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
230 P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
231 P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
232
233 ctx->state[0] += A;
234 ctx->state[1] += B;
235 ctx->state[2] += C;
236 ctx->state[3] += D;
237 ctx->state[4] += E;
238 ctx->state[5] += F;
239 ctx->state[6] += G;
240 ctx->state[7] += H;
241}
242
243/*
244 * SHA-256 process buffer
245 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200246void sha256_update( sha256_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000247{
Paul Bakker23986e52011-04-24 08:57:21 +0000248 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000249 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000250
251 if( ilen <= 0 )
252 return;
253
254 left = ctx->total[0] & 0x3F;
255 fill = 64 - left;
256
Paul Bakker5c2364c2012-10-01 14:41:15 +0000257 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000258 ctx->total[0] &= 0xFFFFFFFF;
259
Paul Bakker5c2364c2012-10-01 14:41:15 +0000260 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000261 ctx->total[1]++;
262
263 if( left && ilen >= fill )
264 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200265 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker9e36f042013-06-30 14:34:05 +0200266 sha256_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000267 input += fill;
268 ilen -= fill;
269 left = 0;
270 }
271
272 while( ilen >= 64 )
273 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200274 sha256_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000275 input += 64;
276 ilen -= 64;
277 }
278
279 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200280 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000281}
282
Paul Bakker9e36f042013-06-30 14:34:05 +0200283static const unsigned char sha256_padding[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000284{
285 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
286 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
287 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
288 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
289};
290
291/*
292 * SHA-256 final digest
293 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200294void sha256_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000295{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000296 uint32_t last, padn;
297 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000298 unsigned char msglen[8];
299
300 high = ( ctx->total[0] >> 29 )
301 | ( ctx->total[1] << 3 );
302 low = ( ctx->total[0] << 3 );
303
Paul Bakker5c2364c2012-10-01 14:41:15 +0000304 PUT_UINT32_BE( high, msglen, 0 );
305 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000306
307 last = ctx->total[0] & 0x3F;
308 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
309
Paul Bakker9e36f042013-06-30 14:34:05 +0200310 sha256_update( ctx, sha256_padding, padn );
311 sha256_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000312
Paul Bakker5c2364c2012-10-01 14:41:15 +0000313 PUT_UINT32_BE( ctx->state[0], output, 0 );
314 PUT_UINT32_BE( ctx->state[1], output, 4 );
315 PUT_UINT32_BE( ctx->state[2], output, 8 );
316 PUT_UINT32_BE( ctx->state[3], output, 12 );
317 PUT_UINT32_BE( ctx->state[4], output, 16 );
318 PUT_UINT32_BE( ctx->state[5], output, 20 );
319 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000320
321 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000322 PUT_UINT32_BE( ctx->state[7], output, 28 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000323}
324
Paul Bakker9e36f042013-06-30 14:34:05 +0200325#endif /* !POLARSSL_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200326
Paul Bakker5121ce52009-01-03 21:22:43 +0000327/*
328 * output = SHA-256( input buffer )
329 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200330void sha256( const unsigned char *input, size_t ilen,
331 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000332{
Paul Bakker9e36f042013-06-30 14:34:05 +0200333 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000334
Paul Bakker9e36f042013-06-30 14:34:05 +0200335 sha256_starts( &ctx, is224 );
336 sha256_update( &ctx, input, ilen );
337 sha256_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000338
Paul Bakker9e36f042013-06-30 14:34:05 +0200339 memset( &ctx, 0, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000340}
341
Paul Bakker335db3f2011-04-25 15:28:35 +0000342#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000343/*
344 * output = SHA-256( file contents )
345 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200346int sha256_file( const char *path, unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000347{
348 FILE *f;
349 size_t n;
Paul Bakker9e36f042013-06-30 14:34:05 +0200350 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000351 unsigned char buf[1024];
352
353 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker9e36f042013-06-30 14:34:05 +0200354 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000355
Paul Bakker9e36f042013-06-30 14:34:05 +0200356 sha256_starts( &ctx, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000357
358 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker9e36f042013-06-30 14:34:05 +0200359 sha256_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000360
Paul Bakker9e36f042013-06-30 14:34:05 +0200361 sha256_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
Paul Bakker9e36f042013-06-30 14:34:05 +0200363 memset( &ctx, 0, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000364
365 if( ferror( f ) != 0 )
366 {
367 fclose( f );
Paul Bakker9e36f042013-06-30 14:34:05 +0200368 return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000369 }
370
371 fclose( f );
372 return( 0 );
373}
Paul Bakker335db3f2011-04-25 15:28:35 +0000374#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000375
376/*
377 * SHA-256 HMAC context setup
378 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200379void sha256_hmac_starts( sha256_context *ctx, const unsigned char *key,
380 size_t keylen, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000381{
Paul Bakker23986e52011-04-24 08:57:21 +0000382 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000383 unsigned char sum[32];
384
385 if( keylen > 64 )
386 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200387 sha256( key, keylen, sum, is224 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000388 keylen = ( is224 ) ? 28 : 32;
389 key = sum;
390 }
391
392 memset( ctx->ipad, 0x36, 64 );
393 memset( ctx->opad, 0x5C, 64 );
394
395 for( i = 0; i < keylen; i++ )
396 {
397 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
398 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
399 }
400
Paul Bakker9e36f042013-06-30 14:34:05 +0200401 sha256_starts( ctx, is224 );
402 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000403
404 memset( sum, 0, sizeof( sum ) );
405}
406
407/*
408 * SHA-256 HMAC process buffer
409 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200410void sha256_hmac_update( sha256_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000411{
Paul Bakker9e36f042013-06-30 14:34:05 +0200412 sha256_update( ctx, input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000413}
414
415/*
416 * SHA-256 HMAC final digest
417 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200418void sha256_hmac_finish( sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000419{
420 int is224, hlen;
421 unsigned char tmpbuf[32];
422
423 is224 = ctx->is224;
424 hlen = ( is224 == 0 ) ? 32 : 28;
425
Paul Bakker9e36f042013-06-30 14:34:05 +0200426 sha256_finish( ctx, tmpbuf );
427 sha256_starts( ctx, is224 );
428 sha256_update( ctx, ctx->opad, 64 );
429 sha256_update( ctx, tmpbuf, hlen );
430 sha256_finish( ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000431
432 memset( tmpbuf, 0, sizeof( tmpbuf ) );
433}
434
435/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000436 * SHA-256 HMAC context reset
437 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200438void sha256_hmac_reset( sha256_context *ctx )
Paul Bakker7d3b6612010-03-21 16:23:13 +0000439{
Paul Bakker9e36f042013-06-30 14:34:05 +0200440 sha256_starts( ctx, ctx->is224 );
441 sha256_update( ctx, ctx->ipad, 64 );
Paul Bakker7d3b6612010-03-21 16:23:13 +0000442}
443
444/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000445 * output = HMAC-SHA-256( hmac key, input buffer )
446 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200447void sha256_hmac( const unsigned char *key, size_t keylen,
448 const unsigned char *input, size_t ilen,
449 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000450{
Paul Bakker9e36f042013-06-30 14:34:05 +0200451 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000452
Paul Bakker9e36f042013-06-30 14:34:05 +0200453 sha256_hmac_starts( &ctx, key, keylen, is224 );
454 sha256_hmac_update( &ctx, input, ilen );
455 sha256_hmac_finish( &ctx, output );
Paul Bakker5121ce52009-01-03 21:22:43 +0000456
Paul Bakker9e36f042013-06-30 14:34:05 +0200457 memset( &ctx, 0, sizeof( sha256_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000458}
459
Paul Bakker40e46942009-01-03 21:51:57 +0000460#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000461/*
462 * FIPS-180-2 test vectors
463 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200464static unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000465{
466 { "abc" },
467 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
468 { "" }
469};
470
Paul Bakker9e36f042013-06-30 14:34:05 +0200471static const int sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000472{
473 3, 56, 1000
474};
475
Paul Bakker9e36f042013-06-30 14:34:05 +0200476static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000477{
478 /*
479 * SHA-224 test vectors
480 */
481 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
482 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
483 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
484 0xE3, 0x6C, 0x9D, 0xA7 },
485 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
486 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
487 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
488 0x52, 0x52, 0x25, 0x25 },
489 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
490 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
491 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
492 0x4E, 0xE7, 0xAD, 0x67 },
493
494 /*
495 * SHA-256 test vectors
496 */
497 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
498 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
499 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
500 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
501 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
502 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
503 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
504 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
505 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
506 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
507 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
508 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
509};
510
511/*
512 * RFC 4231 test vectors
513 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200514static unsigned char sha256_hmac_test_key[7][26] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000515{
516 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
517 "\x0B\x0B\x0B\x0B" },
518 { "Jefe" },
519 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
520 "\xAA\xAA\xAA\xAA" },
521 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
522 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
523 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
524 "\x0C\x0C\x0C\x0C" },
525 { "" }, /* 0xAA 131 times */
526 { "" }
527};
528
Paul Bakker9e36f042013-06-30 14:34:05 +0200529static const int sha256_hmac_test_keylen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000530{
531 20, 4, 20, 25, 20, 131, 131
532};
533
Paul Bakker9e36f042013-06-30 14:34:05 +0200534static unsigned char sha256_hmac_test_buf[7][153] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000535{
536 { "Hi There" },
537 { "what do ya want for nothing?" },
538 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
539 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
540 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
541 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
542 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
543 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
544 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
545 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
546 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
547 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
548 { "Test With Truncation" },
549 { "Test Using Larger Than Block-Size Key - Hash Key First" },
550 { "This is a test using a larger than block-size key "
551 "and a larger than block-size data. The key needs to "
552 "be hashed before being used by the HMAC algorithm." }
553};
554
Paul Bakker9e36f042013-06-30 14:34:05 +0200555static const int sha256_hmac_test_buflen[7] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000556{
557 8, 28, 50, 50, 20, 54, 152
558};
559
Paul Bakker9e36f042013-06-30 14:34:05 +0200560static const unsigned char sha256_hmac_test_sum[14][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000561{
562 /*
563 * HMAC-SHA-224 test vectors
564 */
565 { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19,
566 0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F,
567 0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F,
568 0x53, 0x68, 0x4B, 0x22 },
569 { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF,
570 0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F,
571 0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00,
572 0x8F, 0xD0, 0x5E, 0x44 },
573 { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6,
574 0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64,
575 0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1,
576 0xEC, 0x83, 0x33, 0xEA },
577 { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC,
578 0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C,
579 0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D,
580 0xE7, 0xAF, 0xEC, 0x5A },
581 { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37,
582 0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 },
583 { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD,
584 0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2,
585 0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27,
586 0x3F, 0xA6, 0x87, 0x0E },
587 { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02,
588 0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD,
589 0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9,
590 0xF6, 0xF5, 0x65, 0xD1 },
591
592 /*
593 * HMAC-SHA-256 test vectors
594 */
595 { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53,
596 0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B,
597 0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7,
598 0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 },
599 { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E,
600 0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7,
601 0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83,
602 0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 },
603 { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46,
604 0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7,
605 0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22,
606 0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE },
607 { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E,
608 0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A,
609 0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07,
610 0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B },
611 { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0,
612 0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B },
613 { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F,
614 0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F,
615 0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14,
616 0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 },
617 { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB,
618 0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44,
619 0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93,
620 0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 }
621};
622
623/*
624 * Checkup routine
625 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200626int sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000627{
628 int i, j, k, buflen;
629 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200630 unsigned char sha256sum[32];
631 sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000632
633 for( i = 0; i < 6; i++ )
634 {
635 j = i % 3;
636 k = i < 3;
637
638 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100639 polarssl_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000640
Paul Bakker9e36f042013-06-30 14:34:05 +0200641 sha256_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000642
643 if( j == 2 )
644 {
645 memset( buf, 'a', buflen = 1000 );
646
647 for( j = 0; j < 1000; j++ )
Paul Bakker9e36f042013-06-30 14:34:05 +0200648 sha256_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000649 }
650 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200651 sha256_update( &ctx, sha256_test_buf[j],
652 sha256_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000653
Paul Bakker9e36f042013-06-30 14:34:05 +0200654 sha256_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000655
Paul Bakker9e36f042013-06-30 14:34:05 +0200656 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000657 {
658 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100659 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000660
661 return( 1 );
662 }
663
664 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100665 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000666 }
667
668 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100669 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000670
671 for( i = 0; i < 14; i++ )
672 {
673 j = i % 7;
674 k = i < 7;
675
676 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100677 polarssl_printf( " HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000678
679 if( j == 5 || j == 6 )
680 {
681 memset( buf, '\xAA', buflen = 131 );
Paul Bakker9e36f042013-06-30 14:34:05 +0200682 sha256_hmac_starts( &ctx, buf, buflen, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000683 }
684 else
Paul Bakker9e36f042013-06-30 14:34:05 +0200685 sha256_hmac_starts( &ctx, sha256_hmac_test_key[j],
686 sha256_hmac_test_keylen[j], k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000687
Paul Bakker9e36f042013-06-30 14:34:05 +0200688 sha256_hmac_update( &ctx, sha256_hmac_test_buf[j],
689 sha256_hmac_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000690
Paul Bakker9e36f042013-06-30 14:34:05 +0200691 sha256_hmac_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000692
693 buflen = ( j == 4 ) ? 16 : 32 - k * 4;
694
Paul Bakker9e36f042013-06-30 14:34:05 +0200695 if( memcmp( sha256sum, sha256_hmac_test_sum[i], buflen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000696 {
697 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100698 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000699
700 return( 1 );
701 }
702
703 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100704 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000705 }
706
707 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100708 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000709
710 return( 0 );
711}
712
713#endif
714
715#endif