blob: 8b2c34526ba3cf2f7865ea8f8bcae19202574cee [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
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker5121ce52009-01-03 21:22:43 +00006 */
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
Dave Rodgman8ba9f422023-10-08 10:46:25 +010013#if defined(__clang__) && (__clang_major__ >= 4)
14
Dave Rodgmanfe9fda82023-10-10 14:51:06 +010015/* Ideally, we would simply use MBEDTLS_ARCH_IS_ARMV8_A in the following #if,
Dave Rodgman8ba9f422023-10-08 10:46:25 +010016 * but that is defined by build_info.h, and we need this block to happen first. */
Dave Rodgmanfe9fda82023-10-10 14:51:06 +010017#if defined(__ARM_ARCH) && (__ARM_ARCH_PROFILE == 'A')
Dave Rodgman8ba9f422023-10-08 10:46:25 +010018#if __ARM_ARCH >= 8
Dave Rodgmanfe9fda82023-10-10 14:51:06 +010019#define MBEDTLS_SHA256_ARCH_IS_ARMV8_A
Dave Rodgman8ba9f422023-10-08 10:46:25 +010020#endif
21#endif
22
Dave Rodgmanfe9fda82023-10-10 14:51:06 +010023#if defined(MBEDTLS_SHA256_ARCH_IS_ARMV8_A) && !defined(__ARM_FEATURE_CRYPTO)
Jerry Yua135dee2023-02-16 16:56:22 +080024/* TODO: Re-consider above after https://reviews.llvm.org/D131064 merged.
25 *
Jerry Yufc2e1282023-02-27 11:16:56 +080026 * 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.
Jerry Yu4d786a72023-02-22 11:01:07 +080030 *
Dave Rodgmana0f10da2023-09-05 11:43:17 +010031 * `arm_neon.h` is included by common.h, so we put these defines
Jerry Yufc2e1282023-02-27 11:16:56 +080032 * at the top of this file, before any includes.
Jerry Yua135dee2023-02-16 16:56:22 +080033 */
34#define __ARM_FEATURE_CRYPTO 1
Jerry Yuae129c32023-03-03 15:55:56 +080035/* See: https://arm-software.github.io/acle/main/acle.html#cryptographic-extensions
36 *
Jerry Yu490bf082023-03-06 15:21:44 +080037 * `__ARM_FEATURE_CRYPTO` is deprecated, but we need to continue to specify it
38 * for older compilers.
Jerry Yuae129c32023-03-03 15:55:56 +080039 */
40#define __ARM_FEATURE_SHA2 1
Dave Rodgmandb6ab242023-03-14 16:03:57 +000041#define MBEDTLS_ENABLE_ARM_CRYPTO_EXTENSIONS_COMPILER_FLAG
Jerry Yu490bf082023-03-06 15:21:44 +080042#endif
Jerry Yua135dee2023-02-16 16:56:22 +080043
Dave Rodgman8ba9f422023-10-08 10:46:25 +010044#endif /* defined(__clang__) && (__clang_major__ >= 4) */
45
Dave Rodgman7ed619d2023-10-05 09:39:56 +010046/* Ensure that SIG_SETMASK is defined when -std=c99 is used. */
nilesh.kale2a0a6282024-04-02 18:10:39 +053047#if !defined(_GNU_SOURCE)
Dave Rodgman7ed619d2023-10-05 09:39:56 +010048#define _GNU_SOURCE
nilesh.kale2a0a6282024-04-02 18:10:39 +053049#endif
Dave Rodgman7ed619d2023-10-05 09:39:56 +010050
Gilles Peskinedb09ef62020-06-03 01:43:33 +020051#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000052
Valerio Settia3f99592022-12-14 10:56:54 +010053#if defined(MBEDTLS_SHA256_C) || defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000055#include "mbedtls/sha256.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050056#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000057#include "mbedtls/error.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000058
Rich Evans00ab4702015-02-06 13:43:58 +000059#include <string.h>
60
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000061#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010062
Dave Rodgmanfe9fda82023-10-10 14:51:06 +010063#if defined(MBEDTLS_ARCH_IS_ARMV8_A)
Jerry Yu08933d32023-04-27 18:28:00 +080064
Dave Rodgman5b89c552023-10-10 14:59:02 +010065# if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT) || \
66 defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
Dave Rodgman6e51abf2023-10-25 15:17:11 +010067# if !defined(MBEDTLS_HAVE_NEON_INTRINSICS)
Dave Rodgman5b89c552023-10-10 14:59:02 +010068# if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
Dave Rodgman3ba9ce32023-10-05 09:58:33 +010069# warning "Target does not support NEON instructions"
Dave Rodgman5b89c552023-10-10 14:59:02 +010070# undef MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT
Dave Rodgman3ba9ce32023-10-05 09:58:33 +010071# else
72# error "Target does not support NEON instructions"
73# endif
74# endif
Jerry Yu6b00f5a2023-05-04 16:30:21 +080075# endif
76
Dave Rodgman5b89c552023-10-10 14:59:02 +010077# if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT) || \
78 defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
Dave Rodgman790370b2023-10-05 11:01:31 +010079/* *INDENT-OFF* */
80
Dave Rodgman793e2642023-10-04 17:36:20 +010081# if !defined(__ARM_FEATURE_CRYPTO) || defined(MBEDTLS_ENABLE_ARM_CRYPTO_EXTENSIONS_COMPILER_FLAG)
Jerry Yub1d06bb2023-05-05 14:05:07 +080082# if defined(__ARMCOMPILER_VERSION)
83# if __ARMCOMPILER_VERSION <= 6090000
Dave Rodgman5b89c552023-10-10 14:59:02 +010084# error "Must use minimum -march=armv8-a+crypto for MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_*"
Jerry Yub1d06bb2023-05-05 14:05:07 +080085# endif
86# pragma clang attribute push (__attribute__((target("sha2"))), apply_to=function)
87# define MBEDTLS_POP_TARGET_PRAGMA
88# elif defined(__clang__)
Jerry Yu383cbf42023-02-16 15:16:43 +080089# if __clang_major__ < 4
Dave Rodgman5b89c552023-10-10 14:59:02 +010090# error "A more recent Clang is required for MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_*"
Jerry Yu64e5d4a2023-02-15 11:46:57 +080091# endif
Jerry Yub1d06bb2023-05-05 14:05:07 +080092# pragma clang attribute push (__attribute__((target("crypto"))), apply_to=function)
Jerry Yu64e5d4a2023-02-15 11:46:57 +080093# define MBEDTLS_POP_TARGET_PRAGMA
94# elif defined(__GNUC__)
Tom Cosgrovec15a2b92023-03-08 12:55:48 +000095 /* FIXME: GCC 5 claims to support Armv8 Crypto Extensions, but some
96 * intrinsics are missing. Missing intrinsics could be worked around.
Jerry Yu8ae6a012023-02-16 15:16:20 +080097 */
98# if __GNUC__ < 6
Dave Rodgman5b89c552023-10-10 14:59:02 +010099# error "A more recent GCC is required for MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_*"
Jerry Yu64e5d4a2023-02-15 11:46:57 +0800100# else
Jerry Yu2f2c0492023-02-16 14:24:46 +0800101# pragma GCC push_options
Jerry Yu64e5d4a2023-02-15 11:46:57 +0800102# pragma GCC target ("arch=armv8-a+crypto")
Jerry Yu2f2c0492023-02-16 14:24:46 +0800103# define MBEDTLS_POP_TARGET_PRAGMA
Jerry Yu64e5d4a2023-02-15 11:46:57 +0800104# endif
105# else
Dave Rodgman5b89c552023-10-10 14:59:02 +0100106# error "Only GCC and Clang supported for MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_*"
Jerry Yu64e5d4a2023-02-15 11:46:57 +0800107# endif
Jerry Yu35f2b262023-02-15 11:35:55 +0800108# endif
109/* *INDENT-ON* */
Jerry Yu08933d32023-04-27 18:28:00 +0800110
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000111# endif
Dave Rodgman5b89c552023-10-10 14:59:02 +0100112# if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000113# if defined(__unix__)
114# if defined(__linux__)
Gilles Peskine449bd832023-01-11 14:50:10 +0100115/* Our preferred method of detection is getauxval() */
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000116# include <sys/auxv.h>
Dave Rodgman66d55122023-10-23 15:12:32 +0100117/* These are not always defined via sys/auxv.h */
118# if !defined(HWCAP_SHA2)
119# define HWCAP_SHA2 (1 << 6)
120# endif
121# if !defined(HWCAP2_SHA2)
122# define HWCAP2_SHA2 (1 << 3)
123# endif
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000124# endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100125/* Use SIGILL on Unix, and fall back to it on Linux */
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000126# include <signal.h>
127# endif
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000128# endif
Dave Rodgman0a487172023-09-15 11:52:06 +0100129#elif !defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
Dave Rodgman5b89c552023-10-10 14:59:02 +0100130# undef MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY
131# undef MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000132#endif
133
Dave Rodgman5b89c552023-10-10 14:59:02 +0100134#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000135/*
136 * Capability detection code comes early, so we can disable
Dave Rodgman5b89c552023-10-10 14:59:02 +0100137 * MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT if no detection mechanism found
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000138 */
Dave Rodgman5d4ef832023-10-10 13:04:07 +0100139#if defined(MBEDTLS_ARCH_IS_ARM64) && defined(HWCAP_SHA2)
Gilles Peskine449bd832023-01-11 14:50:10 +0100140static int mbedtls_a64_crypto_sha256_determine_support(void)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000141{
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 return (getauxval(AT_HWCAP) & HWCAP_SHA2) ? 1 : 0;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000143}
Dave Rodgman5d4ef832023-10-10 13:04:07 +0100144#elif defined(MBEDTLS_ARCH_IS_ARM32) && defined(HWCAP2_SHA2)
145static int mbedtls_a64_crypto_sha256_determine_support(void)
146{
147 return (getauxval(AT_HWCAP2) & HWCAP2_SHA2) ? 1 : 0;
148}
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000149#elif defined(__APPLE__)
Gilles Peskine449bd832023-01-11 14:50:10 +0100150static int mbedtls_a64_crypto_sha256_determine_support(void)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000151{
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 return 1;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000153}
Dave Rodgman0a487172023-09-15 11:52:06 +0100154#elif defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
Tom Cosgroveb9987fc2022-02-21 12:26:11 +0000155#define WIN32_LEAN_AND_MEAN
156#include <Windows.h>
157#include <processthreadsapi.h>
158
Gilles Peskine449bd832023-01-11 14:50:10 +0100159static int mbedtls_a64_crypto_sha256_determine_support(void)
Tom Cosgroveb9987fc2022-02-21 12:26:11 +0000160{
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ?
162 1 : 0;
Tom Cosgroveb9987fc2022-02-21 12:26:11 +0000163}
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000164#elif defined(__unix__) && defined(SIG_SETMASK)
165/* Detection with SIGILL, setjmp() and longjmp() */
166#include <signal.h>
167#include <setjmp.h>
168
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000169static jmp_buf return_from_sigill;
170
171/*
Dave Rodgman4fd868e2023-10-12 09:09:42 +0100172 * Armv8-A SHA256 support detection via SIGILL
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000173 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100174static void sigill_handler(int signal)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000175{
176 (void) signal;
Gilles Peskine449bd832023-01-11 14:50:10 +0100177 longjmp(return_from_sigill, 1);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000178}
179
Gilles Peskine449bd832023-01-11 14:50:10 +0100180static int mbedtls_a64_crypto_sha256_determine_support(void)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000181{
182 struct sigaction old_action, new_action;
183
184 sigset_t old_mask;
Gilles Peskine449bd832023-01-11 14:50:10 +0100185 if (sigprocmask(0, NULL, &old_mask)) {
186 return 0;
187 }
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000188
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 sigemptyset(&new_action.sa_mask);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000190 new_action.sa_flags = 0;
191 new_action.sa_handler = sigill_handler;
192
Gilles Peskine449bd832023-01-11 14:50:10 +0100193 sigaction(SIGILL, &new_action, &old_action);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000194
195 static int ret = 0;
196
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 if (setjmp(return_from_sigill) == 0) { /* First return only */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000198 /* If this traps, we will return a second time from setjmp() with 1 */
Dave Rodgman7ed619d2023-10-05 09:39:56 +0100199#if defined(MBEDTLS_ARCH_IS_ARM64)
Dave Rodgman78d78462023-10-10 09:53:44 +0100200 asm volatile ("sha256h q0, q0, v0.4s" : : : "v0");
Dave Rodgman7ed619d2023-10-05 09:39:56 +0100201#else
Dave Rodgman78d78462023-10-10 09:53:44 +0100202 asm volatile ("sha256h.32 q0, q0, q0" : : : "q0");
Dave Rodgman7ed619d2023-10-05 09:39:56 +0100203#endif
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000204 ret = 1;
205 }
206
Gilles Peskine449bd832023-01-11 14:50:10 +0100207 sigaction(SIGILL, &old_action, NULL);
208 sigprocmask(SIG_SETMASK, &old_mask, NULL);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000209
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 return ret;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000211}
212#else
Dave Rodgman94a634d2023-10-10 12:59:29 +0100213#warning "No mechanism to detect ARMV8_CRYPTO found, using C code only"
Dave Rodgman5b89c552023-10-10 14:59:02 +0100214#undef MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000215#endif /* HWCAP_SHA2, __APPLE__, __unix__ && SIG_SETMASK */
216
Dave Rodgman5b89c552023-10-10 14:59:02 +0100217#endif /* MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000218
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +0200219#if !defined(MBEDTLS_SHA256_ALT)
220
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000221#define SHA256_BLOCK_SIZE 64
222
Gilles Peskine449bd832023-01-11 14:50:10 +0100223void mbedtls_sha256_init(mbedtls_sha256_context *ctx)
Paul Bakker5b4af392014-06-26 12:09:34 +0200224{
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 memset(ctx, 0, sizeof(mbedtls_sha256_context));
Paul Bakker5b4af392014-06-26 12:09:34 +0200226}
227
Gilles Peskine449bd832023-01-11 14:50:10 +0100228void mbedtls_sha256_free(mbedtls_sha256_context *ctx)
Paul Bakker5b4af392014-06-26 12:09:34 +0200229{
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 if (ctx == NULL) {
Paul Bakker5b4af392014-06-26 12:09:34 +0200231 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100232 }
Paul Bakker5b4af392014-06-26 12:09:34 +0200233
Gilles Peskine449bd832023-01-11 14:50:10 +0100234 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_sha256_context));
Paul Bakker5b4af392014-06-26 12:09:34 +0200235}
236
Gilles Peskine449bd832023-01-11 14:50:10 +0100237void mbedtls_sha256_clone(mbedtls_sha256_context *dst,
238 const mbedtls_sha256_context *src)
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200239{
240 *dst = *src;
241}
242
Paul Bakker5121ce52009-01-03 21:22:43 +0000243/*
244 * SHA-256 context setup
245 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100246int mbedtls_sha256_starts(mbedtls_sha256_context *ctx, int is224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000247{
Valerio Settia3f99592022-12-14 10:56:54 +0100248#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 if (is224 != 0 && is224 != 1) {
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100250 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 }
Valerio Settia3f99592022-12-14 10:56:54 +0100252#elif defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100253 if (is224 != 0) {
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100254 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 }
Valerio Settia3f99592022-12-14 10:56:54 +0100256#else /* defined MBEDTLS_SHA224_C only */
Gilles Peskine449bd832023-01-11 14:50:10 +0100257 if (is224 == 0) {
Valerio Settia3f99592022-12-14 10:56:54 +0100258 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100259 }
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200260#endif
261
Paul Bakker5121ce52009-01-03 21:22:43 +0000262 ctx->total[0] = 0;
263 ctx->total[1] = 0;
264
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 if (is224 == 0) {
Valerio Settia3f99592022-12-14 10:56:54 +0100266#if defined(MBEDTLS_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000267 ctx->state[0] = 0x6A09E667;
268 ctx->state[1] = 0xBB67AE85;
269 ctx->state[2] = 0x3C6EF372;
270 ctx->state[3] = 0xA54FF53A;
271 ctx->state[4] = 0x510E527F;
272 ctx->state[5] = 0x9B05688C;
273 ctx->state[6] = 0x1F83D9AB;
274 ctx->state[7] = 0x5BE0CD19;
Valerio Settia3f99592022-12-14 10:56:54 +0100275#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 } else {
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200277#if defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000278 ctx->state[0] = 0xC1059ED8;
279 ctx->state[1] = 0x367CD507;
280 ctx->state[2] = 0x3070DD17;
281 ctx->state[3] = 0xF70E5939;
282 ctx->state[4] = 0xFFC00B31;
283 ctx->state[5] = 0x68581511;
284 ctx->state[6] = 0x64F98FA7;
285 ctx->state[7] = 0xBEFA4FA4;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200286#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000287 }
288
Valerio Settia3f99592022-12-14 10:56:54 +0100289#if defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000290 ctx->is224 = is224;
Valerio Settia3f99592022-12-14 10:56:54 +0100291#endif
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100292
Gilles Peskine449bd832023-01-11 14:50:10 +0100293 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000294}
295
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200296#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200297static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000298{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200299 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
300 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
301 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
302 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
303 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
304 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
305 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
306 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
307 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
308 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
309 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
310 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
311 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
312 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
313 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
314 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
315};
Paul Bakker5121ce52009-01-03 21:22:43 +0000316
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000317#endif
318
Dave Rodgman5b89c552023-10-10 14:59:02 +0100319#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT) || \
320 defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000321
Dave Rodgman5b89c552023-10-10 14:59:02 +0100322#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000323# define mbedtls_internal_sha256_process_many_a64_crypto mbedtls_internal_sha256_process_many
324# define mbedtls_internal_sha256_process_a64_crypto mbedtls_internal_sha256_process
325#endif
326
327static size_t mbedtls_internal_sha256_process_many_a64_crypto(
Gilles Peskine449bd832023-01-11 14:50:10 +0100328 mbedtls_sha256_context *ctx, const uint8_t *msg, size_t len)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000329{
Gilles Peskine449bd832023-01-11 14:50:10 +0100330 uint32x4_t abcd = vld1q_u32(&ctx->state[0]);
331 uint32x4_t efgh = vld1q_u32(&ctx->state[4]);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000332
333 size_t processed = 0;
334
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 for (;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000336 len >= SHA256_BLOCK_SIZE;
337 processed += SHA256_BLOCK_SIZE,
Gilles Peskine449bd832023-01-11 14:50:10 +0100338 msg += SHA256_BLOCK_SIZE,
339 len -= SHA256_BLOCK_SIZE) {
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000340 uint32x4_t tmp, abcd_prev;
341
342 uint32x4_t abcd_orig = abcd;
343 uint32x4_t efgh_orig = efgh;
344
Dave Rodgman9a36f4c2023-10-05 11:25:52 +0100345 uint32x4_t sched0 = vreinterpretq_u32_u8(vld1q_u8(msg + 16 * 0));
346 uint32x4_t sched1 = vreinterpretq_u32_u8(vld1q_u8(msg + 16 * 1));
347 uint32x4_t sched2 = vreinterpretq_u32_u8(vld1q_u8(msg + 16 * 2));
348 uint32x4_t sched3 = vreinterpretq_u32_u8(vld1q_u8(msg + 16 * 3));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000349
350#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ /* Will be true if not defined */
351 /* Untested on BE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100352 sched0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched0)));
353 sched1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched1)));
354 sched2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched2)));
355 sched3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(sched3)));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000356#endif
357
358 /* Rounds 0 to 3 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100359 tmp = vaddq_u32(sched0, vld1q_u32(&K[0]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000360 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100361 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
362 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000363
364 /* Rounds 4 to 7 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100365 tmp = vaddq_u32(sched1, vld1q_u32(&K[4]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000366 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100367 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
368 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000369
370 /* Rounds 8 to 11 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 tmp = vaddq_u32(sched2, vld1q_u32(&K[8]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000372 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100373 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
374 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000375
376 /* Rounds 12 to 15 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 tmp = vaddq_u32(sched3, vld1q_u32(&K[12]));
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
Gilles Peskine449bd832023-01-11 14:50:10 +0100382 for (int t = 16; t < 64; t += 16) {
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000383 /* Rounds t to t + 3 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100384 sched0 = vsha256su1q_u32(vsha256su0q_u32(sched0, sched1), sched2, sched3);
385 tmp = vaddq_u32(sched0, vld1q_u32(&K[t]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000386 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100387 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
388 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000389
390 /* Rounds t + 4 to t + 7 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100391 sched1 = vsha256su1q_u32(vsha256su0q_u32(sched1, sched2), sched3, sched0);
392 tmp = vaddq_u32(sched1, vld1q_u32(&K[t + 4]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000393 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
395 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000396
397 /* Rounds t + 8 to t + 11 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100398 sched2 = vsha256su1q_u32(vsha256su0q_u32(sched2, sched3), sched0, sched1);
399 tmp = vaddq_u32(sched2, vld1q_u32(&K[t + 8]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000400 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100401 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
402 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000403
404 /* Rounds t + 12 to t + 15 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100405 sched3 = vsha256su1q_u32(vsha256su0q_u32(sched3, sched0), sched1, sched2);
406 tmp = vaddq_u32(sched3, vld1q_u32(&K[t + 12]));
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000407 abcd_prev = abcd;
Gilles Peskine449bd832023-01-11 14:50:10 +0100408 abcd = vsha256hq_u32(abcd_prev, efgh, tmp);
409 efgh = vsha256h2q_u32(efgh, abcd_prev, tmp);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000410 }
411
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 abcd = vaddq_u32(abcd, abcd_orig);
413 efgh = vaddq_u32(efgh, efgh_orig);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000414 }
415
Gilles Peskine449bd832023-01-11 14:50:10 +0100416 vst1q_u32(&ctx->state[0], abcd);
417 vst1q_u32(&ctx->state[4], efgh);
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000418
Gilles Peskine449bd832023-01-11 14:50:10 +0100419 return processed;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000420}
421
Dave Rodgman5b89c552023-10-10 14:59:02 +0100422#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
Tom Cosgrovec144ca62022-04-19 13:52:24 +0100423/*
Dave Rodgman4fd868e2023-10-12 09:09:42 +0100424 * This function is for internal use only if we are building both C and Armv8-A
Tom Cosgrovec144ca62022-04-19 13:52:24 +0100425 * versions, otherwise it is renamed to be the public mbedtls_internal_sha256_process()
426 */
427static
428#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100429int mbedtls_internal_sha256_process_a64_crypto(mbedtls_sha256_context *ctx,
430 const unsigned char data[SHA256_BLOCK_SIZE])
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000431{
Gilles Peskine449bd832023-01-11 14:50:10 +0100432 return (mbedtls_internal_sha256_process_many_a64_crypto(ctx, data,
433 SHA256_BLOCK_SIZE) ==
434 SHA256_BLOCK_SIZE) ? 0 : -1;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000435}
436
Dave Rodgman5b89c552023-10-10 14:59:02 +0100437#endif /* MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT || MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY */
Tom Cosgroveef2aa0e2023-06-09 11:29:50 +0100438
Jerry Yu92fc5382023-02-16 11:17:11 +0800439#if defined(MBEDTLS_POP_TARGET_PRAGMA)
Jerry Yu2f2c0492023-02-16 14:24:46 +0800440#if defined(__clang__)
Jerry Yu92fc5382023-02-16 11:17:11 +0800441#pragma clang attribute pop
Jerry Yu2f2c0492023-02-16 14:24:46 +0800442#elif defined(__GNUC__)
443#pragma GCC pop_options
444#endif
Jerry Yu92fc5382023-02-16 11:17:11 +0800445#undef MBEDTLS_POP_TARGET_PRAGMA
446#endif
447
Dave Rodgman5b89c552023-10-10 14:59:02 +0100448#if !defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000449#define mbedtls_internal_sha256_process_many_c mbedtls_internal_sha256_process_many
450#define mbedtls_internal_sha256_process_c mbedtls_internal_sha256_process
451#endif
452
453
454#if !defined(MBEDTLS_SHA256_PROCESS_ALT) && \
Dave Rodgman5b89c552023-10-10 14:59:02 +0100455 !defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000456
Gilles Peskine449bd832023-01-11 14:50:10 +0100457#define SHR(x, n) (((x) & 0xFFFFFFFF) >> (n))
458#define ROTR(x, n) (SHR(x, n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000459
Gilles Peskine449bd832023-01-11 14:50:10 +0100460#define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
461#define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
Paul Bakker5121ce52009-01-03 21:22:43 +0000462
Gilles Peskine449bd832023-01-11 14:50:10 +0100463#define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
464#define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
Paul Bakker5121ce52009-01-03 21:22:43 +0000465
Gilles Peskine449bd832023-01-11 14:50:10 +0100466#define F0(x, y, z) (((x) & (y)) | ((z) & ((x) | (y))))
467#define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000468
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200469#define R(t) \
470 ( \
471 local.W[t] = S1(local.W[(t) - 2]) + local.W[(t) - 7] + \
472 S0(local.W[(t) - 15]) + local.W[(t) - 16] \
Hanno Becker1eeca412018-10-15 12:01:35 +0100473 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000474
Gilles Peskine449bd832023-01-11 14:50:10 +0100475#define P(a, b, c, d, e, f, g, h, x, K) \
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200476 do \
477 { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 local.temp1 = (h) + S3(e) + F1((e), (f), (g)) + (K) + (x); \
479 local.temp2 = S2(a) + F0((a), (b), (c)); \
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200480 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
Gilles Peskine449bd832023-01-11 14:50:10 +0100481 } while (0)
Paul Bakker5121ce52009-01-03 21:22:43 +0000482
Dave Rodgman5b89c552023-10-10 14:59:02 +0100483#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
Tom Cosgrovec144ca62022-04-19 13:52:24 +0100484/*
Dave Rodgman94a634d2023-10-10 12:59:29 +0100485 * This function is for internal use only if we are building both C and Armv8
Tom Cosgrovec144ca62022-04-19 13:52:24 +0100486 * versions, otherwise it is renamed to be the public mbedtls_internal_sha256_process()
487 */
488static
489#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100490int mbedtls_internal_sha256_process_c(mbedtls_sha256_context *ctx,
491 const unsigned char data[SHA256_BLOCK_SIZE])
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200492{
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 struct {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200494 uint32_t temp1, temp2, W[64];
495 uint32_t A[8];
496 } local;
497
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200498 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000499
Gilles Peskine449bd832023-01-11 14:50:10 +0100500 for (i = 0; i < 8; i++) {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200501 local.A[i] = ctx->state[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 }
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200503
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200504#if defined(MBEDTLS_SHA256_SMALLER)
Gilles Peskine449bd832023-01-11 14:50:10 +0100505 for (i = 0; i < 64; i++) {
506 if (i < 16) {
507 local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i);
508 } else {
509 R(i);
510 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200511
Gilles Peskine449bd832023-01-11 14:50:10 +0100512 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], K[i]);
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200514
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200515 local.temp1 = local.A[7]; local.A[7] = local.A[6];
516 local.A[6] = local.A[5]; local.A[5] = local.A[4];
517 local.A[4] = local.A[3]; local.A[3] = local.A[2];
518 local.A[2] = local.A[1]; local.A[1] = local.A[0];
519 local.A[0] = local.temp1;
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200520 }
521#else /* MBEDTLS_SHA256_SMALLER */
Gilles Peskine449bd832023-01-11 14:50:10 +0100522 for (i = 0; i < 16; i++) {
523 local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i);
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200524 }
525
Gilles Peskine449bd832023-01-11 14:50:10 +0100526 for (i = 0; i < 16; i += 8) {
527 P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
528 local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0]);
529 P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
530 local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1]);
531 P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
532 local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2]);
533 P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
534 local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3]);
535 P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
536 local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4]);
537 P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
538 local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5]);
539 P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
540 local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6]);
541 P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
542 local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7]);
543 }
544
545 for (i = 16; i < 64; i += 8) {
546 P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
547 local.A[5], local.A[6], local.A[7], R(i+0), K[i+0]);
548 P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
549 local.A[4], local.A[5], local.A[6], R(i+1), K[i+1]);
550 P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
551 local.A[3], local.A[4], local.A[5], R(i+2), K[i+2]);
552 P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
553 local.A[2], local.A[3], local.A[4], R(i+3), K[i+3]);
554 P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
555 local.A[1], local.A[2], local.A[3], R(i+4), K[i+4]);
556 P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
557 local.A[0], local.A[1], local.A[2], R(i+5), K[i+5]);
558 P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
559 local.A[7], local.A[0], local.A[1], R(i+6), K[i+6]);
560 P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
561 local.A[6], local.A[7], local.A[0], R(i+7), K[i+7]);
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200562 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200563#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200564
Gilles Peskine449bd832023-01-11 14:50:10 +0100565 for (i = 0; i < 8; i++) {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200566 ctx->state[i] += local.A[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100567 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100568
gabor-mezei-arm76749ae2020-07-30 16:41:25 +0200569 /* Zeroise buffers and variables to clear sensitive data from memory. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100570 mbedtls_platform_zeroize(&local, sizeof(local));
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100571
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000573}
Jaeden Amero041039f2018-02-19 15:28:08 +0000574
Dave Rodgman5b89c552023-10-10 14:59:02 +0100575#endif /* !MBEDTLS_SHA256_PROCESS_ALT && !MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000576
577
Dave Rodgman5b89c552023-10-10 14:59:02 +0100578#if !defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000579
580static size_t mbedtls_internal_sha256_process_many_c(
Gilles Peskine449bd832023-01-11 14:50:10 +0100581 mbedtls_sha256_context *ctx, const uint8_t *data, size_t len)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000582{
583 size_t processed = 0;
584
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 while (len >= SHA256_BLOCK_SIZE) {
586 if (mbedtls_internal_sha256_process_c(ctx, data) != 0) {
587 return 0;
588 }
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000589
590 data += SHA256_BLOCK_SIZE;
591 len -= SHA256_BLOCK_SIZE;
592
593 processed += SHA256_BLOCK_SIZE;
594 }
595
Gilles Peskine449bd832023-01-11 14:50:10 +0100596 return processed;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000597}
598
Dave Rodgman5b89c552023-10-10 14:59:02 +0100599#endif /* !MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000600
601
Dave Rodgman5b89c552023-10-10 14:59:02 +0100602#if defined(MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000603
Gilles Peskine449bd832023-01-11 14:50:10 +0100604static int mbedtls_a64_crypto_sha256_has_support(void)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000605{
606 static int done = 0;
607 static int supported = 0;
608
Gilles Peskine449bd832023-01-11 14:50:10 +0100609 if (!done) {
Tom Cosgrove7e7aba82022-02-24 08:33:11 +0000610 supported = mbedtls_a64_crypto_sha256_determine_support();
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000611 done = 1;
612 }
613
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 return supported;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000615}
616
Gilles Peskine449bd832023-01-11 14:50:10 +0100617static size_t mbedtls_internal_sha256_process_many(mbedtls_sha256_context *ctx,
618 const uint8_t *msg, size_t len)
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000619{
Gilles Peskine449bd832023-01-11 14:50:10 +0100620 if (mbedtls_a64_crypto_sha256_has_support()) {
621 return mbedtls_internal_sha256_process_many_a64_crypto(ctx, msg, len);
622 } else {
623 return mbedtls_internal_sha256_process_many_c(ctx, msg, len);
624 }
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000625}
626
Gilles Peskine449bd832023-01-11 14:50:10 +0100627int mbedtls_internal_sha256_process(mbedtls_sha256_context *ctx,
628 const unsigned char data[SHA256_BLOCK_SIZE])
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000629{
Gilles Peskine449bd832023-01-11 14:50:10 +0100630 if (mbedtls_a64_crypto_sha256_has_support()) {
631 return mbedtls_internal_sha256_process_a64_crypto(ctx, data);
632 } else {
633 return mbedtls_internal_sha256_process_c(ctx, data);
634 }
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000635}
636
Dave Rodgman5b89c552023-10-10 14:59:02 +0100637#endif /* MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000638
Paul Bakker5121ce52009-01-03 21:22:43 +0000639
640/*
641 * SHA-256 process buffer
642 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100643int mbedtls_sha256_update(mbedtls_sha256_context *ctx,
644 const unsigned char *input,
645 size_t ilen)
Paul Bakker5121ce52009-01-03 21:22:43 +0000646{
Janos Follath24eed8d2019-11-22 13:21:35 +0000647 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23986e52011-04-24 08:57:21 +0000648 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000649 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000650
Gilles Peskine449bd832023-01-11 14:50:10 +0100651 if (ilen == 0) {
652 return 0;
653 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000654
655 left = ctx->total[0] & 0x3F;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000656 fill = SHA256_BLOCK_SIZE - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000657
Paul Bakker5c2364c2012-10-01 14:41:15 +0000658 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000659 ctx->total[0] &= 0xFFFFFFFF;
660
Gilles Peskine449bd832023-01-11 14:50:10 +0100661 if (ctx->total[0] < (uint32_t) ilen) {
Paul Bakker5121ce52009-01-03 21:22:43 +0000662 ctx->total[1]++;
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000664
Gilles Peskine449bd832023-01-11 14:50:10 +0100665 if (left && ilen >= fill) {
666 memcpy((void *) (ctx->buffer + left), input, fill);
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100667
Gilles Peskine449bd832023-01-11 14:50:10 +0100668 if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
669 return ret;
670 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100671
Paul Bakker5121ce52009-01-03 21:22:43 +0000672 input += fill;
673 ilen -= fill;
674 left = 0;
675 }
676
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 while (ilen >= SHA256_BLOCK_SIZE) {
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000678 size_t processed =
Gilles Peskine449bd832023-01-11 14:50:10 +0100679 mbedtls_internal_sha256_process_many(ctx, input, ilen);
680 if (processed < SHA256_BLOCK_SIZE) {
681 return MBEDTLS_ERR_ERROR_GENERIC_ERROR;
682 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100683
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000684 input += processed;
685 ilen -= processed;
Paul Bakker5121ce52009-01-03 21:22:43 +0000686 }
687
Gilles Peskine449bd832023-01-11 14:50:10 +0100688 if (ilen > 0) {
689 memcpy((void *) (ctx->buffer + left), input, ilen);
690 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100691
Gilles Peskine449bd832023-01-11 14:50:10 +0100692 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000693}
694
Paul Bakker5121ce52009-01-03 21:22:43 +0000695/*
696 * SHA-256 final digest
697 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100698int mbedtls_sha256_finish(mbedtls_sha256_context *ctx,
699 unsigned char *output)
Paul Bakker5121ce52009-01-03 21:22:43 +0000700{
Janos Follath24eed8d2019-11-22 13:21:35 +0000701 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200702 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000703 uint32_t high, low;
Dave Rodgman90330a42023-09-28 17:24:06 +0100704 int truncated = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000705
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200706 /*
707 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
708 */
709 used = ctx->total[0] & 0x3F;
710
711 ctx->buffer[used++] = 0x80;
712
Gilles Peskine449bd832023-01-11 14:50:10 +0100713 if (used <= 56) {
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200714 /* Enough room for padding + length in current block */
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 memset(ctx->buffer + used, 0, 56 - used);
716 } else {
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200717 /* We'll need an extra block */
Gilles Peskine449bd832023-01-11 14:50:10 +0100718 memset(ctx->buffer + used, 0, SHA256_BLOCK_SIZE - used);
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200719
Gilles Peskine449bd832023-01-11 14:50:10 +0100720 if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
Dave Rodgmanaafd1e02023-09-11 12:59:36 +0100721 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100722 }
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200723
Gilles Peskine449bd832023-01-11 14:50:10 +0100724 memset(ctx->buffer, 0, 56);
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200725 }
726
727 /*
728 * Add message length
729 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100730 high = (ctx->total[0] >> 29)
731 | (ctx->total[1] << 3);
732 low = (ctx->total[0] << 3);
Paul Bakker5121ce52009-01-03 21:22:43 +0000733
Gilles Peskine449bd832023-01-11 14:50:10 +0100734 MBEDTLS_PUT_UINT32_BE(high, ctx->buffer, 56);
735 MBEDTLS_PUT_UINT32_BE(low, ctx->buffer, 60);
Paul Bakker5121ce52009-01-03 21:22:43 +0000736
Gilles Peskine449bd832023-01-11 14:50:10 +0100737 if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) {
Dave Rodgmanaafd1e02023-09-11 12:59:36 +0100738 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100740
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200741 /*
742 * Output final state
743 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100744 MBEDTLS_PUT_UINT32_BE(ctx->state[0], output, 0);
745 MBEDTLS_PUT_UINT32_BE(ctx->state[1], output, 4);
746 MBEDTLS_PUT_UINT32_BE(ctx->state[2], output, 8);
747 MBEDTLS_PUT_UINT32_BE(ctx->state[3], output, 12);
748 MBEDTLS_PUT_UINT32_BE(ctx->state[4], output, 16);
749 MBEDTLS_PUT_UINT32_BE(ctx->state[5], output, 20);
750 MBEDTLS_PUT_UINT32_BE(ctx->state[6], output, 24);
Paul Bakker5121ce52009-01-03 21:22:43 +0000751
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200752#if defined(MBEDTLS_SHA224_C)
David Horstmann687262c2022-10-06 17:54:57 +0100753 truncated = ctx->is224;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200754#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100755 if (!truncated) {
756 MBEDTLS_PUT_UINT32_BE(ctx->state[7], output, 28);
757 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100758
Dave Rodgmanaafd1e02023-09-11 12:59:36 +0100759 ret = 0;
760
761exit:
762 mbedtls_sha256_free(ctx);
763 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000764}
765
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200766#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200767
Paul Bakker5121ce52009-01-03 21:22:43 +0000768/*
769 * output = SHA-256( input buffer )
770 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100771int mbedtls_sha256(const unsigned char *input,
772 size_t ilen,
773 unsigned char *output,
774 int is224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000775{
Janos Follath24eed8d2019-11-22 13:21:35 +0000776 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200777 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000778
Valerio Settia3f99592022-12-14 10:56:54 +0100779#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 if (is224 != 0 && is224 != 1) {
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100781 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 }
Valerio Settia3f99592022-12-14 10:56:54 +0100783#elif defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100784 if (is224 != 0) {
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100785 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100786 }
Valerio Settia3f99592022-12-14 10:56:54 +0100787#else /* defined MBEDTLS_SHA224_C only */
Gilles Peskine449bd832023-01-11 14:50:10 +0100788 if (is224 == 0) {
Valerio Settia3f99592022-12-14 10:56:54 +0100789 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 }
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200791#endif
792
Gilles Peskine449bd832023-01-11 14:50:10 +0100793 mbedtls_sha256_init(&ctx);
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100794
Gilles Peskine449bd832023-01-11 14:50:10 +0100795 if ((ret = mbedtls_sha256_starts(&ctx, is224)) != 0) {
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100796 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100797 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100798
Gilles Peskine449bd832023-01-11 14:50:10 +0100799 if ((ret = mbedtls_sha256_update(&ctx, input, ilen)) != 0) {
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100800 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100801 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100802
Gilles Peskine449bd832023-01-11 14:50:10 +0100803 if ((ret = mbedtls_sha256_finish(&ctx, output)) != 0) {
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100804 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100805 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100806
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100807exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100808 mbedtls_sha256_free(&ctx);
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100809
Gilles Peskine449bd832023-01-11 14:50:10 +0100810 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000811}
812
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200813#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000814/*
815 * FIPS-180-2 test vectors
816 */
Valerio Settia3f99592022-12-14 10:56:54 +0100817static const unsigned char sha_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000818{
819 { "abc" },
820 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
821 { "" }
822};
823
Valerio Settia3f99592022-12-14 10:56:54 +0100824static const size_t sha_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000825{
826 3, 56, 1000
827};
828
Valerio Settia3f99592022-12-14 10:56:54 +0100829typedef const unsigned char (sha_test_sum_t)[32];
830
831/*
832 * SHA-224 test vectors
833 */
834#if defined(MBEDTLS_SHA224_C)
835static sha_test_sum_t sha224_test_sum[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000836{
Paul Bakker5121ce52009-01-03 21:22:43 +0000837 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
838 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
839 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
840 0xE3, 0x6C, 0x9D, 0xA7 },
841 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
842 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
843 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
844 0x52, 0x52, 0x25, 0x25 },
845 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
846 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
847 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
Valerio Settia3f99592022-12-14 10:56:54 +0100848 0x4E, 0xE7, 0xAD, 0x67 }
849};
850#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000851
Valerio Settia3f99592022-12-14 10:56:54 +0100852/*
853 * SHA-256 test vectors
854 */
855#if defined(MBEDTLS_SHA256_C)
856static sha_test_sum_t sha256_test_sum[] =
857{
Paul Bakker5121ce52009-01-03 21:22:43 +0000858 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
859 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
860 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
861 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
862 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
863 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
864 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
865 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
866 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
867 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
868 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
869 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
870};
Valerio Settia3f99592022-12-14 10:56:54 +0100871#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000872
873/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000874 * Checkup routine
875 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100876static int mbedtls_sha256_common_self_test(int verbose, int is224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000877{
Valerio Settia3f99592022-12-14 10:56:54 +0100878 int i, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500879 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200880 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200881 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000882
Valerio Settia3f99592022-12-14 10:56:54 +0100883#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100884 sha_test_sum_t *sha_test_sum = (is224) ? sha224_test_sum : sha256_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100885#elif defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100886 sha_test_sum_t *sha_test_sum = sha256_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100887#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100888 sha_test_sum_t *sha_test_sum = sha224_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100889#endif
890
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 buf = mbedtls_calloc(1024, sizeof(unsigned char));
892 if (NULL == buf) {
893 if (verbose != 0) {
894 mbedtls_printf("Buffer allocation failed\n");
895 }
Russ Butlerbb83b422016-10-12 17:36:50 -0500896
Gilles Peskine449bd832023-01-11 14:50:10 +0100897 return 1;
Russ Butlerbb83b422016-10-12 17:36:50 -0500898 }
899
Gilles Peskine449bd832023-01-11 14:50:10 +0100900 mbedtls_sha256_init(&ctx);
Paul Bakker5b4af392014-06-26 12:09:34 +0200901
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 for (i = 0; i < 3; i++) {
903 if (verbose != 0) {
904 mbedtls_printf(" SHA-%d test #%d: ", 256 - is224 * 32, i + 1);
905 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000906
Gilles Peskine449bd832023-01-11 14:50:10 +0100907 if ((ret = mbedtls_sha256_starts(&ctx, is224)) != 0) {
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100908 goto fail;
Gilles Peskine449bd832023-01-11 14:50:10 +0100909 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000910
Gilles Peskine449bd832023-01-11 14:50:10 +0100911 if (i == 2) {
912 memset(buf, 'a', buflen = 1000);
Paul Bakker5121ce52009-01-03 21:22:43 +0000913
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 for (int j = 0; j < 1000; j++) {
915 ret = mbedtls_sha256_update(&ctx, buf, buflen);
916 if (ret != 0) {
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100917 goto fail;
Gilles Peskine449bd832023-01-11 14:50:10 +0100918 }
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100919 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100920
Gilles Peskine449bd832023-01-11 14:50:10 +0100921 } else {
922 ret = mbedtls_sha256_update(&ctx, sha_test_buf[i],
923 sha_test_buflen[i]);
924 if (ret != 0) {
925 goto fail;
926 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100927 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000928
Gilles Peskine449bd832023-01-11 14:50:10 +0100929 if ((ret = mbedtls_sha256_finish(&ctx, sha256sum)) != 0) {
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100930 goto fail;
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100932
Paul Bakker5121ce52009-01-03 21:22:43 +0000933
Gilles Peskine449bd832023-01-11 14:50:10 +0100934 if (memcmp(sha256sum, sha_test_sum[i], 32 - is224 * 4) != 0) {
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100935 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100936 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100937 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000938
Gilles Peskine449bd832023-01-11 14:50:10 +0100939 if (verbose != 0) {
940 mbedtls_printf("passed\n");
941 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000942 }
943
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 if (verbose != 0) {
945 mbedtls_printf("\n");
946 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000947
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100948 goto exit;
949
950fail:
Gilles Peskine449bd832023-01-11 14:50:10 +0100951 if (verbose != 0) {
952 mbedtls_printf("failed\n");
953 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100954
Paul Bakker5b4af392014-06-26 12:09:34 +0200955exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 mbedtls_sha256_free(&ctx);
957 mbedtls_free(buf);
Paul Bakker5b4af392014-06-26 12:09:34 +0200958
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000960}
961
Valerio Settia3f99592022-12-14 10:56:54 +0100962#if defined(MBEDTLS_SHA256_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100963int mbedtls_sha256_self_test(int verbose)
Valerio Settia3f99592022-12-14 10:56:54 +0100964{
Gilles Peskine449bd832023-01-11 14:50:10 +0100965 return mbedtls_sha256_common_self_test(verbose, 0);
Valerio Settia3f99592022-12-14 10:56:54 +0100966}
967#endif /* MBEDTLS_SHA256_C */
968
969#if defined(MBEDTLS_SHA224_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100970int mbedtls_sha224_self_test(int verbose)
Valerio Settia3f99592022-12-14 10:56:54 +0100971{
Gilles Peskine449bd832023-01-11 14:50:10 +0100972 return mbedtls_sha256_common_self_test(verbose, 1);
Valerio Settia3f99592022-12-14 10:56:54 +0100973}
974#endif /* MBEDTLS_SHA224_C */
975
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000977
Valerio Settia3f99592022-12-14 10:56:54 +0100978#endif /* MBEDTLS_SHA256_C || MBEDTLS_SHA224_C */