blob: 432d8a0caaa7aa693ff033065a179c06db2349bc [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
Steven Cooreman0e307642021-02-18 16:18:32 +0100425 return( mbedtls_to_psa_error( ret ) );
426}
427
Steven Cooreman83f300e2021-03-08 17:09:48 +0100428static psa_status_t hash_finish(
Steven Cooreman0e307642021-02-18 16:18:32 +0100429 mbedtls_psa_hash_operation_t *operation,
430 uint8_t *hash,
431 size_t hash_size,
432 size_t *hash_length )
433{
434 psa_status_t status;
435 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
436 size_t actual_hash_length = PSA_HASH_LENGTH( operation->alg );
437
438 /* Fill the output buffer with something that isn't a valid hash
439 * (barring an attack on the hash and deliberately-crafted input),
440 * in case the caller doesn't check the return status properly. */
441 *hash_length = hash_size;
442 /* If hash_size is 0 then hash may be NULL and then the
443 * call to memset would have undefined behavior. */
444 if( hash_size != 0 )
445 memset( hash, '!', hash_size );
446
447 if( hash_size < actual_hash_length )
448 {
449 status = PSA_ERROR_BUFFER_TOO_SMALL;
450 goto exit;
451 }
452
453 switch( operation->alg )
454 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100455#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100456 case PSA_ALG_MD2:
457 ret = mbedtls_md2_finish_ret( &operation->ctx.md2, hash );
458 break;
459#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100460#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100461 case PSA_ALG_MD4:
462 ret = mbedtls_md4_finish_ret( &operation->ctx.md4, hash );
463 break;
464#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100465#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100466 case PSA_ALG_MD5:
467 ret = mbedtls_md5_finish_ret( &operation->ctx.md5, hash );
468 break;
469#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100470#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100471 case PSA_ALG_RIPEMD160:
472 ret = mbedtls_ripemd160_finish_ret( &operation->ctx.ripemd160, hash );
473 break;
474#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100475#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100476 case PSA_ALG_SHA_1:
477 ret = mbedtls_sha1_finish_ret( &operation->ctx.sha1, hash );
478 break;
479#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100480#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100481 case PSA_ALG_SHA_224:
482 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
483 break;
484#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100485#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100486 case PSA_ALG_SHA_256:
487 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
488 break;
489#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100490#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100491 case PSA_ALG_SHA_384:
492 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
493 break;
494#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100495#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100496 case PSA_ALG_SHA_512:
497 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
498 break;
499#endif
500 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100501 (void) hash;
Steven Cooreman0e307642021-02-18 16:18:32 +0100502 return( PSA_ERROR_BAD_STATE );
503 }
504 status = mbedtls_to_psa_error( ret );
505
506exit:
507 if( status == PSA_SUCCESS )
Steven Cooreman0e307642021-02-18 16:18:32 +0100508 *hash_length = actual_hash_length;
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100509 return( status );
Steven Cooreman0e307642021-02-18 16:18:32 +0100510}
511
Steven Cooreman83f300e2021-03-08 17:09:48 +0100512static psa_status_t hash_compute(
513 psa_algorithm_t alg,
514 const uint8_t *input,
515 size_t input_length,
516 uint8_t *hash,
517 size_t hash_size,
518 size_t *hash_length)
519{
520 mbedtls_psa_hash_operation_t operation = MBEDTLS_PSA_HASH_OPERATION_INIT;
521 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100522 psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman83f300e2021-03-08 17:09:48 +0100523
524 *hash_length = hash_size;
525 status = hash_setup( &operation, alg );
526 if( status != PSA_SUCCESS )
527 goto exit;
528 status = hash_update( &operation, input, input_length );
529 if( status != PSA_SUCCESS )
530 goto exit;
531 status = hash_finish( &operation, hash, hash_size, hash_length );
532 if( status != PSA_SUCCESS )
533 goto exit;
534
535exit:
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100536 abort_status = hash_abort( &operation );
Steven Cooreman83f300e2021-03-08 17:09:48 +0100537 if( status == PSA_SUCCESS )
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100538 return( abort_status );
Steven Cooreman83f300e2021-03-08 17:09:48 +0100539 else
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100540 return( status );
541
Steven Cooreman83f300e2021-03-08 17:09:48 +0100542}
543#endif /* INCLUDE_HASH_CORE */
544
Steven Cooreman0d586662021-03-08 20:28:18 +0100545#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman83f300e2021-03-08 17:09:48 +0100546psa_status_t mbedtls_psa_hash_compute(
547 psa_algorithm_t alg,
548 const uint8_t *input,
549 size_t input_length,
550 uint8_t *hash,
551 size_t hash_size,
552 size_t *hash_length)
553{
554 return( hash_compute( alg, input, input_length,
555 hash, hash_size, hash_length ) );
556}
557
558psa_status_t mbedtls_psa_hash_setup(
559 mbedtls_psa_hash_operation_t *operation,
560 psa_algorithm_t alg )
561{
562 return( hash_setup( operation, alg ) );
563}
564
565psa_status_t mbedtls_psa_hash_clone(
566 const mbedtls_psa_hash_operation_t *source_operation,
567 mbedtls_psa_hash_operation_t *target_operation )
568{
569 return( hash_clone( source_operation, target_operation ) );
570}
571
572psa_status_t mbedtls_psa_hash_update(
573 mbedtls_psa_hash_operation_t *operation,
574 const uint8_t *input,
575 size_t input_length )
576{
577 return( hash_update( operation, input, input_length ) );
578}
579
580psa_status_t mbedtls_psa_hash_finish(
581 mbedtls_psa_hash_operation_t *operation,
582 uint8_t *hash,
583 size_t hash_size,
584 size_t *hash_length )
585{
586 return( hash_finish( operation, hash, hash_size, hash_length ) );
587}
588
Steven Cooreman0e307642021-02-18 16:18:32 +0100589psa_status_t mbedtls_psa_hash_abort(
590 mbedtls_psa_hash_operation_t *operation )
591{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100592 return( hash_abort( operation ) );
Steven Cooreman0e307642021-02-18 16:18:32 +0100593}
Steven Cooreman0d586662021-03-08 20:28:18 +0100594#endif /* MBEDTLS_PSA_BUILTIN_HASH */
Steven Cooreman0e307642021-02-18 16:18:32 +0100595
Steven Cooremanf7638102021-03-04 15:14:36 +0100596 /*
597 * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
598 */
Steven Cooremanf7638102021-03-04 15:14:36 +0100599#if defined(INCLUDE_HASH_TEST_DRIVER)
Steven Cooremana85e2f82021-03-15 11:00:12 +0100600
Steven Cooremanf7638102021-03-04 15:14:36 +0100601psa_status_t is_hash_accelerated( psa_algorithm_t alg )
602{
603 switch( alg )
604 {
605#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2)
606 case PSA_ALG_MD2:
607 return( PSA_SUCCESS );
608#endif
609#if defined(MBEDTLS_PSA_ACCEL_ALG_MD4)
610 case PSA_ALG_MD4:
611 return( PSA_SUCCESS );
612#endif
613#if defined(MBEDTLS_PSA_ACCEL_ALG_MD5)
614 case PSA_ALG_MD5:
615 return( PSA_SUCCESS );
616#endif
617#if defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160)
618 case PSA_ALG_RIPEMD160:
619 return( PSA_SUCCESS );
620#endif
621#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1)
622 case PSA_ALG_SHA_1:
623 return( PSA_SUCCESS );
624#endif
625#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224)
626 case PSA_ALG_SHA_224:
627 return( PSA_SUCCESS );
628#endif
629#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256)
630 case PSA_ALG_SHA_256:
631 return( PSA_SUCCESS );
632#endif
633#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384)
634 case PSA_ALG_SHA_384:
635 return( PSA_SUCCESS );
636#endif
637#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
638 case PSA_ALG_SHA_512:
639 return( PSA_SUCCESS );
640#endif
641 default:
642 return( PSA_ERROR_NOT_SUPPORTED );
643 }
644}
Steven Cooremanf7638102021-03-04 15:14:36 +0100645
Steven Cooreman25555222021-03-08 16:20:04 +0100646psa_status_t mbedtls_transparent_test_driver_hash_compute(
Steven Cooremanf7638102021-03-04 15:14:36 +0100647 psa_algorithm_t alg,
648 const uint8_t *input,
649 size_t input_length,
650 uint8_t *hash,
651 size_t hash_size,
652 size_t *hash_length)
653{
Steven Cooremanf7638102021-03-04 15:14:36 +0100654 if( is_hash_accelerated( alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100655 return( hash_compute( alg, input, input_length,
656 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100657 else
658 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf7638102021-03-04 15:14:36 +0100659}
660
Steven Cooreman25555222021-03-08 16:20:04 +0100661psa_status_t mbedtls_transparent_test_driver_hash_setup(
662 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100663 psa_algorithm_t alg )
664{
Steven Cooremanf7638102021-03-04 15:14:36 +0100665 if( is_hash_accelerated( alg ) == PSA_SUCCESS )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100666 return( hash_setup( operation, alg ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100667 else
668 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf7638102021-03-04 15:14:36 +0100669}
670
Steven Cooreman25555222021-03-08 16:20:04 +0100671psa_status_t mbedtls_transparent_test_driver_hash_clone(
672 const mbedtls_transparent_test_driver_hash_operation_t *source_operation,
673 mbedtls_transparent_test_driver_hash_operation_t *target_operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100674{
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100675 if( is_hash_accelerated( source_operation->alg ) == PSA_SUCCESS )
676 return( hash_clone( source_operation, target_operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100677 else
678 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100679}
680
Steven Cooreman25555222021-03-08 16:20:04 +0100681psa_status_t mbedtls_transparent_test_driver_hash_update(
682 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100683 const uint8_t *input,
684 size_t input_length )
685{
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100686 if( is_hash_accelerated( operation->alg ) == PSA_SUCCESS )
687 return( hash_update( operation, input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100688 else
689 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100690}
691
Steven Cooreman25555222021-03-08 16:20:04 +0100692psa_status_t mbedtls_transparent_test_driver_hash_finish(
693 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100694 uint8_t *hash,
695 size_t hash_size,
696 size_t *hash_length )
697{
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100698 if( is_hash_accelerated( operation->alg ) == PSA_SUCCESS )
699 return( hash_finish( operation, hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100700 else
701 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100702}
703
Steven Cooreman25555222021-03-08 16:20:04 +0100704psa_status_t mbedtls_transparent_test_driver_hash_abort(
705 mbedtls_transparent_test_driver_hash_operation_t *operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100706{
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100707 return( hash_abort( operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100708}
709
Steven Cooremana85e2f82021-03-15 11:00:12 +0100710#endif /* INCLUDE_HASH_TEST_DRIVER */
Steven Cooremanf7638102021-03-04 15:14:36 +0100711
Steven Cooreman0e307642021-02-18 16:18:32 +0100712#endif /* MBEDTLS_PSA_CRYPTO_C */