Coverage Report

Created: 2025-10-28 06:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openthread/third_party/mbedtls/repo/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
#if defined(__clang__) &&  (__clang_major__ >= 4)
14
15
/* Ideally, we would simply use MBEDTLS_ARCH_IS_ARMV8_A in the following #if,
16
 * but that is defined by build_info.h, and we need this block to happen first. */
17
#if defined(__ARM_ARCH) && (__ARM_ARCH_PROFILE == 'A')
18
#if __ARM_ARCH >= 8
19
#define MBEDTLS_SHA256_ARCH_IS_ARMV8_A
20
#endif
21
#endif
22
23
#if defined(MBEDTLS_SHA256_ARCH_IS_ARMV8_A) && !defined(__ARM_FEATURE_CRYPTO)
24
/* TODO: Re-consider above after https://reviews.llvm.org/D131064 merged.
25
 *
26
 * The intrinsic declaration are guarded by predefined ACLE macros in clang:
27
 * these are normally only enabled by the -march option on the command line.
28
 * By defining the macros ourselves we gain access to those declarations without
29
 * requiring -march on the command line.
30
 *
31
 * `arm_neon.h` is included by common.h, so we put these defines
32
 * at the top of this file, before any includes.
33
 */
34
#define __ARM_FEATURE_CRYPTO 1
35
/* See: https://arm-software.github.io/acle/main/acle.html#cryptographic-extensions
36
 *
37
 * `__ARM_FEATURE_CRYPTO` is deprecated, but we need to continue to specify it
38
 * for older compilers.
39
 */
40
#define __ARM_FEATURE_SHA2   1
41
#define MBEDTLS_ENABLE_ARM_CRYPTO_EXTENSIONS_COMPILER_FLAG
42
#endif
43
44
#endif /* defined(__clang__) &&  (__clang_major__ >= 4) */
45
46
/* Ensure that SIG_SETMASK is defined when -std=c99 is used. */
47
#define _GNU_SOURCE
48
49
#include "common.h"
50
51
#if defined(MBEDTLS_SHA256_C) || defined(MBEDTLS_SHA224_C)
52
53
#include "mbedtls/sha256.h"
54
#include "mbedtls/platform_util.h"
55
#include "mbedtls/error.h"
56
57
#include <string.h>
58
59
#include "mbedtls/platform.h"
60
61
#if defined(MBEDTLS_ARCH_IS_ARMV8_A)
62
63
#  if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT) || \
64
    defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
65
#       if !defined(MBEDTLS_HAVE_NEON_INTRINSICS)
66
#           if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
67
#               warning "Target does not support NEON instructions"
68
#               undef MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT
69
#           else
70
#               error "Target does not support NEON instructions"
71
#           endif
72
#       endif
73
#   endif
74
75
#  if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT) || \
76
    defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
77
/* *INDENT-OFF* */
78
79
#   if !defined(__ARM_FEATURE_CRYPTO) || defined(MBEDTLS_ENABLE_ARM_CRYPTO_EXTENSIONS_COMPILER_FLAG)
80
#      if defined(__ARMCOMPILER_VERSION)
81
#        if __ARMCOMPILER_VERSION <= 6090000
82
#          error "Must use minimum -march=armv8-a+crypto for MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_*"
83
#        endif
84
#          pragma clang attribute push (__attribute__((target("sha2"))), apply_to=function)
85
#          define MBEDTLS_POP_TARGET_PRAGMA
86
#      elif defined(__clang__)
87
#        if __clang_major__ < 4
88
#          error "A more recent Clang is required for MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_*"
89
#        endif
90
#        pragma clang attribute push (__attribute__((target("crypto"))), apply_to=function)
91
#        define MBEDTLS_POP_TARGET_PRAGMA
92
#      elif defined(__GNUC__)
93
         /* FIXME: GCC 5 claims to support Armv8 Crypto Extensions, but some
94
          *        intrinsics are missing. Missing intrinsics could be worked around.
95
          */
96
#        if __GNUC__ < 6
97
#          error "A more recent GCC is required for MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_*"
98
#        else
99
#          pragma GCC push_options
100
#          pragma GCC target ("arch=armv8-a+crypto")
101
#          define MBEDTLS_POP_TARGET_PRAGMA
102
#        endif
103
#      else
104
#        error "Only GCC and Clang supported for MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_*"
105
#      endif
106
#    endif
107
/* *INDENT-ON* */
108
109
#  endif
110
#  if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
111
#    if defined(__unix__)
112
#      if defined(__linux__)
113
/* Our preferred method of detection is getauxval() */
114
#        include <sys/auxv.h>
115
/* These are not always defined via sys/auxv.h */
116
#        if !defined(HWCAP_SHA2)
117
#          define HWCAP_SHA2  (1 << 6)
118
#        endif
119
#        if !defined(HWCAP2_SHA2)
120
#          define HWCAP2_SHA2 (1 << 3)
121
#        endif
122
#      endif
123
/* Use SIGILL on Unix, and fall back to it on Linux */
124
#      include <signal.h>
125
#    endif
126
#  endif
127
#elif !defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
128
#  undef MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY
129
#  undef MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT
130
#endif
131
132
#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
133
/*
134
 * Capability detection code comes early, so we can disable
135
 * MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT if no detection mechanism found
136
 */
137
#if defined(MBEDTLS_ARCH_IS_ARM64) && defined(HWCAP_SHA2)
138
static int mbedtls_a64_crypto_sha256_determine_support(void)
139
{
140
    return (getauxval(AT_HWCAP) & HWCAP_SHA2) ? 1 : 0;
141
}
142
#elif defined(MBEDTLS_ARCH_IS_ARM32) && defined(HWCAP2_SHA2)
143
static int mbedtls_a64_crypto_sha256_determine_support(void)
144
{
145
    return (getauxval(AT_HWCAP2) & HWCAP2_SHA2) ? 1 : 0;
146
}
147
#elif defined(__APPLE__)
148
static int mbedtls_a64_crypto_sha256_determine_support(void)
149
{
150
    return 1;
151
}
152
#elif defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
153
#define WIN32_LEAN_AND_MEAN
154
#include <Windows.h>
155
#include <processthreadsapi.h>
156
157
static int mbedtls_a64_crypto_sha256_determine_support(void)
158
{
159
    return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ?
160
           1 : 0;
161
}
162
#elif defined(__unix__) && defined(SIG_SETMASK)
163
/* Detection with SIGILL, setjmp() and longjmp() */
164
#include <signal.h>
165
#include <setjmp.h>
166
167
static jmp_buf return_from_sigill;
168
169
/*
170
 * Armv8-A SHA256 support detection via SIGILL
171
 */
172
static void sigill_handler(int signal)
173
{
174
    (void) signal;
175
    longjmp(return_from_sigill, 1);
176
}
177
178
static int mbedtls_a64_crypto_sha256_determine_support(void)
179
{
180
    struct sigaction old_action, new_action;
181
182
    sigset_t old_mask;
183
    if (sigprocmask(0, NULL, &old_mask)) {
184
        return 0;
185
    }
186
187
    sigemptyset(&new_action.sa_mask);
188
    new_action.sa_flags = 0;
189
    new_action.sa_handler = sigill_handler;
190
191
    sigaction(SIGILL, &new_action, &old_action);
192
193
    static int ret = 0;
194
195
    if (setjmp(return_from_sigill) == 0) {         /* First return only */
196
        /* If this traps, we will return a second time from setjmp() with 1 */
197
#if defined(MBEDTLS_ARCH_IS_ARM64)
198
        asm volatile ("sha256h q0, q0, v0.4s" : : : "v0");
199
#else
200
        asm volatile ("sha256h.32 q0, q0, q0" : : : "q0");
201
#endif
202
        ret = 1;
203
    }
204
205
    sigaction(SIGILL, &old_action, NULL);
206
    sigprocmask(SIG_SETMASK, &old_mask, NULL);
207
208
    return ret;
209
}
210
#else
211
#warning "No mechanism to detect ARMV8_CRYPTO found, using C code only"
212
#undef MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT
213
#endif  /* HWCAP_SHA2, __APPLE__, __unix__ && SIG_SETMASK */
214
215
#endif  /* MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT */
216
217
#if !defined(MBEDTLS_SHA256_ALT)
218
219
7.01M
#define SHA256_BLOCK_SIZE 64
220
221
void mbedtls_sha256_init(mbedtls_sha256_context *ctx)
222
498k
{
223
498k
    memset(ctx, 0, sizeof(mbedtls_sha256_context));
224
498k
}
225
226
void mbedtls_sha256_free(mbedtls_sha256_context *ctx)
227
1.21M
{
228
1.21M
    if (ctx == NULL) {
229
0
        return;
230
0
    }
231
232
1.21M
    mbedtls_platform_zeroize(ctx, sizeof(mbedtls_sha256_context));
233
1.21M
}
234
235
void mbedtls_sha256_clone(mbedtls_sha256_context *dst,
236
                          const mbedtls_sha256_context *src)
237
0
{
238
0
    *dst = *src;
239
0
}
240
241
/*
242
 * SHA-256 context setup
243
 */
244
int mbedtls_sha256_starts(mbedtls_sha256_context *ctx, int is224)
245
745k
{
246
745k
#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
247
745k
    if (is224 != 0 && is224 != 1) {
248
0
        return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
249
0
    }
250
#elif defined(MBEDTLS_SHA256_C)
251
    if (is224 != 0) {
252
        return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
253
    }
254
#else /* defined MBEDTLS_SHA224_C only */
255
    if (is224 == 0) {
256
        return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
257
    }
258
#endif
259
260
745k
    ctx->total[0] = 0;
261
745k
    ctx->total[1] = 0;
262
263
745k
    if (is224 == 0) {
264
745k
#if defined(MBEDTLS_SHA256_C)
265
745k
        ctx->state[0] = 0x6A09E667;
266
745k
        ctx->state[1] = 0xBB67AE85;
267
745k
        ctx->state[2] = 0x3C6EF372;
268
745k
        ctx->state[3] = 0xA54FF53A;
269
745k
        ctx->state[4] = 0x510E527F;
270
745k
        ctx->state[5] = 0x9B05688C;
271
745k
        ctx->state[6] = 0x1F83D9AB;
272
745k
        ctx->state[7] = 0x5BE0CD19;
273
745k
#endif
274
745k
    } else {
275
0
#if defined(MBEDTLS_SHA224_C)
276
0
        ctx->state[0] = 0xC1059ED8;
277
0
        ctx->state[1] = 0x367CD507;
278
0
        ctx->state[2] = 0x3070DD17;
279
0
        ctx->state[3] = 0xF70E5939;
280
0
        ctx->state[4] = 0xFFC00B31;
281
0
        ctx->state[5] = 0x68581511;
282
0
        ctx->state[6] = 0x64F98FA7;
283
0
        ctx->state[7] = 0xBEFA4FA4;
284
0
#endif
285
0
    }
286
287
745k
#if defined(MBEDTLS_SHA224_C)
288
745k
    ctx->is224 = is224;
289
745k
#endif
290
291
745k
    return 0;
292
745k
}
293
294
#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
295
static const uint32_t K[] =
296
{
297
    0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
298
    0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
299
    0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
300
    0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
301
    0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
302
    0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
303
    0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
304
    0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
305
    0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
306
    0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
307
    0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
308
    0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
309
    0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
310
    0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
311
    0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
312
    0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
313
};
314
315
#endif
316
317
#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT) || \
318
    defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
319
320
#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
321
#  define mbedtls_internal_sha256_process_many_a64_crypto mbedtls_internal_sha256_process_many
322
#  define mbedtls_internal_sha256_process_a64_crypto      mbedtls_internal_sha256_process
323
#endif
324
325
static size_t mbedtls_internal_sha256_process_many_a64_crypto(
326
    mbedtls_sha256_context *ctx, const uint8_t *msg, size_t len)
327
{
328
    uint32x4_t abcd = vld1q_u32(&ctx->state[0]);
329
    uint32x4_t efgh = vld1q_u32(&ctx->state[4]);
330
331
    size_t processed = 0;
332
333
    for (;
334
         len >= SHA256_BLOCK_SIZE;
335
         processed += SHA256_BLOCK_SIZE,
336
         msg += SHA256_BLOCK_SIZE,
337
         len -= SHA256_BLOCK_SIZE) {
338
        uint32x4_t tmp, abcd_prev;
339
340
        uint32x4_t abcd_orig = abcd;
341
        uint32x4_t efgh_orig = efgh;
342
343
        uint32x4_t sched0 = vreinterpretq_u32_u8(vld1q_u8(msg + 16 * 0));
344
        uint32x4_t sched1 = vreinterpretq_u32_u8(vld1q_u8(msg + 16 * 1));
345
        uint32x4_t sched2 = vreinterpretq_u32_u8(vld1q_u8(msg + 16 * 2));
346
        uint32x4_t sched3 = vreinterpretq_u32_u8(vld1q_u8(msg + 16 * 3));
347
348
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  /* Will be true if not defined */
349
                                               /* Untested on BE */
350
        sched0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched0)));
351
        sched1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched1)));
352
        sched2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched2)));
353
        sched3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched3)));
354
#endif
355
356
        /* Rounds 0 to 3 */
357
        tmp = vaddq_u32(sched0, vld1q_u32(&K[0]));
358
        abcd_prev = abcd;
359
        abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
360
        efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
361
362
        /* Rounds 4 to 7 */
363
        tmp = vaddq_u32(sched1, vld1q_u32(&K[4]));
364
        abcd_prev = abcd;
365
        abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
366
        efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
367
368
        /* Rounds 8 to 11 */
369
        tmp = vaddq_u32(sched2, vld1q_u32(&K[8]));
370
        abcd_prev = abcd;
371
        abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
372
        efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
373
374
        /* Rounds 12 to 15 */
375
        tmp = vaddq_u32(sched3, vld1q_u32(&K[12]));
376
        abcd_prev = abcd;
377
        abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
378
        efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
379
380
        for (int t = 16; t < 64; t += 16) {
381
            /* Rounds t to t + 3 */
382
            sched0 = vsha256su1q_u32(vsha256su0q_u32(sched0, sched1), sched2, sched3);
383
            tmp = vaddq_u32(sched0, vld1q_u32(&K[t]));
384
            abcd_prev = abcd;
385
            abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
386
            efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
387
388
            /* Rounds t + 4 to t + 7 */
389
            sched1 = vsha256su1q_u32(vsha256su0q_u32(sched1, sched2), sched3, sched0);
390
            tmp = vaddq_u32(sched1, vld1q_u32(&K[t + 4]));
391
            abcd_prev = abcd;
392
            abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
393
            efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
394
395
            /* Rounds t + 8 to t + 11 */
396
            sched2 = vsha256su1q_u32(vsha256su0q_u32(sched2, sched3), sched0, sched1);
397
            tmp = vaddq_u32(sched2, vld1q_u32(&K[t + 8]));
398
            abcd_prev = abcd;
399
            abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
400
            efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
401
402
            /* Rounds t + 12 to t + 15 */
403
            sched3 = vsha256su1q_u32(vsha256su0q_u32(sched3, sched0), sched1, sched2);
404
            tmp = vaddq_u32(sched3, vld1q_u32(&K[t + 12]));
405
            abcd_prev = abcd;
406
            abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
407
            efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
408
        }
409
410
        abcd = vaddq_u32(abcd, abcd_orig);
411
        efgh = vaddq_u32(efgh, efgh_orig);
412
    }
413
414
    vst1q_u32(&ctx->state[0], abcd);
415
    vst1q_u32(&ctx->state[4], efgh);
416
417
    return processed;
418
}
419
420
#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
421
/*
422
 * This function is for internal use only if we are building both C and Armv8-A
423
 * versions, otherwise it is renamed to be the public mbedtls_internal_sha256_process()
424
 */
425
static
426
#endif
427
int mbedtls_internal_sha256_process_a64_crypto(mbedtls_sha256_context *ctx,
428
                                               const unsigned char data[SHA256_BLOCK_SIZE])
429
{
430
    return (mbedtls_internal_sha256_process_many_a64_crypto(ctx, data,
431
                                                            SHA256_BLOCK_SIZE) ==
432
            SHA256_BLOCK_SIZE) ? 0 : -1;
433
}
434
435
#endif /* MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT || MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY */
436
437
#if defined(MBEDTLS_POP_TARGET_PRAGMA)
438
#if defined(__clang__)
439
#pragma clang attribute pop
440
#elif defined(__GNUC__)
441
#pragma GCC pop_options
442
#endif
443
#undef MBEDTLS_POP_TARGET_PRAGMA
444
#endif
445
446
#if !defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
447
#define mbedtls_internal_sha256_process_many_c mbedtls_internal_sha256_process_many
448
544k
#define mbedtls_internal_sha256_process_c      mbedtls_internal_sha256_process
449
#endif
450
451
452
#if !defined(MBEDTLS_SHA256_PROCESS_ALT) && \
453
    !defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
454
455
901M
#define  SHR(x, n) (((x) & 0xFFFFFFFF) >> (n))
456
772M
#define ROTR(x, n) (SHR(x, n) | ((x) << (32 - (n))))
457
458
64.3M
#define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^  SHR(x, 3))
459
64.3M
#define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^  SHR(x, 10))
460
461
85.8M
#define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
462
85.8M
#define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
463
464
85.8M
#define F0(x, y, z) (((x) & (y)) | ((z) & ((x) | (y))))
465
85.8M
#define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
466
467
#define R(t)                                                        \
468
64.3M
    (                                                               \
469
64.3M
        local.W[t] = S1(local.W[(t) -  2]) + local.W[(t) -  7] +    \
470
64.3M
                     S0(local.W[(t) - 15]) + local.W[(t) - 16]      \
471
64.3M
    )
472
473
#define P(a, b, c, d, e, f, g, h, x, K)                                      \
474
85.8M
    do                                                              \
475
85.8M
    {                                                               \
476
85.8M
        local.temp1 = (h) + S3(e) + F1((e), (f), (g)) + (K) + (x);    \
477
85.8M
        local.temp2 = S2(a) + F0((a), (b), (c));                      \
478
85.8M
        (d) += local.temp1; (h) = local.temp1 + local.temp2;        \
479
85.8M
    } while (0)
480
481
#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
482
/*
483
 * This function is for internal use only if we are building both C and Armv8
484
 * versions, otherwise it is renamed to be the public mbedtls_internal_sha256_process()
485
 */
486
static
487
#endif
488
int mbedtls_internal_sha256_process_c(mbedtls_sha256_context *ctx,
489
                                      const unsigned char data[SHA256_BLOCK_SIZE])
490
1.34M
{
491
1.34M
    struct {
492
1.34M
        uint32_t temp1, temp2, W[64];
493
1.34M
        uint32_t A[8];
494
1.34M
    } local;
495
496
1.34M
    unsigned int i;
497
498
12.0M
    for (i = 0; i < 8; i++) {
499
10.7M
        local.A[i] = ctx->state[i];
500
10.7M
    }
501
502
1.34M
#if defined(MBEDTLS_SHA256_SMALLER)
503
87.1M
    for (i = 0; i < 64; i++) {
504
85.8M
        if (i < 16) {
505
21.4M
            local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i);
506
64.3M
        } else {
507
64.3M
            R(i);
508
64.3M
        }
509
510
85.8M
        P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
511
85.8M
          local.A[5], local.A[6], local.A[7], local.W[i], K[i]);
512
513
85.8M
        local.temp1 = local.A[7]; local.A[7] = local.A[6];
514
85.8M
        local.A[6] = local.A[5]; local.A[5] = local.A[4];
515
85.8M
        local.A[4] = local.A[3]; local.A[3] = local.A[2];
516
85.8M
        local.A[2] = local.A[1]; local.A[1] = local.A[0];
517
85.8M
        local.A[0] = local.temp1;
518
85.8M
    }
519
#else /* MBEDTLS_SHA256_SMALLER */
520
    for (i = 0; i < 16; i++) {
521
        local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i);
522
    }
523
524
    for (i = 0; i < 16; i += 8) {
525
        P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
526
          local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0]);
527
        P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
528
          local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1]);
529
        P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
530
          local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2]);
531
        P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
532
          local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3]);
533
        P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
534
          local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4]);
535
        P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
536
          local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5]);
537
        P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
538
          local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6]);
539
        P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
540
          local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7]);
541
    }
542
543
    for (i = 16; i < 64; i += 8) {
544
        P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
545
          local.A[5], local.A[6], local.A[7], R(i+0), K[i+0]);
546
        P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
547
          local.A[4], local.A[5], local.A[6], R(i+1), K[i+1]);
548
        P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
549
          local.A[3], local.A[4], local.A[5], R(i+2), K[i+2]);
550
        P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
551
          local.A[2], local.A[3], local.A[4], R(i+3), K[i+3]);
552
        P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
553
          local.A[1], local.A[2], local.A[3], R(i+4), K[i+4]);
554
        P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
555
          local.A[0], local.A[1], local.A[2], R(i+5), K[i+5]);
556
        P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
557
          local.A[7], local.A[0], local.A[1], R(i+6), K[i+6]);
558
        P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
559
          local.A[6], local.A[7], local.A[0], R(i+7), K[i+7]);
560
    }
561
#endif /* MBEDTLS_SHA256_SMALLER */
562
563
12.0M
    for (i = 0; i < 8; i++) {
564
10.7M
        ctx->state[i] += local.A[i];
565
10.7M
    }
566
567
    /* Zeroise buffers and variables to clear sensitive data from memory. */
568
1.34M
    mbedtls_platform_zeroize(&local, sizeof(local));
569
570
1.34M
    return 0;
571
1.34M
}
572
573
#endif /* !MBEDTLS_SHA256_PROCESS_ALT && !MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY */
574
575
576
#if !defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
577
578
static size_t mbedtls_internal_sha256_process_many_c(
579
    mbedtls_sha256_context *ctx, const uint8_t *data, size_t len)
580
520k
{
581
520k
    size_t processed = 0;
582
583
1.06M
    while (len >= SHA256_BLOCK_SIZE) {
584
544k
        if (mbedtls_internal_sha256_process_c(ctx, data) != 0) {
585
0
            return 0;
586
0
        }
587
588
544k
        data += SHA256_BLOCK_SIZE;
589
544k
        len  -= SHA256_BLOCK_SIZE;
590
591
544k
        processed += SHA256_BLOCK_SIZE;
592
544k
    }
593
594
520k
    return processed;
595
520k
}
596
597
#endif /* !MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY */
598
599
600
#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
601
602
static int mbedtls_a64_crypto_sha256_has_support(void)
603
{
604
    static int done = 0;
605
    static int supported = 0;
606
607
    if (!done) {
608
        supported = mbedtls_a64_crypto_sha256_determine_support();
609
        done = 1;
610
    }
611
612
    return supported;
613
}
614
615
static size_t mbedtls_internal_sha256_process_many(mbedtls_sha256_context *ctx,
616
                                                   const uint8_t *msg, size_t len)
617
{
618
    if (mbedtls_a64_crypto_sha256_has_support()) {
619
        return mbedtls_internal_sha256_process_many_a64_crypto(ctx, msg, len);
620
    } else {
621
        return mbedtls_internal_sha256_process_many_c(ctx, msg, len);
622
    }
623
}
624
625
int mbedtls_internal_sha256_process(mbedtls_sha256_context *ctx,
626
                                    const unsigned char data[SHA256_BLOCK_SIZE])
627
{
628
    if (mbedtls_a64_crypto_sha256_has_support()) {
629
        return mbedtls_internal_sha256_process_a64_crypto(ctx, data);
630
    } else {
631
        return mbedtls_internal_sha256_process_c(ctx, data);
632
    }
633
}
634
635
#endif /* MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT */
636
637
638
/*
639
 * SHA-256 process buffer
640
 */
641
int mbedtls_sha256_update(mbedtls_sha256_context *ctx,
642
                          const unsigned char *input,
643
                          size_t ilen)
644
1.63M
{
645
1.63M
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
646
1.63M
    size_t fill;
647
1.63M
    uint32_t left;
648
649
1.63M
    if (ilen == 0) {
650
16
        return 0;
651
16
    }
652
653
1.63M
    left = ctx->total[0] & 0x3F;
654
1.63M
    fill = SHA256_BLOCK_SIZE - left;
655
656
1.63M
    ctx->total[0] += (uint32_t) ilen;
657
1.63M
    ctx->total[0] &= 0xFFFFFFFF;
658
659
1.63M
    if (ctx->total[0] < (uint32_t) ilen) {
660
0
        ctx->total[1]++;
661
0
    }
662
663
1.63M
    if (left && ilen >= fill) {
664
76.5k
        memcpy((void *) (ctx->buffer + left), input, fill);
665
666
76.5k
        if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
667
0
            return ret;
668
0
        }
669
670
76.5k
        input += fill;
671
76.5k
        ilen  -= fill;
672
76.5k
        left = 0;
673
76.5k
    }
674
675
2.15M
    while (ilen >= SHA256_BLOCK_SIZE) {
676
520k
        size_t processed =
677
520k
            mbedtls_internal_sha256_process_many(ctx, input, ilen);
678
520k
        if (processed < SHA256_BLOCK_SIZE) {
679
0
            return MBEDTLS_ERR_ERROR_GENERIC_ERROR;
680
0
        }
681
682
520k
        input += processed;
683
520k
        ilen  -= processed;
684
520k
    }
685
686
1.63M
    if (ilen > 0) {
687
1.04M
        memcpy((void *) (ctx->buffer + left), input, ilen);
688
1.04M
    }
689
690
1.63M
    return 0;
691
1.63M
}
692
693
/*
694
 * SHA-256 final digest
695
 */
696
int mbedtls_sha256_finish(mbedtls_sha256_context *ctx,
697
                          unsigned char *output)
698
719k
{
699
719k
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
700
719k
    uint32_t used;
701
719k
    uint32_t high, low;
702
719k
    int truncated = 0;
703
704
    /*
705
     * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
706
     */
707
719k
    used = ctx->total[0] & 0x3F;
708
709
719k
    ctx->buffer[used++] = 0x80;
710
711
719k
    if (used <= 56) {
712
        /* Enough room for padding + length in current block */
713
719k
        memset(ctx->buffer + used, 0, 56 - used);
714
719k
    } else {
715
        /* We'll need an extra block */
716
0
        memset(ctx->buffer + used, 0, SHA256_BLOCK_SIZE - used);
717
718
0
        if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
719
0
            goto exit;
720
0
        }
721
722
0
        memset(ctx->buffer, 0, 56);
723
0
    }
724
725
    /*
726
     * Add message length
727
     */
728
719k
    high = (ctx->total[0] >> 29)
729
719k
           | (ctx->total[1] <<  3);
730
719k
    low  = (ctx->total[0] <<  3);
731
732
719k
    MBEDTLS_PUT_UINT32_BE(high, ctx->buffer, 56);
733
719k
    MBEDTLS_PUT_UINT32_BE(low,  ctx->buffer, 60);
734
735
719k
    if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
736
0
        goto exit;
737
0
    }
738
739
    /*
740
     * Output final state
741
     */
742
719k
    MBEDTLS_PUT_UINT32_BE(ctx->state[0], output,  0);
743
719k
    MBEDTLS_PUT_UINT32_BE(ctx->state[1], output,  4);
744
719k
    MBEDTLS_PUT_UINT32_BE(ctx->state[2], output,  8);
745
719k
    MBEDTLS_PUT_UINT32_BE(ctx->state[3], output, 12);
746
719k
    MBEDTLS_PUT_UINT32_BE(ctx->state[4], output, 16);
747
719k
    MBEDTLS_PUT_UINT32_BE(ctx->state[5], output, 20);
748
719k
    MBEDTLS_PUT_UINT32_BE(ctx->state[6], output, 24);
749
750
719k
#if defined(MBEDTLS_SHA224_C)
751
719k
    truncated = ctx->is224;
752
719k
#endif
753
719k
    if (!truncated) {
754
719k
        MBEDTLS_PUT_UINT32_BE(ctx->state[7], output, 28);
755
719k
    }
756
757
719k
    ret = 0;
758
759
719k
exit:
760
719k
    mbedtls_sha256_free(ctx);
761
719k
    return ret;
762
719k
}
763
764
#endif /* !MBEDTLS_SHA256_ALT */
765
766
/*
767
 * output = SHA-256( input buffer )
768
 */
769
int mbedtls_sha256(const unsigned char *input,
770
                   size_t ilen,
771
                   unsigned char *output,
772
                   int is224)
773
49.2k
{
774
49.2k
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
775
49.2k
    mbedtls_sha256_context ctx;
776
777
49.2k
#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
778
49.2k
    if (is224 != 0 && is224 != 1) {
779
0
        return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
780
0
    }
781
#elif defined(MBEDTLS_SHA256_C)
782
    if (is224 != 0) {
783
        return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
784
    }
785
#else /* defined MBEDTLS_SHA224_C only */
786
    if (is224 == 0) {
787
        return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
788
    }
789
#endif
790
791
49.2k
    mbedtls_sha256_init(&ctx);
792
793
49.2k
    if ((ret = mbedtls_sha256_starts(&ctx, is224)) != 0) {
794
0
        goto exit;
795
0
    }
796
797
49.2k
    if ((ret = mbedtls_sha256_update(&ctx, input, ilen)) != 0) {
798
0
        goto exit;
799
0
    }
800
801
49.2k
    if ((ret = mbedtls_sha256_finish(&ctx, output)) != 0) {
802
0
        goto exit;
803
0
    }
804
805
49.2k
exit:
806
49.2k
    mbedtls_sha256_free(&ctx);
807
808
49.2k
    return ret;
809
49.2k
}
810
811
#if defined(MBEDTLS_SELF_TEST)
812
/*
813
 * FIPS-180-2 test vectors
814
 */
815
static const unsigned char sha_test_buf[3][57] =
816
{
817
    { "abc" },
818
    { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
819
    { "" }
820
};
821
822
static const size_t sha_test_buflen[3] =
823
{
824
    3, 56, 1000
825
};
826
827
typedef const unsigned char (sha_test_sum_t)[32];
828
829
/*
830
 * SHA-224 test vectors
831
 */
832
#if defined(MBEDTLS_SHA224_C)
833
static sha_test_sum_t sha224_test_sum[] =
834
{
835
    { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
836
      0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
837
      0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
838
      0xE3, 0x6C, 0x9D, 0xA7 },
839
    { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
840
      0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
841
      0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
842
      0x52, 0x52, 0x25, 0x25 },
843
    { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
844
      0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
845
      0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
846
      0x4E, 0xE7, 0xAD, 0x67 }
847
};
848
#endif
849
850
/*
851
 * SHA-256 test vectors
852
 */
853
#if defined(MBEDTLS_SHA256_C)
854
static sha_test_sum_t sha256_test_sum[] =
855
{
856
    { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
857
      0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
858
      0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
859
      0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
860
    { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
861
      0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
862
      0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
863
      0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
864
    { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
865
      0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
866
      0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
867
      0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
868
};
869
#endif
870
871
/*
872
 * Checkup routine
873
 */
874
static int mbedtls_sha256_common_self_test(int verbose, int is224)
875
{
876
    int i, buflen, ret = 0;
877
    unsigned char *buf;
878
    unsigned char sha256sum[32];
879
    mbedtls_sha256_context ctx;
880
881
#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
882
    sha_test_sum_t *sha_test_sum = (is224) ? sha224_test_sum : sha256_test_sum;
883
#elif defined(MBEDTLS_SHA256_C)
884
    sha_test_sum_t *sha_test_sum = sha256_test_sum;
885
#else
886
    sha_test_sum_t *sha_test_sum = sha224_test_sum;
887
#endif
888
889
    buf = mbedtls_calloc(1024, sizeof(unsigned char));
890
    if (NULL == buf) {
891
        if (verbose != 0) {
892
            mbedtls_printf("Buffer allocation failed\n");
893
        }
894
895
        return 1;
896
    }
897
898
    mbedtls_sha256_init(&ctx);
899
900
    for (i = 0; i < 3; i++) {
901
        if (verbose != 0) {
902
            mbedtls_printf("  SHA-%d test #%d: ", 256 - is224 * 32, i + 1);
903
        }
904
905
        if ((ret = mbedtls_sha256_starts(&ctx, is224)) != 0) {
906
            goto fail;
907
        }
908
909
        if (i == 2) {
910
            memset(buf, 'a', buflen = 1000);
911
912
            for (int j = 0; j < 1000; j++) {
913
                ret = mbedtls_sha256_update(&ctx, buf, buflen);
914
                if (ret != 0) {
915
                    goto fail;
916
                }
917
            }
918
919
        } else {
920
            ret = mbedtls_sha256_update(&ctx, sha_test_buf[i],
921
                                        sha_test_buflen[i]);
922
            if (ret != 0) {
923
                goto fail;
924
            }
925
        }
926
927
        if ((ret = mbedtls_sha256_finish(&ctx, sha256sum)) != 0) {
928
            goto fail;
929
        }
930
931
932
        if (memcmp(sha256sum, sha_test_sum[i], 32 - is224 * 4) != 0) {
933
            ret = 1;
934
            goto fail;
935
        }
936
937
        if (verbose != 0) {
938
            mbedtls_printf("passed\n");
939
        }
940
    }
941
942
    if (verbose != 0) {
943
        mbedtls_printf("\n");
944
    }
945
946
    goto exit;
947
948
fail:
949
    if (verbose != 0) {
950
        mbedtls_printf("failed\n");
951
    }
952
953
exit:
954
    mbedtls_sha256_free(&ctx);
955
    mbedtls_free(buf);
956
957
    return ret;
958
}
959
960
#if defined(MBEDTLS_SHA256_C)
961
int mbedtls_sha256_self_test(int verbose)
962
{
963
    return mbedtls_sha256_common_self_test(verbose, 0);
964
}
965
#endif /* MBEDTLS_SHA256_C */
966
967
#if defined(MBEDTLS_SHA224_C)
968
int mbedtls_sha224_self_test(int verbose)
969
{
970
    return mbedtls_sha256_common_self_test(verbose, 1);
971
}
972
#endif /* MBEDTLS_SHA224_C */
973
974
#endif /* MBEDTLS_SELF_TEST */
975
976
#endif /* MBEDTLS_SHA256_C || MBEDTLS_SHA224_C */