blob: 00a01ea3d6e44851cbf0cdd260871bec0ba29c60 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
20 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
21 *
22 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
23 */
24
Jerry Yua135dee2023-02-16 16:56:22 +080025#if defined(__aarch64__) && !defined(__ARM_FEATURE_CRYPTO) && \
Jerry Yu6f86c192023-03-13 11:03:40 +080026 defined(__clang__) && __clang_major__ >= 4
Jerry Yua135dee2023-02-16 16:56:22 +080027/* TODO: Re-consider above after https://reviews.llvm.org/D131064 merged.
28 *
Jerry Yufc2e1282023-02-27 11:16:56 +080029 * The intrinsic declaration are guarded by predefined ACLE macros in clang:
30 * these are normally only enabled by the -march option on the command line.
31 * By defining the macros ourselves we gain access to those declarations without
32 * requiring -march on the command line.
Jerry Yu4d786a72023-02-22 11:01:07 +080033 *
Jerry Yufc2e1282023-02-27 11:16:56 +080034 * `arm_neon.h` could be included by any header file, so we put these defines
35 * at the top of this file, before any includes.
Jerry Yua135dee2023-02-16 16:56:22 +080036 */
37#define __ARM_FEATURE_CRYPTO 1
Jerry Yuae129c32023-03-03 15:55:56 +080038/* See: https://arm-software.github.io/acle/main/acle.html#cryptographic-extensions
39 *
Jerry Yu490bf082023-03-06 15:21:44 +080040 * `__ARM_FEATURE_CRYPTO` is deprecated, but we need to continue to specify it
41 * for older compilers.
Jerry Yuae129c32023-03-03 15:55:56 +080042 */
43#define __ARM_FEATURE_SHA2 1
Dave Rodgmandb6ab242023-03-14 16:03:57 +000044#define MBEDTLS_ENABLE_ARM_CRYPTO_EXTENSIONS_COMPILER_FLAG
Jerry Yu490bf082023-03-06 15:21:44 +080045#endif
Jerry Yua135dee2023-02-16 16:56:22 +080046
Gilles Peskinedb09ef62020-06-03 01:43:33 +020047#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000048
Valerio Settia3f99592022-12-14 10:56:54 +010049#if defined(MBEDTLS_SHA256_C) || defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000050
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000051#include "mbedtls/sha256.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050052#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000053#include "mbedtls/error.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Rich Evans00ab4702015-02-06 13:43:58 +000055#include <string.h>
56
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000057#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010058
Dave Rodgmancc5bf492023-10-03 18:02:56 +010059#if defined(MBEDTLS_ARCH_IS_ARMV8)
Jerry Yu08933d32023-04-27 18:28:00 +080060
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000061# if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT) || \
Gilles Peskine449bd832023-01-11 14:50:10 +010062 defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
Jerry Yu08933d32023-04-27 18:28:00 +080063
Jerry Yu35f2b262023-02-15 11:35:55 +080064/* *INDENT-OFF* */
Jerry Yu6b00f5a2023-05-04 16:30:21 +080065
66# ifdef __ARM_NEON
67# include <arm_neon.h>
68# else
69# error "Target does not support NEON instructions"
70# endif
71
Dave Rodgman793e2642023-10-04 17:36:20 +010072# if !defined(__ARM_FEATURE_CRYPTO) || defined(MBEDTLS_ENABLE_ARM_CRYPTO_EXTENSIONS_COMPILER_FLAG)
Jerry Yub1d06bb2023-05-05 14:05:07 +080073# if defined(__ARMCOMPILER_VERSION)
74# if __ARMCOMPILER_VERSION <= 6090000
75# error "Must use minimum -march=armv8-a+crypto for MBEDTLS_SHA256_USE_A64_CRYPTO_*"
76# endif
77# pragma clang attribute push (__attribute__((target("sha2"))), apply_to=function)
78# define MBEDTLS_POP_TARGET_PRAGMA
79# elif defined(__clang__)
Jerry Yu383cbf42023-02-16 15:16:43 +080080# if __clang_major__ < 4
81# error "A more recent Clang is required for MBEDTLS_SHA256_USE_A64_CRYPTO_*"
Jerry Yu64e5d4a2023-02-15 11:46:57 +080082# endif
Jerry Yub1d06bb2023-05-05 14:05:07 +080083# pragma clang attribute push (__attribute__((target("crypto"))), apply_to=function)
Jerry Yu64e5d4a2023-02-15 11:46:57 +080084# define MBEDTLS_POP_TARGET_PRAGMA
85# elif defined(__GNUC__)
Tom Cosgrovec15a2b92023-03-08 12:55:48 +000086 /* FIXME: GCC 5 claims to support Armv8 Crypto Extensions, but some
87 * intrinsics are missing. Missing intrinsics could be worked around.
Jerry Yu8ae6a012023-02-16 15:16:20 +080088 */
89# if __GNUC__ < 6
Jerry Yu64e5d4a2023-02-15 11:46:57 +080090# error "A more recent GCC is required for MBEDTLS_SHA256_USE_A64_CRYPTO_*"
91# else
Jerry Yu2f2c0492023-02-16 14:24:46 +080092# pragma GCC push_options
Jerry Yu64e5d4a2023-02-15 11:46:57 +080093# pragma GCC target ("arch=armv8-a+crypto")
Jerry Yu2f2c0492023-02-16 14:24:46 +080094# define MBEDTLS_POP_TARGET_PRAGMA
Jerry Yu64e5d4a2023-02-15 11:46:57 +080095# endif
96# else
97# error "Only GCC and Clang supported for MBEDTLS_SHA256_USE_A64_CRYPTO_*"
98# endif
Jerry Yu35f2b262023-02-15 11:35:55 +080099# endif
100/* *INDENT-ON* */
Jerry Yu08933d32023-04-27 18:28:00 +0800101
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000102# endif
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000103# if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
Dave Rodgmanebe42922023-10-04 17:36:44 +0100104# if defined(MBEDTLS_COMPILER_IS_GCC) && !defined(MBEDTLS_ARCH_IS_ARM64)
Dave Rodgman04d0d062023-10-04 18:05:08 +0100105# warning \
106 "GCC only supports aarch64 for MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT, using C code only"
Dave Rodgmanebe42922023-10-04 17:36:44 +0100107# undef MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
108# endif
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000109# if defined(__unix__)
110# if defined(__linux__)
Gilles Peskine449bd832023-01-11 14:50:10 +0100111/* Our preferred method of detection is getauxval() */
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000112# include <sys/auxv.h>
113# endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100114/* Use SIGILL on Unix, and fall back to it on Linux */
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000115# include <signal.h>
116# endif
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000117# endif
Tom Cosgroveb9987fc2022-02-21 12:26:11 +0000118#elif defined(_M_ARM64)
119# if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT) || \
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
Tom Cosgroveb9987fc2022-02-21 12:26:11 +0000121# include <arm64_neon.h>
122# endif
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000123#else
124# undef MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY
125# undef MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
126#endif
127
128#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
129/*
130 * Capability detection code comes early, so we can disable
131 * MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT if no detection mechanism found
132 */
133#if defined(HWCAP_SHA2)
Gilles Peskine449bd832023-01-11 14:50:10 +0100134static int mbedtls_a64_crypto_sha256_determine_support(void)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000135{
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 return (getauxval(AT_HWCAP) & HWCAP_SHA2) ? 1 : 0;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000137}
138#elif defined(__APPLE__)
Gilles Peskine449bd832023-01-11 14:50:10 +0100139static int mbedtls_a64_crypto_sha256_determine_support(void)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000140{
Gilles Peskine449bd832023-01-11 14:50:10 +0100141 return 1;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000142}
Tom Cosgroveb9987fc2022-02-21 12:26:11 +0000143#elif defined(_M_ARM64)
144#define WIN32_LEAN_AND_MEAN
145#include <Windows.h>
146#include <processthreadsapi.h>
147
Gilles Peskine449bd832023-01-11 14:50:10 +0100148static int mbedtls_a64_crypto_sha256_determine_support(void)
Tom Cosgroveb9987fc2022-02-21 12:26:11 +0000149{
Gilles Peskine449bd832023-01-11 14:50:10 +0100150 return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ?
151 1 : 0;
Tom Cosgroveb9987fc2022-02-21 12:26:11 +0000152}
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000153#elif defined(__unix__) && defined(SIG_SETMASK)
154/* Detection with SIGILL, setjmp() and longjmp() */
155#include <signal.h>
156#include <setjmp.h>
157
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000158static jmp_buf return_from_sigill;
159
160/*
161 * A64 SHA256 support detection via SIGILL
162 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100163static void sigill_handler(int signal)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000164{
165 (void) signal;
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 longjmp(return_from_sigill, 1);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000167}
168
Gilles Peskine449bd832023-01-11 14:50:10 +0100169static int mbedtls_a64_crypto_sha256_determine_support(void)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000170{
171 struct sigaction old_action, new_action;
172
173 sigset_t old_mask;
Gilles Peskine449bd832023-01-11 14:50:10 +0100174 if (sigprocmask(0, NULL, &old_mask)) {
175 return 0;
176 }
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 sigemptyset(&new_action.sa_mask);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000179 new_action.sa_flags = 0;
180 new_action.sa_handler = sigill_handler;
181
Gilles Peskine449bd832023-01-11 14:50:10 +0100182 sigaction(SIGILL, &new_action, &old_action);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000183
184 static int ret = 0;
185
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 if (setjmp(return_from_sigill) == 0) { /* First return only */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000187 /* If this traps, we will return a second time from setjmp() with 1 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100188 asm ("sha256h q0, q0, v0.4s" : : : "v0");
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000189 ret = 1;
190 }
191
Gilles Peskine449bd832023-01-11 14:50:10 +0100192 sigaction(SIGILL, &old_action, NULL);
193 sigprocmask(SIG_SETMASK, &old_mask, NULL);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000194
Gilles Peskine449bd832023-01-11 14:50:10 +0100195 return ret;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000196}
197#else
198#warning "No mechanism to detect A64_CRYPTO found, using C code only"
199#undef MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
200#endif /* HWCAP_SHA2, __APPLE__, __unix__ && SIG_SETMASK */
201
202#endif /* MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT */
203
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +0200204#if !defined(MBEDTLS_SHA256_ALT)
205
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000206#define SHA256_BLOCK_SIZE 64
207
Gilles Peskine449bd832023-01-11 14:50:10 +0100208void mbedtls_sha256_init(mbedtls_sha256_context *ctx)
Paul Bakker5b4af392014-06-26 12:09:34 +0200209{
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 memset(ctx, 0, sizeof(mbedtls_sha256_context));
Paul Bakker5b4af392014-06-26 12:09:34 +0200211}
212
Gilles Peskine449bd832023-01-11 14:50:10 +0100213void mbedtls_sha256_free(mbedtls_sha256_context *ctx)
Paul Bakker5b4af392014-06-26 12:09:34 +0200214{
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 if (ctx == NULL) {
Paul Bakker5b4af392014-06-26 12:09:34 +0200216 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100217 }
Paul Bakker5b4af392014-06-26 12:09:34 +0200218
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_sha256_context));
Paul Bakker5b4af392014-06-26 12:09:34 +0200220}
221
Gilles Peskine449bd832023-01-11 14:50:10 +0100222void mbedtls_sha256_clone(mbedtls_sha256_context *dst,
223 const mbedtls_sha256_context *src)
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200224{
225 *dst = *src;
226}
227
Paul Bakker5121ce52009-01-03 21:22:43 +0000228/*
229 * SHA-256 context setup
230 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100231int mbedtls_sha256_starts(mbedtls_sha256_context *ctx, int is224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000232{
Valerio Settia3f99592022-12-14 10:56:54 +0100233#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100234 if (is224 != 0 && is224 != 1) {
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100235 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 }
Valerio Settia3f99592022-12-14 10:56:54 +0100237#elif defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100238 if (is224 != 0) {
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100239 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 }
Valerio Settia3f99592022-12-14 10:56:54 +0100241#else /* defined MBEDTLS_SHA224_C only */
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 if (is224 == 0) {
Valerio Settia3f99592022-12-14 10:56:54 +0100243 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100244 }
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200245#endif
246
Paul Bakker5121ce52009-01-03 21:22:43 +0000247 ctx->total[0] = 0;
248 ctx->total[1] = 0;
249
Gilles Peskine449bd832023-01-11 14:50:10 +0100250 if (is224 == 0) {
Valerio Settia3f99592022-12-14 10:56:54 +0100251#if defined(MBEDTLS_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000252 ctx->state[0] = 0x6A09E667;
253 ctx->state[1] = 0xBB67AE85;
254 ctx->state[2] = 0x3C6EF372;
255 ctx->state[3] = 0xA54FF53A;
256 ctx->state[4] = 0x510E527F;
257 ctx->state[5] = 0x9B05688C;
258 ctx->state[6] = 0x1F83D9AB;
259 ctx->state[7] = 0x5BE0CD19;
Valerio Settia3f99592022-12-14 10:56:54 +0100260#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 } else {
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200262#if defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000263 ctx->state[0] = 0xC1059ED8;
264 ctx->state[1] = 0x367CD507;
265 ctx->state[2] = 0x3070DD17;
266 ctx->state[3] = 0xF70E5939;
267 ctx->state[4] = 0xFFC00B31;
268 ctx->state[5] = 0x68581511;
269 ctx->state[6] = 0x64F98FA7;
270 ctx->state[7] = 0xBEFA4FA4;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200271#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000272 }
273
Valerio Settia3f99592022-12-14 10:56:54 +0100274#if defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000275 ctx->is224 = is224;
Valerio Settia3f99592022-12-14 10:56:54 +0100276#endif
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100277
Gilles Peskine449bd832023-01-11 14:50:10 +0100278 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000279}
280
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200281#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200282static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000283{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200284 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
285 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
286 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
287 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
288 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
289 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
290 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
291 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
292 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
293 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
294 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
295 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
296 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
297 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
298 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
299 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
300};
Paul Bakker5121ce52009-01-03 21:22:43 +0000301
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000302#endif
303
304#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT) || \
305 defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
306
307#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
308# define mbedtls_internal_sha256_process_many_a64_crypto mbedtls_internal_sha256_process_many
309# define mbedtls_internal_sha256_process_a64_crypto mbedtls_internal_sha256_process
310#endif
311
312static size_t mbedtls_internal_sha256_process_many_a64_crypto(
Gilles Peskine449bd832023-01-11 14:50:10 +0100313 mbedtls_sha256_context *ctx, const uint8_t *msg, size_t len)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000314{
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 uint32x4_t abcd = vld1q_u32(&ctx->state[0]);
316 uint32x4_t efgh = vld1q_u32(&ctx->state[4]);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000317
318 size_t processed = 0;
319
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 for (;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000321 len >= SHA256_BLOCK_SIZE;
322 processed += SHA256_BLOCK_SIZE,
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 msg += SHA256_BLOCK_SIZE,
324 len -= SHA256_BLOCK_SIZE) {
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000325 uint32x4_t tmp, abcd_prev;
326
327 uint32x4_t abcd_orig = abcd;
328 uint32x4_t efgh_orig = efgh;
329
Gilles Peskine449bd832023-01-11 14:50:10 +0100330 uint32x4_t sched0 = (uint32x4_t) vld1q_u8(msg + 16 * 0);
331 uint32x4_t sched1 = (uint32x4_t) vld1q_u8(msg + 16 * 1);
332 uint32x4_t sched2 = (uint32x4_t) vld1q_u8(msg + 16 * 2);
333 uint32x4_t sched3 = (uint32x4_t) vld1q_u8(msg + 16 * 3);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000334
335#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ /* Will be true if not defined */
336 /* Untested on BE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 sched0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched0)));
338 sched1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched1)));
339 sched2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched2)));
340 sched3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched3)));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000341#endif
342
343 /* Rounds 0 to 3 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 tmp = vaddq_u32(sched0, vld1q_u32(&K[0]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000345 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100346 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
347 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000348
349 /* Rounds 4 to 7 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100350 tmp = vaddq_u32(sched1, vld1q_u32(&K[4]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000351 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100352 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
353 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000354
355 /* Rounds 8 to 11 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100356 tmp = vaddq_u32(sched2, vld1q_u32(&K[8]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000357 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100358 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
359 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000360
361 /* Rounds 12 to 15 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100362 tmp = vaddq_u32(sched3, vld1q_u32(&K[12]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000363 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100364 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
365 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000366
Gilles Peskine449bd832023-01-11 14:50:10 +0100367 for (int t = 16; t < 64; t += 16) {
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000368 /* Rounds t to t + 3 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100369 sched0 = vsha256su1q_u32(vsha256su0q_u32(sched0, sched1), sched2, sched3);
370 tmp = vaddq_u32(sched0, vld1q_u32(&K[t]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000371 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100372 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
373 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000374
375 /* Rounds t + 4 to t + 7 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100376 sched1 = vsha256su1q_u32(vsha256su0q_u32(sched1, sched2), sched3, sched0);
377 tmp = vaddq_u32(sched1, vld1q_u32(&K[t + 4]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000378 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100379 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
380 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000381
382 /* Rounds t + 8 to t + 11 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100383 sched2 = vsha256su1q_u32(vsha256su0q_u32(sched2, sched3), sched0, sched1);
384 tmp = vaddq_u32(sched2, vld1q_u32(&K[t + 8]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000385 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
387 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000388
389 /* Rounds t + 12 to t + 15 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100390 sched3 = vsha256su1q_u32(vsha256su0q_u32(sched3, sched0), sched1, sched2);
391 tmp = vaddq_u32(sched3, vld1q_u32(&K[t + 12]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000392 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100393 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
394 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000395 }
396
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 abcd = vaddq_u32(abcd, abcd_orig);
398 efgh = vaddq_u32(efgh, efgh_orig);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000399 }
400
Gilles Peskine449bd832023-01-11 14:50:10 +0100401 vst1q_u32(&ctx->state[0], abcd);
402 vst1q_u32(&ctx->state[4], efgh);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000403
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 return processed;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000405}
406
Tom Cosgrovec144ca62022-04-19 13:52:24 +0100407#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
408/*
409 * This function is for internal use only if we are building both C and A64
410 * versions, otherwise it is renamed to be the public mbedtls_internal_sha256_process()
411 */
412static
413#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100414int mbedtls_internal_sha256_process_a64_crypto(mbedtls_sha256_context *ctx,
415 const unsigned char data[SHA256_BLOCK_SIZE])
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000416{
Gilles Peskine449bd832023-01-11 14:50:10 +0100417 return (mbedtls_internal_sha256_process_many_a64_crypto(ctx, data,
418 SHA256_BLOCK_SIZE) ==
419 SHA256_BLOCK_SIZE) ? 0 : -1;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000420}
421
Tom Cosgroveef2aa0e2023-06-09 11:29:50 +0100422#endif /* MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT || MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY */
423
Jerry Yu92fc5382023-02-16 11:17:11 +0800424#if defined(MBEDTLS_POP_TARGET_PRAGMA)
Jerry Yu2f2c0492023-02-16 14:24:46 +0800425#if defined(__clang__)
Jerry Yu92fc5382023-02-16 11:17:11 +0800426#pragma clang attribute pop
Jerry Yu2f2c0492023-02-16 14:24:46 +0800427#elif defined(__GNUC__)
428#pragma GCC pop_options
429#endif
Jerry Yu92fc5382023-02-16 11:17:11 +0800430#undef MBEDTLS_POP_TARGET_PRAGMA
431#endif
432
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000433#if !defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
434#define mbedtls_internal_sha256_process_many_c mbedtls_internal_sha256_process_many
435#define mbedtls_internal_sha256_process_c mbedtls_internal_sha256_process
436#endif
437
438
439#if !defined(MBEDTLS_SHA256_PROCESS_ALT) && \
440 !defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
441
Gilles Peskine449bd832023-01-11 14:50:10 +0100442#define SHR(x, n) (((x) & 0xFFFFFFFF) >> (n))
443#define ROTR(x, n) (SHR(x, n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
Gilles Peskine449bd832023-01-11 14:50:10 +0100445#define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
446#define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
Paul Bakker5121ce52009-01-03 21:22:43 +0000447
Gilles Peskine449bd832023-01-11 14:50:10 +0100448#define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
449#define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
Paul Bakker5121ce52009-01-03 21:22:43 +0000450
Gilles Peskine449bd832023-01-11 14:50:10 +0100451#define F0(x, y, z) (((x) & (y)) | ((z) & ((x) | (y))))
452#define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000453
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200454#define R(t) \
455 ( \
456 local.W[t] = S1(local.W[(t) - 2]) + local.W[(t) - 7] + \
457 S0(local.W[(t) - 15]) + local.W[(t) - 16] \
Hanno Becker1eeca412018-10-15 12:01:35 +0100458 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000459
Gilles Peskine449bd832023-01-11 14:50:10 +0100460#define P(a, b, c, d, e, f, g, h, x, K) \
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200461 do \
462 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100463 local.temp1 = (h) + S3(e) + F1((e), (f), (g)) + (K) + (x); \
464 local.temp2 = S2(a) + F0((a), (b), (c)); \
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200465 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
Gilles Peskine449bd832023-01-11 14:50:10 +0100466 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000467
Tom Cosgrovec144ca62022-04-19 13:52:24 +0100468#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
469/*
470 * This function is for internal use only if we are building both C and A64
471 * versions, otherwise it is renamed to be the public mbedtls_internal_sha256_process()
472 */
473static
474#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100475int mbedtls_internal_sha256_process_c(mbedtls_sha256_context *ctx,
476 const unsigned char data[SHA256_BLOCK_SIZE])
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200477{
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 struct {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200479 uint32_t temp1, temp2, W[64];
480 uint32_t A[8];
481 } local;
482
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200483 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000484
Gilles Peskine449bd832023-01-11 14:50:10 +0100485 for (i = 0; i < 8; i++) {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200486 local.A[i] = ctx->state[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 }
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200488
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200489#if defined(MBEDTLS_SHA256_SMALLER)
Gilles Peskine449bd832023-01-11 14:50:10 +0100490 for (i = 0; i < 64; i++) {
491 if (i < 16) {
492 local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i);
493 } else {
494 R(i);
495 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200496
Gilles Peskine449bd832023-01-11 14:50:10 +0100497 P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
498 local.A[5], local.A[6], local.A[7], local.W[i], K[i]);
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200499
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200500 local.temp1 = local.A[7]; local.A[7] = local.A[6];
501 local.A[6] = local.A[5]; local.A[5] = local.A[4];
502 local.A[4] = local.A[3]; local.A[3] = local.A[2];
503 local.A[2] = local.A[1]; local.A[1] = local.A[0];
504 local.A[0] = local.temp1;
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200505 }
506#else /* MBEDTLS_SHA256_SMALLER */
Gilles Peskine449bd832023-01-11 14:50:10 +0100507 for (i = 0; i < 16; i++) {
508 local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i);
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200509 }
510
Gilles Peskine449bd832023-01-11 14:50:10 +0100511 for (i = 0; i < 16; i += 8) {
512 P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
513 local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0]);
514 P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
515 local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1]);
516 P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
517 local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2]);
518 P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
519 local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3]);
520 P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
521 local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4]);
522 P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
523 local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5]);
524 P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
525 local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6]);
526 P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
527 local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7]);
528 }
529
530 for (i = 16; i < 64; i += 8) {
531 P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
532 local.A[5], local.A[6], local.A[7], R(i+0), K[i+0]);
533 P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
534 local.A[4], local.A[5], local.A[6], R(i+1), K[i+1]);
535 P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
536 local.A[3], local.A[4], local.A[5], R(i+2), K[i+2]);
537 P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
538 local.A[2], local.A[3], local.A[4], R(i+3), K[i+3]);
539 P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
540 local.A[1], local.A[2], local.A[3], R(i+4), K[i+4]);
541 P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
542 local.A[0], local.A[1], local.A[2], R(i+5), K[i+5]);
543 P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
544 local.A[7], local.A[0], local.A[1], R(i+6), K[i+6]);
545 P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
546 local.A[6], local.A[7], local.A[0], R(i+7), K[i+7]);
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200547 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200548#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200549
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 for (i = 0; i < 8; i++) {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200551 ctx->state[i] += local.A[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100552 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100553
gabor-mezei-arm76749ae2020-07-30 16:41:25 +0200554 /* Zeroise buffers and variables to clear sensitive data from memory. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100555 mbedtls_platform_zeroize(&local, sizeof(local));
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100556
Gilles Peskine449bd832023-01-11 14:50:10 +0100557 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000558}
Jaeden Amero041039f2018-02-19 15:28:08 +0000559
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000560#endif /* !MBEDTLS_SHA256_PROCESS_ALT && !MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY */
561
562
563#if !defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
564
565static size_t mbedtls_internal_sha256_process_many_c(
Gilles Peskine449bd832023-01-11 14:50:10 +0100566 mbedtls_sha256_context *ctx, const uint8_t *data, size_t len)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000567{
568 size_t processed = 0;
569
Gilles Peskine449bd832023-01-11 14:50:10 +0100570 while (len >= SHA256_BLOCK_SIZE) {
571 if (mbedtls_internal_sha256_process_c(ctx, data) != 0) {
572 return 0;
573 }
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000574
575 data += SHA256_BLOCK_SIZE;
576 len -= SHA256_BLOCK_SIZE;
577
578 processed += SHA256_BLOCK_SIZE;
579 }
580
Gilles Peskine449bd832023-01-11 14:50:10 +0100581 return processed;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000582}
583
584#endif /* !MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY */
585
586
587#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
588
Gilles Peskine449bd832023-01-11 14:50:10 +0100589static int mbedtls_a64_crypto_sha256_has_support(void)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000590{
591 static int done = 0;
592 static int supported = 0;
593
Gilles Peskine449bd832023-01-11 14:50:10 +0100594 if (!done) {
Tom Cosgrove7e7aba82022-02-24 08:33:11 +0000595 supported = mbedtls_a64_crypto_sha256_determine_support();
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000596 done = 1;
597 }
598
Gilles Peskine449bd832023-01-11 14:50:10 +0100599 return supported;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000600}
601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602static size_t mbedtls_internal_sha256_process_many(mbedtls_sha256_context *ctx,
603 const uint8_t *msg, size_t len)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000604{
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 if (mbedtls_a64_crypto_sha256_has_support()) {
606 return mbedtls_internal_sha256_process_many_a64_crypto(ctx, msg, len);
607 } else {
608 return mbedtls_internal_sha256_process_many_c(ctx, msg, len);
609 }
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000610}
611
Gilles Peskine449bd832023-01-11 14:50:10 +0100612int mbedtls_internal_sha256_process(mbedtls_sha256_context *ctx,
613 const unsigned char data[SHA256_BLOCK_SIZE])
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000614{
Gilles Peskine449bd832023-01-11 14:50:10 +0100615 if (mbedtls_a64_crypto_sha256_has_support()) {
616 return mbedtls_internal_sha256_process_a64_crypto(ctx, data);
617 } else {
618 return mbedtls_internal_sha256_process_c(ctx, data);
619 }
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000620}
621
622#endif /* MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT */
623
Paul Bakker5121ce52009-01-03 21:22:43 +0000624
625/*
626 * SHA-256 process buffer
627 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100628int mbedtls_sha256_update(mbedtls_sha256_context *ctx,
629 const unsigned char *input,
630 size_t ilen)
Paul Bakker5121ce52009-01-03 21:22:43 +0000631{
Janos Follath24eed8d2019-11-22 13:21:35 +0000632 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23986e52011-04-24 08:57:21 +0000633 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000634 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000635
Gilles Peskine449bd832023-01-11 14:50:10 +0100636 if (ilen == 0) {
637 return 0;
638 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000639
640 left = ctx->total[0] & 0x3F;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000641 fill = SHA256_BLOCK_SIZE - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000642
Paul Bakker5c2364c2012-10-01 14:41:15 +0000643 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000644 ctx->total[0] &= 0xFFFFFFFF;
645
Gilles Peskine449bd832023-01-11 14:50:10 +0100646 if (ctx->total[0] < (uint32_t) ilen) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000647 ctx->total[1]++;
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000649
Gilles Peskine449bd832023-01-11 14:50:10 +0100650 if (left && ilen >= fill) {
651 memcpy((void *) (ctx->buffer + left), input, fill);
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100652
Gilles Peskine449bd832023-01-11 14:50:10 +0100653 if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
654 return ret;
655 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100656
Paul Bakker5121ce52009-01-03 21:22:43 +0000657 input += fill;
658 ilen -= fill;
659 left = 0;
660 }
661
Gilles Peskine449bd832023-01-11 14:50:10 +0100662 while (ilen >= SHA256_BLOCK_SIZE) {
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000663 size_t processed =
Gilles Peskine449bd832023-01-11 14:50:10 +0100664 mbedtls_internal_sha256_process_many(ctx, input, ilen);
665 if (processed < SHA256_BLOCK_SIZE) {
666 return MBEDTLS_ERR_ERROR_GENERIC_ERROR;
667 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100668
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000669 input += processed;
670 ilen -= processed;
Paul Bakker5121ce52009-01-03 21:22:43 +0000671 }
672
Gilles Peskine449bd832023-01-11 14:50:10 +0100673 if (ilen > 0) {
674 memcpy((void *) (ctx->buffer + left), input, ilen);
675 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100676
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000678}
679
Paul Bakker5121ce52009-01-03 21:22:43 +0000680/*
681 * SHA-256 final digest
682 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100683int mbedtls_sha256_finish(mbedtls_sha256_context *ctx,
684 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +0000685{
Janos Follath24eed8d2019-11-22 13:21:35 +0000686 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200687 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000688 uint32_t high, low;
Dave Rodgman90330a42023-09-28 17:24:06 +0100689 int truncated = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000690
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200691 /*
692 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
693 */
694 used = ctx->total[0] & 0x3F;
695
696 ctx->buffer[used++] = 0x80;
697
Gilles Peskine449bd832023-01-11 14:50:10 +0100698 if (used <= 56) {
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200699 /* Enough room for padding + length in current block */
Gilles Peskine449bd832023-01-11 14:50:10 +0100700 memset(ctx->buffer + used, 0, 56 - used);
701 } else {
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200702 /* We'll need an extra block */
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 memset(ctx->buffer + used, 0, SHA256_BLOCK_SIZE - used);
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200704
Gilles Peskine449bd832023-01-11 14:50:10 +0100705 if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
Dave Rodgmanaafd1e02023-09-11 12:59:36 +0100706 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100707 }
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200708
Gilles Peskine449bd832023-01-11 14:50:10 +0100709 memset(ctx->buffer, 0, 56);
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200710 }
711
712 /*
713 * Add message length
714 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 high = (ctx->total[0] >> 29)
716 | (ctx->total[1] << 3);
717 low = (ctx->total[0] << 3);
Paul Bakker5121ce52009-01-03 21:22:43 +0000718
Gilles Peskine449bd832023-01-11 14:50:10 +0100719 MBEDTLS_PUT_UINT32_BE(high, ctx->buffer, 56);
720 MBEDTLS_PUT_UINT32_BE(low, ctx->buffer, 60);
Paul Bakker5121ce52009-01-03 21:22:43 +0000721
Gilles Peskine449bd832023-01-11 14:50:10 +0100722 if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
Dave Rodgmanaafd1e02023-09-11 12:59:36 +0100723 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100724 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100725
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200726 /*
727 * Output final state
728 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100729 MBEDTLS_PUT_UINT32_BE(ctx->state[0], output, 0);
730 MBEDTLS_PUT_UINT32_BE(ctx->state[1], output, 4);
731 MBEDTLS_PUT_UINT32_BE(ctx->state[2], output, 8);
732 MBEDTLS_PUT_UINT32_BE(ctx->state[3], output, 12);
733 MBEDTLS_PUT_UINT32_BE(ctx->state[4], output, 16);
734 MBEDTLS_PUT_UINT32_BE(ctx->state[5], output, 20);
735 MBEDTLS_PUT_UINT32_BE(ctx->state[6], output, 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000736
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200737#if defined(MBEDTLS_SHA224_C)
David Horstmann687262c2022-10-06 17:54:57 +0100738 truncated = ctx->is224;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200739#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 if (!truncated) {
741 MBEDTLS_PUT_UINT32_BE(ctx->state[7], output, 28);
742 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100743
Dave Rodgmanaafd1e02023-09-11 12:59:36 +0100744 ret = 0;
745
746exit:
747 mbedtls_sha256_free(ctx);
748 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000749}
750
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200751#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200752
Paul Bakker5121ce52009-01-03 21:22:43 +0000753/*
754 * output = SHA-256( input buffer )
755 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100756int mbedtls_sha256(const unsigned char *input,
757 size_t ilen,
758 unsigned char *output,
759 int is224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000760{
Janos Follath24eed8d2019-11-22 13:21:35 +0000761 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200762 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000763
Valerio Settia3f99592022-12-14 10:56:54 +0100764#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100765 if (is224 != 0 && is224 != 1) {
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100766 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100767 }
Valerio Settia3f99592022-12-14 10:56:54 +0100768#elif defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100769 if (is224 != 0) {
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100770 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100771 }
Valerio Settia3f99592022-12-14 10:56:54 +0100772#else /* defined MBEDTLS_SHA224_C only */
Gilles Peskine449bd832023-01-11 14:50:10 +0100773 if (is224 == 0) {
Valerio Settia3f99592022-12-14 10:56:54 +0100774 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100775 }
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200776#endif
777
Gilles Peskine449bd832023-01-11 14:50:10 +0100778 mbedtls_sha256_init(&ctx);
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100779
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 if ((ret = mbedtls_sha256_starts(&ctx, is224)) != 0) {
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100781 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100783
Gilles Peskine449bd832023-01-11 14:50:10 +0100784 if ((ret = mbedtls_sha256_update(&ctx, input, ilen)) != 0) {
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100785 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100786 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100787
Gilles Peskine449bd832023-01-11 14:50:10 +0100788 if ((ret = mbedtls_sha256_finish(&ctx, output)) != 0) {
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100789 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100791
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100792exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100793 mbedtls_sha256_free(&ctx);
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100794
Gilles Peskine449bd832023-01-11 14:50:10 +0100795 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000796}
797
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000799/*
800 * FIPS-180-2 test vectors
801 */
Valerio Settia3f99592022-12-14 10:56:54 +0100802static const unsigned char sha_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000803{
804 { "abc" },
805 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
806 { "" }
807};
808
Valerio Settia3f99592022-12-14 10:56:54 +0100809static const size_t sha_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000810{
811 3, 56, 1000
812};
813
Valerio Settia3f99592022-12-14 10:56:54 +0100814typedef const unsigned char (sha_test_sum_t)[32];
815
816/*
817 * SHA-224 test vectors
818 */
819#if defined(MBEDTLS_SHA224_C)
820static sha_test_sum_t sha224_test_sum[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000821{
Paul Bakker5121ce52009-01-03 21:22:43 +0000822 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
823 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
824 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
825 0xE3, 0x6C, 0x9D, 0xA7 },
826 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
827 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
828 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
829 0x52, 0x52, 0x25, 0x25 },
830 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
831 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
832 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
Valerio Settia3f99592022-12-14 10:56:54 +0100833 0x4E, 0xE7, 0xAD, 0x67 }
834};
835#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000836
Valerio Settia3f99592022-12-14 10:56:54 +0100837/*
838 * SHA-256 test vectors
839 */
840#if defined(MBEDTLS_SHA256_C)
841static sha_test_sum_t sha256_test_sum[] =
842{
Paul Bakker5121ce52009-01-03 21:22:43 +0000843 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
844 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
845 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
846 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
847 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
848 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
849 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
850 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
851 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
852 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
853 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
854 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
855};
Valerio Settia3f99592022-12-14 10:56:54 +0100856#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000857
858/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000859 * Checkup routine
860 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100861static int mbedtls_sha256_common_self_test(int verbose, int is224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000862{
Valerio Settia3f99592022-12-14 10:56:54 +0100863 int i, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500864 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200865 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200866 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000867
Valerio Settia3f99592022-12-14 10:56:54 +0100868#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100869 sha_test_sum_t *sha_test_sum = (is224) ? sha224_test_sum : sha256_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100870#elif defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 sha_test_sum_t *sha_test_sum = sha256_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100872#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100873 sha_test_sum_t *sha_test_sum = sha224_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100874#endif
875
Gilles Peskine449bd832023-01-11 14:50:10 +0100876 buf = mbedtls_calloc(1024, sizeof(unsigned char));
877 if (NULL == buf) {
878 if (verbose != 0) {
879 mbedtls_printf("Buffer allocation failed\n");
880 }
Russ Butlerbb83b422016-10-12 17:36:50 -0500881
Gilles Peskine449bd832023-01-11 14:50:10 +0100882 return 1;
Russ Butlerbb83b422016-10-12 17:36:50 -0500883 }
884
Gilles Peskine449bd832023-01-11 14:50:10 +0100885 mbedtls_sha256_init(&ctx);
Paul Bakker5b4af392014-06-26 12:09:34 +0200886
Gilles Peskine449bd832023-01-11 14:50:10 +0100887 for (i = 0; i < 3; i++) {
888 if (verbose != 0) {
889 mbedtls_printf(" SHA-%d test #%d: ", 256 - is224 * 32, i + 1);
890 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000891
Gilles Peskine449bd832023-01-11 14:50:10 +0100892 if ((ret = mbedtls_sha256_starts(&ctx, is224)) != 0) {
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100893 goto fail;
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000895
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 if (i == 2) {
897 memset(buf, 'a', buflen = 1000);
Paul Bakker5121ce52009-01-03 21:22:43 +0000898
Gilles Peskine449bd832023-01-11 14:50:10 +0100899 for (int j = 0; j < 1000; j++) {
900 ret = mbedtls_sha256_update(&ctx, buf, buflen);
901 if (ret != 0) {
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100902 goto fail;
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 }
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100904 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100905
Gilles Peskine449bd832023-01-11 14:50:10 +0100906 } else {
907 ret = mbedtls_sha256_update(&ctx, sha_test_buf[i],
908 sha_test_buflen[i]);
909 if (ret != 0) {
910 goto fail;
911 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100912 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000913
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 if ((ret = mbedtls_sha256_finish(&ctx, sha256sum)) != 0) {
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100915 goto fail;
Gilles Peskine449bd832023-01-11 14:50:10 +0100916 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100917
Paul Bakker5121ce52009-01-03 21:22:43 +0000918
Gilles Peskine449bd832023-01-11 14:50:10 +0100919 if (memcmp(sha256sum, sha_test_sum[i], 32 - is224 * 4) != 0) {
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100920 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100921 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100922 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000923
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 if (verbose != 0) {
925 mbedtls_printf("passed\n");
926 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000927 }
928
Gilles Peskine449bd832023-01-11 14:50:10 +0100929 if (verbose != 0) {
930 mbedtls_printf("\n");
931 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000932
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100933 goto exit;
934
935fail:
Gilles Peskine449bd832023-01-11 14:50:10 +0100936 if (verbose != 0) {
937 mbedtls_printf("failed\n");
938 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100939
Paul Bakker5b4af392014-06-26 12:09:34 +0200940exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 mbedtls_sha256_free(&ctx);
942 mbedtls_free(buf);
Paul Bakker5b4af392014-06-26 12:09:34 +0200943
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000945}
946
Valerio Settia3f99592022-12-14 10:56:54 +0100947#if defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100948int mbedtls_sha256_self_test(int verbose)
Valerio Settia3f99592022-12-14 10:56:54 +0100949{
Gilles Peskine449bd832023-01-11 14:50:10 +0100950 return mbedtls_sha256_common_self_test(verbose, 0);
Valerio Settia3f99592022-12-14 10:56:54 +0100951}
952#endif /* MBEDTLS_SHA256_C */
953
954#if defined(MBEDTLS_SHA224_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100955int mbedtls_sha224_self_test(int verbose)
Valerio Settia3f99592022-12-14 10:56:54 +0100956{
Gilles Peskine449bd832023-01-11 14:50:10 +0100957 return mbedtls_sha256_common_self_test(verbose, 1);
Valerio Settia3f99592022-12-14 10:56:54 +0100958}
959#endif /* MBEDTLS_SHA224_C */
960
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200961#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000962
Valerio Settia3f99592022-12-14 10:56:54 +0100963#endif /* MBEDTLS_SHA256_C || MBEDTLS_SHA224_C */