blob: ef6d135eb8c1669815a8eb9e98e6303fb74d457c [file] [log] [blame]
Steven Cooremana70d5882020-07-16 20:26:18 +02001/*
Steven Cooreman56250fd2020-09-04 13:07:15 +02002 * Test driver for signature functions.
3 * Currently supports signing and verifying precalculated hashes, using
4 * only deterministic ECDSA on curves secp256r1, secp384r1 and secp521r1.
Steven Cooremana70d5882020-07-16 20:26:18 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremana70d5882020-07-16 20:26:18 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremana70d5882020-07-16 20:26:18 +020020 */
21
Mateusz Starzyk2c09c9b2021-05-14 22:20:10 +020022#include <test/helpers.h>
23
Steven Cooremanf1720ea2020-07-24 18:41:58 +020024#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) && defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana70d5882020-07-16 20:26:18 +020025#include "psa/crypto.h"
Steven Cooreman15f58d22020-09-04 13:05:23 +020026#include "psa_crypto_core.h"
Ronald Cronb5399a82020-12-10 09:35:33 +010027#include "psa_crypto_ecp.h"
gabor-mezei-arm50eac352021-04-22 11:32:19 +020028#include "psa_crypto_hash.h"
Ronald Crond2fb8542020-12-09 15:18:01 +010029#include "psa_crypto_rsa.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020030#include "mbedtls/ecp.h"
31
Ronald Cron5601cd22021-04-10 15:12:00 +020032#include "test/drivers/hash.h"
Steven Cooreman0d7c64d2020-09-07 16:17:55 +020033#include "test/drivers/signature.h"
Ronald Cron40170d92021-03-13 18:19:08 +010034#include "test/drivers/hash.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020035
36#include "mbedtls/md.h"
37#include "mbedtls/ecdsa.h"
38
Steven Cooreman55ae2172020-07-17 19:46:15 +020039#include "test/random.h"
40
Ronald Cron7975fae2021-09-13 14:50:42 +020041#if defined(MBEDTLS_TEST_LIBTESTDRIVER1)
42#include "libtestdriver1/library/psa_crypto_ecp.h"
43#include "libtestdriver1/library/psa_crypto_hash.h"
44#include "libtestdriver1/library/psa_crypto_rsa.h"
45#endif
46
Steven Cooremana70d5882020-07-16 20:26:18 +020047#include <string.h>
48
Ronald Cron7f13fa22021-04-13 12:41:34 +020049mbedtls_test_driver_signature_hooks_t
50 mbedtls_test_driver_signature_sign_hooks = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
51mbedtls_test_driver_signature_hooks_t
52 mbedtls_test_driver_signature_verify_hooks = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
Steven Cooreman55ae2172020-07-17 19:46:15 +020053
gabor-mezei-arm50eac352021-04-22 11:32:19 +020054psa_status_t sign_hash(
Steven Cooremana70d5882020-07-16 20:26:18 +020055 const psa_key_attributes_t *attributes,
gabor-mezei-arm50eac352021-04-22 11:32:19 +020056 const uint8_t *key_buffer,
57 size_t key_buffer_size,
Steven Cooremana70d5882020-07-16 20:26:18 +020058 psa_algorithm_t alg,
gabor-mezei-arm50eac352021-04-22 11:32:19 +020059 const uint8_t *hash,
60 size_t hash_length,
61 uint8_t *signature,
62 size_t signature_size,
63 size_t *signature_length )
Steven Cooremana70d5882020-07-16 20:26:18 +020064{
Ronald Crond2fb8542020-12-09 15:18:01 +010065 if( attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR )
66 {
Ronald Cron81ca97e2021-04-09 15:32:03 +020067 if( PSA_ALG_IS_RSA_PKCS1V15_SIGN( alg ) ||
68 PSA_ALG_IS_RSA_PSS( alg) )
Ronald Cronb5399a82020-12-10 09:35:33 +010069 {
Ronald Cron7975fae2021-09-13 14:50:42 +020070#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
71 ( defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
72 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) )
Ronald Cron40170d92021-03-13 18:19:08 +010073 return( libtestdriver1_mbedtls_psa_rsa_sign_hash(
Ronald Cron7975fae2021-09-13 14:50:42 +020074 (const libtestdriver1_psa_key_attributes_t *) attributes,
Ronald Cronb5399a82020-12-10 09:35:33 +010075 key_buffer, key_buffer_size,
76 alg, hash, hash_length,
77 signature, signature_size, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +020078#elif defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
79 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
Ronald Cron40170d92021-03-13 18:19:08 +010080 return( mbedtls_psa_rsa_sign_hash(
81 attributes,
82 key_buffer, key_buffer_size,
83 alg, hash, hash_length,
84 signature, signature_size, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +020085#endif
Ronald Cronb5399a82020-12-10 09:35:33 +010086 }
87 else
88 {
89 return( PSA_ERROR_INVALID_ARGUMENT );
90 }
91 }
Ronald Cron81ca97e2021-04-09 15:32:03 +020092 else if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
93 {
94 if( PSA_ALG_IS_ECDSA( alg ) )
95 {
Ronald Cron7975fae2021-09-13 14:50:42 +020096#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
97 ( defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
98 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) )
Ronald Cron40170d92021-03-13 18:19:08 +010099 return( libtestdriver1_mbedtls_psa_ecdsa_sign_hash(
Ronald Cron7975fae2021-09-13 14:50:42 +0200100 (const libtestdriver1_psa_key_attributes_t *) attributes,
Ronald Cron81ca97e2021-04-09 15:32:03 +0200101 key_buffer, key_buffer_size,
102 alg, hash, hash_length,
103 signature, signature_size, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200104#elif defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
105 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
106 return( mbedtls_psa_ecdsa_sign_hash(
107 attributes,
108 key_buffer, key_buffer_size,
109 alg, hash, hash_length,
110 signature, signature_size, signature_length ) );
111#endif
Ronald Cron81ca97e2021-04-09 15:32:03 +0200112 }
113 else
114 {
115 return( PSA_ERROR_INVALID_ARGUMENT );
116 }
Steven Cooremana70d5882020-07-16 20:26:18 +0200117 }
Ronald Cron81ca97e2021-04-09 15:32:03 +0200118
119 (void)attributes;
120 (void)key_buffer;
121 (void)key_buffer_size;
122 (void)alg;
123 (void)hash;
124 (void)hash_length;
125 (void)signature;
126 (void)signature_size;
127 (void)signature_length;
128 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremana70d5882020-07-16 20:26:18 +0200129}
130
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200131psa_status_t verify_hash(
Steven Cooremana70d5882020-07-16 20:26:18 +0200132 const psa_key_attributes_t *attributes,
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200133 const uint8_t *key_buffer,
134 size_t key_buffer_size,
Steven Cooremana70d5882020-07-16 20:26:18 +0200135 psa_algorithm_t alg,
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200136 const uint8_t *hash,
137 size_t hash_length,
138 const uint8_t *signature,
139 size_t signature_length )
Steven Cooremana70d5882020-07-16 20:26:18 +0200140{
Ronald Crond2fb8542020-12-09 15:18:01 +0100141 if( PSA_KEY_TYPE_IS_RSA( attributes->core.type ) )
142 {
Ronald Cron81ca97e2021-04-09 15:32:03 +0200143 if( PSA_ALG_IS_RSA_PKCS1V15_SIGN( alg ) ||
144 PSA_ALG_IS_RSA_PSS( alg) )
Ronald Cronb5399a82020-12-10 09:35:33 +0100145 {
Ronald Cron7975fae2021-09-13 14:50:42 +0200146#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
147 ( defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
148 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) )
Ronald Cron40170d92021-03-13 18:19:08 +0100149 return( libtestdriver1_mbedtls_psa_rsa_verify_hash(
Ronald Cron7975fae2021-09-13 14:50:42 +0200150 (const libtestdriver1_psa_key_attributes_t *) attributes,
Ronald Cronb5399a82020-12-10 09:35:33 +0100151 key_buffer, key_buffer_size,
152 alg, hash, hash_length,
153 signature, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200154#elif defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
155 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
Ronald Cron40170d92021-03-13 18:19:08 +0100156 return( mbedtls_psa_rsa_verify_hash(
157 attributes,
158 key_buffer, key_buffer_size,
159 alg, hash, hash_length,
160 signature, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200161#endif
Ronald Cronb5399a82020-12-10 09:35:33 +0100162 }
163 else
164 {
165 return( PSA_ERROR_INVALID_ARGUMENT );
166 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200167 }
Ronald Cron81ca97e2021-04-09 15:32:03 +0200168 else if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
169 {
170 if( PSA_ALG_IS_ECDSA( alg ) )
171 {
Ronald Cron7975fae2021-09-13 14:50:42 +0200172#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
173 ( defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
174 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) )
Ronald Cron40170d92021-03-13 18:19:08 +0100175 return( libtestdriver1_mbedtls_psa_ecdsa_verify_hash(
Ronald Cron7975fae2021-09-13 14:50:42 +0200176 (const libtestdriver1_psa_key_attributes_t *) attributes,
Ronald Cron81ca97e2021-04-09 15:32:03 +0200177 key_buffer, key_buffer_size,
178 alg, hash, hash_length,
179 signature, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200180#elif defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
181 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
182 return( mbedtls_psa_ecdsa_verify_hash(
183 attributes,
184 key_buffer, key_buffer_size,
185 alg, hash, hash_length,
186 signature, signature_length ) );
187#endif
Ronald Cron81ca97e2021-04-09 15:32:03 +0200188 }
189 else
190 {
191 return( PSA_ERROR_INVALID_ARGUMENT );
192 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200193 }
Ronald Cron81ca97e2021-04-09 15:32:03 +0200194
195 (void)attributes;
196 (void)key_buffer;
197 (void)key_buffer_size;
198 (void)alg;
199 (void)hash;
200 (void)hash_length;
201 (void)signature;
202 (void)signature_length;
Ronald Cron81ca97e2021-04-09 15:32:03 +0200203 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200204}
205
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200206psa_status_t mbedtls_test_transparent_signature_sign_message(
207 const psa_key_attributes_t *attributes,
208 const uint8_t *key_buffer,
209 size_t key_buffer_size,
210 psa_algorithm_t alg,
211 const uint8_t *input,
212 size_t input_length,
213 uint8_t *signature,
214 size_t signature_size,
215 size_t *signature_length )
216{
217 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
218 size_t hash_length;
219 uint8_t hash[PSA_HASH_MAX_SIZE];
220
221 ++mbedtls_test_driver_signature_sign_hooks.hits;
222
223 if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
224 return( mbedtls_test_driver_signature_sign_hooks.forced_status );
225
226 if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
227 {
228 if( mbedtls_test_driver_signature_sign_hooks.forced_output_length > signature_size )
229 return( PSA_ERROR_BUFFER_TOO_SMALL );
230
231 memcpy( signature, mbedtls_test_driver_signature_sign_hooks.forced_output,
232 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
233 *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
234
235 return( PSA_SUCCESS );
236 }
237
Ronald Cron7975fae2021-09-13 14:50:42 +0200238#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
239 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_HASH)
Ronald Cron40170d92021-03-13 18:19:08 +0100240 status = libtestdriver1_mbedtls_psa_hash_compute(
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200241 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
242 hash, sizeof( hash ), &hash_length );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200243#elif defined(MBEDTLS_PSA_BUILTIN_HASH)
244 status = mbedtls_psa_hash_compute(
245 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
246 hash, sizeof( hash ), &hash_length );
247#else
248 (void) input;
249 (void) input_length;
250 status = PSA_ERROR_NOT_SUPPORTED;
251#endif
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200252 if( status != PSA_SUCCESS )
253 return status;
254
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200255 return( sign_hash( attributes, key_buffer, key_buffer_size,
256 alg, hash, hash_length,
257 signature, signature_size, signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200258}
259
260psa_status_t mbedtls_test_opaque_signature_sign_message(
261 const psa_key_attributes_t *attributes,
262 const uint8_t *key,
263 size_t key_length,
264 psa_algorithm_t alg,
265 const uint8_t *input,
266 size_t input_length,
267 uint8_t *signature,
268 size_t signature_size,
269 size_t *signature_length )
270{
271 (void) attributes;
272 (void) key;
273 (void) key_length;
274 (void) alg;
275 (void) input;
276 (void) input_length;
277 (void) signature;
278 (void) signature_size;
279 (void) signature_length;
280
281 return( PSA_ERROR_NOT_SUPPORTED );
282}
283
284psa_status_t mbedtls_test_transparent_signature_verify_message(
285 const psa_key_attributes_t *attributes,
286 const uint8_t *key_buffer,
287 size_t key_buffer_size,
288 psa_algorithm_t alg,
289 const uint8_t *input,
290 size_t input_length,
291 const uint8_t *signature,
292 size_t signature_length )
293{
294 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
295 size_t hash_length;
296 uint8_t hash[PSA_HASH_MAX_SIZE];
297
298 ++mbedtls_test_driver_signature_verify_hooks.hits;
299
300 if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
301 return( mbedtls_test_driver_signature_verify_hooks.forced_status );
302
Ronald Cron7975fae2021-09-13 14:50:42 +0200303#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
304 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_HASH)
Ronald Cron40170d92021-03-13 18:19:08 +0100305 status = libtestdriver1_mbedtls_psa_hash_compute(
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200306 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
307 hash, sizeof( hash ), &hash_length );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200308#elif defined(MBEDTLS_PSA_BUILTIN_HASH)
309 status = mbedtls_psa_hash_compute(
310 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
311 hash, sizeof( hash ), &hash_length );
312#else
313 (void) input;
314 (void) input_length;
315 status = PSA_ERROR_NOT_SUPPORTED;
316#endif
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200317 if( status != PSA_SUCCESS )
318 return status;
319
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200320 return( verify_hash( attributes, key_buffer, key_buffer_size,
321 alg, hash, hash_length,
322 signature, signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200323}
324
325psa_status_t mbedtls_test_opaque_signature_verify_message(
326 const psa_key_attributes_t *attributes,
327 const uint8_t *key,
328 size_t key_length,
329 psa_algorithm_t alg,
330 const uint8_t *input,
331 size_t input_length,
332 const uint8_t *signature,
333 size_t signature_length )
334{
335 (void) attributes;
336 (void) key;
337 (void) key_length;
338 (void) alg;
339 (void) input;
340 (void) input_length;
341 (void) signature;
342 (void) signature_length;
343
344 return( PSA_ERROR_NOT_SUPPORTED );
345}
346
347psa_status_t mbedtls_test_transparent_signature_sign_hash(
348 const psa_key_attributes_t *attributes,
349 const uint8_t *key_buffer, size_t key_buffer_size,
350 psa_algorithm_t alg,
351 const uint8_t *hash, size_t hash_length,
352 uint8_t *signature, size_t signature_size, size_t *signature_length )
353{
354 ++mbedtls_test_driver_signature_sign_hooks.hits;
355
356 if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
357 return( mbedtls_test_driver_signature_sign_hooks.forced_status );
358
359 if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
360 {
361 if( mbedtls_test_driver_signature_sign_hooks.forced_output_length > signature_size )
362 return( PSA_ERROR_BUFFER_TOO_SMALL );
363 memcpy( signature, mbedtls_test_driver_signature_sign_hooks.forced_output,
364 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
365 *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
366 return( PSA_SUCCESS );
367 }
368
Ronald Cron40170d92021-03-13 18:19:08 +0100369 return( sign_hash( attributes, key_buffer, key_buffer_size,
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200370 alg, hash, hash_length,
Ronald Cron40170d92021-03-13 18:19:08 +0100371 signature, signature_size, signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200372}
373
374psa_status_t mbedtls_test_opaque_signature_sign_hash(
375 const psa_key_attributes_t *attributes,
376 const uint8_t *key, size_t key_length,
377 psa_algorithm_t alg,
378 const uint8_t *hash, size_t hash_length,
379 uint8_t *signature, size_t signature_size, size_t *signature_length )
380{
381 (void) attributes;
382 (void) key;
383 (void) key_length;
384 (void) alg;
385 (void) hash;
386 (void) hash_length;
387 (void) signature;
388 (void) signature_size;
389 (void) signature_length;
390
391 return( PSA_ERROR_NOT_SUPPORTED );
392}
393
394psa_status_t mbedtls_test_transparent_signature_verify_hash(
395 const psa_key_attributes_t *attributes,
396 const uint8_t *key_buffer, size_t key_buffer_size,
397 psa_algorithm_t alg,
398 const uint8_t *hash, size_t hash_length,
399 const uint8_t *signature, size_t signature_length )
400{
401 ++mbedtls_test_driver_signature_verify_hooks.hits;
402
403 if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
404 return( mbedtls_test_driver_signature_verify_hooks.forced_status );
405
406 return verify_hash( attributes, key_buffer, key_buffer_size,
407 alg, hash, hash_length,
408 signature, signature_length );
409}
410
Ronald Cron7f13fa22021-04-13 12:41:34 +0200411psa_status_t mbedtls_test_opaque_signature_verify_hash(
Steven Cooreman55ae2172020-07-17 19:46:15 +0200412 const psa_key_attributes_t *attributes,
413 const uint8_t *key, size_t key_length,
414 psa_algorithm_t alg,
415 const uint8_t *hash, size_t hash_length,
416 const uint8_t *signature, size_t signature_length )
417{
418 (void) attributes;
419 (void) key;
420 (void) key_length;
421 (void) alg;
422 (void) hash;
423 (void) hash_length;
424 (void) signature;
425 (void) signature_length;
426 return( PSA_ERROR_NOT_SUPPORTED );
427}
428
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200429#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */