blob: d0f986ebc781719924e4e96d4149db62fdcb8b41 [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 Cooreman5f88e772021-03-15 11:07:12 +010071#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
72 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) || \
73 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) || \
74 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
75const mbedtls_md_info_t *mbedtls_md_info_from_psa( psa_algorithm_t alg )
76{
77 switch( alg )
78 {
79#if defined(MBEDTLS_MD2_C)
80 case PSA_ALG_MD2:
81 return( &mbedtls_md2_info );
82#endif
83#if defined(MBEDTLS_MD4_C)
84 case PSA_ALG_MD4:
85 return( &mbedtls_md4_info );
86#endif
87#if defined(MBEDTLS_MD5_C)
88 case PSA_ALG_MD5:
89 return( &mbedtls_md5_info );
90#endif
91#if defined(MBEDTLS_RIPEMD160_C)
92 case PSA_ALG_RIPEMD160:
93 return( &mbedtls_ripemd160_info );
94#endif
95#if defined(MBEDTLS_SHA1_C)
96 case PSA_ALG_SHA_1:
97 return( &mbedtls_sha1_info );
98#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +020099#if defined(MBEDTLS_SHA224_C)
Steven Cooreman5f88e772021-03-15 11:07:12 +0100100 case PSA_ALG_SHA_224:
101 return( &mbedtls_sha224_info );
102#endif
103#if defined(MBEDTLS_SHA256_C)
104 case PSA_ALG_SHA_256:
105 return( &mbedtls_sha256_info );
106#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200107#if defined(MBEDTLS_SHA384_C)
Steven Cooreman5f88e772021-03-15 11:07:12 +0100108 case PSA_ALG_SHA_384:
109 return( &mbedtls_sha384_info );
110#endif
111#if defined(MBEDTLS_SHA512_C)
112 case PSA_ALG_SHA_512:
113 return( &mbedtls_sha512_info );
114#endif
115 default:
116 return( NULL );
117 }
118}
119#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) ||
120 * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) ||
121 * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) ||
122 * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
123
Steven Cooreman83f300e2021-03-08 17:09:48 +0100124/* Implement the PSA driver hash interface on top of mbed TLS if either the
125 * software driver or the test driver requires it. */
Steven Cooremanf8e45a42021-03-16 11:07:55 +0100126#if defined(MBEDTLS_PSA_BUILTIN_HASH) || defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman83f300e2021-03-08 17:09:48 +0100127static psa_status_t hash_abort(
128 mbedtls_psa_hash_operation_t *operation )
Steven Cooreman0e307642021-02-18 16:18:32 +0100129{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100130 switch( operation->alg )
131 {
132 case 0:
133 /* The object has (apparently) been initialized but it is not
134 * in use. It's ok to call abort on such an object, and there's
135 * nothing to do. */
136 break;
137#if defined(BUILTIN_ALG_MD2)
138 case PSA_ALG_MD2:
139 mbedtls_md2_free( &operation->ctx.md2 );
140 break;
141#endif
142#if defined(BUILTIN_ALG_MD4)
143 case PSA_ALG_MD4:
144 mbedtls_md4_free( &operation->ctx.md4 );
145 break;
146#endif
147#if defined(BUILTIN_ALG_MD5)
148 case PSA_ALG_MD5:
149 mbedtls_md5_free( &operation->ctx.md5 );
150 break;
151#endif
152#if defined(BUILTIN_ALG_RIPEMD160)
153 case PSA_ALG_RIPEMD160:
154 mbedtls_ripemd160_free( &operation->ctx.ripemd160 );
155 break;
156#endif
157#if defined(BUILTIN_ALG_SHA_1)
158 case PSA_ALG_SHA_1:
159 mbedtls_sha1_free( &operation->ctx.sha1 );
160 break;
161#endif
162#if defined(BUILTIN_ALG_SHA_224)
163 case PSA_ALG_SHA_224:
164 mbedtls_sha256_free( &operation->ctx.sha256 );
165 break;
166#endif
167#if defined(BUILTIN_ALG_SHA_256)
168 case PSA_ALG_SHA_256:
169 mbedtls_sha256_free( &operation->ctx.sha256 );
170 break;
171#endif
172#if defined(BUILTIN_ALG_SHA_384)
173 case PSA_ALG_SHA_384:
174 mbedtls_sha512_free( &operation->ctx.sha512 );
175 break;
176#endif
177#if defined(BUILTIN_ALG_SHA_512)
178 case PSA_ALG_SHA_512:
179 mbedtls_sha512_free( &operation->ctx.sha512 );
180 break;
181#endif
182 default:
183 return( PSA_ERROR_BAD_STATE );
184 }
185 operation->alg = 0;
186 return( PSA_SUCCESS );
Steven Cooreman0e307642021-02-18 16:18:32 +0100187}
188
Steven Cooreman83f300e2021-03-08 17:09:48 +0100189static psa_status_t hash_setup(
Steven Cooreman0e307642021-02-18 16:18:32 +0100190 mbedtls_psa_hash_operation_t *operation,
191 psa_algorithm_t alg )
192{
193 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
194
195 /* A context must be freshly initialized before it can be set up. */
196 if( operation->alg != 0 )
197 {
198 return( PSA_ERROR_BAD_STATE );
199 }
200
201 switch( alg )
202 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100203#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100204 case PSA_ALG_MD2:
205 mbedtls_md2_init( &operation->ctx.md2 );
206 ret = mbedtls_md2_starts_ret( &operation->ctx.md2 );
207 break;
208#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100209#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100210 case PSA_ALG_MD4:
211 mbedtls_md4_init( &operation->ctx.md4 );
212 ret = mbedtls_md4_starts_ret( &operation->ctx.md4 );
213 break;
214#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100215#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100216 case PSA_ALG_MD5:
217 mbedtls_md5_init( &operation->ctx.md5 );
218 ret = mbedtls_md5_starts_ret( &operation->ctx.md5 );
219 break;
220#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100221#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100222 case PSA_ALG_RIPEMD160:
223 mbedtls_ripemd160_init( &operation->ctx.ripemd160 );
224 ret = mbedtls_ripemd160_starts_ret( &operation->ctx.ripemd160 );
225 break;
226#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100227#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100228 case PSA_ALG_SHA_1:
229 mbedtls_sha1_init( &operation->ctx.sha1 );
230 ret = mbedtls_sha1_starts_ret( &operation->ctx.sha1 );
231 break;
232#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100233#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100234 case PSA_ALG_SHA_224:
235 mbedtls_sha256_init( &operation->ctx.sha256 );
236 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 1 );
237 break;
238#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100239#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100240 case PSA_ALG_SHA_256:
241 mbedtls_sha256_init( &operation->ctx.sha256 );
242 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 0 );
243 break;
244#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100245#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100246 case PSA_ALG_SHA_384:
247 mbedtls_sha512_init( &operation->ctx.sha512 );
248 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 1 );
249 break;
250#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100251#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100252 case PSA_ALG_SHA_512:
253 mbedtls_sha512_init( &operation->ctx.sha512 );
254 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 0 );
255 break;
256#endif
257 default:
258 return( PSA_ALG_IS_HASH( alg ) ?
259 PSA_ERROR_NOT_SUPPORTED :
260 PSA_ERROR_INVALID_ARGUMENT );
261 }
262 if( ret == 0 )
263 operation->alg = alg;
264 else
Steven Cooreman83f300e2021-03-08 17:09:48 +0100265 hash_abort( operation );
Steven Cooreman0e307642021-02-18 16:18:32 +0100266 return( mbedtls_to_psa_error( ret ) );
267}
268
Steven Cooreman83f300e2021-03-08 17:09:48 +0100269static psa_status_t hash_clone(
Steven Cooreman0e307642021-02-18 16:18:32 +0100270 const mbedtls_psa_hash_operation_t *source_operation,
271 mbedtls_psa_hash_operation_t *target_operation )
272{
273 switch( source_operation->alg )
274 {
275 case 0:
276 return( PSA_ERROR_BAD_STATE );
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100277#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100278 case PSA_ALG_MD2:
279 mbedtls_md2_clone( &target_operation->ctx.md2,
280 &source_operation->ctx.md2 );
281 break;
282#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100283#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100284 case PSA_ALG_MD4:
285 mbedtls_md4_clone( &target_operation->ctx.md4,
286 &source_operation->ctx.md4 );
287 break;
288#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100289#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100290 case PSA_ALG_MD5:
291 mbedtls_md5_clone( &target_operation->ctx.md5,
292 &source_operation->ctx.md5 );
293 break;
294#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100295#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100296 case PSA_ALG_RIPEMD160:
297 mbedtls_ripemd160_clone( &target_operation->ctx.ripemd160,
298 &source_operation->ctx.ripemd160 );
299 break;
300#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100301#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100302 case PSA_ALG_SHA_1:
303 mbedtls_sha1_clone( &target_operation->ctx.sha1,
304 &source_operation->ctx.sha1 );
305 break;
306#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100307#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100308 case PSA_ALG_SHA_224:
309 mbedtls_sha256_clone( &target_operation->ctx.sha256,
310 &source_operation->ctx.sha256 );
311 break;
312#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100313#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100314 case PSA_ALG_SHA_256:
315 mbedtls_sha256_clone( &target_operation->ctx.sha256,
316 &source_operation->ctx.sha256 );
317 break;
318#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100319#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100320 case PSA_ALG_SHA_384:
321 mbedtls_sha512_clone( &target_operation->ctx.sha512,
322 &source_operation->ctx.sha512 );
323 break;
324#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100325#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100326 case PSA_ALG_SHA_512:
327 mbedtls_sha512_clone( &target_operation->ctx.sha512,
328 &source_operation->ctx.sha512 );
329 break;
330#endif
331 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100332 (void) source_operation;
333 (void) target_operation;
Steven Cooreman0e307642021-02-18 16:18:32 +0100334 return( PSA_ERROR_NOT_SUPPORTED );
335 }
336
337 target_operation->alg = source_operation->alg;
338 return( PSA_SUCCESS );
339}
340
Steven Cooreman83f300e2021-03-08 17:09:48 +0100341static psa_status_t hash_update(
Steven Cooreman0e307642021-02-18 16:18:32 +0100342 mbedtls_psa_hash_operation_t *operation,
343 const uint8_t *input,
344 size_t input_length )
345{
346 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
347
Steven Cooreman0e307642021-02-18 16:18:32 +0100348 switch( operation->alg )
349 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100350#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100351 case PSA_ALG_MD2:
352 ret = mbedtls_md2_update_ret( &operation->ctx.md2,
353 input, input_length );
354 break;
355#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100356#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100357 case PSA_ALG_MD4:
358 ret = mbedtls_md4_update_ret( &operation->ctx.md4,
359 input, input_length );
360 break;
361#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100362#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100363 case PSA_ALG_MD5:
364 ret = mbedtls_md5_update_ret( &operation->ctx.md5,
365 input, input_length );
366 break;
367#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100368#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100369 case PSA_ALG_RIPEMD160:
370 ret = mbedtls_ripemd160_update_ret( &operation->ctx.ripemd160,
371 input, input_length );
372 break;
373#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100374#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100375 case PSA_ALG_SHA_1:
376 ret = mbedtls_sha1_update_ret( &operation->ctx.sha1,
377 input, input_length );
378 break;
379#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100380#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100381 case PSA_ALG_SHA_224:
382 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
383 input, input_length );
384 break;
385#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100386#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100387 case PSA_ALG_SHA_256:
388 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
389 input, input_length );
390 break;
391#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100392#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100393 case PSA_ALG_SHA_384:
394 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
395 input, input_length );
396 break;
397#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100398#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100399 case PSA_ALG_SHA_512:
400 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
401 input, input_length );
402 break;
403#endif
404 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100405 (void) input;
406 (void) input_length;
Steven Cooreman0e307642021-02-18 16:18:32 +0100407 return( PSA_ERROR_BAD_STATE );
408 }
409
Steven Cooreman0e307642021-02-18 16:18:32 +0100410 return( mbedtls_to_psa_error( ret ) );
411}
412
Steven Cooreman83f300e2021-03-08 17:09:48 +0100413static psa_status_t hash_finish(
Steven Cooreman0e307642021-02-18 16:18:32 +0100414 mbedtls_psa_hash_operation_t *operation,
415 uint8_t *hash,
416 size_t hash_size,
417 size_t *hash_length )
418{
419 psa_status_t status;
420 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
421 size_t actual_hash_length = PSA_HASH_LENGTH( operation->alg );
422
423 /* Fill the output buffer with something that isn't a valid hash
424 * (barring an attack on the hash and deliberately-crafted input),
425 * in case the caller doesn't check the return status properly. */
426 *hash_length = hash_size;
427 /* If hash_size is 0 then hash may be NULL and then the
428 * call to memset would have undefined behavior. */
429 if( hash_size != 0 )
430 memset( hash, '!', hash_size );
431
432 if( hash_size < actual_hash_length )
433 {
434 status = PSA_ERROR_BUFFER_TOO_SMALL;
435 goto exit;
436 }
437
438 switch( operation->alg )
439 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100440#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100441 case PSA_ALG_MD2:
442 ret = mbedtls_md2_finish_ret( &operation->ctx.md2, hash );
443 break;
444#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100445#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100446 case PSA_ALG_MD4:
447 ret = mbedtls_md4_finish_ret( &operation->ctx.md4, hash );
448 break;
449#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100450#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100451 case PSA_ALG_MD5:
452 ret = mbedtls_md5_finish_ret( &operation->ctx.md5, hash );
453 break;
454#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100455#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100456 case PSA_ALG_RIPEMD160:
457 ret = mbedtls_ripemd160_finish_ret( &operation->ctx.ripemd160, hash );
458 break;
459#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100460#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100461 case PSA_ALG_SHA_1:
462 ret = mbedtls_sha1_finish_ret( &operation->ctx.sha1, hash );
463 break;
464#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100465#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100466 case PSA_ALG_SHA_224:
467 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
468 break;
469#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100470#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100471 case PSA_ALG_SHA_256:
472 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
473 break;
474#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100475#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100476 case PSA_ALG_SHA_384:
477 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
478 break;
479#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100480#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100481 case PSA_ALG_SHA_512:
482 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
483 break;
484#endif
485 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100486 (void) hash;
Steven Cooreman0e307642021-02-18 16:18:32 +0100487 return( PSA_ERROR_BAD_STATE );
488 }
489 status = mbedtls_to_psa_error( ret );
490
491exit:
492 if( status == PSA_SUCCESS )
Steven Cooreman0e307642021-02-18 16:18:32 +0100493 *hash_length = actual_hash_length;
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100494 return( status );
Steven Cooreman0e307642021-02-18 16:18:32 +0100495}
496
Steven Cooreman83f300e2021-03-08 17:09:48 +0100497static psa_status_t hash_compute(
498 psa_algorithm_t alg,
499 const uint8_t *input,
500 size_t input_length,
501 uint8_t *hash,
502 size_t hash_size,
503 size_t *hash_length)
504{
505 mbedtls_psa_hash_operation_t operation = MBEDTLS_PSA_HASH_OPERATION_INIT;
506 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100507 psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman83f300e2021-03-08 17:09:48 +0100508
509 *hash_length = hash_size;
510 status = hash_setup( &operation, alg );
511 if( status != PSA_SUCCESS )
512 goto exit;
513 status = hash_update( &operation, input, input_length );
514 if( status != PSA_SUCCESS )
515 goto exit;
516 status = hash_finish( &operation, hash, hash_size, hash_length );
517 if( status != PSA_SUCCESS )
518 goto exit;
519
520exit:
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100521 abort_status = hash_abort( &operation );
Steven Cooreman83f300e2021-03-08 17:09:48 +0100522 if( status == PSA_SUCCESS )
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100523 return( abort_status );
Steven Cooreman83f300e2021-03-08 17:09:48 +0100524 else
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100525 return( status );
526
Steven Cooreman83f300e2021-03-08 17:09:48 +0100527}
Steven Cooremanf8e45a42021-03-16 11:07:55 +0100528#endif /* MBEDTLS_PSA_BUILTIN_HASH || PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman83f300e2021-03-08 17:09:48 +0100529
Steven Cooreman0d586662021-03-08 20:28:18 +0100530#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman83f300e2021-03-08 17:09:48 +0100531psa_status_t mbedtls_psa_hash_compute(
532 psa_algorithm_t alg,
533 const uint8_t *input,
534 size_t input_length,
535 uint8_t *hash,
536 size_t hash_size,
537 size_t *hash_length)
538{
539 return( hash_compute( alg, input, input_length,
540 hash, hash_size, hash_length ) );
541}
542
543psa_status_t mbedtls_psa_hash_setup(
544 mbedtls_psa_hash_operation_t *operation,
545 psa_algorithm_t alg )
546{
547 return( hash_setup( operation, alg ) );
548}
549
550psa_status_t mbedtls_psa_hash_clone(
551 const mbedtls_psa_hash_operation_t *source_operation,
552 mbedtls_psa_hash_operation_t *target_operation )
553{
554 return( hash_clone( source_operation, target_operation ) );
555}
556
557psa_status_t mbedtls_psa_hash_update(
558 mbedtls_psa_hash_operation_t *operation,
559 const uint8_t *input,
560 size_t input_length )
561{
562 return( hash_update( operation, input, input_length ) );
563}
564
565psa_status_t mbedtls_psa_hash_finish(
566 mbedtls_psa_hash_operation_t *operation,
567 uint8_t *hash,
568 size_t hash_size,
569 size_t *hash_length )
570{
571 return( hash_finish( operation, hash, hash_size, hash_length ) );
572}
573
Steven Cooreman0e307642021-02-18 16:18:32 +0100574psa_status_t mbedtls_psa_hash_abort(
575 mbedtls_psa_hash_operation_t *operation )
576{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100577 return( hash_abort( operation ) );
Steven Cooreman0e307642021-02-18 16:18:32 +0100578}
Steven Cooreman0d586662021-03-08 20:28:18 +0100579#endif /* MBEDTLS_PSA_BUILTIN_HASH */
Steven Cooreman0e307642021-02-18 16:18:32 +0100580
Steven Cooremanf7638102021-03-04 15:14:36 +0100581 /*
582 * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
583 */
Steven Cooremanf8e45a42021-03-16 11:07:55 +0100584#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana85e2f82021-03-15 11:00:12 +0100585
Ronald Cron56c9a942021-04-01 10:45:57 +0200586static int is_hash_accelerated( psa_algorithm_t alg )
Steven Cooremanf7638102021-03-04 15:14:36 +0100587{
588 switch( alg )
589 {
590#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2)
591 case PSA_ALG_MD2:
Ronald Cron56c9a942021-04-01 10:45:57 +0200592 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100593#endif
594#if defined(MBEDTLS_PSA_ACCEL_ALG_MD4)
595 case PSA_ALG_MD4:
Ronald Cron56c9a942021-04-01 10:45:57 +0200596 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100597#endif
598#if defined(MBEDTLS_PSA_ACCEL_ALG_MD5)
599 case PSA_ALG_MD5:
Ronald Cron56c9a942021-04-01 10:45:57 +0200600 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100601#endif
602#if defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160)
603 case PSA_ALG_RIPEMD160:
Ronald Cron56c9a942021-04-01 10:45:57 +0200604 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100605#endif
606#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1)
607 case PSA_ALG_SHA_1:
Ronald Cron56c9a942021-04-01 10:45:57 +0200608 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100609#endif
610#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224)
611 case PSA_ALG_SHA_224:
Ronald Cron56c9a942021-04-01 10:45:57 +0200612 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100613#endif
614#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256)
615 case PSA_ALG_SHA_256:
Ronald Cron56c9a942021-04-01 10:45:57 +0200616 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100617#endif
618#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384)
619 case PSA_ALG_SHA_384:
Ronald Cron56c9a942021-04-01 10:45:57 +0200620 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100621#endif
622#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
623 case PSA_ALG_SHA_512:
Ronald Cron56c9a942021-04-01 10:45:57 +0200624 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100625#endif
626 default:
Ronald Cron56c9a942021-04-01 10:45:57 +0200627 return( 0 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100628 }
629}
Steven Cooremanf7638102021-03-04 15:14:36 +0100630
Steven Cooreman25555222021-03-08 16:20:04 +0100631psa_status_t mbedtls_transparent_test_driver_hash_compute(
Steven Cooremanf7638102021-03-04 15:14:36 +0100632 psa_algorithm_t alg,
633 const uint8_t *input,
634 size_t input_length,
635 uint8_t *hash,
636 size_t hash_size,
637 size_t *hash_length)
638{
Ronald Cron56c9a942021-04-01 10:45:57 +0200639 if( is_hash_accelerated( alg ) )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100640 return( hash_compute( alg, input, input_length,
641 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100642 else
643 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf7638102021-03-04 15:14:36 +0100644}
645
Steven Cooreman25555222021-03-08 16:20:04 +0100646psa_status_t mbedtls_transparent_test_driver_hash_setup(
647 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100648 psa_algorithm_t alg )
649{
Ronald Cron56c9a942021-04-01 10:45:57 +0200650 if( is_hash_accelerated( alg ) )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100651 return( hash_setup( operation, alg ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100652 else
653 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf7638102021-03-04 15:14:36 +0100654}
655
Steven Cooreman25555222021-03-08 16:20:04 +0100656psa_status_t mbedtls_transparent_test_driver_hash_clone(
657 const mbedtls_transparent_test_driver_hash_operation_t *source_operation,
658 mbedtls_transparent_test_driver_hash_operation_t *target_operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100659{
Ronald Cron56c9a942021-04-01 10:45:57 +0200660 if( is_hash_accelerated( source_operation->alg ) )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100661 return( hash_clone( source_operation, target_operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100662 else
663 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100664}
665
Steven Cooreman25555222021-03-08 16:20:04 +0100666psa_status_t mbedtls_transparent_test_driver_hash_update(
667 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100668 const uint8_t *input,
669 size_t input_length )
670{
Ronald Cron56c9a942021-04-01 10:45:57 +0200671 if( is_hash_accelerated( operation->alg ) )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100672 return( hash_update( operation, input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100673 else
674 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100675}
676
Steven Cooreman25555222021-03-08 16:20:04 +0100677psa_status_t mbedtls_transparent_test_driver_hash_finish(
678 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100679 uint8_t *hash,
680 size_t hash_size,
681 size_t *hash_length )
682{
Ronald Cron56c9a942021-04-01 10:45:57 +0200683 if( is_hash_accelerated( operation->alg ) )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100684 return( hash_finish( operation, hash, hash_size, hash_length ) );
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_abort(
690 mbedtls_transparent_test_driver_hash_operation_t *operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100691{
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100692 return( hash_abort( operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100693}
694
Steven Cooremanf8e45a42021-03-16 11:07:55 +0100695#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremanf7638102021-03-04 15:14:36 +0100696
Steven Cooreman0e307642021-02-18 16:18:32 +0100697#endif /* MBEDTLS_PSA_CRYPTO_C */