blob: 44df5526f6057d4a54ad420be7268469f681ef01 [file] [log] [blame]
Steven Cooreman0e307642021-02-18 16:18:32 +01001/*
2 * PSA hashing layer on top of Mbed TLS software crypto
3 */
4/*
5 * Copyright The Mbed TLS Contributors
6 * SPDX-License-Identifier: Apache-2.0
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License"); you may
9 * not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21#include "common.h"
22
23#if defined(MBEDTLS_PSA_CRYPTO_C)
24
25#include <psa/crypto.h>
26#include "psa_crypto_core.h"
27#include "psa_crypto_hash.h"
28
29#include <mbedtls/error.h>
30#include <string.h>
31
Ronald Cron0266cfe2021-03-13 18:50:11 +010032#if defined(MBEDTLS_PSA_BUILTIN_HASH)
33psa_status_t mbedtls_psa_hash_abort(
Gilles Peskine449bd832023-01-11 14:50:10 +010034 mbedtls_psa_hash_operation_t *operation)
Steven Cooreman0e307642021-02-18 16:18:32 +010035{
Gilles Peskine449bd832023-01-11 14:50:10 +010036 switch (operation->alg) {
Steven Cooreman83f300e2021-03-08 17:09:48 +010037 case 0:
38 /* The object has (apparently) been initialized but it is not
39 * in use. It's ok to call abort on such an object, and there's
40 * nothing to do. */
41 break;
Ronald Cron0266cfe2021-03-13 18:50:11 +010042#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5)
Steven Cooreman83f300e2021-03-08 17:09:48 +010043 case PSA_ALG_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +010044 mbedtls_md5_free(&operation->ctx.md5);
Steven Cooreman83f300e2021-03-08 17:09:48 +010045 break;
46#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +010047#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160)
Steven Cooreman83f300e2021-03-08 17:09:48 +010048 case PSA_ALG_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +010049 mbedtls_ripemd160_free(&operation->ctx.ripemd160);
Steven Cooreman83f300e2021-03-08 17:09:48 +010050 break;
51#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +010052#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1)
Steven Cooreman83f300e2021-03-08 17:09:48 +010053 case PSA_ALG_SHA_1:
Gilles Peskine449bd832023-01-11 14:50:10 +010054 mbedtls_sha1_free(&operation->ctx.sha1);
Steven Cooreman83f300e2021-03-08 17:09:48 +010055 break;
56#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +010057#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224)
Steven Cooreman83f300e2021-03-08 17:09:48 +010058 case PSA_ALG_SHA_224:
Gilles Peskine449bd832023-01-11 14:50:10 +010059 mbedtls_sha256_free(&operation->ctx.sha256);
Steven Cooreman83f300e2021-03-08 17:09:48 +010060 break;
61#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +010062#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256)
Steven Cooreman83f300e2021-03-08 17:09:48 +010063 case PSA_ALG_SHA_256:
Gilles Peskine449bd832023-01-11 14:50:10 +010064 mbedtls_sha256_free(&operation->ctx.sha256);
Steven Cooreman83f300e2021-03-08 17:09:48 +010065 break;
66#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +010067#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384)
Steven Cooreman83f300e2021-03-08 17:09:48 +010068 case PSA_ALG_SHA_384:
Gilles Peskine449bd832023-01-11 14:50:10 +010069 mbedtls_sha512_free(&operation->ctx.sha512);
Steven Cooreman83f300e2021-03-08 17:09:48 +010070 break;
71#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +010072#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512)
Steven Cooreman83f300e2021-03-08 17:09:48 +010073 case PSA_ALG_SHA_512:
Gilles Peskine449bd832023-01-11 14:50:10 +010074 mbedtls_sha512_free(&operation->ctx.sha512);
Steven Cooreman83f300e2021-03-08 17:09:48 +010075 break;
76#endif
Dave Rodgman98083c62023-06-25 23:27:45 +010077#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_3)
78 case PSA_ALG_SHA3_224:
79 case PSA_ALG_SHA3_256:
80 case PSA_ALG_SHA3_384:
81 case PSA_ALG_SHA3_512:
82 mbedtls_sha3_free(&operation->ctx.sha3);
83 break;
84#endif
Steven Cooreman83f300e2021-03-08 17:09:48 +010085 default:
Gilles Peskine449bd832023-01-11 14:50:10 +010086 return PSA_ERROR_BAD_STATE;
Steven Cooreman83f300e2021-03-08 17:09:48 +010087 }
88 operation->alg = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010089 return PSA_SUCCESS;
Steven Cooreman0e307642021-02-18 16:18:32 +010090}
91
Ronald Cron0266cfe2021-03-13 18:50:11 +010092psa_status_t mbedtls_psa_hash_setup(
Steven Cooreman0e307642021-02-18 16:18:32 +010093 mbedtls_psa_hash_operation_t *operation,
Gilles Peskine449bd832023-01-11 14:50:10 +010094 psa_algorithm_t alg)
Steven Cooreman0e307642021-02-18 16:18:32 +010095{
96 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
97
98 /* A context must be freshly initialized before it can be set up. */
Gilles Peskine449bd832023-01-11 14:50:10 +010099 if (operation->alg != 0) {
100 return PSA_ERROR_BAD_STATE;
Steven Cooreman0e307642021-02-18 16:18:32 +0100101 }
102
Gilles Peskine449bd832023-01-11 14:50:10 +0100103 switch (alg) {
Ronald Cron0266cfe2021-03-13 18:50:11 +0100104#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100105 case PSA_ALG_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100106 mbedtls_md5_init(&operation->ctx.md5);
107 ret = mbedtls_md5_starts(&operation->ctx.md5);
Steven Cooreman0e307642021-02-18 16:18:32 +0100108 break;
109#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100110#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100111 case PSA_ALG_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100112 mbedtls_ripemd160_init(&operation->ctx.ripemd160);
113 ret = mbedtls_ripemd160_starts(&operation->ctx.ripemd160);
Steven Cooreman0e307642021-02-18 16:18:32 +0100114 break;
115#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100116#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100117 case PSA_ALG_SHA_1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 mbedtls_sha1_init(&operation->ctx.sha1);
119 ret = mbedtls_sha1_starts(&operation->ctx.sha1);
Steven Cooreman0e307642021-02-18 16:18:32 +0100120 break;
121#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100122#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100123 case PSA_ALG_SHA_224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 mbedtls_sha256_init(&operation->ctx.sha256);
125 ret = mbedtls_sha256_starts(&operation->ctx.sha256, 1);
Steven Cooreman0e307642021-02-18 16:18:32 +0100126 break;
127#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100128#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100129 case PSA_ALG_SHA_256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100130 mbedtls_sha256_init(&operation->ctx.sha256);
131 ret = mbedtls_sha256_starts(&operation->ctx.sha256, 0);
Steven Cooreman0e307642021-02-18 16:18:32 +0100132 break;
133#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100134#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100135 case PSA_ALG_SHA_384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 mbedtls_sha512_init(&operation->ctx.sha512);
137 ret = mbedtls_sha512_starts(&operation->ctx.sha512, 1);
Steven Cooreman0e307642021-02-18 16:18:32 +0100138 break;
139#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100140#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100141 case PSA_ALG_SHA_512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 mbedtls_sha512_init(&operation->ctx.sha512);
143 ret = mbedtls_sha512_starts(&operation->ctx.sha512, 0);
Steven Cooreman0e307642021-02-18 16:18:32 +0100144 break;
145#endif
Dave Rodgman98083c62023-06-25 23:27:45 +0100146#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_3)
147 case PSA_ALG_SHA3_224:
148 mbedtls_sha3_init(&operation->ctx.sha3);
149 ret = mbedtls_sha3_starts(&operation->ctx.sha3, MBEDTLS_SHA3_224);
150 break;
151 case PSA_ALG_SHA3_256:
152 mbedtls_sha3_init(&operation->ctx.sha3);
153 ret = mbedtls_sha3_starts(&operation->ctx.sha3, MBEDTLS_SHA3_256);
154 break;
155 case PSA_ALG_SHA3_384:
156 mbedtls_sha3_init(&operation->ctx.sha3);
157 ret = mbedtls_sha3_starts(&operation->ctx.sha3, MBEDTLS_SHA3_384);
158 break;
159 case PSA_ALG_SHA3_512:
160 mbedtls_sha3_init(&operation->ctx.sha3);
161 ret = mbedtls_sha3_starts(&operation->ctx.sha3, MBEDTLS_SHA3_512);
162 break;
163#endif
Steven Cooreman0e307642021-02-18 16:18:32 +0100164 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 return PSA_ALG_IS_HASH(alg) ?
166 PSA_ERROR_NOT_SUPPORTED :
167 PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman0e307642021-02-18 16:18:32 +0100168 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100169 if (ret == 0) {
Steven Cooreman0e307642021-02-18 16:18:32 +0100170 operation->alg = alg;
Gilles Peskine449bd832023-01-11 14:50:10 +0100171 } else {
172 mbedtls_psa_hash_abort(operation);
173 }
174 return mbedtls_to_psa_error(ret);
Steven Cooreman0e307642021-02-18 16:18:32 +0100175}
176
Ronald Cron0266cfe2021-03-13 18:50:11 +0100177psa_status_t mbedtls_psa_hash_clone(
Steven Cooreman0e307642021-02-18 16:18:32 +0100178 const mbedtls_psa_hash_operation_t *source_operation,
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 mbedtls_psa_hash_operation_t *target_operation)
Steven Cooreman0e307642021-02-18 16:18:32 +0100180{
Gilles Peskine449bd832023-01-11 14:50:10 +0100181 switch (source_operation->alg) {
Steven Cooreman0e307642021-02-18 16:18:32 +0100182 case 0:
Gilles Peskine449bd832023-01-11 14:50:10 +0100183 return PSA_ERROR_BAD_STATE;
Ronald Cron0266cfe2021-03-13 18:50:11 +0100184#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100185 case PSA_ALG_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 mbedtls_md5_clone(&target_operation->ctx.md5,
187 &source_operation->ctx.md5);
Steven Cooreman0e307642021-02-18 16:18:32 +0100188 break;
189#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100190#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100191 case PSA_ALG_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100192 mbedtls_ripemd160_clone(&target_operation->ctx.ripemd160,
193 &source_operation->ctx.ripemd160);
Steven Cooreman0e307642021-02-18 16:18:32 +0100194 break;
195#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100196#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100197 case PSA_ALG_SHA_1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 mbedtls_sha1_clone(&target_operation->ctx.sha1,
199 &source_operation->ctx.sha1);
Steven Cooreman0e307642021-02-18 16:18:32 +0100200 break;
201#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100202#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100203 case PSA_ALG_SHA_224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 mbedtls_sha256_clone(&target_operation->ctx.sha256,
205 &source_operation->ctx.sha256);
Steven Cooreman0e307642021-02-18 16:18:32 +0100206 break;
207#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100208#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100209 case PSA_ALG_SHA_256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 mbedtls_sha256_clone(&target_operation->ctx.sha256,
211 &source_operation->ctx.sha256);
Steven Cooreman0e307642021-02-18 16:18:32 +0100212 break;
213#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100214#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100215 case PSA_ALG_SHA_384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 mbedtls_sha512_clone(&target_operation->ctx.sha512,
217 &source_operation->ctx.sha512);
Steven Cooreman0e307642021-02-18 16:18:32 +0100218 break;
219#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100220#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100221 case PSA_ALG_SHA_512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100222 mbedtls_sha512_clone(&target_operation->ctx.sha512,
223 &source_operation->ctx.sha512);
Steven Cooreman0e307642021-02-18 16:18:32 +0100224 break;
225#endif
Dave Rodgman98083c62023-06-25 23:27:45 +0100226#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_3)
227 case PSA_ALG_SHA3_224:
228 case PSA_ALG_SHA3_256:
229 case PSA_ALG_SHA3_384:
230 case PSA_ALG_SHA3_512:
231 mbedtls_sha3_clone(&target_operation->ctx.sha3,
232 &source_operation->ctx.sha3);
233 break;
234#endif
Steven Cooreman0e307642021-02-18 16:18:32 +0100235 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100236 (void) source_operation;
237 (void) target_operation;
Gilles Peskine449bd832023-01-11 14:50:10 +0100238 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman0e307642021-02-18 16:18:32 +0100239 }
240
241 target_operation->alg = source_operation->alg;
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 return PSA_SUCCESS;
Steven Cooreman0e307642021-02-18 16:18:32 +0100243}
244
Ronald Cron0266cfe2021-03-13 18:50:11 +0100245psa_status_t mbedtls_psa_hash_update(
Steven Cooreman0e307642021-02-18 16:18:32 +0100246 mbedtls_psa_hash_operation_t *operation,
247 const uint8_t *input,
Gilles Peskine449bd832023-01-11 14:50:10 +0100248 size_t input_length)
Steven Cooreman0e307642021-02-18 16:18:32 +0100249{
250 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
251
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 switch (operation->alg) {
Ronald Cron0266cfe2021-03-13 18:50:11 +0100253#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100254 case PSA_ALG_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 ret = mbedtls_md5_update(&operation->ctx.md5,
256 input, input_length);
Steven Cooreman0e307642021-02-18 16:18:32 +0100257 break;
258#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100259#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100260 case PSA_ALG_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 ret = mbedtls_ripemd160_update(&operation->ctx.ripemd160,
262 input, input_length);
Steven Cooreman0e307642021-02-18 16:18:32 +0100263 break;
264#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100265#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100266 case PSA_ALG_SHA_1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 ret = mbedtls_sha1_update(&operation->ctx.sha1,
268 input, input_length);
Steven Cooreman0e307642021-02-18 16:18:32 +0100269 break;
270#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100271#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100272 case PSA_ALG_SHA_224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 ret = mbedtls_sha256_update(&operation->ctx.sha256,
274 input, input_length);
Steven Cooreman0e307642021-02-18 16:18:32 +0100275 break;
276#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100277#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100278 case PSA_ALG_SHA_256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 ret = mbedtls_sha256_update(&operation->ctx.sha256,
280 input, input_length);
Steven Cooreman0e307642021-02-18 16:18:32 +0100281 break;
282#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100283#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100284 case PSA_ALG_SHA_384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 ret = mbedtls_sha512_update(&operation->ctx.sha512,
286 input, input_length);
Steven Cooreman0e307642021-02-18 16:18:32 +0100287 break;
288#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100289#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100290 case PSA_ALG_SHA_512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 ret = mbedtls_sha512_update(&operation->ctx.sha512,
292 input, input_length);
Steven Cooreman0e307642021-02-18 16:18:32 +0100293 break;
294#endif
Dave Rodgman98083c62023-06-25 23:27:45 +0100295#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_3)
296 case PSA_ALG_SHA3_224:
297 case PSA_ALG_SHA3_256:
298 case PSA_ALG_SHA3_384:
299 case PSA_ALG_SHA3_512:
300 ret = mbedtls_sha3_update(&operation->ctx.sha3,
301 input, input_length);
302 break;
303#endif
Steven Cooreman0e307642021-02-18 16:18:32 +0100304 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100305 (void) input;
306 (void) input_length;
Gilles Peskine449bd832023-01-11 14:50:10 +0100307 return PSA_ERROR_BAD_STATE;
Steven Cooreman0e307642021-02-18 16:18:32 +0100308 }
309
Gilles Peskine449bd832023-01-11 14:50:10 +0100310 return mbedtls_to_psa_error(ret);
Steven Cooreman0e307642021-02-18 16:18:32 +0100311}
312
Ronald Cron0266cfe2021-03-13 18:50:11 +0100313psa_status_t mbedtls_psa_hash_finish(
Steven Cooreman0e307642021-02-18 16:18:32 +0100314 mbedtls_psa_hash_operation_t *operation,
315 uint8_t *hash,
316 size_t hash_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100317 size_t *hash_length)
Steven Cooreman0e307642021-02-18 16:18:32 +0100318{
319 psa_status_t status;
320 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 size_t actual_hash_length = PSA_HASH_LENGTH(operation->alg);
Steven Cooreman0e307642021-02-18 16:18:32 +0100322
323 /* Fill the output buffer with something that isn't a valid hash
324 * (barring an attack on the hash and deliberately-crafted input),
325 * in case the caller doesn't check the return status properly. */
326 *hash_length = hash_size;
327 /* If hash_size is 0 then hash may be NULL and then the
328 * call to memset would have undefined behavior. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 if (hash_size != 0) {
330 memset(hash, '!', hash_size);
331 }
Steven Cooreman0e307642021-02-18 16:18:32 +0100332
Gilles Peskine449bd832023-01-11 14:50:10 +0100333 if (hash_size < actual_hash_length) {
Steven Cooreman0e307642021-02-18 16:18:32 +0100334 status = PSA_ERROR_BUFFER_TOO_SMALL;
335 goto exit;
336 }
337
Gilles Peskine449bd832023-01-11 14:50:10 +0100338 switch (operation->alg) {
Ronald Cron0266cfe2021-03-13 18:50:11 +0100339#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100340 case PSA_ALG_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100341 ret = mbedtls_md5_finish(&operation->ctx.md5, hash);
Steven Cooreman0e307642021-02-18 16:18:32 +0100342 break;
343#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100344#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100345 case PSA_ALG_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100346 ret = mbedtls_ripemd160_finish(&operation->ctx.ripemd160, hash);
Steven Cooreman0e307642021-02-18 16:18:32 +0100347 break;
348#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100349#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100350 case PSA_ALG_SHA_1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100351 ret = mbedtls_sha1_finish(&operation->ctx.sha1, hash);
Steven Cooreman0e307642021-02-18 16:18:32 +0100352 break;
353#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100354#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100355 case PSA_ALG_SHA_224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100356 ret = mbedtls_sha256_finish(&operation->ctx.sha256, hash);
Steven Cooreman0e307642021-02-18 16:18:32 +0100357 break;
358#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100359#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100360 case PSA_ALG_SHA_256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100361 ret = mbedtls_sha256_finish(&operation->ctx.sha256, hash);
Steven Cooreman0e307642021-02-18 16:18:32 +0100362 break;
363#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100364#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100365 case PSA_ALG_SHA_384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 ret = mbedtls_sha512_finish(&operation->ctx.sha512, hash);
Steven Cooreman0e307642021-02-18 16:18:32 +0100367 break;
368#endif
Ronald Cron0266cfe2021-03-13 18:50:11 +0100369#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100370 case PSA_ALG_SHA_512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 ret = mbedtls_sha512_finish(&operation->ctx.sha512, hash);
Steven Cooreman0e307642021-02-18 16:18:32 +0100372 break;
373#endif
Dave Rodgman98083c62023-06-25 23:27:45 +0100374#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_3)
375 case PSA_ALG_SHA3_224:
376 case PSA_ALG_SHA3_256:
377 case PSA_ALG_SHA3_384:
378 case PSA_ALG_SHA3_512:
379 ret = mbedtls_sha3_finish(&operation->ctx.sha3, hash, hash_size);
380 break;
381#endif
Steven Cooreman0e307642021-02-18 16:18:32 +0100382 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100383 (void) hash;
Gilles Peskine449bd832023-01-11 14:50:10 +0100384 return PSA_ERROR_BAD_STATE;
Steven Cooreman0e307642021-02-18 16:18:32 +0100385 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 status = mbedtls_to_psa_error(ret);
Steven Cooreman0e307642021-02-18 16:18:32 +0100387
388exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 if (status == PSA_SUCCESS) {
Steven Cooreman0e307642021-02-18 16:18:32 +0100390 *hash_length = actual_hash_length;
Gilles Peskine449bd832023-01-11 14:50:10 +0100391 }
392 return status;
Steven Cooreman0e307642021-02-18 16:18:32 +0100393}
394
Ronald Cron0266cfe2021-03-13 18:50:11 +0100395psa_status_t mbedtls_psa_hash_compute(
Steven Cooreman83f300e2021-03-08 17:09:48 +0100396 psa_algorithm_t alg,
397 const uint8_t *input,
398 size_t input_length,
399 uint8_t *hash,
400 size_t hash_size,
401 size_t *hash_length)
402{
403 mbedtls_psa_hash_operation_t operation = MBEDTLS_PSA_HASH_OPERATION_INIT;
404 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100405 psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman83f300e2021-03-08 17:09:48 +0100406
407 *hash_length = hash_size;
Gilles Peskine449bd832023-01-11 14:50:10 +0100408 status = mbedtls_psa_hash_setup(&operation, alg);
409 if (status != PSA_SUCCESS) {
Steven Cooreman83f300e2021-03-08 17:09:48 +0100410 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100411 }
412 status = mbedtls_psa_hash_update(&operation, input, input_length);
413 if (status != PSA_SUCCESS) {
Steven Cooreman83f300e2021-03-08 17:09:48 +0100414 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 }
416 status = mbedtls_psa_hash_finish(&operation, hash, hash_size, hash_length);
417 if (status != PSA_SUCCESS) {
Steven Cooreman83f300e2021-03-08 17:09:48 +0100418 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100419 }
Steven Cooreman83f300e2021-03-08 17:09:48 +0100420
421exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 abort_status = mbedtls_psa_hash_abort(&operation);
423 if (status == PSA_SUCCESS) {
424 return abort_status;
425 } else {
426 return status;
427 }
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100428
Steven Cooreman83f300e2021-03-08 17:09:48 +0100429}
Steven Cooreman0d586662021-03-08 20:28:18 +0100430#endif /* MBEDTLS_PSA_BUILTIN_HASH */
Steven Cooreman0e307642021-02-18 16:18:32 +0100431
Steven Cooreman0e307642021-02-18 16:18:32 +0100432#endif /* MBEDTLS_PSA_CRYPTO_C */