~bibledit/bibledit/client

« back to all changes in this revision

Viewing changes to mbedtls2/sha256.c

  • Committer: Teus Benschop
  • Date: 2024-08-17 17:08:44 UTC
  • Revision ID: teusjannette@gmail.com-20240817170844-0qf789ywtms3hyz7
new upstream version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#pragma clang diagnostic ignored "-Wunknown-warning-option"
 
2
#pragma clang diagnostic ignored "-Wimplicit-int-conversion"
 
3
#pragma clang diagnostic ignored "-Wsign-conversion"
 
4
 
 
5
#pragma GCC diagnostic ignored "-Wconversion"
 
6
 
 
7
#pragma clang diagnostic ignored "-Wimplicit-int-conversion"
 
8
#pragma clang diagnostic ignored "-Wsign-conversion"
 
9
 
 
10
#pragma GCC diagnostic ignored "-Wconversion"
 
11
 
 
12
#pragma clang diagnostic ignored "-Wimplicit-int-conversion"
 
13
#pragma clang diagnostic ignored "-Wsign-conversion"
 
14
/*
 
15
 *  FIPS-180-2 compliant SHA-256 implementation
 
16
 *
 
17
 *  Copyright The Mbed TLS Contributors
 
18
 *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
 
19
 *
 
20
 *  This file is provided under the Apache License 2.0, or the
 
21
 *  GNU General Public License v2.0 or later.
 
22
 *
 
23
 *  **********
 
24
 *  Apache License 2.0:
 
25
 *
 
26
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 
27
 *  not use this file except in compliance with the License.
 
28
 *  You may obtain a copy of the License at
 
29
 *
 
30
 *  http://www.apache.org/licenses/LICENSE-2.0
 
31
 *
 
32
 *  Unless required by applicable law or agreed to in writing, software
 
33
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 
34
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
35
 *  See the License for the specific language governing permissions and
 
36
 *  limitations under the License.
 
37
 *
 
38
 *  **********
 
39
 *
 
40
 *  **********
 
41
 *  GNU General Public License v2.0 or later:
 
42
 *
 
43
 *  This program is free software; you can redistribute it and/or modify
 
44
 *  it under the terms of the GNU General Public License as published by
 
45
 *  the Free Software Foundation; either version 2 of the License, or
 
46
 *  (at your option) any later version.
 
47
 *
 
48
 *  This program is distributed in the hope that it will be useful,
 
49
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
50
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
51
 *  GNU General Public License for more details.
 
52
 *
 
53
 *  You should have received a copy of the GNU General Public License along
 
54
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 
55
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
56
 *
 
57
 *  **********
 
58
 */
 
59
/*
 
60
 *  The SHA-256 Secure Hash Standard was published by NIST in 2002.
 
61
 *
 
62
 *  http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
 
63
 */
 
64
 
 
65
#if !defined(MBEDTLS_CONFIG_FILE)
 
66
#include "mbedtls/config.h"
 
67
#else
 
68
#include MBEDTLS_CONFIG_FILE
 
69
#endif
 
70
 
 
71
#if defined(MBEDTLS_SHA256_C)
 
72
 
 
73
#include "mbedtls/sha256.h"
 
74
#include "mbedtls/platform_util.h"
 
75
 
 
76
#include <string.h>
 
77
 
 
78
#if defined(MBEDTLS_SELF_TEST)
 
79
#if defined(MBEDTLS_PLATFORM_C)
 
80
#include "mbedtls/platform.h"
 
81
#else
 
82
#include <stdio.h>
 
83
#include <stdlib.h>
 
84
#define mbedtls_printf printf
 
85
#define mbedtls_calloc    calloc
 
86
#define mbedtls_free       free
 
87
#endif /* MBEDTLS_PLATFORM_C */
 
88
#endif /* MBEDTLS_SELF_TEST */
 
89
 
 
90
#define SHA256_VALIDATE_RET(cond)                           \
 
91
    MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
 
92
#define SHA256_VALIDATE(cond)  MBEDTLS_INTERNAL_VALIDATE( cond )
 
93
 
 
94
#if !defined(MBEDTLS_SHA256_ALT)
 
95
 
 
96
/*
 
97
 * 32-bit integer manipulation macros (big endian)
 
98
 */
 
99
#ifndef GET_UINT32_BE
 
100
#define GET_UINT32_BE(n,b,i)                            \
 
101
do {                                                    \
 
102
    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \
 
103
        | ( (uint32_t) (b)[(i) + 1] << 16 )             \
 
104
        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \
 
105
        | ( (uint32_t) (b)[(i) + 3]       );            \
 
106
} while( 0 )
 
107
#endif
 
108
 
 
109
#ifndef PUT_UINT32_BE
 
110
#define PUT_UINT32_BE(n,b,i)                            \
 
111
do {                                                    \
 
112
    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
 
113
    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
 
114
    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
 
115
    (b)[(i) + 3] = (unsigned char) ( (n)       );       \
 
116
} while( 0 )
 
117
#endif
 
118
 
 
119
void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
 
120
{
 
121
    SHA256_VALIDATE( ctx != NULL );
 
122
 
 
123
    memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
 
124
}
 
125
 
 
126
void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
 
127
{
 
128
    if( ctx == NULL )
 
129
        return;
 
130
 
 
131
    mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
 
132
}
 
133
 
 
134
void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
 
135
                           const mbedtls_sha256_context *src )
 
136
{
 
137
    SHA256_VALIDATE( dst != NULL );
 
138
    SHA256_VALIDATE( src != NULL );
 
139
 
 
140
    *dst = *src;
 
141
}
 
142
 
 
143
/*
 
144
 * SHA-256 context setup
 
145
 */
 
146
int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
 
147
{
 
148
    SHA256_VALIDATE_RET( ctx != NULL );
 
149
    SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
 
150
 
 
151
    ctx->total[0] = 0;
 
152
    ctx->total[1] = 0;
 
153
 
 
154
    if( is224 == 0 )
 
155
    {
 
156
        /* SHA-256 */
 
157
        ctx->state[0] = 0x6A09E667;
 
158
        ctx->state[1] = 0xBB67AE85;
 
159
        ctx->state[2] = 0x3C6EF372;
 
160
        ctx->state[3] = 0xA54FF53A;
 
161
        ctx->state[4] = 0x510E527F;
 
162
        ctx->state[5] = 0x9B05688C;
 
163
        ctx->state[6] = 0x1F83D9AB;
 
164
        ctx->state[7] = 0x5BE0CD19;
 
165
    }
 
166
    else
 
167
    {
 
168
        /* SHA-224 */
 
169
        ctx->state[0] = 0xC1059ED8;
 
170
        ctx->state[1] = 0x367CD507;
 
171
        ctx->state[2] = 0x3070DD17;
 
172
        ctx->state[3] = 0xF70E5939;
 
173
        ctx->state[4] = 0xFFC00B31;
 
174
        ctx->state[5] = 0x68581511;
 
175
        ctx->state[6] = 0x64F98FA7;
 
176
        ctx->state[7] = 0xBEFA4FA4;
 
177
    }
 
178
 
 
179
    ctx->is224 = is224;
 
180
 
 
181
    return( 0 );
 
182
}
 
183
 
 
184
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 
185
void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
 
186
                            int is224 )
 
187
{
 
188
    mbedtls_sha256_starts_ret( ctx, is224 );
 
189
}
 
190
#endif
 
191
 
 
192
#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
 
193
static const uint32_t K[] =
 
194
{
 
195
    0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
 
196
    0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
 
197
    0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
 
198
    0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
 
199
    0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
 
200
    0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
 
201
    0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
 
202
    0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
 
203
    0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
 
204
    0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
 
205
    0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
 
206
    0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
 
207
    0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
 
208
    0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
 
209
    0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
 
210
    0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
 
211
};
 
212
 
 
213
#define  SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
 
214
#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
 
215
 
 
216
#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^  SHR(x, 3))
 
217
#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^  SHR(x,10))
 
218
 
 
219
#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
 
220
#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
 
221
 
 
222
#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
 
223
#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
 
224
 
 
225
#define R(t)                                                        \
 
226
    (                                                               \
 
227
        local.W[t] = S1(local.W[(t) -  2]) + local.W[(t) -  7] +    \
 
228
                     S0(local.W[(t) - 15]) + local.W[(t) - 16]      \
 
229
    )
 
230
 
 
231
#define P(a,b,c,d,e,f,g,h,x,K)                                      \
 
232
    do                                                              \
 
233
    {                                                               \
 
234
        local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x);    \
 
235
        local.temp2 = S2(a) + F0((a),(b),(c));                      \
 
236
        (d) += local.temp1; (h) = local.temp1 + local.temp2;        \
 
237
    } while( 0 )
 
238
 
 
239
int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
 
240
                                const unsigned char data[64] )
 
241
{
 
242
    struct
 
243
    {
 
244
        uint32_t temp1, temp2, W[64];
 
245
        uint32_t A[8];
 
246
    } local;
 
247
 
 
248
    unsigned int i;
 
249
 
 
250
    SHA256_VALIDATE_RET( ctx != NULL );
 
251
    SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
 
252
 
 
253
    for( i = 0; i < 8; i++ )
 
254
        local.A[i] = ctx->state[i];
 
255
 
 
256
#if defined(MBEDTLS_SHA256_SMALLER)
 
257
    for( i = 0; i < 64; i++ )
 
258
    {
 
259
        if( i < 16 )
 
260
            GET_UINT32_BE( local.W[i], data, 4 * i );
 
261
        else
 
262
            R( i );
 
263
 
 
264
        P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
 
265
           local.A[5], local.A[6], local.A[7], local.W[i], K[i] );
 
266
 
 
267
        local.temp1 = local.A[7]; local.A[7] = local.A[6];
 
268
        local.A[6] = local.A[5]; local.A[5] = local.A[4];
 
269
        local.A[4] = local.A[3]; local.A[3] = local.A[2];
 
270
        local.A[2] = local.A[1]; local.A[1] = local.A[0];
 
271
        local.A[0] = local.temp1;
 
272
    }
 
273
#else /* MBEDTLS_SHA256_SMALLER */
 
274
    for( i = 0; i < 16; i++ )
 
275
        GET_UINT32_BE( local.W[i], data, 4 * i );
 
276
 
 
277
    for( i = 0; i < 16; i += 8 )
 
278
    {
 
279
        P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
 
280
           local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0] );
 
281
        P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
 
282
           local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1] );
 
283
        P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
 
284
           local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2] );
 
285
        P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
 
286
           local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3] );
 
287
        P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
 
288
           local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4] );
 
289
        P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
 
290
           local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5] );
 
291
        P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
 
292
           local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6] );
 
293
        P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
 
294
           local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7] );
 
295
    }
 
296
 
 
297
    for( i = 16; i < 64; i += 8 )
 
298
    {
 
299
        P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
 
300
           local.A[5], local.A[6], local.A[7], R(i+0), K[i+0] );
 
301
        P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
 
302
           local.A[4], local.A[5], local.A[6], R(i+1), K[i+1] );
 
303
        P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
 
304
           local.A[3], local.A[4], local.A[5], R(i+2), K[i+2] );
 
305
        P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
 
306
           local.A[2], local.A[3], local.A[4], R(i+3), K[i+3] );
 
307
        P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
 
308
           local.A[1], local.A[2], local.A[3], R(i+4), K[i+4] );
 
309
        P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
 
310
           local.A[0], local.A[1], local.A[2], R(i+5), K[i+5] );
 
311
        P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
 
312
           local.A[7], local.A[0], local.A[1], R(i+6), K[i+6] );
 
313
        P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
 
314
           local.A[6], local.A[7], local.A[0], R(i+7), K[i+7] );
 
315
    }
 
316
#endif /* MBEDTLS_SHA256_SMALLER */
 
317
 
 
318
    for( i = 0; i < 8; i++ )
 
319
        ctx->state[i] += local.A[i];
 
320
 
 
321
    /* Zeroise buffers and variables to clear sensitive data from memory. */
 
322
    mbedtls_platform_zeroize( &local, sizeof( local ) );
 
323
 
 
324
    return( 0 );
 
325
}
 
326
 
 
327
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 
328
void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
 
329
                             const unsigned char data[64] )
 
330
{
 
331
    mbedtls_internal_sha256_process( ctx, data );
 
332
}
 
333
#endif
 
334
#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
 
335
 
 
336
/*
 
337
 * SHA-256 process buffer
 
338
 */
 
339
int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
 
340
                               const unsigned char *input,
 
341
                               size_t ilen )
 
342
{
 
343
    int ret;
 
344
    size_t fill;
 
345
    uint32_t left;
 
346
 
 
347
    SHA256_VALIDATE_RET( ctx != NULL );
 
348
    SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
 
349
 
 
350
    if( ilen == 0 )
 
351
        return( 0 );
 
352
 
 
353
    left = ctx->total[0] & 0x3F;
 
354
    fill = 64 - left;
 
355
 
 
356
    ctx->total[0] += (uint32_t) ilen;
 
357
    ctx->total[0] &= 0xFFFFFFFF;
 
358
 
 
359
    if( ctx->total[0] < (uint32_t) ilen )
 
360
        ctx->total[1]++;
 
361
 
 
362
    if( left && ilen >= fill )
 
363
    {
 
364
        memcpy( (void *) (ctx->buffer + left), input, fill );
 
365
 
 
366
        if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
 
367
            return( ret );
 
368
 
 
369
        input += fill;
 
370
        ilen  -= fill;
 
371
        left = 0;
 
372
    }
 
373
 
 
374
    while( ilen >= 64 )
 
375
    {
 
376
        if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
 
377
            return( ret );
 
378
 
 
379
        input += 64;
 
380
        ilen  -= 64;
 
381
    }
 
382
 
 
383
    if( ilen > 0 )
 
384
        memcpy( (void *) (ctx->buffer + left), input, ilen );
 
385
 
 
386
    return( 0 );
 
387
}
 
388
 
 
389
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 
390
void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
 
391
                            const unsigned char *input,
 
392
                            size_t ilen )
 
393
{
 
394
    mbedtls_sha256_update_ret( ctx, input, ilen );
 
395
}
 
396
#endif
 
397
 
 
398
/*
 
399
 * SHA-256 final digest
 
400
 */
 
401
int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
 
402
                               unsigned char output[32] )
 
403
{
 
404
    int ret;
 
405
    uint32_t used;
 
406
    uint32_t high, low;
 
407
 
 
408
    SHA256_VALIDATE_RET( ctx != NULL );
 
409
    SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
 
410
 
 
411
    /*
 
412
     * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
 
413
     */
 
414
    used = ctx->total[0] & 0x3F;
 
415
 
 
416
    ctx->buffer[used++] = 0x80;
 
417
 
 
418
    if( used <= 56 )
 
419
    {
 
420
        /* Enough room for padding + length in current block */
 
421
        memset( ctx->buffer + used, 0, 56 - used );
 
422
    }
 
423
    else
 
424
    {
 
425
        /* We'll need an extra block */
 
426
        memset( ctx->buffer + used, 0, 64 - used );
 
427
 
 
428
        if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
 
429
            return( ret );
 
430
 
 
431
        memset( ctx->buffer, 0, 56 );
 
432
    }
 
433
 
 
434
    /*
 
435
     * Add message length
 
436
     */
 
437
    high = ( ctx->total[0] >> 29 )
 
438
         | ( ctx->total[1] <<  3 );
 
439
    low  = ( ctx->total[0] <<  3 );
 
440
 
 
441
    PUT_UINT32_BE( high, ctx->buffer, 56 );
 
442
    PUT_UINT32_BE( low,  ctx->buffer, 60 );
 
443
 
 
444
    if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
 
445
        return( ret );
 
446
 
 
447
    /*
 
448
     * Output final state
 
449
     */
 
450
    PUT_UINT32_BE( ctx->state[0], output,  0 );
 
451
    PUT_UINT32_BE( ctx->state[1], output,  4 );
 
452
    PUT_UINT32_BE( ctx->state[2], output,  8 );
 
453
    PUT_UINT32_BE( ctx->state[3], output, 12 );
 
454
    PUT_UINT32_BE( ctx->state[4], output, 16 );
 
455
    PUT_UINT32_BE( ctx->state[5], output, 20 );
 
456
    PUT_UINT32_BE( ctx->state[6], output, 24 );
 
457
 
 
458
    if( ctx->is224 == 0 )
 
459
        PUT_UINT32_BE( ctx->state[7], output, 28 );
 
460
 
 
461
    return( 0 );
 
462
}
 
463
 
 
464
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 
465
void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
 
466
                            unsigned char output[32] )
 
467
{
 
468
    mbedtls_sha256_finish_ret( ctx, output );
 
469
}
 
470
#endif
 
471
 
 
472
#endif /* !MBEDTLS_SHA256_ALT */
 
473
 
 
474
/*
 
475
 * output = SHA-256( input buffer )
 
476
 */
 
477
int mbedtls_sha256_ret( const unsigned char *input,
 
478
                        size_t ilen,
 
479
                        unsigned char output[32],
 
480
                        int is224 )
 
481
{
 
482
    int ret;
 
483
    mbedtls_sha256_context ctx;
 
484
 
 
485
    SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
 
486
    SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
 
487
    SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
 
488
 
 
489
    mbedtls_sha256_init( &ctx );
 
490
 
 
491
    if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
 
492
        goto exit;
 
493
 
 
494
    if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
 
495
        goto exit;
 
496
 
 
497
    if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
 
498
        goto exit;
 
499
 
 
500
exit:
 
501
    mbedtls_sha256_free( &ctx );
 
502
 
 
503
    return( ret );
 
504
}
 
505
 
 
506
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 
507
void mbedtls_sha256( const unsigned char *input,
 
508
                     size_t ilen,
 
509
                     unsigned char output[32],
 
510
                     int is224 )
 
511
{
 
512
    mbedtls_sha256_ret( input, ilen, output, is224 );
 
513
}
 
514
#endif
 
515
 
 
516
#if defined(MBEDTLS_SELF_TEST)
 
517
/*
 
518
 * FIPS-180-2 test vectors
 
519
 */
 
520
static const unsigned char sha256_test_buf[3][57] =
 
521
{
 
522
    { "abc" },
 
523
    { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
 
524
    { "" }
 
525
};
 
526
 
 
527
static const size_t sha256_test_buflen[3] =
 
528
{
 
529
    3, 56, 1000
 
530
};
 
531
 
 
532
static const unsigned char sha256_test_sum[6][32] =
 
533
{
 
534
    /*
 
535
     * SHA-224 test vectors
 
536
     */
 
537
    { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
 
538
      0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
 
539
      0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
 
540
      0xE3, 0x6C, 0x9D, 0xA7 },
 
541
    { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
 
542
      0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
 
543
      0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
 
544
      0x52, 0x52, 0x25, 0x25 },
 
545
    { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
 
546
      0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
 
547
      0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
 
548
      0x4E, 0xE7, 0xAD, 0x67 },
 
549
 
 
550
    /*
 
551
     * SHA-256 test vectors
 
552
     */
 
553
    { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
 
554
      0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
 
555
      0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
 
556
      0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
 
557
    { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
 
558
      0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
 
559
      0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
 
560
      0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
 
561
    { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
 
562
      0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
 
563
      0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
 
564
      0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
 
565
};
 
566
 
 
567
/*
 
568
 * Checkup routine
 
569
 */
 
570
int mbedtls_sha256_self_test( int verbose )
 
571
{
 
572
    int i, j, k, buflen, ret = 0;
 
573
    unsigned char *buf;
 
574
    unsigned char sha256sum[32];
 
575
    mbedtls_sha256_context ctx;
 
576
 
 
577
    buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
 
578
    if( NULL == buf )
 
579
    {
 
580
        if( verbose != 0 )
 
581
            mbedtls_printf( "Buffer allocation failed\n" );
 
582
 
 
583
        return( 1 );
 
584
    }
 
585
 
 
586
    mbedtls_sha256_init( &ctx );
 
587
 
 
588
    for( i = 0; i < 6; i++ )
 
589
    {
 
590
        j = i % 3;
 
591
        k = i < 3;
 
592
 
 
593
        if( verbose != 0 )
 
594
            mbedtls_printf( "  SHA-%d test #%d: ", 256 - k * 32, j + 1 );
 
595
 
 
596
        if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
 
597
            goto fail;
 
598
 
 
599
        if( j == 2 )
 
600
        {
 
601
            memset( buf, 'a', buflen = 1000 );
 
602
 
 
603
            for( j = 0; j < 1000; j++ )
 
604
            {
 
605
                ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
 
606
                if( ret != 0 )
 
607
                    goto fail;
 
608
            }
 
609
 
 
610
        }
 
611
        else
 
612
        {
 
613
            ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
 
614
                                             sha256_test_buflen[j] );
 
615
            if( ret != 0 )
 
616
                 goto fail;
 
617
        }
 
618
 
 
619
        if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
 
620
            goto fail;
 
621
 
 
622
 
 
623
        if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
 
624
        {
 
625
            ret = 1;
 
626
            goto fail;
 
627
        }
 
628
 
 
629
        if( verbose != 0 )
 
630
            mbedtls_printf( "passed\n" );
 
631
    }
 
632
 
 
633
    if( verbose != 0 )
 
634
        mbedtls_printf( "\n" );
 
635
 
 
636
    goto exit;
 
637
 
 
638
fail:
 
639
    if( verbose != 0 )
 
640
        mbedtls_printf( "failed\n" );
 
641
 
 
642
exit:
 
643
    mbedtls_sha256_free( &ctx );
 
644
    mbedtls_free( buf );
 
645
 
 
646
    return( ret );
 
647
}
 
648
 
 
649
#endif /* MBEDTLS_SELF_TEST */
 
650
 
 
651
#endif /* MBEDTLS_SHA256_C */