Coverage Report

Created: 2025-11-24 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opensips/sha256.c
Line
Count
Source
1
/*
2
 *  FIPS-180-2 compliant SHA-256 implementation
3
 *
4
 *  Copyright (C) 2006-2014, Brainspark B.V.
5
 *
6
 *  This file is part of PolarSSL (http://www.polarssl.org)
7
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
8
 *
9
 *  All rights reserved.
10
 *
11
 *  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
31
#include "sha256.h"
32
33
#define polarssl_printf printf
34
35
/* Implementation that should never be optimized out by the compiler */
36
0
static void polarssl_zeroize( void *v, size_t n ) {
37
0
    volatile unsigned char *p = v; while( n-- ) *p++ = 0;
38
0
}
39
40
#if !defined(POLARSSL_SHA256_ALT)
41
42
/*
43
 * 32-bit integer manipulation macros (big endian)
44
 */
45
#ifndef GET_UINT32_BE
46
0
#define GET_UINT32_BE(n,b,i)                            \
47
0
{                                                       \
48
0
    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \
49
0
        | ( (uint32_t) (b)[(i) + 1] << 16 )             \
50
0
        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \
51
0
        | ( (uint32_t) (b)[(i) + 3]       );            \
52
0
}
53
#endif
54
55
#ifndef PUT_UINT32_BE
56
0
#define PUT_UINT32_BE(n,b,i)                            \
57
0
{                                                       \
58
0
    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
59
0
    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
60
0
    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
61
0
    (b)[(i) + 3] = (unsigned char) ( (n)       );       \
62
0
}
63
#endif
64
65
void sha256_init( sha256_context *ctx )
66
0
{
67
0
    memset( ctx, 0, sizeof( sha256_context ) );
68
0
}
69
70
void sha256_free( sha256_context *ctx )
71
0
{
72
0
    if( ctx == NULL )
73
0
        return;
74
75
0
    polarssl_zeroize( ctx, sizeof( sha256_context ) );
76
0
}
77
78
/*
79
 * SHA-256 context setup
80
 */
81
void sha256_starts( sha256_context *ctx, int is224 )
82
0
{
83
0
    ctx->total[0] = 0;
84
0
    ctx->total[1] = 0;
85
86
0
    if( is224 == 0 )
87
0
    {
88
        /* SHA-256 */
89
0
        ctx->state[0] = 0x6A09E667;
90
0
        ctx->state[1] = 0xBB67AE85;
91
0
        ctx->state[2] = 0x3C6EF372;
92
0
        ctx->state[3] = 0xA54FF53A;
93
0
        ctx->state[4] = 0x510E527F;
94
0
        ctx->state[5] = 0x9B05688C;
95
0
        ctx->state[6] = 0x1F83D9AB;
96
0
        ctx->state[7] = 0x5BE0CD19;
97
0
    }
98
0
    else
99
0
    {
100
        /* SHA-224 */
101
0
        ctx->state[0] = 0xC1059ED8;
102
0
        ctx->state[1] = 0x367CD507;
103
0
        ctx->state[2] = 0x3070DD17;
104
0
        ctx->state[3] = 0xF70E5939;
105
0
        ctx->state[4] = 0xFFC00B31;
106
0
        ctx->state[5] = 0x68581511;
107
0
        ctx->state[6] = 0x64F98FA7;
108
0
        ctx->state[7] = 0xBEFA4FA4;
109
0
    }
110
111
0
    ctx->is224 = is224;
112
0
}
113
114
void sha256_process( sha256_context *ctx, const unsigned char data[64] )
115
0
{
116
0
    uint32_t temp1, temp2, W[64];
117
0
    uint32_t A, B, C, D, E, F, G, H;
118
119
0
    GET_UINT32_BE( W[ 0], data,  0 );
120
0
    GET_UINT32_BE( W[ 1], data,  4 );
121
0
    GET_UINT32_BE( W[ 2], data,  8 );
122
0
    GET_UINT32_BE( W[ 3], data, 12 );
123
0
    GET_UINT32_BE( W[ 4], data, 16 );
124
0
    GET_UINT32_BE( W[ 5], data, 20 );
125
0
    GET_UINT32_BE( W[ 6], data, 24 );
126
0
    GET_UINT32_BE( W[ 7], data, 28 );
127
0
    GET_UINT32_BE( W[ 8], data, 32 );
128
0
    GET_UINT32_BE( W[ 9], data, 36 );
129
0
    GET_UINT32_BE( W[10], data, 40 );
130
0
    GET_UINT32_BE( W[11], data, 44 );
131
0
    GET_UINT32_BE( W[12], data, 48 );
132
0
    GET_UINT32_BE( W[13], data, 52 );
133
0
    GET_UINT32_BE( W[14], data, 56 );
134
0
    GET_UINT32_BE( W[15], data, 60 );
135
136
0
#define  SHR(x,n) ((x & 0xFFFFFFFF) >> n)
137
0
#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
138
139
0
#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^  SHR(x, 3))
140
0
#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^  SHR(x,10))
141
142
0
#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
143
0
#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
144
145
0
#define F0(x,y,z) ((x & y) | (z & (x | y)))
146
0
#define F1(x,y,z) (z ^ (x & (y ^ z)))
147
148
0
#define R(t)                                    \
149
0
(                                               \
150
0
    W[t] = S1(W[t -  2]) + W[t -  7] +          \
151
0
           S0(W[t - 15]) + W[t - 16]            \
152
0
)
153
154
0
#define P(a,b,c,d,e,f,g,h,x,K)                  \
155
0
{                                               \
156
0
    temp1 = h + S3(e) + F1(e,f,g) + K + x;      \
157
0
    temp2 = S2(a) + F0(a,b,c);                  \
158
0
    d += temp1; h = temp1 + temp2;              \
159
0
}
160
161
0
    A = ctx->state[0];
162
0
    B = ctx->state[1];
163
0
    C = ctx->state[2];
164
0
    D = ctx->state[3];
165
0
    E = ctx->state[4];
166
0
    F = ctx->state[5];
167
0
    G = ctx->state[6];
168
0
    H = ctx->state[7];
169
170
0
    P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
171
0
    P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
172
0
    P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
173
0
    P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
174
0
    P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
175
0
    P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
176
0
    P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
177
0
    P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
178
0
    P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
179
0
    P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
180
0
    P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
181
0
    P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
182
0
    P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
183
0
    P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
184
0
    P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
185
0
    P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
186
0
    P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
187
0
    P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
188
0
    P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
189
0
    P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
190
0
    P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
191
0
    P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
192
0
    P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
193
0
    P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
194
0
    P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
195
0
    P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
196
0
    P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
197
0
    P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
198
0
    P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
199
0
    P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
200
0
    P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
201
0
    P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
202
0
    P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
203
0
    P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
204
0
    P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
205
0
    P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
206
0
    P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
207
0
    P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
208
0
    P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
209
0
    P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
210
0
    P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
211
0
    P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
212
0
    P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
213
0
    P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
214
0
    P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
215
0
    P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
216
0
    P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
217
0
    P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
218
0
    P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
219
0
    P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
220
0
    P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
221
0
    P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
222
0
    P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
223
0
    P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
224
0
    P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
225
0
    P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
226
0
    P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
227
0
    P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
228
0
    P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
229
0
    P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
230
0
    P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
231
0
    P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
232
0
    P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
233
0
    P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
234
235
0
    ctx->state[0] += A;
236
0
    ctx->state[1] += B;
237
0
    ctx->state[2] += C;
238
0
    ctx->state[3] += D;
239
0
    ctx->state[4] += E;
240
0
    ctx->state[5] += F;
241
0
    ctx->state[6] += G;
242
0
    ctx->state[7] += H;
243
0
}
244
245
/*
246
 * SHA-256 process buffer
247
 */
248
void sha256_update( sha256_context *ctx, const unsigned char *input,
249
                    size_t ilen )
250
0
{
251
0
    size_t fill;
252
0
    uint32_t left;
253
254
0
    if( ilen == 0 )
255
0
        return;
256
257
0
    left = ctx->total[0] & 0x3F;
258
0
    fill = 64 - left;
259
260
0
    ctx->total[0] += (uint32_t) ilen;
261
0
    ctx->total[0] &= 0xFFFFFFFF;
262
263
0
    if( ctx->total[0] < (uint32_t) ilen )
264
0
        ctx->total[1]++;
265
266
0
    if( left && ilen >= fill )
267
0
    {
268
0
        memcpy( (void *) (ctx->buffer + left), input, fill );
269
0
        sha256_process( ctx, ctx->buffer );
270
0
        input += fill;
271
0
        ilen  -= fill;
272
0
        left = 0;
273
0
    }
274
275
0
    while( ilen >= 64 )
276
0
    {
277
0
        sha256_process( ctx, input );
278
0
        input += 64;
279
0
        ilen  -= 64;
280
0
    }
281
282
0
    if( ilen > 0 )
283
0
        memcpy( (void *) (ctx->buffer + left), input, ilen );
284
0
}
285
286
static const unsigned char sha256_padding[64] =
287
{
288
 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
289
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
290
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
291
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
292
};
293
294
/*
295
 * SHA-256 final digest
296
 */
297
void sha256_finish( sha256_context *ctx, unsigned char output[32] )
298
0
{
299
0
    uint32_t last, padn;
300
0
    uint32_t high, low;
301
0
    unsigned char msglen[8];
302
303
0
    high = ( ctx->total[0] >> 29 )
304
0
         | ( ctx->total[1] <<  3 );
305
0
    low  = ( ctx->total[0] <<  3 );
306
307
0
    PUT_UINT32_BE( high, msglen, 0 );
308
0
    PUT_UINT32_BE( low,  msglen, 4 );
309
310
0
    last = ctx->total[0] & 0x3F;
311
0
    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
312
313
0
    sha256_update( ctx, sha256_padding, padn );
314
0
    sha256_update( ctx, msglen, 8 );
315
316
0
    PUT_UINT32_BE( ctx->state[0], output,  0 );
317
0
    PUT_UINT32_BE( ctx->state[1], output,  4 );
318
0
    PUT_UINT32_BE( ctx->state[2], output,  8 );
319
0
    PUT_UINT32_BE( ctx->state[3], output, 12 );
320
0
    PUT_UINT32_BE( ctx->state[4], output, 16 );
321
0
    PUT_UINT32_BE( ctx->state[5], output, 20 );
322
0
    PUT_UINT32_BE( ctx->state[6], output, 24 );
323
324
0
    if( ctx->is224 == 0 )
325
0
        PUT_UINT32_BE( ctx->state[7], output, 28 );
326
0
}
327
328
#endif /* !POLARSSL_SHA256_ALT */
329
330
/*
331
 * output = SHA-256( input buffer )
332
 */
333
void sha256( const unsigned char *input, size_t ilen,
334
             unsigned char output[32], int is224 )
335
0
{
336
0
    sha256_context ctx;
337
338
0
    sha256_init( &ctx );
339
0
    sha256_starts( &ctx, is224 );
340
0
    sha256_update( &ctx, input, ilen );
341
0
    sha256_finish( &ctx, output );
342
0
    sha256_free( &ctx );
343
0
}
344
345
#if defined(POLARSSL_FS_IO)
346
/*
347
 * output = SHA-256( file contents )
348
 */
349
int sha256_file( const char *path, unsigned char output[32], int is224 )
350
{
351
    FILE *f;
352
    size_t n;
353
    sha256_context ctx;
354
    unsigned char buf[1024];
355
356
    if( ( f = fopen( path, "rb" ) ) == NULL )
357
        return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
358
359
    sha256_init( &ctx );
360
    sha256_starts( &ctx, is224 );
361
362
    while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
363
        sha256_update( &ctx, buf, n );
364
365
    sha256_finish( &ctx, output );
366
    sha256_free( &ctx );
367
368
    if( ferror( f ) != 0 )
369
    {
370
        fclose( f );
371
        return( POLARSSL_ERR_SHA256_FILE_IO_ERROR );
372
    }
373
374
    fclose( f );
375
    return( 0 );
376
}
377
#endif /* POLARSSL_FS_IO */
378
379
/*
380
 * SHA-256 HMAC context setup
381
 */
382
void sha256_hmac_starts( sha256_context *ctx, const unsigned char *key,
383
                         size_t keylen, int is224 )
384
0
{
385
0
    size_t i;
386
0
    unsigned char sum[32];
387
388
0
    if( keylen > 64 )
389
0
    {
390
0
        sha256( key, keylen, sum, is224 );
391
0
        keylen = ( is224 ) ? 28 : 32;
392
0
        key = sum;
393
0
    }
394
395
0
    memset( ctx->ipad, 0x36, 64 );
396
0
    memset( ctx->opad, 0x5C, 64 );
397
398
0
    for( i = 0; i < keylen; i++ )
399
0
    {
400
0
        ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
401
0
        ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
402
0
    }
403
404
0
    sha256_starts( ctx, is224 );
405
0
    sha256_update( ctx, ctx->ipad, 64 );
406
407
0
    polarssl_zeroize( sum, sizeof( sum ) );
408
0
}
409
410
/*
411
 * SHA-256 HMAC process buffer
412
 */
413
void sha256_hmac_update( sha256_context *ctx, const unsigned char *input,
414
                         size_t ilen )
415
0
{
416
0
    sha256_update( ctx, input, ilen );
417
0
}
418
419
/*
420
 * SHA-256 HMAC final digest
421
 */
422
void sha256_hmac_finish( sha256_context *ctx, unsigned char output[32] )
423
0
{
424
0
    int is224, hlen;
425
0
    unsigned char tmpbuf[32];
426
427
0
    is224 = ctx->is224;
428
0
    hlen = ( is224 == 0 ) ? 32 : 28;
429
430
0
    sha256_finish( ctx, tmpbuf );
431
0
    sha256_starts( ctx, is224 );
432
0
    sha256_update( ctx, ctx->opad, 64 );
433
0
    sha256_update( ctx, tmpbuf, hlen );
434
0
    sha256_finish( ctx, output );
435
436
0
    polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
437
0
}
438
439
/*
440
 * SHA-256 HMAC context reset
441
 */
442
void sha256_hmac_reset( sha256_context *ctx )
443
0
{
444
0
    sha256_starts( ctx, ctx->is224 );
445
0
    sha256_update( ctx, ctx->ipad, 64 );
446
0
}
447
448
/*
449
 * output = HMAC-SHA-256( hmac key, input buffer )
450
 */
451
void sha256_hmac( const unsigned char *key, size_t keylen,
452
                  const unsigned char *input, size_t ilen,
453
                  unsigned char output[32], int is224 )
454
0
{
455
0
    sha256_context ctx;
456
457
0
    sha256_init( &ctx );
458
0
    sha256_hmac_starts( &ctx, key, keylen, is224 );
459
0
    sha256_hmac_update( &ctx, input, ilen );
460
0
    sha256_hmac_finish( &ctx, output );
461
0
    sha256_free( &ctx );
462
0
}
463
464
#if defined(POLARSSL_SELF_TEST)
465
/*
466
 * FIPS-180-2 test vectors
467
 */
468
static unsigned char sha256_test_buf[3][57] =
469
{
470
    { "abc" },
471
    { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
472
    { "" }
473
};
474
475
static const int sha256_test_buflen[3] =
476
{
477
    3, 56, 1000
478
};
479
480
static const unsigned char sha256_test_sum[6][32] =
481
{
482
    /*
483
     * SHA-224 test vectors
484
     */
485
    { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
486
      0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
487
      0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
488
      0xE3, 0x6C, 0x9D, 0xA7 },
489
    { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
490
      0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
491
      0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
492
      0x52, 0x52, 0x25, 0x25 },
493
    { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
494
      0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
495
      0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
496
      0x4E, 0xE7, 0xAD, 0x67 },
497
498
    /*
499
     * SHA-256 test vectors
500
     */
501
    { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
502
      0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
503
      0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
504
      0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
505
    { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
506
      0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
507
      0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
508
      0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
509
    { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
510
      0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
511
      0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
512
      0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
513
};
514
515
/*
516
 * RFC 4231 test vectors
517
 */
518
static unsigned char sha256_hmac_test_key[7][26] =
519
{
520
    { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
521
      "\x0B\x0B\x0B\x0B" },
522
    { "Jefe" },
523
    { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
524
      "\xAA\xAA\xAA\xAA" },
525
    { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
526
      "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
527
    { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
528
      "\x0C\x0C\x0C\x0C" },
529
    { "" }, /* 0xAA 131 times */
530
    { "" }
531
};
532
533
static const int sha256_hmac_test_keylen[7] =
534
{
535
    20, 4, 20, 25, 20, 131, 131
536
};
537
538
static unsigned char sha256_hmac_test_buf[7][153] =
539
{
540
    { "Hi There" },
541
    { "what do ya want for nothing?" },
542
    { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
543
      "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
544
      "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
545
      "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
546
      "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
547
    { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
548
      "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
549
      "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
550
      "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
551
      "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
552
    { "Test With Truncation" },
553
    { "Test Using Larger Than Block-Size Key - Hash Key First" },
554
    { "This is a test using a larger than block-size key "
555
      "and a larger than block-size data. The key needs to "
556
      "be hashed before being used by the HMAC algorithm." }
557
};
558
559
static const int sha256_hmac_test_buflen[7] =
560
{
561
    8, 28, 50, 50, 20, 54, 152
562
};
563
564
static const unsigned char sha256_hmac_test_sum[14][32] =
565
{
566
    /*
567
     * HMAC-SHA-224 test vectors
568
     */
569
    { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19,
570
      0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F,
571
      0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F,
572
      0x53, 0x68, 0x4B, 0x22 },
573
    { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF,
574
      0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F,
575
      0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00,
576
      0x8F, 0xD0, 0x5E, 0x44 },
577
    { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6,
578
      0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64,
579
      0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1,
580
      0xEC, 0x83, 0x33, 0xEA },
581
    { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC,
582
      0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C,
583
      0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D,
584
      0xE7, 0xAF, 0xEC, 0x5A },
585
    { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37,
586
      0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 },
587
    { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD,
588
      0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2,
589
      0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27,
590
      0x3F, 0xA6, 0x87, 0x0E },
591
    { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02,
592
      0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD,
593
      0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9,
594
      0xF6, 0xF5, 0x65, 0xD1 },
595
596
    /*
597
     * HMAC-SHA-256 test vectors
598
     */
599
    { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53,
600
      0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B,
601
      0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7,
602
      0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 },
603
    { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E,
604
      0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7,
605
      0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83,
606
      0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 },
607
    { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46,
608
      0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7,
609
      0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22,
610
      0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE },
611
    { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E,
612
      0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A,
613
      0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07,
614
      0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B },
615
    { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0,
616
      0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B },
617
    { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F,
618
      0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F,
619
      0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14,
620
      0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 },
621
    { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB,
622
      0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44,
623
      0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93,
624
      0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 }
625
};
626
627
/*
628
 * Checkup routine
629
 */
630
int sha256_self_test( int verbose )
631
{
632
    int i, j, k, buflen, ret = 0;
633
    unsigned char buf[1024];
634
    unsigned char sha256sum[32];
635
    sha256_context ctx;
636
637
    sha256_init( &ctx );
638
639
    for( i = 0; i < 6; i++ )
640
    {
641
        j = i % 3;
642
        k = i < 3;
643
644
        if( verbose != 0 )
645
            polarssl_printf( "  SHA-%d test #%d: ", 256 - k * 32, j + 1 );
646
647
        sha256_starts( &ctx, k );
648
649
        if( j == 2 )
650
        {
651
            memset( buf, 'a', buflen = 1000 );
652
653
            for( j = 0; j < 1000; j++ )
654
                sha256_update( &ctx, buf, buflen );
655
        }
656
        else
657
            sha256_update( &ctx, sha256_test_buf[j],
658
                                 sha256_test_buflen[j] );
659
660
        sha256_finish( &ctx, sha256sum );
661
662
        if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
663
        {
664
            if( verbose != 0 )
665
                polarssl_printf( "failed\n" );
666
667
            ret = 1;
668
            goto exit;
669
        }
670
671
        if( verbose != 0 )
672
            polarssl_printf( "passed\n" );
673
    }
674
675
    if( verbose != 0 )
676
        polarssl_printf( "\n" );
677
678
    for( i = 0; i < 14; i++ )
679
    {
680
        j = i % 7;
681
        k = i < 7;
682
683
        if( verbose != 0 )
684
            polarssl_printf( "  HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 );
685
686
        if( j == 5 || j == 6 )
687
        {
688
            memset( buf, '\xAA', buflen = 131 );
689
            sha256_hmac_starts( &ctx, buf, buflen, k );
690
        }
691
        else
692
            sha256_hmac_starts( &ctx, sha256_hmac_test_key[j],
693
                                      sha256_hmac_test_keylen[j], k );
694
695
        sha256_hmac_update( &ctx, sha256_hmac_test_buf[j],
696
                                  sha256_hmac_test_buflen[j] );
697
698
        sha256_hmac_finish( &ctx, sha256sum );
699
700
        buflen = ( j == 4 ) ? 16 : 32 - k * 4;
701
702
        if( memcmp( sha256sum, sha256_hmac_test_sum[i], buflen ) != 0 )
703
        {
704
            if( verbose != 0 )
705
                polarssl_printf( "failed\n" );
706
707
            ret = 1;
708
            goto exit;
709
        }
710
711
        if( verbose != 0 )
712
            polarssl_printf( "passed\n" );
713
    }
714
715
    if( verbose != 0 )
716
        polarssl_printf( "\n" );
717
718
exit:
719
    sha256_free( &ctx );
720
721
    return( ret );
722
}
723
724
#endif /* POLARSSL_SELF_TEST */