blob: 2678738f42ac37cbd17270009ae5e80480c929ac [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
Steven Cooreman4f7d0582021-03-08 13:59:42 +010032/* Use builtin defines specific to this compilation unit, since the test driver
Steven Cooreman83f300e2021-03-08 17:09:48 +010033 * relies on the software driver. */
Steven Cooreman4f7d0582021-03-08 13:59:42 +010034#if( defined(MBEDTLS_PSA_BUILTIN_ALG_MD2) || \
35 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_MD2) ) )
36#define BUILTIN_ALG_MD2 1
37#endif
38#if( defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) || \
39 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_MD4) ) )
40#define BUILTIN_ALG_MD4 1
41#endif
42#if( defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) || \
43 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_MD5) ) )
44#define BUILTIN_ALG_MD5 1
45#endif
46#if( defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) || \
47 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160) ) )
48#define BUILTIN_ALG_RIPEMD160 1
49#endif
50#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) || \
51 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1) ) )
52#define BUILTIN_ALG_SHA_1 1
53#endif
54#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) || \
55 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224) ) )
56#define BUILTIN_ALG_SHA_224 1
57#endif
58#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) || \
59 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256) ) )
60#define BUILTIN_ALG_SHA_256 1
61#endif
62#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) || \
63 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384) ) )
64#define BUILTIN_ALG_SHA_384 1
65#endif
66#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) || \
67 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512) ) )
68#define BUILTIN_ALG_SHA_512 1
69#endif
70
Steven Cooreman0d586662021-03-08 20:28:18 +010071/* If at least one of the hash algorithms is to be exercised through the
72 * transparent test driver, then the mbedtls_transparent_test_driver_hash_*
73 * entry points need to be implemented. */
Steven Cooreman83f300e2021-03-08 17:09:48 +010074#if defined(PSA_CRYPTO_DRIVER_TEST) && \
Steven Cooremana85e2f82021-03-15 11:00:12 +010075 defined(MBEDTLS_PSA_ACCEL_HASH)
Steven Cooreman83f300e2021-03-08 17:09:48 +010076#define INCLUDE_HASH_TEST_DRIVER
77#endif
78
Steven Cooreman0d586662021-03-08 20:28:18 +010079/* If either of the built-in or test driver entry points need to be implemented, then
80 * the core implementation should be present. */
81#if defined(MBEDTLS_PSA_BUILTIN_HASH) || \
Steven Cooreman83f300e2021-03-08 17:09:48 +010082 defined(INCLUDE_HASH_TEST_DRIVER)
83#define INCLUDE_HASH_CORE 1
84#endif
85
Steven Cooreman5f88e772021-03-15 11:07:12 +010086#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
87 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) || \
88 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) || \
89 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
90const mbedtls_md_info_t *mbedtls_md_info_from_psa( psa_algorithm_t alg )
91{
92 switch( alg )
93 {
94#if defined(MBEDTLS_MD2_C)
95 case PSA_ALG_MD2:
96 return( &mbedtls_md2_info );
97#endif
98#if defined(MBEDTLS_MD4_C)
99 case PSA_ALG_MD4:
100 return( &mbedtls_md4_info );
101#endif
102#if defined(MBEDTLS_MD5_C)
103 case PSA_ALG_MD5:
104 return( &mbedtls_md5_info );
105#endif
106#if defined(MBEDTLS_RIPEMD160_C)
107 case PSA_ALG_RIPEMD160:
108 return( &mbedtls_ripemd160_info );
109#endif
110#if defined(MBEDTLS_SHA1_C)
111 case PSA_ALG_SHA_1:
112 return( &mbedtls_sha1_info );
113#endif
114#if defined(MBEDTLS_SHA256_C)
115 case PSA_ALG_SHA_224:
116 return( &mbedtls_sha224_info );
117#endif
118#if defined(MBEDTLS_SHA256_C)
119 case PSA_ALG_SHA_256:
120 return( &mbedtls_sha256_info );
121#endif
122#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
123 case PSA_ALG_SHA_384:
124 return( &mbedtls_sha384_info );
125#endif
126#if defined(MBEDTLS_SHA512_C)
127 case PSA_ALG_SHA_512:
128 return( &mbedtls_sha512_info );
129#endif
130 default:
131 return( NULL );
132 }
133}
134#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) ||
135 * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) ||
136 * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) ||
137 * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
138
Steven Cooreman83f300e2021-03-08 17:09:48 +0100139/* Implement the PSA driver hash interface on top of mbed TLS if either the
140 * software driver or the test driver requires it. */
141#if defined(INCLUDE_HASH_CORE)
142static psa_status_t hash_abort(
143 mbedtls_psa_hash_operation_t *operation )
Steven Cooreman0e307642021-02-18 16:18:32 +0100144{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100145 switch( operation->alg )
146 {
147 case 0:
148 /* The object has (apparently) been initialized but it is not
149 * in use. It's ok to call abort on such an object, and there's
150 * nothing to do. */
151 break;
152#if defined(BUILTIN_ALG_MD2)
153 case PSA_ALG_MD2:
154 mbedtls_md2_free( &operation->ctx.md2 );
155 break;
156#endif
157#if defined(BUILTIN_ALG_MD4)
158 case PSA_ALG_MD4:
159 mbedtls_md4_free( &operation->ctx.md4 );
160 break;
161#endif
162#if defined(BUILTIN_ALG_MD5)
163 case PSA_ALG_MD5:
164 mbedtls_md5_free( &operation->ctx.md5 );
165 break;
166#endif
167#if defined(BUILTIN_ALG_RIPEMD160)
168 case PSA_ALG_RIPEMD160:
169 mbedtls_ripemd160_free( &operation->ctx.ripemd160 );
170 break;
171#endif
172#if defined(BUILTIN_ALG_SHA_1)
173 case PSA_ALG_SHA_1:
174 mbedtls_sha1_free( &operation->ctx.sha1 );
175 break;
176#endif
177#if defined(BUILTIN_ALG_SHA_224)
178 case PSA_ALG_SHA_224:
179 mbedtls_sha256_free( &operation->ctx.sha256 );
180 break;
181#endif
182#if defined(BUILTIN_ALG_SHA_256)
183 case PSA_ALG_SHA_256:
184 mbedtls_sha256_free( &operation->ctx.sha256 );
185 break;
186#endif
187#if defined(BUILTIN_ALG_SHA_384)
188 case PSA_ALG_SHA_384:
189 mbedtls_sha512_free( &operation->ctx.sha512 );
190 break;
191#endif
192#if defined(BUILTIN_ALG_SHA_512)
193 case PSA_ALG_SHA_512:
194 mbedtls_sha512_free( &operation->ctx.sha512 );
195 break;
196#endif
197 default:
198 return( PSA_ERROR_BAD_STATE );
199 }
200 operation->alg = 0;
201 return( PSA_SUCCESS );
Steven Cooreman0e307642021-02-18 16:18:32 +0100202}
203
Steven Cooreman83f300e2021-03-08 17:09:48 +0100204static psa_status_t hash_setup(
Steven Cooreman0e307642021-02-18 16:18:32 +0100205 mbedtls_psa_hash_operation_t *operation,
206 psa_algorithm_t alg )
207{
208 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
209
210 /* A context must be freshly initialized before it can be set up. */
211 if( operation->alg != 0 )
212 {
213 return( PSA_ERROR_BAD_STATE );
214 }
215
216 switch( alg )
217 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100218#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100219 case PSA_ALG_MD2:
220 mbedtls_md2_init( &operation->ctx.md2 );
221 ret = mbedtls_md2_starts_ret( &operation->ctx.md2 );
222 break;
223#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100224#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100225 case PSA_ALG_MD4:
226 mbedtls_md4_init( &operation->ctx.md4 );
227 ret = mbedtls_md4_starts_ret( &operation->ctx.md4 );
228 break;
229#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100230#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100231 case PSA_ALG_MD5:
232 mbedtls_md5_init( &operation->ctx.md5 );
233 ret = mbedtls_md5_starts_ret( &operation->ctx.md5 );
234 break;
235#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100236#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100237 case PSA_ALG_RIPEMD160:
238 mbedtls_ripemd160_init( &operation->ctx.ripemd160 );
239 ret = mbedtls_ripemd160_starts_ret( &operation->ctx.ripemd160 );
240 break;
241#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100242#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100243 case PSA_ALG_SHA_1:
244 mbedtls_sha1_init( &operation->ctx.sha1 );
245 ret = mbedtls_sha1_starts_ret( &operation->ctx.sha1 );
246 break;
247#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100248#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100249 case PSA_ALG_SHA_224:
250 mbedtls_sha256_init( &operation->ctx.sha256 );
251 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 1 );
252 break;
253#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100254#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100255 case PSA_ALG_SHA_256:
256 mbedtls_sha256_init( &operation->ctx.sha256 );
257 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 0 );
258 break;
259#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100260#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100261 case PSA_ALG_SHA_384:
262 mbedtls_sha512_init( &operation->ctx.sha512 );
263 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 1 );
264 break;
265#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100266#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100267 case PSA_ALG_SHA_512:
268 mbedtls_sha512_init( &operation->ctx.sha512 );
269 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 0 );
270 break;
271#endif
272 default:
273 return( PSA_ALG_IS_HASH( alg ) ?
274 PSA_ERROR_NOT_SUPPORTED :
275 PSA_ERROR_INVALID_ARGUMENT );
276 }
277 if( ret == 0 )
278 operation->alg = alg;
279 else
Steven Cooreman83f300e2021-03-08 17:09:48 +0100280 hash_abort( operation );
Steven Cooreman0e307642021-02-18 16:18:32 +0100281 return( mbedtls_to_psa_error( ret ) );
282}
283
Steven Cooreman83f300e2021-03-08 17:09:48 +0100284static psa_status_t hash_clone(
Steven Cooreman0e307642021-02-18 16:18:32 +0100285 const mbedtls_psa_hash_operation_t *source_operation,
286 mbedtls_psa_hash_operation_t *target_operation )
287{
288 switch( source_operation->alg )
289 {
290 case 0:
291 return( PSA_ERROR_BAD_STATE );
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100292#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100293 case PSA_ALG_MD2:
294 mbedtls_md2_clone( &target_operation->ctx.md2,
295 &source_operation->ctx.md2 );
296 break;
297#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100298#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100299 case PSA_ALG_MD4:
300 mbedtls_md4_clone( &target_operation->ctx.md4,
301 &source_operation->ctx.md4 );
302 break;
303#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100304#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100305 case PSA_ALG_MD5:
306 mbedtls_md5_clone( &target_operation->ctx.md5,
307 &source_operation->ctx.md5 );
308 break;
309#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100310#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100311 case PSA_ALG_RIPEMD160:
312 mbedtls_ripemd160_clone( &target_operation->ctx.ripemd160,
313 &source_operation->ctx.ripemd160 );
314 break;
315#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100316#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100317 case PSA_ALG_SHA_1:
318 mbedtls_sha1_clone( &target_operation->ctx.sha1,
319 &source_operation->ctx.sha1 );
320 break;
321#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100322#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100323 case PSA_ALG_SHA_224:
324 mbedtls_sha256_clone( &target_operation->ctx.sha256,
325 &source_operation->ctx.sha256 );
326 break;
327#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100328#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100329 case PSA_ALG_SHA_256:
330 mbedtls_sha256_clone( &target_operation->ctx.sha256,
331 &source_operation->ctx.sha256 );
332 break;
333#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100334#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100335 case PSA_ALG_SHA_384:
336 mbedtls_sha512_clone( &target_operation->ctx.sha512,
337 &source_operation->ctx.sha512 );
338 break;
339#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100340#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100341 case PSA_ALG_SHA_512:
342 mbedtls_sha512_clone( &target_operation->ctx.sha512,
343 &source_operation->ctx.sha512 );
344 break;
345#endif
346 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100347 (void) source_operation;
348 (void) target_operation;
Steven Cooreman0e307642021-02-18 16:18:32 +0100349 return( PSA_ERROR_NOT_SUPPORTED );
350 }
351
352 target_operation->alg = source_operation->alg;
353 return( PSA_SUCCESS );
354}
355
Steven Cooreman83f300e2021-03-08 17:09:48 +0100356static psa_status_t hash_update(
Steven Cooreman0e307642021-02-18 16:18:32 +0100357 mbedtls_psa_hash_operation_t *operation,
358 const uint8_t *input,
359 size_t input_length )
360{
361 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
362
Steven Cooreman0e307642021-02-18 16:18:32 +0100363 switch( operation->alg )
364 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100365#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100366 case PSA_ALG_MD2:
367 ret = mbedtls_md2_update_ret( &operation->ctx.md2,
368 input, input_length );
369 break;
370#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100371#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100372 case PSA_ALG_MD4:
373 ret = mbedtls_md4_update_ret( &operation->ctx.md4,
374 input, input_length );
375 break;
376#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100377#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100378 case PSA_ALG_MD5:
379 ret = mbedtls_md5_update_ret( &operation->ctx.md5,
380 input, input_length );
381 break;
382#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100383#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100384 case PSA_ALG_RIPEMD160:
385 ret = mbedtls_ripemd160_update_ret( &operation->ctx.ripemd160,
386 input, input_length );
387 break;
388#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100389#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100390 case PSA_ALG_SHA_1:
391 ret = mbedtls_sha1_update_ret( &operation->ctx.sha1,
392 input, input_length );
393 break;
394#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100395#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100396 case PSA_ALG_SHA_224:
397 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
398 input, input_length );
399 break;
400#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100401#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100402 case PSA_ALG_SHA_256:
403 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
404 input, input_length );
405 break;
406#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100407#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100408 case PSA_ALG_SHA_384:
409 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
410 input, input_length );
411 break;
412#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100413#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100414 case PSA_ALG_SHA_512:
415 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
416 input, input_length );
417 break;
418#endif
419 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100420 (void) input;
421 (void) input_length;
Steven Cooreman0e307642021-02-18 16:18:32 +0100422 return( PSA_ERROR_BAD_STATE );
423 }
424
425 if( ret != 0 )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100426 hash_abort( operation );
Steven Cooreman0e307642021-02-18 16:18:32 +0100427 return( mbedtls_to_psa_error( ret ) );
428}
429
Steven Cooreman83f300e2021-03-08 17:09:48 +0100430static psa_status_t hash_finish(
Steven Cooreman0e307642021-02-18 16:18:32 +0100431 mbedtls_psa_hash_operation_t *operation,
432 uint8_t *hash,
433 size_t hash_size,
434 size_t *hash_length )
435{
436 psa_status_t status;
437 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
438 size_t actual_hash_length = PSA_HASH_LENGTH( operation->alg );
439
440 /* Fill the output buffer with something that isn't a valid hash
441 * (barring an attack on the hash and deliberately-crafted input),
442 * in case the caller doesn't check the return status properly. */
443 *hash_length = hash_size;
444 /* If hash_size is 0 then hash may be NULL and then the
445 * call to memset would have undefined behavior. */
446 if( hash_size != 0 )
447 memset( hash, '!', hash_size );
448
449 if( hash_size < actual_hash_length )
450 {
451 status = PSA_ERROR_BUFFER_TOO_SMALL;
452 goto exit;
453 }
454
455 switch( operation->alg )
456 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100457#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100458 case PSA_ALG_MD2:
459 ret = mbedtls_md2_finish_ret( &operation->ctx.md2, hash );
460 break;
461#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100462#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100463 case PSA_ALG_MD4:
464 ret = mbedtls_md4_finish_ret( &operation->ctx.md4, hash );
465 break;
466#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100467#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100468 case PSA_ALG_MD5:
469 ret = mbedtls_md5_finish_ret( &operation->ctx.md5, hash );
470 break;
471#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100472#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100473 case PSA_ALG_RIPEMD160:
474 ret = mbedtls_ripemd160_finish_ret( &operation->ctx.ripemd160, hash );
475 break;
476#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100477#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100478 case PSA_ALG_SHA_1:
479 ret = mbedtls_sha1_finish_ret( &operation->ctx.sha1, hash );
480 break;
481#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100482#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100483 case PSA_ALG_SHA_224:
484 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
485 break;
486#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100487#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100488 case PSA_ALG_SHA_256:
489 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
490 break;
491#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100492#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100493 case PSA_ALG_SHA_384:
494 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
495 break;
496#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100497#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100498 case PSA_ALG_SHA_512:
499 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
500 break;
501#endif
502 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100503 (void) hash;
Steven Cooreman0e307642021-02-18 16:18:32 +0100504 return( PSA_ERROR_BAD_STATE );
505 }
506 status = mbedtls_to_psa_error( ret );
507
508exit:
509 if( status == PSA_SUCCESS )
510 {
511 *hash_length = actual_hash_length;
Steven Cooreman83f300e2021-03-08 17:09:48 +0100512 return( hash_abort( operation ) );
Steven Cooreman0e307642021-02-18 16:18:32 +0100513 }
514 else
515 {
Steven Cooreman83f300e2021-03-08 17:09:48 +0100516 hash_abort( operation );
Steven Cooreman0e307642021-02-18 16:18:32 +0100517 return( status );
518 }
519}
520
Steven Cooreman83f300e2021-03-08 17:09:48 +0100521static psa_status_t hash_compute(
522 psa_algorithm_t alg,
523 const uint8_t *input,
524 size_t input_length,
525 uint8_t *hash,
526 size_t hash_size,
527 size_t *hash_length)
528{
529 mbedtls_psa_hash_operation_t operation = MBEDTLS_PSA_HASH_OPERATION_INIT;
530 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
531
532 *hash_length = hash_size;
533 status = hash_setup( &operation, alg );
534 if( status != PSA_SUCCESS )
535 goto exit;
536 status = hash_update( &operation, input, input_length );
537 if( status != PSA_SUCCESS )
538 goto exit;
539 status = hash_finish( &operation, hash, hash_size, hash_length );
540 if( status != PSA_SUCCESS )
541 goto exit;
542
543exit:
544 if( status == PSA_SUCCESS )
545 status = hash_abort( &operation );
546 else
547 hash_abort( &operation );
548 return( status );
549}
550#endif /* INCLUDE_HASH_CORE */
551
Steven Cooreman0d586662021-03-08 20:28:18 +0100552#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman83f300e2021-03-08 17:09:48 +0100553psa_status_t mbedtls_psa_hash_compute(
554 psa_algorithm_t alg,
555 const uint8_t *input,
556 size_t input_length,
557 uint8_t *hash,
558 size_t hash_size,
559 size_t *hash_length)
560{
561 return( hash_compute( alg, input, input_length,
562 hash, hash_size, hash_length ) );
563}
564
565psa_status_t mbedtls_psa_hash_setup(
566 mbedtls_psa_hash_operation_t *operation,
567 psa_algorithm_t alg )
568{
569 return( hash_setup( operation, alg ) );
570}
571
572psa_status_t mbedtls_psa_hash_clone(
573 const mbedtls_psa_hash_operation_t *source_operation,
574 mbedtls_psa_hash_operation_t *target_operation )
575{
576 return( hash_clone( source_operation, target_operation ) );
577}
578
579psa_status_t mbedtls_psa_hash_update(
580 mbedtls_psa_hash_operation_t *operation,
581 const uint8_t *input,
582 size_t input_length )
583{
584 return( hash_update( operation, input, input_length ) );
585}
586
587psa_status_t mbedtls_psa_hash_finish(
588 mbedtls_psa_hash_operation_t *operation,
589 uint8_t *hash,
590 size_t hash_size,
591 size_t *hash_length )
592{
593 return( hash_finish( operation, hash, hash_size, hash_length ) );
594}
595
Steven Cooreman0e307642021-02-18 16:18:32 +0100596psa_status_t mbedtls_psa_hash_abort(
597 mbedtls_psa_hash_operation_t *operation )
598{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100599 return( hash_abort( operation ) );
Steven Cooreman0e307642021-02-18 16:18:32 +0100600}
Steven Cooreman0d586662021-03-08 20:28:18 +0100601#endif /* MBEDTLS_PSA_BUILTIN_HASH */
Steven Cooreman0e307642021-02-18 16:18:32 +0100602
Steven Cooremanf7638102021-03-04 15:14:36 +0100603 /*
604 * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
605 */
Steven Cooremanf7638102021-03-04 15:14:36 +0100606#if defined(INCLUDE_HASH_TEST_DRIVER)
Steven Cooremana85e2f82021-03-15 11:00:12 +0100607
Steven Cooremanf7638102021-03-04 15:14:36 +0100608psa_status_t is_hash_accelerated( psa_algorithm_t alg )
609{
610 switch( alg )
611 {
612#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2)
613 case PSA_ALG_MD2:
614 return( PSA_SUCCESS );
615#endif
616#if defined(MBEDTLS_PSA_ACCEL_ALG_MD4)
617 case PSA_ALG_MD4:
618 return( PSA_SUCCESS );
619#endif
620#if defined(MBEDTLS_PSA_ACCEL_ALG_MD5)
621 case PSA_ALG_MD5:
622 return( PSA_SUCCESS );
623#endif
624#if defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160)
625 case PSA_ALG_RIPEMD160:
626 return( PSA_SUCCESS );
627#endif
628#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1)
629 case PSA_ALG_SHA_1:
630 return( PSA_SUCCESS );
631#endif
632#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224)
633 case PSA_ALG_SHA_224:
634 return( PSA_SUCCESS );
635#endif
636#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256)
637 case PSA_ALG_SHA_256:
638 return( PSA_SUCCESS );
639#endif
640#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384)
641 case PSA_ALG_SHA_384:
642 return( PSA_SUCCESS );
643#endif
644#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
645 case PSA_ALG_SHA_512:
646 return( PSA_SUCCESS );
647#endif
648 default:
649 return( PSA_ERROR_NOT_SUPPORTED );
650 }
651}
Steven Cooremanf7638102021-03-04 15:14:36 +0100652
Steven Cooreman25555222021-03-08 16:20:04 +0100653psa_status_t mbedtls_transparent_test_driver_hash_compute(
Steven Cooremanf7638102021-03-04 15:14:36 +0100654 psa_algorithm_t alg,
655 const uint8_t *input,
656 size_t input_length,
657 uint8_t *hash,
658 size_t hash_size,
659 size_t *hash_length)
660{
Steven Cooremanf7638102021-03-04 15:14:36 +0100661 if( is_hash_accelerated( alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100662 return( hash_compute( alg, input, input_length,
663 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100664 else
665 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf7638102021-03-04 15:14:36 +0100666}
667
Steven Cooreman25555222021-03-08 16:20:04 +0100668psa_status_t mbedtls_transparent_test_driver_hash_setup(
669 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100670 psa_algorithm_t alg )
671{
Steven Cooremanf7638102021-03-04 15:14:36 +0100672 if( is_hash_accelerated( alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100673 return( hash_setup( &operation->operation, alg ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100674 else
675 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf7638102021-03-04 15:14:36 +0100676}
677
Steven Cooreman25555222021-03-08 16:20:04 +0100678psa_status_t mbedtls_transparent_test_driver_hash_clone(
679 const mbedtls_transparent_test_driver_hash_operation_t *source_operation,
680 mbedtls_transparent_test_driver_hash_operation_t *target_operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100681{
Steven Cooremanf7638102021-03-04 15:14:36 +0100682 if( is_hash_accelerated( source_operation->operation.alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100683 return( hash_clone( &source_operation->operation,
684 &target_operation->operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100685 else
686 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100687}
688
Steven Cooreman25555222021-03-08 16:20:04 +0100689psa_status_t mbedtls_transparent_test_driver_hash_update(
690 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100691 const uint8_t *input,
692 size_t input_length )
693{
Steven Cooremanf7638102021-03-04 15:14:36 +0100694 if( is_hash_accelerated( operation->operation.alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100695 return( hash_update( &operation->operation,
696 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100697 else
698 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100699}
700
Steven Cooreman25555222021-03-08 16:20:04 +0100701psa_status_t mbedtls_transparent_test_driver_hash_finish(
702 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100703 uint8_t *hash,
704 size_t hash_size,
705 size_t *hash_length )
706{
Steven Cooremanf7638102021-03-04 15:14:36 +0100707 if( is_hash_accelerated( operation->operation.alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100708 return( hash_finish( &operation->operation,
709 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100710 else
711 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100712}
713
Steven Cooreman25555222021-03-08 16:20:04 +0100714psa_status_t mbedtls_transparent_test_driver_hash_abort(
715 mbedtls_transparent_test_driver_hash_operation_t *operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100716{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100717 return( hash_abort( &operation->operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100718}
719
Steven Cooremana85e2f82021-03-15 11:00:12 +0100720#endif /* INCLUDE_HASH_TEST_DRIVER */
Steven Cooremanf7638102021-03-04 15:14:36 +0100721
Steven Cooreman0e307642021-02-18 16:18:32 +0100722#endif /* MBEDTLS_PSA_CRYPTO_C */