Coverage Report

Created: 2025-07-01 06:54

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