blob: e622e0d1b340bb2eaff00e2dbb4fb075bf6074c0 [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) && \
75 ( defined(MBEDTLS_PSA_ACCEL_ALG_MD2) || \
76 defined(MBEDTLS_PSA_ACCEL_ALG_MD4) || \
77 defined(MBEDTLS_PSA_ACCEL_ALG_MD5) || \
78 defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160) || \
79 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1) || \
80 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224) || \
81 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256) || \
82 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384) || \
83 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512) )
84#define INCLUDE_HASH_TEST_DRIVER
85#endif
86
Steven Cooreman0d586662021-03-08 20:28:18 +010087/* If either of the built-in or test driver entry points need to be implemented, then
88 * the core implementation should be present. */
89#if defined(MBEDTLS_PSA_BUILTIN_HASH) || \
Steven Cooreman83f300e2021-03-08 17:09:48 +010090 defined(INCLUDE_HASH_TEST_DRIVER)
91#define INCLUDE_HASH_CORE 1
92#endif
93
94/* Implement the PSA driver hash interface on top of mbed TLS if either the
95 * software driver or the test driver requires it. */
96#if defined(INCLUDE_HASH_CORE)
97static psa_status_t hash_abort(
98 mbedtls_psa_hash_operation_t *operation )
Steven Cooreman0e307642021-02-18 16:18:32 +010099{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100100 switch( operation->alg )
101 {
102 case 0:
103 /* The object has (apparently) been initialized but it is not
104 * in use. It's ok to call abort on such an object, and there's
105 * nothing to do. */
106 break;
107#if defined(BUILTIN_ALG_MD2)
108 case PSA_ALG_MD2:
109 mbedtls_md2_free( &operation->ctx.md2 );
110 break;
111#endif
112#if defined(BUILTIN_ALG_MD4)
113 case PSA_ALG_MD4:
114 mbedtls_md4_free( &operation->ctx.md4 );
115 break;
116#endif
117#if defined(BUILTIN_ALG_MD5)
118 case PSA_ALG_MD5:
119 mbedtls_md5_free( &operation->ctx.md5 );
120 break;
121#endif
122#if defined(BUILTIN_ALG_RIPEMD160)
123 case PSA_ALG_RIPEMD160:
124 mbedtls_ripemd160_free( &operation->ctx.ripemd160 );
125 break;
126#endif
127#if defined(BUILTIN_ALG_SHA_1)
128 case PSA_ALG_SHA_1:
129 mbedtls_sha1_free( &operation->ctx.sha1 );
130 break;
131#endif
132#if defined(BUILTIN_ALG_SHA_224)
133 case PSA_ALG_SHA_224:
134 mbedtls_sha256_free( &operation->ctx.sha256 );
135 break;
136#endif
137#if defined(BUILTIN_ALG_SHA_256)
138 case PSA_ALG_SHA_256:
139 mbedtls_sha256_free( &operation->ctx.sha256 );
140 break;
141#endif
142#if defined(BUILTIN_ALG_SHA_384)
143 case PSA_ALG_SHA_384:
144 mbedtls_sha512_free( &operation->ctx.sha512 );
145 break;
146#endif
147#if defined(BUILTIN_ALG_SHA_512)
148 case PSA_ALG_SHA_512:
149 mbedtls_sha512_free( &operation->ctx.sha512 );
150 break;
151#endif
152 default:
153 return( PSA_ERROR_BAD_STATE );
154 }
155 operation->alg = 0;
156 return( PSA_SUCCESS );
Steven Cooreman0e307642021-02-18 16:18:32 +0100157}
158
Steven Cooreman83f300e2021-03-08 17:09:48 +0100159static psa_status_t hash_setup(
Steven Cooreman0e307642021-02-18 16:18:32 +0100160 mbedtls_psa_hash_operation_t *operation,
161 psa_algorithm_t alg )
162{
163 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
164
165 /* A context must be freshly initialized before it can be set up. */
166 if( operation->alg != 0 )
167 {
168 return( PSA_ERROR_BAD_STATE );
169 }
170
171 switch( alg )
172 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100173#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100174 case PSA_ALG_MD2:
175 mbedtls_md2_init( &operation->ctx.md2 );
176 ret = mbedtls_md2_starts_ret( &operation->ctx.md2 );
177 break;
178#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100179#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100180 case PSA_ALG_MD4:
181 mbedtls_md4_init( &operation->ctx.md4 );
182 ret = mbedtls_md4_starts_ret( &operation->ctx.md4 );
183 break;
184#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100185#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100186 case PSA_ALG_MD5:
187 mbedtls_md5_init( &operation->ctx.md5 );
188 ret = mbedtls_md5_starts_ret( &operation->ctx.md5 );
189 break;
190#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100191#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100192 case PSA_ALG_RIPEMD160:
193 mbedtls_ripemd160_init( &operation->ctx.ripemd160 );
194 ret = mbedtls_ripemd160_starts_ret( &operation->ctx.ripemd160 );
195 break;
196#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100197#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100198 case PSA_ALG_SHA_1:
199 mbedtls_sha1_init( &operation->ctx.sha1 );
200 ret = mbedtls_sha1_starts_ret( &operation->ctx.sha1 );
201 break;
202#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100203#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100204 case PSA_ALG_SHA_224:
205 mbedtls_sha256_init( &operation->ctx.sha256 );
206 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 1 );
207 break;
208#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100209#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100210 case PSA_ALG_SHA_256:
211 mbedtls_sha256_init( &operation->ctx.sha256 );
212 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 0 );
213 break;
214#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100215#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100216 case PSA_ALG_SHA_384:
217 mbedtls_sha512_init( &operation->ctx.sha512 );
218 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 1 );
219 break;
220#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100221#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100222 case PSA_ALG_SHA_512:
223 mbedtls_sha512_init( &operation->ctx.sha512 );
224 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 0 );
225 break;
226#endif
227 default:
228 return( PSA_ALG_IS_HASH( alg ) ?
229 PSA_ERROR_NOT_SUPPORTED :
230 PSA_ERROR_INVALID_ARGUMENT );
231 }
232 if( ret == 0 )
233 operation->alg = alg;
234 else
Steven Cooreman83f300e2021-03-08 17:09:48 +0100235 hash_abort( operation );
Steven Cooreman0e307642021-02-18 16:18:32 +0100236 return( mbedtls_to_psa_error( ret ) );
237}
238
Steven Cooreman83f300e2021-03-08 17:09:48 +0100239static psa_status_t hash_clone(
Steven Cooreman0e307642021-02-18 16:18:32 +0100240 const mbedtls_psa_hash_operation_t *source_operation,
241 mbedtls_psa_hash_operation_t *target_operation )
242{
243 switch( source_operation->alg )
244 {
245 case 0:
246 return( PSA_ERROR_BAD_STATE );
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100247#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100248 case PSA_ALG_MD2:
249 mbedtls_md2_clone( &target_operation->ctx.md2,
250 &source_operation->ctx.md2 );
251 break;
252#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100253#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100254 case PSA_ALG_MD4:
255 mbedtls_md4_clone( &target_operation->ctx.md4,
256 &source_operation->ctx.md4 );
257 break;
258#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100259#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100260 case PSA_ALG_MD5:
261 mbedtls_md5_clone( &target_operation->ctx.md5,
262 &source_operation->ctx.md5 );
263 break;
264#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100265#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100266 case PSA_ALG_RIPEMD160:
267 mbedtls_ripemd160_clone( &target_operation->ctx.ripemd160,
268 &source_operation->ctx.ripemd160 );
269 break;
270#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100271#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100272 case PSA_ALG_SHA_1:
273 mbedtls_sha1_clone( &target_operation->ctx.sha1,
274 &source_operation->ctx.sha1 );
275 break;
276#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100277#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100278 case PSA_ALG_SHA_224:
279 mbedtls_sha256_clone( &target_operation->ctx.sha256,
280 &source_operation->ctx.sha256 );
281 break;
282#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100283#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100284 case PSA_ALG_SHA_256:
285 mbedtls_sha256_clone( &target_operation->ctx.sha256,
286 &source_operation->ctx.sha256 );
287 break;
288#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100289#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100290 case PSA_ALG_SHA_384:
291 mbedtls_sha512_clone( &target_operation->ctx.sha512,
292 &source_operation->ctx.sha512 );
293 break;
294#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100295#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100296 case PSA_ALG_SHA_512:
297 mbedtls_sha512_clone( &target_operation->ctx.sha512,
298 &source_operation->ctx.sha512 );
299 break;
300#endif
301 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100302 (void) source_operation;
303 (void) target_operation;
Steven Cooreman0e307642021-02-18 16:18:32 +0100304 return( PSA_ERROR_NOT_SUPPORTED );
305 }
306
307 target_operation->alg = source_operation->alg;
308 return( PSA_SUCCESS );
309}
310
Steven Cooreman83f300e2021-03-08 17:09:48 +0100311static psa_status_t hash_update(
Steven Cooreman0e307642021-02-18 16:18:32 +0100312 mbedtls_psa_hash_operation_t *operation,
313 const uint8_t *input,
314 size_t input_length )
315{
316 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
317
Steven Cooreman0e307642021-02-18 16:18:32 +0100318 switch( operation->alg )
319 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100320#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100321 case PSA_ALG_MD2:
322 ret = mbedtls_md2_update_ret( &operation->ctx.md2,
323 input, input_length );
324 break;
325#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100326#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100327 case PSA_ALG_MD4:
328 ret = mbedtls_md4_update_ret( &operation->ctx.md4,
329 input, input_length );
330 break;
331#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100332#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100333 case PSA_ALG_MD5:
334 ret = mbedtls_md5_update_ret( &operation->ctx.md5,
335 input, input_length );
336 break;
337#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100338#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100339 case PSA_ALG_RIPEMD160:
340 ret = mbedtls_ripemd160_update_ret( &operation->ctx.ripemd160,
341 input, input_length );
342 break;
343#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100344#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100345 case PSA_ALG_SHA_1:
346 ret = mbedtls_sha1_update_ret( &operation->ctx.sha1,
347 input, input_length );
348 break;
349#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100350#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100351 case PSA_ALG_SHA_224:
352 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
353 input, input_length );
354 break;
355#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100356#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100357 case PSA_ALG_SHA_256:
358 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
359 input, input_length );
360 break;
361#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100362#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100363 case PSA_ALG_SHA_384:
364 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
365 input, input_length );
366 break;
367#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100368#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100369 case PSA_ALG_SHA_512:
370 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
371 input, input_length );
372 break;
373#endif
374 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100375 (void) input;
376 (void) input_length;
Steven Cooreman0e307642021-02-18 16:18:32 +0100377 return( PSA_ERROR_BAD_STATE );
378 }
379
380 if( ret != 0 )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100381 hash_abort( operation );
Steven Cooreman0e307642021-02-18 16:18:32 +0100382 return( mbedtls_to_psa_error( ret ) );
383}
384
Steven Cooreman83f300e2021-03-08 17:09:48 +0100385static psa_status_t hash_finish(
Steven Cooreman0e307642021-02-18 16:18:32 +0100386 mbedtls_psa_hash_operation_t *operation,
387 uint8_t *hash,
388 size_t hash_size,
389 size_t *hash_length )
390{
391 psa_status_t status;
392 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
393 size_t actual_hash_length = PSA_HASH_LENGTH( operation->alg );
394
395 /* Fill the output buffer with something that isn't a valid hash
396 * (barring an attack on the hash and deliberately-crafted input),
397 * in case the caller doesn't check the return status properly. */
398 *hash_length = hash_size;
399 /* If hash_size is 0 then hash may be NULL and then the
400 * call to memset would have undefined behavior. */
401 if( hash_size != 0 )
402 memset( hash, '!', hash_size );
403
404 if( hash_size < actual_hash_length )
405 {
406 status = PSA_ERROR_BUFFER_TOO_SMALL;
407 goto exit;
408 }
409
410 switch( operation->alg )
411 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100412#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100413 case PSA_ALG_MD2:
414 ret = mbedtls_md2_finish_ret( &operation->ctx.md2, hash );
415 break;
416#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100417#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100418 case PSA_ALG_MD4:
419 ret = mbedtls_md4_finish_ret( &operation->ctx.md4, hash );
420 break;
421#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100422#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100423 case PSA_ALG_MD5:
424 ret = mbedtls_md5_finish_ret( &operation->ctx.md5, hash );
425 break;
426#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100427#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100428 case PSA_ALG_RIPEMD160:
429 ret = mbedtls_ripemd160_finish_ret( &operation->ctx.ripemd160, hash );
430 break;
431#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100432#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100433 case PSA_ALG_SHA_1:
434 ret = mbedtls_sha1_finish_ret( &operation->ctx.sha1, hash );
435 break;
436#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100437#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100438 case PSA_ALG_SHA_224:
439 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
440 break;
441#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100442#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100443 case PSA_ALG_SHA_256:
444 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
445 break;
446#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100447#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100448 case PSA_ALG_SHA_384:
449 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
450 break;
451#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100452#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100453 case PSA_ALG_SHA_512:
454 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
455 break;
456#endif
457 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100458 (void) hash;
Steven Cooreman0e307642021-02-18 16:18:32 +0100459 return( PSA_ERROR_BAD_STATE );
460 }
461 status = mbedtls_to_psa_error( ret );
462
463exit:
464 if( status == PSA_SUCCESS )
465 {
466 *hash_length = actual_hash_length;
Steven Cooreman83f300e2021-03-08 17:09:48 +0100467 return( hash_abort( operation ) );
Steven Cooreman0e307642021-02-18 16:18:32 +0100468 }
469 else
470 {
Steven Cooreman83f300e2021-03-08 17:09:48 +0100471 hash_abort( operation );
Steven Cooreman0e307642021-02-18 16:18:32 +0100472 return( status );
473 }
474}
475
Steven Cooreman83f300e2021-03-08 17:09:48 +0100476static psa_status_t hash_compute(
477 psa_algorithm_t alg,
478 const uint8_t *input,
479 size_t input_length,
480 uint8_t *hash,
481 size_t hash_size,
482 size_t *hash_length)
483{
484 mbedtls_psa_hash_operation_t operation = MBEDTLS_PSA_HASH_OPERATION_INIT;
485 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
486
487 *hash_length = hash_size;
488 status = hash_setup( &operation, alg );
489 if( status != PSA_SUCCESS )
490 goto exit;
491 status = hash_update( &operation, input, input_length );
492 if( status != PSA_SUCCESS )
493 goto exit;
494 status = hash_finish( &operation, hash, hash_size, hash_length );
495 if( status != PSA_SUCCESS )
496 goto exit;
497
498exit:
499 if( status == PSA_SUCCESS )
500 status = hash_abort( &operation );
501 else
502 hash_abort( &operation );
503 return( status );
504}
505#endif /* INCLUDE_HASH_CORE */
506
Steven Cooreman0d586662021-03-08 20:28:18 +0100507#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman83f300e2021-03-08 17:09:48 +0100508psa_status_t mbedtls_psa_hash_compute(
509 psa_algorithm_t alg,
510 const uint8_t *input,
511 size_t input_length,
512 uint8_t *hash,
513 size_t hash_size,
514 size_t *hash_length)
515{
516 return( hash_compute( alg, input, input_length,
517 hash, hash_size, hash_length ) );
518}
519
520psa_status_t mbedtls_psa_hash_setup(
521 mbedtls_psa_hash_operation_t *operation,
522 psa_algorithm_t alg )
523{
524 return( hash_setup( operation, alg ) );
525}
526
527psa_status_t mbedtls_psa_hash_clone(
528 const mbedtls_psa_hash_operation_t *source_operation,
529 mbedtls_psa_hash_operation_t *target_operation )
530{
531 return( hash_clone( source_operation, target_operation ) );
532}
533
534psa_status_t mbedtls_psa_hash_update(
535 mbedtls_psa_hash_operation_t *operation,
536 const uint8_t *input,
537 size_t input_length )
538{
539 return( hash_update( operation, input, input_length ) );
540}
541
542psa_status_t mbedtls_psa_hash_finish(
543 mbedtls_psa_hash_operation_t *operation,
544 uint8_t *hash,
545 size_t hash_size,
546 size_t *hash_length )
547{
548 return( hash_finish( operation, hash, hash_size, hash_length ) );
549}
550
Steven Cooreman0e307642021-02-18 16:18:32 +0100551psa_status_t mbedtls_psa_hash_abort(
552 mbedtls_psa_hash_operation_t *operation )
553{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100554 return( hash_abort( operation ) );
Steven Cooreman0e307642021-02-18 16:18:32 +0100555}
Steven Cooreman0d586662021-03-08 20:28:18 +0100556#endif /* MBEDTLS_PSA_BUILTIN_HASH */
Steven Cooreman0e307642021-02-18 16:18:32 +0100557
Steven Cooremanf7638102021-03-04 15:14:36 +0100558 /*
559 * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
560 */
561#if defined(PSA_CRYPTO_DRIVER_TEST)
562
Steven Cooremanf7638102021-03-04 15:14:36 +0100563#if defined(INCLUDE_HASH_TEST_DRIVER)
564psa_status_t is_hash_accelerated( psa_algorithm_t alg )
565{
566 switch( alg )
567 {
568#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2)
569 case PSA_ALG_MD2:
570 return( PSA_SUCCESS );
571#endif
572#if defined(MBEDTLS_PSA_ACCEL_ALG_MD4)
573 case PSA_ALG_MD4:
574 return( PSA_SUCCESS );
575#endif
576#if defined(MBEDTLS_PSA_ACCEL_ALG_MD5)
577 case PSA_ALG_MD5:
578 return( PSA_SUCCESS );
579#endif
580#if defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160)
581 case PSA_ALG_RIPEMD160:
582 return( PSA_SUCCESS );
583#endif
584#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1)
585 case PSA_ALG_SHA_1:
586 return( PSA_SUCCESS );
587#endif
588#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224)
589 case PSA_ALG_SHA_224:
590 return( PSA_SUCCESS );
591#endif
592#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256)
593 case PSA_ALG_SHA_256:
594 return( PSA_SUCCESS );
595#endif
596#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384)
597 case PSA_ALG_SHA_384:
598 return( PSA_SUCCESS );
599#endif
600#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
601 case PSA_ALG_SHA_512:
602 return( PSA_SUCCESS );
603#endif
604 default:
605 return( PSA_ERROR_NOT_SUPPORTED );
606 }
607}
608#endif /* INCLUDE_HASH_TEST_DRIVER */
609
Steven Cooreman25555222021-03-08 16:20:04 +0100610psa_status_t mbedtls_transparent_test_driver_hash_compute(
Steven Cooremanf7638102021-03-04 15:14:36 +0100611 psa_algorithm_t alg,
612 const uint8_t *input,
613 size_t input_length,
614 uint8_t *hash,
615 size_t hash_size,
616 size_t *hash_length)
617{
618#if defined(INCLUDE_HASH_TEST_DRIVER)
619 if( is_hash_accelerated( alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100620 return( hash_compute( alg, input, input_length,
621 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100622 else
623 return( PSA_ERROR_NOT_SUPPORTED );
624#else
625 (void) alg;
626 (void) input;
627 (void) input_length;
628 (void) hash;
629 (void) hash_size;
630 (void) hash_length;
631 return( PSA_ERROR_NOT_SUPPORTED );
632#endif
633}
634
Steven Cooreman25555222021-03-08 16:20:04 +0100635psa_status_t mbedtls_transparent_test_driver_hash_setup(
636 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100637 psa_algorithm_t alg )
638{
639#if defined(INCLUDE_HASH_TEST_DRIVER)
640 if( is_hash_accelerated( alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100641 return( hash_setup( &operation->operation, alg ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100642 else
643 return( PSA_ERROR_NOT_SUPPORTED );
644#else
645 (void) alg;
646 (void) operation;
647 return( PSA_ERROR_NOT_SUPPORTED );
648#endif
649}
650
Steven Cooreman25555222021-03-08 16:20:04 +0100651psa_status_t mbedtls_transparent_test_driver_hash_clone(
652 const mbedtls_transparent_test_driver_hash_operation_t *source_operation,
653 mbedtls_transparent_test_driver_hash_operation_t *target_operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100654{
655#if defined(INCLUDE_HASH_TEST_DRIVER)
656 if( is_hash_accelerated( source_operation->operation.alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100657 return( hash_clone( &source_operation->operation,
658 &target_operation->operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100659 else
660 return( PSA_ERROR_BAD_STATE );
661#else
662 (void) source_operation;
663 (void) target_operation;
664 return( PSA_ERROR_NOT_SUPPORTED );
665#endif
666}
667
Steven Cooreman25555222021-03-08 16:20:04 +0100668psa_status_t mbedtls_transparent_test_driver_hash_update(
669 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100670 const uint8_t *input,
671 size_t input_length )
672{
673#if defined(INCLUDE_HASH_TEST_DRIVER)
674 if( is_hash_accelerated( operation->operation.alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100675 return( hash_update( &operation->operation,
676 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100677 else
678 return( PSA_ERROR_BAD_STATE );
679#else
680 (void) operation;
681 (void) input;
682 (void) input_length;
683 return( PSA_ERROR_NOT_SUPPORTED );
684#endif
685}
686
Steven Cooreman25555222021-03-08 16:20:04 +0100687psa_status_t mbedtls_transparent_test_driver_hash_finish(
688 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100689 uint8_t *hash,
690 size_t hash_size,
691 size_t *hash_length )
692{
693#if defined(INCLUDE_HASH_TEST_DRIVER)
694 if( is_hash_accelerated( operation->operation.alg ) == PSA_SUCCESS )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100695 return( hash_finish( &operation->operation,
696 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100697 else
698 return( PSA_ERROR_BAD_STATE );
699#else
700 (void) operation;
701 (void) hash;
702 (void) hash_size;
703 (void) hash_length;
704 return( PSA_ERROR_NOT_SUPPORTED );
705#endif
706}
707
Steven Cooreman25555222021-03-08 16:20:04 +0100708psa_status_t mbedtls_transparent_test_driver_hash_abort(
709 mbedtls_transparent_test_driver_hash_operation_t *operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100710{
711#if defined(INCLUDE_HASH_TEST_DRIVER)
Steven Cooreman83f300e2021-03-08 17:09:48 +0100712 return( hash_abort( &operation->operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100713#else
714 (void) operation;
715 return( PSA_ERROR_NOT_SUPPORTED );
716#endif
717}
718
719#endif /* PSA_CRYPTO_DRIVER_TEST */
720
Steven Cooreman0e307642021-02-18 16:18:32 +0100721#endif /* MBEDTLS_PSA_CRYPTO_C */