blob: b573c7aee6dd16c6c7db95e6a8789aea0aeae6ab [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
33 * relies on this software driver. */
34#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 Cooreman0e307642021-02-18 16:18:32 +010071psa_status_t mbedtls_psa_hash_compute(
72 psa_algorithm_t alg,
73 const uint8_t *input,
74 size_t input_length,
75 uint8_t *hash,
76 size_t hash_size,
77 size_t *hash_length)
78{
79 mbedtls_psa_hash_operation_t operation = MBEDTLS_PSA_HASH_OPERATION_INIT;
80 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
81
82 *hash_length = hash_size;
83 status = mbedtls_psa_hash_setup( &operation, alg );
84 if( status != PSA_SUCCESS )
85 goto exit;
86 status = mbedtls_psa_hash_update( &operation, input, input_length );
87 if( status != PSA_SUCCESS )
88 goto exit;
89 status = mbedtls_psa_hash_finish( &operation, hash, hash_size, hash_length );
90 if( status != PSA_SUCCESS )
91 goto exit;
92
93exit:
94 if( status == PSA_SUCCESS )
95 status = mbedtls_psa_hash_abort( &operation );
96 else
97 mbedtls_psa_hash_abort( &operation );
98 return( status );
99}
100
101psa_status_t mbedtls_psa_hash_setup(
102 mbedtls_psa_hash_operation_t *operation,
103 psa_algorithm_t alg )
104{
105 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
106
107 /* A context must be freshly initialized before it can be set up. */
108 if( operation->alg != 0 )
109 {
110 return( PSA_ERROR_BAD_STATE );
111 }
112
113 switch( alg )
114 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100115#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100116 case PSA_ALG_MD2:
117 mbedtls_md2_init( &operation->ctx.md2 );
118 ret = mbedtls_md2_starts_ret( &operation->ctx.md2 );
119 break;
120#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100121#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100122 case PSA_ALG_MD4:
123 mbedtls_md4_init( &operation->ctx.md4 );
124 ret = mbedtls_md4_starts_ret( &operation->ctx.md4 );
125 break;
126#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100127#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100128 case PSA_ALG_MD5:
129 mbedtls_md5_init( &operation->ctx.md5 );
130 ret = mbedtls_md5_starts_ret( &operation->ctx.md5 );
131 break;
132#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100133#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100134 case PSA_ALG_RIPEMD160:
135 mbedtls_ripemd160_init( &operation->ctx.ripemd160 );
136 ret = mbedtls_ripemd160_starts_ret( &operation->ctx.ripemd160 );
137 break;
138#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100139#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100140 case PSA_ALG_SHA_1:
141 mbedtls_sha1_init( &operation->ctx.sha1 );
142 ret = mbedtls_sha1_starts_ret( &operation->ctx.sha1 );
143 break;
144#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100145#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100146 case PSA_ALG_SHA_224:
147 mbedtls_sha256_init( &operation->ctx.sha256 );
148 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 1 );
149 break;
150#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100151#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100152 case PSA_ALG_SHA_256:
153 mbedtls_sha256_init( &operation->ctx.sha256 );
154 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 0 );
155 break;
156#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100157#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100158 case PSA_ALG_SHA_384:
159 mbedtls_sha512_init( &operation->ctx.sha512 );
160 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 1 );
161 break;
162#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100163#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100164 case PSA_ALG_SHA_512:
165 mbedtls_sha512_init( &operation->ctx.sha512 );
166 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 0 );
167 break;
168#endif
169 default:
170 return( PSA_ALG_IS_HASH( alg ) ?
171 PSA_ERROR_NOT_SUPPORTED :
172 PSA_ERROR_INVALID_ARGUMENT );
173 }
174 if( ret == 0 )
175 operation->alg = alg;
176 else
177 mbedtls_psa_hash_abort( operation );
178 return( mbedtls_to_psa_error( ret ) );
179}
180
181psa_status_t mbedtls_psa_hash_clone(
182 const mbedtls_psa_hash_operation_t *source_operation,
183 mbedtls_psa_hash_operation_t *target_operation )
184{
185 switch( source_operation->alg )
186 {
187 case 0:
188 return( PSA_ERROR_BAD_STATE );
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100189#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100190 case PSA_ALG_MD2:
191 mbedtls_md2_clone( &target_operation->ctx.md2,
192 &source_operation->ctx.md2 );
193 break;
194#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100195#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100196 case PSA_ALG_MD4:
197 mbedtls_md4_clone( &target_operation->ctx.md4,
198 &source_operation->ctx.md4 );
199 break;
200#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100201#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100202 case PSA_ALG_MD5:
203 mbedtls_md5_clone( &target_operation->ctx.md5,
204 &source_operation->ctx.md5 );
205 break;
206#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100207#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100208 case PSA_ALG_RIPEMD160:
209 mbedtls_ripemd160_clone( &target_operation->ctx.ripemd160,
210 &source_operation->ctx.ripemd160 );
211 break;
212#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100213#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100214 case PSA_ALG_SHA_1:
215 mbedtls_sha1_clone( &target_operation->ctx.sha1,
216 &source_operation->ctx.sha1 );
217 break;
218#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100219#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100220 case PSA_ALG_SHA_224:
221 mbedtls_sha256_clone( &target_operation->ctx.sha256,
222 &source_operation->ctx.sha256 );
223 break;
224#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100225#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100226 case PSA_ALG_SHA_256:
227 mbedtls_sha256_clone( &target_operation->ctx.sha256,
228 &source_operation->ctx.sha256 );
229 break;
230#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100231#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100232 case PSA_ALG_SHA_384:
233 mbedtls_sha512_clone( &target_operation->ctx.sha512,
234 &source_operation->ctx.sha512 );
235 break;
236#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100237#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100238 case PSA_ALG_SHA_512:
239 mbedtls_sha512_clone( &target_operation->ctx.sha512,
240 &source_operation->ctx.sha512 );
241 break;
242#endif
243 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100244 (void) source_operation;
245 (void) target_operation;
Steven Cooreman0e307642021-02-18 16:18:32 +0100246 return( PSA_ERROR_NOT_SUPPORTED );
247 }
248
249 target_operation->alg = source_operation->alg;
250 return( PSA_SUCCESS );
251}
252
253psa_status_t mbedtls_psa_hash_update(
254 mbedtls_psa_hash_operation_t *operation,
255 const uint8_t *input,
256 size_t input_length )
257{
258 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
259
Steven Cooreman0e307642021-02-18 16:18:32 +0100260 switch( operation->alg )
261 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100262#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100263 case PSA_ALG_MD2:
264 ret = mbedtls_md2_update_ret( &operation->ctx.md2,
265 input, input_length );
266 break;
267#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100268#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100269 case PSA_ALG_MD4:
270 ret = mbedtls_md4_update_ret( &operation->ctx.md4,
271 input, input_length );
272 break;
273#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100274#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100275 case PSA_ALG_MD5:
276 ret = mbedtls_md5_update_ret( &operation->ctx.md5,
277 input, input_length );
278 break;
279#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100280#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100281 case PSA_ALG_RIPEMD160:
282 ret = mbedtls_ripemd160_update_ret( &operation->ctx.ripemd160,
283 input, input_length );
284 break;
285#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100286#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100287 case PSA_ALG_SHA_1:
288 ret = mbedtls_sha1_update_ret( &operation->ctx.sha1,
289 input, input_length );
290 break;
291#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100292#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100293 case PSA_ALG_SHA_224:
294 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
295 input, input_length );
296 break;
297#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100298#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100299 case PSA_ALG_SHA_256:
300 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
301 input, input_length );
302 break;
303#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100304#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100305 case PSA_ALG_SHA_384:
306 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
307 input, input_length );
308 break;
309#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100310#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100311 case PSA_ALG_SHA_512:
312 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
313 input, input_length );
314 break;
315#endif
316 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100317 (void) input;
318 (void) input_length;
Steven Cooreman0e307642021-02-18 16:18:32 +0100319 return( PSA_ERROR_BAD_STATE );
320 }
321
322 if( ret != 0 )
323 mbedtls_psa_hash_abort( operation );
324 return( mbedtls_to_psa_error( ret ) );
325}
326
327psa_status_t mbedtls_psa_hash_finish(
328 mbedtls_psa_hash_operation_t *operation,
329 uint8_t *hash,
330 size_t hash_size,
331 size_t *hash_length )
332{
333 psa_status_t status;
334 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
335 size_t actual_hash_length = PSA_HASH_LENGTH( operation->alg );
336
337 /* Fill the output buffer with something that isn't a valid hash
338 * (barring an attack on the hash and deliberately-crafted input),
339 * in case the caller doesn't check the return status properly. */
340 *hash_length = hash_size;
341 /* If hash_size is 0 then hash may be NULL and then the
342 * call to memset would have undefined behavior. */
343 if( hash_size != 0 )
344 memset( hash, '!', hash_size );
345
346 if( hash_size < actual_hash_length )
347 {
348 status = PSA_ERROR_BUFFER_TOO_SMALL;
349 goto exit;
350 }
351
352 switch( operation->alg )
353 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100354#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100355 case PSA_ALG_MD2:
356 ret = mbedtls_md2_finish_ret( &operation->ctx.md2, hash );
357 break;
358#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100359#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100360 case PSA_ALG_MD4:
361 ret = mbedtls_md4_finish_ret( &operation->ctx.md4, hash );
362 break;
363#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100364#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100365 case PSA_ALG_MD5:
366 ret = mbedtls_md5_finish_ret( &operation->ctx.md5, hash );
367 break;
368#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100369#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100370 case PSA_ALG_RIPEMD160:
371 ret = mbedtls_ripemd160_finish_ret( &operation->ctx.ripemd160, hash );
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_finish_ret( &operation->ctx.sha1, hash );
377 break;
378#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100379#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100380 case PSA_ALG_SHA_224:
381 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
382 break;
383#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100384#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100385 case PSA_ALG_SHA_256:
386 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
387 break;
388#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100389#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100390 case PSA_ALG_SHA_384:
391 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
392 break;
393#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100394#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100395 case PSA_ALG_SHA_512:
396 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
397 break;
398#endif
399 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100400 (void) hash;
Steven Cooreman0e307642021-02-18 16:18:32 +0100401 return( PSA_ERROR_BAD_STATE );
402 }
403 status = mbedtls_to_psa_error( ret );
404
405exit:
406 if( status == PSA_SUCCESS )
407 {
408 *hash_length = actual_hash_length;
409 return( mbedtls_psa_hash_abort( operation ) );
410 }
411 else
412 {
413 mbedtls_psa_hash_abort( operation );
414 return( status );
415 }
416}
417
418psa_status_t mbedtls_psa_hash_abort(
419 mbedtls_psa_hash_operation_t *operation )
420{
421 switch( operation->alg )
422 {
423 case 0:
424 /* The object has (apparently) been initialized but it is not
425 * in use. It's ok to call abort on such an object, and there's
426 * nothing to do. */
427 break;
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100428#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100429 case PSA_ALG_MD2:
430 mbedtls_md2_free( &operation->ctx.md2 );
431 break;
432#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100433#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100434 case PSA_ALG_MD4:
435 mbedtls_md4_free( &operation->ctx.md4 );
436 break;
437#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100438#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100439 case PSA_ALG_MD5:
440 mbedtls_md5_free( &operation->ctx.md5 );
441 break;
442#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100443#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100444 case PSA_ALG_RIPEMD160:
445 mbedtls_ripemd160_free( &operation->ctx.ripemd160 );
446 break;
447#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100448#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100449 case PSA_ALG_SHA_1:
450 mbedtls_sha1_free( &operation->ctx.sha1 );
451 break;
452#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100453#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100454 case PSA_ALG_SHA_224:
455 mbedtls_sha256_free( &operation->ctx.sha256 );
456 break;
457#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100458#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100459 case PSA_ALG_SHA_256:
460 mbedtls_sha256_free( &operation->ctx.sha256 );
461 break;
462#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100463#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100464 case PSA_ALG_SHA_384:
465 mbedtls_sha512_free( &operation->ctx.sha512 );
466 break;
467#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100468#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100469 case PSA_ALG_SHA_512:
470 mbedtls_sha512_free( &operation->ctx.sha512 );
471 break;
472#endif
473 default:
474 return( PSA_ERROR_BAD_STATE );
475 }
476 operation->alg = 0;
477 return( PSA_SUCCESS );
478}
479
Steven Cooremanf7638102021-03-04 15:14:36 +0100480 /*
481 * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
482 */
483#if defined(PSA_CRYPTO_DRIVER_TEST)
484
485#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2) || \
486 defined(MBEDTLS_PSA_ACCEL_ALG_MD4) || \
487 defined(MBEDTLS_PSA_ACCEL_ALG_MD5) || \
488 defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160) || \
489 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1) || \
490 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224) || \
491 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256) || \
492 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384) || \
493 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
494#define INCLUDE_HASH_TEST_DRIVER
495#endif
496
497#if defined(INCLUDE_HASH_TEST_DRIVER)
498psa_status_t is_hash_accelerated( psa_algorithm_t alg )
499{
500 switch( alg )
501 {
502#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2)
503 case PSA_ALG_MD2:
504 return( PSA_SUCCESS );
505#endif
506#if defined(MBEDTLS_PSA_ACCEL_ALG_MD4)
507 case PSA_ALG_MD4:
508 return( PSA_SUCCESS );
509#endif
510#if defined(MBEDTLS_PSA_ACCEL_ALG_MD5)
511 case PSA_ALG_MD5:
512 return( PSA_SUCCESS );
513#endif
514#if defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160)
515 case PSA_ALG_RIPEMD160:
516 return( PSA_SUCCESS );
517#endif
518#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1)
519 case PSA_ALG_SHA_1:
520 return( PSA_SUCCESS );
521#endif
522#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224)
523 case PSA_ALG_SHA_224:
524 return( PSA_SUCCESS );
525#endif
526#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256)
527 case PSA_ALG_SHA_256:
528 return( PSA_SUCCESS );
529#endif
530#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384)
531 case PSA_ALG_SHA_384:
532 return( PSA_SUCCESS );
533#endif
534#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
535 case PSA_ALG_SHA_512:
536 return( PSA_SUCCESS );
537#endif
538 default:
539 return( PSA_ERROR_NOT_SUPPORTED );
540 }
541}
542#endif /* INCLUDE_HASH_TEST_DRIVER */
543
Steven Cooreman25555222021-03-08 16:20:04 +0100544psa_status_t mbedtls_transparent_test_driver_hash_compute(
Steven Cooremanf7638102021-03-04 15:14:36 +0100545 psa_algorithm_t alg,
546 const uint8_t *input,
547 size_t input_length,
548 uint8_t *hash,
549 size_t hash_size,
550 size_t *hash_length)
551{
552#if defined(INCLUDE_HASH_TEST_DRIVER)
553 if( is_hash_accelerated( alg ) == PSA_SUCCESS )
554 return( mbedtls_psa_hash_compute( alg, input, input_length,
555 hash, hash_size, hash_length ) );
556 else
557 return( PSA_ERROR_NOT_SUPPORTED );
558#else
559 (void) alg;
560 (void) input;
561 (void) input_length;
562 (void) hash;
563 (void) hash_size;
564 (void) hash_length;
565 return( PSA_ERROR_NOT_SUPPORTED );
566#endif
567}
568
Steven Cooreman25555222021-03-08 16:20:04 +0100569psa_status_t mbedtls_transparent_test_driver_hash_setup(
570 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100571 psa_algorithm_t alg )
572{
573#if defined(INCLUDE_HASH_TEST_DRIVER)
574 if( is_hash_accelerated( alg ) == PSA_SUCCESS )
575 return( mbedtls_psa_hash_setup( &operation->operation, alg ) );
576 else
577 return( PSA_ERROR_NOT_SUPPORTED );
578#else
579 (void) alg;
580 (void) operation;
581 return( PSA_ERROR_NOT_SUPPORTED );
582#endif
583}
584
Steven Cooreman25555222021-03-08 16:20:04 +0100585psa_status_t mbedtls_transparent_test_driver_hash_clone(
586 const mbedtls_transparent_test_driver_hash_operation_t *source_operation,
587 mbedtls_transparent_test_driver_hash_operation_t *target_operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100588{
589#if defined(INCLUDE_HASH_TEST_DRIVER)
590 if( is_hash_accelerated( source_operation->operation.alg ) == PSA_SUCCESS )
591 return( mbedtls_psa_hash_clone( &source_operation->operation,
592 &target_operation->operation ) );
593 else
594 return( PSA_ERROR_BAD_STATE );
595#else
596 (void) source_operation;
597 (void) target_operation;
598 return( PSA_ERROR_NOT_SUPPORTED );
599#endif
600}
601
Steven Cooreman25555222021-03-08 16:20:04 +0100602psa_status_t mbedtls_transparent_test_driver_hash_update(
603 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100604 const uint8_t *input,
605 size_t input_length )
606{
607#if defined(INCLUDE_HASH_TEST_DRIVER)
608 if( is_hash_accelerated( operation->operation.alg ) == PSA_SUCCESS )
609 return( mbedtls_psa_hash_update( &operation->operation,
610 input, input_length ) );
611 else
612 return( PSA_ERROR_BAD_STATE );
613#else
614 (void) operation;
615 (void) input;
616 (void) input_length;
617 return( PSA_ERROR_NOT_SUPPORTED );
618#endif
619}
620
Steven Cooreman25555222021-03-08 16:20:04 +0100621psa_status_t mbedtls_transparent_test_driver_hash_finish(
622 mbedtls_transparent_test_driver_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100623 uint8_t *hash,
624 size_t hash_size,
625 size_t *hash_length )
626{
627#if defined(INCLUDE_HASH_TEST_DRIVER)
628 if( is_hash_accelerated( operation->operation.alg ) == PSA_SUCCESS )
629 return( mbedtls_psa_hash_finish( &operation->operation,
630 hash, hash_size, hash_length ) );
631 else
632 return( PSA_ERROR_BAD_STATE );
633#else
634 (void) operation;
635 (void) hash;
636 (void) hash_size;
637 (void) hash_length;
638 return( PSA_ERROR_NOT_SUPPORTED );
639#endif
640}
641
Steven Cooreman25555222021-03-08 16:20:04 +0100642psa_status_t mbedtls_transparent_test_driver_hash_abort(
643 mbedtls_transparent_test_driver_hash_operation_t *operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100644{
645#if defined(INCLUDE_HASH_TEST_DRIVER)
646 return( mbedtls_psa_hash_abort( &operation->operation ) );
647#else
648 (void) operation;
649 return( PSA_ERROR_NOT_SUPPORTED );
650#endif
651}
652
653#endif /* PSA_CRYPTO_DRIVER_TEST */
654
Steven Cooreman0e307642021-02-18 16:18:32 +0100655#endif /* MBEDTLS_PSA_CRYPTO_C */