blob: 84ba8412580b0d0b8ad66e3b5fe42da2d53dbb2e [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) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020035 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
36 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
37 defined(MBEDTLS_PSA_ACCEL_ALG_MD2) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010038#define BUILTIN_ALG_MD2 1
39#endif
40#if( defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020041 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
42 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
43 defined(MBEDTLS_PSA_ACCEL_ALG_MD4) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010044#define BUILTIN_ALG_MD4 1
45#endif
46#if( defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020047 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
48 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
49 defined(MBEDTLS_PSA_ACCEL_ALG_MD5) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010050#define BUILTIN_ALG_MD5 1
51#endif
52#if( defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020053 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
54 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
55 defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010056#define BUILTIN_ALG_RIPEMD160 1
57#endif
58#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020059 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
60 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
61 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010062#define BUILTIN_ALG_SHA_1 1
63#endif
64#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020065 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
66 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
67 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010068#define BUILTIN_ALG_SHA_224 1
69#endif
70#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020071 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
72 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
73 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010074#define BUILTIN_ALG_SHA_256 1
75#endif
76#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020077 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
78 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
79 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010080#define BUILTIN_ALG_SHA_384 1
81#endif
82#if( defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) || \
Ronald Cron2091eed2021-04-09 11:09:54 +020083 ( defined(PSA_CRYPTO_DRIVER_TEST) && \
84 defined(MBEDTLS_PSA_CRYPTO_CONFIG) && \
85 defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512) ) )
Steven Cooreman4f7d0582021-03-08 13:59:42 +010086#define BUILTIN_ALG_SHA_512 1
87#endif
88
Steven Cooreman5f88e772021-03-15 11:07:12 +010089#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
90 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) || \
91 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) || \
92 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
93const mbedtls_md_info_t *mbedtls_md_info_from_psa( psa_algorithm_t alg )
94{
95 switch( alg )
96 {
97#if defined(MBEDTLS_MD2_C)
98 case PSA_ALG_MD2:
99 return( &mbedtls_md2_info );
100#endif
101#if defined(MBEDTLS_MD4_C)
102 case PSA_ALG_MD4:
103 return( &mbedtls_md4_info );
104#endif
105#if defined(MBEDTLS_MD5_C)
106 case PSA_ALG_MD5:
107 return( &mbedtls_md5_info );
108#endif
109#if defined(MBEDTLS_RIPEMD160_C)
110 case PSA_ALG_RIPEMD160:
111 return( &mbedtls_ripemd160_info );
112#endif
113#if defined(MBEDTLS_SHA1_C)
114 case PSA_ALG_SHA_1:
115 return( &mbedtls_sha1_info );
116#endif
117#if defined(MBEDTLS_SHA256_C)
118 case PSA_ALG_SHA_224:
119 return( &mbedtls_sha224_info );
120#endif
121#if defined(MBEDTLS_SHA256_C)
122 case PSA_ALG_SHA_256:
123 return( &mbedtls_sha256_info );
124#endif
125#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
126 case PSA_ALG_SHA_384:
127 return( &mbedtls_sha384_info );
128#endif
129#if defined(MBEDTLS_SHA512_C)
130 case PSA_ALG_SHA_512:
131 return( &mbedtls_sha512_info );
132#endif
133 default:
134 return( NULL );
135 }
136}
137#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) ||
138 * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) ||
139 * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) ||
140 * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
141
Steven Cooreman83f300e2021-03-08 17:09:48 +0100142/* Implement the PSA driver hash interface on top of mbed TLS if either the
143 * software driver or the test driver requires it. */
Ronald Cron2091eed2021-04-09 11:09:54 +0200144#if defined(MBEDTLS_PSA_BUILTIN_HASH) || \
145 ( defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_CRYPTO_CONFIG) )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100146static psa_status_t hash_abort(
147 mbedtls_psa_hash_operation_t *operation )
Steven Cooreman0e307642021-02-18 16:18:32 +0100148{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100149 switch( operation->alg )
150 {
151 case 0:
152 /* The object has (apparently) been initialized but it is not
153 * in use. It's ok to call abort on such an object, and there's
154 * nothing to do. */
155 break;
156#if defined(BUILTIN_ALG_MD2)
157 case PSA_ALG_MD2:
158 mbedtls_md2_free( &operation->ctx.md2 );
159 break;
160#endif
161#if defined(BUILTIN_ALG_MD4)
162 case PSA_ALG_MD4:
163 mbedtls_md4_free( &operation->ctx.md4 );
164 break;
165#endif
166#if defined(BUILTIN_ALG_MD5)
167 case PSA_ALG_MD5:
168 mbedtls_md5_free( &operation->ctx.md5 );
169 break;
170#endif
171#if defined(BUILTIN_ALG_RIPEMD160)
172 case PSA_ALG_RIPEMD160:
173 mbedtls_ripemd160_free( &operation->ctx.ripemd160 );
174 break;
175#endif
176#if defined(BUILTIN_ALG_SHA_1)
177 case PSA_ALG_SHA_1:
178 mbedtls_sha1_free( &operation->ctx.sha1 );
179 break;
180#endif
181#if defined(BUILTIN_ALG_SHA_224)
182 case PSA_ALG_SHA_224:
183 mbedtls_sha256_free( &operation->ctx.sha256 );
184 break;
185#endif
186#if defined(BUILTIN_ALG_SHA_256)
187 case PSA_ALG_SHA_256:
188 mbedtls_sha256_free( &operation->ctx.sha256 );
189 break;
190#endif
191#if defined(BUILTIN_ALG_SHA_384)
192 case PSA_ALG_SHA_384:
193 mbedtls_sha512_free( &operation->ctx.sha512 );
194 break;
195#endif
196#if defined(BUILTIN_ALG_SHA_512)
197 case PSA_ALG_SHA_512:
198 mbedtls_sha512_free( &operation->ctx.sha512 );
199 break;
200#endif
201 default:
202 return( PSA_ERROR_BAD_STATE );
203 }
204 operation->alg = 0;
205 return( PSA_SUCCESS );
Steven Cooreman0e307642021-02-18 16:18:32 +0100206}
207
Steven Cooreman83f300e2021-03-08 17:09:48 +0100208static psa_status_t hash_setup(
Steven Cooreman0e307642021-02-18 16:18:32 +0100209 mbedtls_psa_hash_operation_t *operation,
210 psa_algorithm_t alg )
211{
212 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
213
214 /* A context must be freshly initialized before it can be set up. */
215 if( operation->alg != 0 )
216 {
217 return( PSA_ERROR_BAD_STATE );
218 }
219
220 switch( alg )
221 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100222#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100223 case PSA_ALG_MD2:
224 mbedtls_md2_init( &operation->ctx.md2 );
225 ret = mbedtls_md2_starts_ret( &operation->ctx.md2 );
226 break;
227#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100228#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100229 case PSA_ALG_MD4:
230 mbedtls_md4_init( &operation->ctx.md4 );
231 ret = mbedtls_md4_starts_ret( &operation->ctx.md4 );
232 break;
233#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100234#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100235 case PSA_ALG_MD5:
236 mbedtls_md5_init( &operation->ctx.md5 );
237 ret = mbedtls_md5_starts_ret( &operation->ctx.md5 );
238 break;
239#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100240#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100241 case PSA_ALG_RIPEMD160:
242 mbedtls_ripemd160_init( &operation->ctx.ripemd160 );
243 ret = mbedtls_ripemd160_starts_ret( &operation->ctx.ripemd160 );
244 break;
245#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100246#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100247 case PSA_ALG_SHA_1:
248 mbedtls_sha1_init( &operation->ctx.sha1 );
249 ret = mbedtls_sha1_starts_ret( &operation->ctx.sha1 );
250 break;
251#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100252#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100253 case PSA_ALG_SHA_224:
254 mbedtls_sha256_init( &operation->ctx.sha256 );
255 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 1 );
256 break;
257#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100258#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100259 case PSA_ALG_SHA_256:
260 mbedtls_sha256_init( &operation->ctx.sha256 );
261 ret = mbedtls_sha256_starts_ret( &operation->ctx.sha256, 0 );
262 break;
263#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100264#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100265 case PSA_ALG_SHA_384:
266 mbedtls_sha512_init( &operation->ctx.sha512 );
267 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 1 );
268 break;
269#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100270#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100271 case PSA_ALG_SHA_512:
272 mbedtls_sha512_init( &operation->ctx.sha512 );
273 ret = mbedtls_sha512_starts_ret( &operation->ctx.sha512, 0 );
274 break;
275#endif
276 default:
277 return( PSA_ALG_IS_HASH( alg ) ?
278 PSA_ERROR_NOT_SUPPORTED :
279 PSA_ERROR_INVALID_ARGUMENT );
280 }
281 if( ret == 0 )
282 operation->alg = alg;
283 else
Steven Cooreman83f300e2021-03-08 17:09:48 +0100284 hash_abort( operation );
Steven Cooreman0e307642021-02-18 16:18:32 +0100285 return( mbedtls_to_psa_error( ret ) );
286}
287
Steven Cooreman83f300e2021-03-08 17:09:48 +0100288static psa_status_t hash_clone(
Steven Cooreman0e307642021-02-18 16:18:32 +0100289 const mbedtls_psa_hash_operation_t *source_operation,
290 mbedtls_psa_hash_operation_t *target_operation )
291{
292 switch( source_operation->alg )
293 {
294 case 0:
295 return( PSA_ERROR_BAD_STATE );
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100296#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100297 case PSA_ALG_MD2:
298 mbedtls_md2_clone( &target_operation->ctx.md2,
299 &source_operation->ctx.md2 );
300 break;
301#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100302#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100303 case PSA_ALG_MD4:
304 mbedtls_md4_clone( &target_operation->ctx.md4,
305 &source_operation->ctx.md4 );
306 break;
307#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100308#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100309 case PSA_ALG_MD5:
310 mbedtls_md5_clone( &target_operation->ctx.md5,
311 &source_operation->ctx.md5 );
312 break;
313#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100314#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100315 case PSA_ALG_RIPEMD160:
316 mbedtls_ripemd160_clone( &target_operation->ctx.ripemd160,
317 &source_operation->ctx.ripemd160 );
318 break;
319#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100320#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100321 case PSA_ALG_SHA_1:
322 mbedtls_sha1_clone( &target_operation->ctx.sha1,
323 &source_operation->ctx.sha1 );
324 break;
325#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100326#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100327 case PSA_ALG_SHA_224:
328 mbedtls_sha256_clone( &target_operation->ctx.sha256,
329 &source_operation->ctx.sha256 );
330 break;
331#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100332#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100333 case PSA_ALG_SHA_256:
334 mbedtls_sha256_clone( &target_operation->ctx.sha256,
335 &source_operation->ctx.sha256 );
336 break;
337#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100338#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100339 case PSA_ALG_SHA_384:
340 mbedtls_sha512_clone( &target_operation->ctx.sha512,
341 &source_operation->ctx.sha512 );
342 break;
343#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100344#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100345 case PSA_ALG_SHA_512:
346 mbedtls_sha512_clone( &target_operation->ctx.sha512,
347 &source_operation->ctx.sha512 );
348 break;
349#endif
350 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100351 (void) source_operation;
352 (void) target_operation;
Steven Cooreman0e307642021-02-18 16:18:32 +0100353 return( PSA_ERROR_NOT_SUPPORTED );
354 }
355
356 target_operation->alg = source_operation->alg;
357 return( PSA_SUCCESS );
358}
359
Steven Cooreman83f300e2021-03-08 17:09:48 +0100360static psa_status_t hash_update(
Steven Cooreman0e307642021-02-18 16:18:32 +0100361 mbedtls_psa_hash_operation_t *operation,
362 const uint8_t *input,
363 size_t input_length )
364{
365 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
366
Steven Cooreman0e307642021-02-18 16:18:32 +0100367 switch( operation->alg )
368 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100369#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100370 case PSA_ALG_MD2:
371 ret = mbedtls_md2_update_ret( &operation->ctx.md2,
372 input, input_length );
373 break;
374#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100375#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100376 case PSA_ALG_MD4:
377 ret = mbedtls_md4_update_ret( &operation->ctx.md4,
378 input, input_length );
379 break;
380#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100381#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100382 case PSA_ALG_MD5:
383 ret = mbedtls_md5_update_ret( &operation->ctx.md5,
384 input, input_length );
385 break;
386#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100387#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100388 case PSA_ALG_RIPEMD160:
389 ret = mbedtls_ripemd160_update_ret( &operation->ctx.ripemd160,
390 input, input_length );
391 break;
392#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100393#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100394 case PSA_ALG_SHA_1:
395 ret = mbedtls_sha1_update_ret( &operation->ctx.sha1,
396 input, input_length );
397 break;
398#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100399#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100400 case PSA_ALG_SHA_224:
401 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
402 input, input_length );
403 break;
404#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100405#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100406 case PSA_ALG_SHA_256:
407 ret = mbedtls_sha256_update_ret( &operation->ctx.sha256,
408 input, input_length );
409 break;
410#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100411#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100412 case PSA_ALG_SHA_384:
413 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
414 input, input_length );
415 break;
416#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100417#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100418 case PSA_ALG_SHA_512:
419 ret = mbedtls_sha512_update_ret( &operation->ctx.sha512,
420 input, input_length );
421 break;
422#endif
423 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100424 (void) input;
425 (void) input_length;
Steven Cooreman0e307642021-02-18 16:18:32 +0100426 return( PSA_ERROR_BAD_STATE );
427 }
428
Steven Cooreman0e307642021-02-18 16:18:32 +0100429 return( mbedtls_to_psa_error( ret ) );
430}
431
Steven Cooreman83f300e2021-03-08 17:09:48 +0100432static psa_status_t hash_finish(
Steven Cooreman0e307642021-02-18 16:18:32 +0100433 mbedtls_psa_hash_operation_t *operation,
434 uint8_t *hash,
435 size_t hash_size,
436 size_t *hash_length )
437{
438 psa_status_t status;
439 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
440 size_t actual_hash_length = PSA_HASH_LENGTH( operation->alg );
441
442 /* Fill the output buffer with something that isn't a valid hash
443 * (barring an attack on the hash and deliberately-crafted input),
444 * in case the caller doesn't check the return status properly. */
445 *hash_length = hash_size;
446 /* If hash_size is 0 then hash may be NULL and then the
447 * call to memset would have undefined behavior. */
448 if( hash_size != 0 )
449 memset( hash, '!', hash_size );
450
451 if( hash_size < actual_hash_length )
452 {
453 status = PSA_ERROR_BUFFER_TOO_SMALL;
454 goto exit;
455 }
456
457 switch( operation->alg )
458 {
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100459#if defined(BUILTIN_ALG_MD2)
Steven Cooreman0e307642021-02-18 16:18:32 +0100460 case PSA_ALG_MD2:
461 ret = mbedtls_md2_finish_ret( &operation->ctx.md2, hash );
462 break;
463#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100464#if defined(BUILTIN_ALG_MD4)
Steven Cooreman0e307642021-02-18 16:18:32 +0100465 case PSA_ALG_MD4:
466 ret = mbedtls_md4_finish_ret( &operation->ctx.md4, hash );
467 break;
468#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100469#if defined(BUILTIN_ALG_MD5)
Steven Cooreman0e307642021-02-18 16:18:32 +0100470 case PSA_ALG_MD5:
471 ret = mbedtls_md5_finish_ret( &operation->ctx.md5, hash );
472 break;
473#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100474#if defined(BUILTIN_ALG_RIPEMD160)
Steven Cooreman0e307642021-02-18 16:18:32 +0100475 case PSA_ALG_RIPEMD160:
476 ret = mbedtls_ripemd160_finish_ret( &operation->ctx.ripemd160, hash );
477 break;
478#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100479#if defined(BUILTIN_ALG_SHA_1)
Steven Cooreman0e307642021-02-18 16:18:32 +0100480 case PSA_ALG_SHA_1:
481 ret = mbedtls_sha1_finish_ret( &operation->ctx.sha1, hash );
482 break;
483#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100484#if defined(BUILTIN_ALG_SHA_224)
Steven Cooreman0e307642021-02-18 16:18:32 +0100485 case PSA_ALG_SHA_224:
486 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
487 break;
488#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100489#if defined(BUILTIN_ALG_SHA_256)
Steven Cooreman0e307642021-02-18 16:18:32 +0100490 case PSA_ALG_SHA_256:
491 ret = mbedtls_sha256_finish_ret( &operation->ctx.sha256, hash );
492 break;
493#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100494#if defined(BUILTIN_ALG_SHA_384)
Steven Cooreman0e307642021-02-18 16:18:32 +0100495 case PSA_ALG_SHA_384:
496 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
497 break;
498#endif
Steven Cooreman4f7d0582021-03-08 13:59:42 +0100499#if defined(BUILTIN_ALG_SHA_512)
Steven Cooreman0e307642021-02-18 16:18:32 +0100500 case PSA_ALG_SHA_512:
501 ret = mbedtls_sha512_finish_ret( &operation->ctx.sha512, hash );
502 break;
503#endif
504 default:
Steven Cooreman5adf52c2021-03-04 18:09:49 +0100505 (void) hash;
Steven Cooreman0e307642021-02-18 16:18:32 +0100506 return( PSA_ERROR_BAD_STATE );
507 }
508 status = mbedtls_to_psa_error( ret );
509
510exit:
511 if( status == PSA_SUCCESS )
Steven Cooreman0e307642021-02-18 16:18:32 +0100512 *hash_length = actual_hash_length;
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100513 return( status );
Steven Cooreman0e307642021-02-18 16:18:32 +0100514}
515
Steven Cooreman83f300e2021-03-08 17:09:48 +0100516static psa_status_t hash_compute(
517 psa_algorithm_t alg,
518 const uint8_t *input,
519 size_t input_length,
520 uint8_t *hash,
521 size_t hash_size,
522 size_t *hash_length)
523{
524 mbedtls_psa_hash_operation_t operation = MBEDTLS_PSA_HASH_OPERATION_INIT;
525 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100526 psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman83f300e2021-03-08 17:09:48 +0100527
528 *hash_length = hash_size;
529 status = hash_setup( &operation, alg );
530 if( status != PSA_SUCCESS )
531 goto exit;
532 status = hash_update( &operation, input, input_length );
533 if( status != PSA_SUCCESS )
534 goto exit;
535 status = hash_finish( &operation, hash, hash_size, hash_length );
536 if( status != PSA_SUCCESS )
537 goto exit;
538
539exit:
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100540 abort_status = hash_abort( &operation );
Steven Cooreman83f300e2021-03-08 17:09:48 +0100541 if( status == PSA_SUCCESS )
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100542 return( abort_status );
Steven Cooreman83f300e2021-03-08 17:09:48 +0100543 else
Steven Cooreman61bb8fc2021-03-15 12:32:48 +0100544 return( status );
545
Steven Cooreman83f300e2021-03-08 17:09:48 +0100546}
Ronald Cron2091eed2021-04-09 11:09:54 +0200547#endif /* MBEDTLS_PSA_BUILTIN_HASH ||
548 ( PSA_CRYPTO_DRIVER_TEST && MBEDTLS_PSA_CRYPTO_CONFIG ) */
Steven Cooreman83f300e2021-03-08 17:09:48 +0100549
Steven Cooreman0d586662021-03-08 20:28:18 +0100550#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman83f300e2021-03-08 17:09:48 +0100551psa_status_t mbedtls_psa_hash_compute(
552 psa_algorithm_t alg,
553 const uint8_t *input,
554 size_t input_length,
555 uint8_t *hash,
556 size_t hash_size,
557 size_t *hash_length)
558{
559 return( hash_compute( alg, input, input_length,
560 hash, hash_size, hash_length ) );
561}
562
563psa_status_t mbedtls_psa_hash_setup(
564 mbedtls_psa_hash_operation_t *operation,
565 psa_algorithm_t alg )
566{
567 return( hash_setup( operation, alg ) );
568}
569
570psa_status_t mbedtls_psa_hash_clone(
571 const mbedtls_psa_hash_operation_t *source_operation,
572 mbedtls_psa_hash_operation_t *target_operation )
573{
574 return( hash_clone( source_operation, target_operation ) );
575}
576
577psa_status_t mbedtls_psa_hash_update(
578 mbedtls_psa_hash_operation_t *operation,
579 const uint8_t *input,
580 size_t input_length )
581{
582 return( hash_update( operation, input, input_length ) );
583}
584
585psa_status_t mbedtls_psa_hash_finish(
586 mbedtls_psa_hash_operation_t *operation,
587 uint8_t *hash,
588 size_t hash_size,
589 size_t *hash_length )
590{
591 return( hash_finish( operation, hash, hash_size, hash_length ) );
592}
593
Steven Cooreman0e307642021-02-18 16:18:32 +0100594psa_status_t mbedtls_psa_hash_abort(
595 mbedtls_psa_hash_operation_t *operation )
596{
Steven Cooreman83f300e2021-03-08 17:09:48 +0100597 return( hash_abort( operation ) );
Steven Cooreman0e307642021-02-18 16:18:32 +0100598}
Steven Cooreman0d586662021-03-08 20:28:18 +0100599#endif /* MBEDTLS_PSA_BUILTIN_HASH */
Steven Cooreman0e307642021-02-18 16:18:32 +0100600
Steven Cooremanf7638102021-03-04 15:14:36 +0100601 /*
602 * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
603 */
Ronald Cron2091eed2021-04-09 11:09:54 +0200604#if defined(PSA_CRYPTO_DRIVER_TEST) && defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Steven Cooremana85e2f82021-03-15 11:00:12 +0100605
Ronald Cron56c9a942021-04-01 10:45:57 +0200606static int is_hash_accelerated( psa_algorithm_t alg )
Steven Cooremanf7638102021-03-04 15:14:36 +0100607{
608 switch( alg )
609 {
610#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2)
611 case PSA_ALG_MD2:
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_MD4)
615 case PSA_ALG_MD4:
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_MD5)
619 case PSA_ALG_MD5:
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_RIPEMD160)
623 case PSA_ALG_RIPEMD160:
Ronald Cron56c9a942021-04-01 10:45:57 +0200624 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100625#endif
626#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1)
627 case PSA_ALG_SHA_1:
Ronald Cron56c9a942021-04-01 10:45:57 +0200628 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100629#endif
630#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224)
631 case PSA_ALG_SHA_224:
Ronald Cron56c9a942021-04-01 10:45:57 +0200632 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100633#endif
634#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256)
635 case PSA_ALG_SHA_256:
Ronald Cron56c9a942021-04-01 10:45:57 +0200636 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100637#endif
638#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384)
639 case PSA_ALG_SHA_384:
Ronald Cron56c9a942021-04-01 10:45:57 +0200640 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100641#endif
642#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
643 case PSA_ALG_SHA_512:
Ronald Cron56c9a942021-04-01 10:45:57 +0200644 return( 1 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100645#endif
646 default:
Ronald Cron56c9a942021-04-01 10:45:57 +0200647 return( 0 );
Steven Cooremanf7638102021-03-04 15:14:36 +0100648 }
649}
Steven Cooremanf7638102021-03-04 15:14:36 +0100650
Ronald Cron7b7854e2021-03-13 18:19:08 +0100651psa_status_t libtestdriver1_mbedtls_psa_hash_compute(
Steven Cooremanf7638102021-03-04 15:14:36 +0100652 psa_algorithm_t alg,
653 const uint8_t *input,
654 size_t input_length,
655 uint8_t *hash,
656 size_t hash_size,
657 size_t *hash_length)
658{
Ronald Cron56c9a942021-04-01 10:45:57 +0200659 if( is_hash_accelerated( alg ) )
Steven Cooreman83f300e2021-03-08 17:09:48 +0100660 return( hash_compute( alg, input, input_length,
661 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100662 else
663 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf7638102021-03-04 15:14:36 +0100664}
665
Ronald Cron7b7854e2021-03-13 18:19:08 +0100666psa_status_t libtestdriver1_mbedtls_psa_hash_setup(
Ronald Cron0c677c22021-04-09 17:15:06 +0200667 mbedtls_psa_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100668 psa_algorithm_t alg )
669{
Ronald Cron56c9a942021-04-01 10:45:57 +0200670 if( is_hash_accelerated( alg ) )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100671 return( hash_setup( operation, alg ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100672 else
673 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf7638102021-03-04 15:14:36 +0100674}
675
Ronald Cron7b7854e2021-03-13 18:19:08 +0100676psa_status_t libtestdriver1_mbedtls_psa_hash_clone(
Ronald Cron0c677c22021-04-09 17:15:06 +0200677 const mbedtls_psa_hash_operation_t *source_operation,
678 mbedtls_psa_hash_operation_t *target_operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100679{
Ronald Cron56c9a942021-04-01 10:45:57 +0200680 if( is_hash_accelerated( source_operation->alg ) )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100681 return( hash_clone( source_operation, target_operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100682 else
683 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100684}
685
Ronald Cron7b7854e2021-03-13 18:19:08 +0100686psa_status_t libtestdriver1_mbedtls_psa_hash_update(
Ronald Cron0c677c22021-04-09 17:15:06 +0200687 mbedtls_psa_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100688 const uint8_t *input,
689 size_t input_length )
690{
Ronald Cron56c9a942021-04-01 10:45:57 +0200691 if( is_hash_accelerated( operation->alg ) )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100692 return( hash_update( operation, input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100693 else
694 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100695}
696
Ronald Cron7b7854e2021-03-13 18:19:08 +0100697psa_status_t libtestdriver1_mbedtls_psa_hash_finish(
Ronald Cron0c677c22021-04-09 17:15:06 +0200698 mbedtls_psa_hash_operation_t *operation,
Steven Cooremanf7638102021-03-04 15:14:36 +0100699 uint8_t *hash,
700 size_t hash_size,
701 size_t *hash_length )
702{
Ronald Cron56c9a942021-04-01 10:45:57 +0200703 if( is_hash_accelerated( operation->alg ) )
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100704 return( hash_finish( operation, hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100705 else
706 return( PSA_ERROR_BAD_STATE );
Steven Cooremanf7638102021-03-04 15:14:36 +0100707}
708
Ronald Cron7b7854e2021-03-13 18:19:08 +0100709psa_status_t libtestdriver1_mbedtls_psa_hash_abort(
Ronald Cron0c677c22021-04-09 17:15:06 +0200710 mbedtls_psa_hash_operation_t *operation )
Steven Cooremanf7638102021-03-04 15:14:36 +0100711{
Steven Cooreman0f8ffa82021-03-15 11:56:33 +0100712 return( hash_abort( operation ) );
Steven Cooremanf7638102021-03-04 15:14:36 +0100713}
714
Steven Cooremanf8e45a42021-03-16 11:07:55 +0100715#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremanf7638102021-03-04 15:14:36 +0100716
Steven Cooreman0e307642021-02-18 16:18:32 +0100717#endif /* MBEDTLS_PSA_CRYPTO_C */