Coverage Report

Created: 2026-10-28 07:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/mbedtls/library/sha256.c
Line
Count
Source
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
1.07M
    MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA)
27
44.8k
#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
44.8k
{
33
44.8k
    SHA256_VALIDATE(ctx != NULL);
34
35
44.8k
    memset(ctx, 0, sizeof(mbedtls_sha256_context));
36
44.8k
}
37
38
void mbedtls_sha256_free(mbedtls_sha256_context *ctx)
39
44.8k
{
40
44.8k
    if (ctx == NULL) {
41
0
        return;
42
0
    }
43
44
44.8k
    mbedtls_platform_zeroize(ctx, sizeof(mbedtls_sha256_context));
45
44.8k
}
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
89.6k
{
61
89.6k
    SHA256_VALIDATE_RET(ctx != NULL);
62
89.6k
    SHA256_VALIDATE_RET(is224 == 0 || is224 == 1);
63
64
89.6k
    ctx->total[0] = 0;
65
89.6k
    ctx->total[1] = 0;
66
67
89.6k
    if (is224 == 0) {
68
        /* SHA-256 */
69
89.6k
        ctx->state[0] = 0x6A09E667;
70
89.6k
        ctx->state[1] = 0xBB67AE85;
71
89.6k
        ctx->state[2] = 0x3C6EF372;
72
89.6k
        ctx->state[3] = 0xA54FF53A;
73
89.6k
        ctx->state[4] = 0x510E527F;
74
89.6k
        ctx->state[5] = 0x9B05688C;
75
89.6k
        ctx->state[6] = 0x1F83D9AB;
76
89.6k
        ctx->state[7] = 0x5BE0CD19;
77
89.6k
    } 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
89.6k
    ctx->is224 = is224;
90
91
89.6k
    return 0;
92
89.6k
}
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
68.8M
#define  SHR(x, n) (((x) & 0xFFFFFFFF) >> (n))
124
68.8M
#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
11.4M
#define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
130
11.4M
#define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
131
132
11.4M
#define F0(x, y, z) (((x) & (y)) | ((z) & ((x) | (y))))
133
11.4M
#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
11.4M
    do                                                              \
143
11.4M
    {                                                               \
144
11.4M
        local.temp1 = (h) + S3(e) + F1((e), (f), (g)) + (K) + (x);    \
145
11.4M
        local.temp2 = S2(a) + F0((a), (b), (c));                      \
146
11.4M
        (d) += local.temp1; (h) = local.temp1 + local.temp2;        \
147
11.4M
    } while (0)
148
149
int mbedtls_internal_sha256_process(mbedtls_sha256_context *ctx,
150
                                    const unsigned char data[64])
151
179k
{
152
179k
    struct {
153
179k
        uint32_t temp1, temp2, W[64];
154
179k
        uint32_t A[8];
155
179k
    } local;
156
157
179k
    unsigned int i;
158
159
179k
    SHA256_VALIDATE_RET(ctx != NULL);
160
179k
    SHA256_VALIDATE_RET((const unsigned char *) data != NULL);
161
162
1.61M
    for (i = 0; i < 8; i++) {
163
1.43M
        local.A[i] = ctx->state[i];
164
1.43M
    }
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
3.04M
    for (i = 0; i < 16; i++) {
185
2.86M
        local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i);
186
2.86M
    }
187
188
537k
    for (i = 0; i < 16; i += 8) {
189
358k
        P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
190
358k
          local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0]);
191
358k
        P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
192
358k
          local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1]);
193
358k
        P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
194
358k
          local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2]);
195
358k
        P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
196
358k
          local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3]);
197
358k
        P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
198
358k
          local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4]);
199
358k
        P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
200
358k
          local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5]);
201
358k
        P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
202
358k
          local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6]);
203
358k
        P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
204
358k
          local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7]);
205
358k
    }
206
207
1.25M
    for (i = 16; i < 64; i += 8) {
208
1.07M
        P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
209
1.07M
          local.A[5], local.A[6], local.A[7], R(i+0), K[i+0]);
210
1.07M
        P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
211
1.07M
          local.A[4], local.A[5], local.A[6], R(i+1), K[i+1]);
212
1.07M
        P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
213
1.07M
          local.A[3], local.A[4], local.A[5], R(i+2), K[i+2]);
214
1.07M
        P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
215
1.07M
          local.A[2], local.A[3], local.A[4], R(i+3), K[i+3]);
216
1.07M
        P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
217
1.07M
          local.A[1], local.A[2], local.A[3], R(i+4), K[i+4]);
218
1.07M
        P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
219
1.07M
          local.A[0], local.A[1], local.A[2], R(i+5), K[i+5]);
220
1.07M
        P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
221
1.07M
          local.A[7], local.A[0], local.A[1], R(i+6), K[i+6]);
222
1.07M
        P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
223
1.07M
          local.A[6], local.A[7], local.A[0], R(i+7), K[i+7]);
224
1.07M
    }
225
179k
#endif /* MBEDTLS_SHA256_SMALLER */
226
227
1.61M
    for (i = 0; i < 8; i++) {
228
1.43M
        ctx->state[i] += local.A[i];
229
1.43M
    }
230
231
    /* Zeroise buffers and variables to clear sensitive data from memory. */
232
179k
    mbedtls_platform_zeroize(&local, sizeof(local));
233
234
179k
    return 0;
235
179k
}
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
179k
{
253
179k
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
254
179k
    size_t fill;
255
179k
    uint32_t left;
256
257
179k
    SHA256_VALIDATE_RET(ctx != NULL);
258
179k
    SHA256_VALIDATE_RET(ilen == 0 || input != NULL);
259
260
179k
    if (ilen == 0) {
261
0
        return 0;
262
0
    }
263
264
179k
    left = ctx->total[0] & 0x3F;
265
179k
    fill = 64 - left;
266
267
179k
    ctx->total[0] += (uint32_t) ilen;
268
179k
    ctx->total[0] &= 0xFFFFFFFF;
269
270
179k
    if (ctx->total[0] < (uint32_t) ilen) {
271
0
        ctx->total[1]++;
272
0
    }
273
274
179k
    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
268k
    while (ilen >= 64) {
287
89.6k
        if ((ret = mbedtls_internal_sha256_process(ctx, input)) != 0) {
288
0
            return ret;
289
0
        }
290
291
89.6k
        input += 64;
292
89.6k
        ilen  -= 64;
293
89.6k
    }
294
295
179k
    if (ilen > 0) {
296
89.6k
        memcpy((void *) (ctx->buffer + left), input, ilen);
297
89.6k
    }
298
299
179k
    return 0;
300
179k
}
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
89.6k
{
317
89.6k
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
318
89.6k
    uint32_t used;
319
89.6k
    uint32_t high, low;
320
321
89.6k
    SHA256_VALIDATE_RET(ctx != NULL);
322
89.6k
    SHA256_VALIDATE_RET((unsigned char *) output != NULL);
323
324
    /*
325
     * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
326
     */
327
89.6k
    used = ctx->total[0] & 0x3F;
328
329
89.6k
    ctx->buffer[used++] = 0x80;
330
331
89.6k
    if (used <= 56) {
332
        /* Enough room for padding + length in current block */
333
89.6k
        memset(ctx->buffer + used, 0, 56 - used);
334
89.6k
    } 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
89.6k
    high = (ctx->total[0] >> 29)
349
89.6k
           | (ctx->total[1] <<  3);
350
89.6k
    low  = (ctx->total[0] <<  3);
351
352
89.6k
    MBEDTLS_PUT_UINT32_BE(high, ctx->buffer, 56);
353
89.6k
    MBEDTLS_PUT_UINT32_BE(low,  ctx->buffer, 60);
354
355
89.6k
    if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
356
0
        return ret;
357
0
    }
358
359
    /*
360
     * Output final state
361
     */
362
89.6k
    MBEDTLS_PUT_UINT32_BE(ctx->state[0], output,  0);
363
89.6k
    MBEDTLS_PUT_UINT32_BE(ctx->state[1], output,  4);
364
89.6k
    MBEDTLS_PUT_UINT32_BE(ctx->state[2], output,  8);
365
89.6k
    MBEDTLS_PUT_UINT32_BE(ctx->state[3], output, 12);
366
89.6k
    MBEDTLS_PUT_UINT32_BE(ctx->state[4], output, 16);
367
89.6k
    MBEDTLS_PUT_UINT32_BE(ctx->state[5], output, 20);
368
89.6k
    MBEDTLS_PUT_UINT32_BE(ctx->state[6], output, 24);
369
370
89.6k
    if (ctx->is224 == 0) {
371
89.6k
        MBEDTLS_PUT_UINT32_BE(ctx->state[7], output, 28);
372
89.6k
    }
373
374
89.6k
    return 0;
375
89.6k
}
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 */