blob: 4bf60a5bdbc96b89389c39a26c2058c227dac927 [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)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020025# include "psa/crypto.h"
26# include "psa_crypto_core.h"
27# include "psa_crypto_ecp.h"
28# include "psa_crypto_hash.h"
29# include "psa_crypto_rsa.h"
30# include "mbedtls/ecp.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020031
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020032# include "test/drivers/signature.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020033
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020034# include "mbedtls/md.h"
35# include "mbedtls/ecdsa.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020036
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020037# include "test/random.h"
Steven Cooreman55ae2172020-07-17 19:46:15 +020038
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020039# include <string.h>
Steven Cooremana70d5882020-07-16 20:26:18 +020040
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020041mbedtls_test_driver_signature_hooks_t mbedtls_test_driver_signature_sign_hooks =
42 MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
43mbedtls_test_driver_signature_hooks_t mbedtls_test_driver_signature_verify_hooks =
44 MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
Steven Cooreman55ae2172020-07-17 19:46:15 +020045
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020046psa_status_t sign_hash(const psa_key_attributes_t *attributes,
47 const uint8_t *key_buffer,
48 size_t key_buffer_size,
49 psa_algorithm_t alg,
50 const uint8_t *hash,
51 size_t hash_length,
52 uint8_t *signature,
53 size_t signature_size,
54 size_t *signature_length)
Steven Cooremana70d5882020-07-16 20:26:18 +020055{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020056# if defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
57 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS)
58 if (attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR) {
59 return (mbedtls_transparent_test_driver_rsa_sign_hash(
60 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
61 signature, signature_size, signature_length));
62 } else
63# endif /* defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
64 * defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) */
Ronald Crond2fb8542020-12-09 15:18:01 +010065
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020066# if defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
67 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
68 if (PSA_KEY_TYPE_IS_ECC(attributes->core.type)) {
69 if (
70# if defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
71 PSA_ALG_IS_ECDSA(alg)
72# else
73 PSA_ALG_IS_RANDOMIZED_ECDSA(alg)
74# endif
75 ) {
76 return (mbedtls_transparent_test_driver_ecdsa_sign_hash(
77 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
78 signature, signature_size, signature_length));
79 } else {
80 return PSA_ERROR_INVALID_ARGUMENT;
Ronald Cronb5399a82020-12-10 09:35:33 +010081 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020082 } else
83# endif /* defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
84 * defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) */
Ronald Cronb5399a82020-12-10 09:35:33 +010085 {
86 (void)attributes;
87 (void)key_buffer;
88 (void)key_buffer_size;
89 (void)alg;
90 (void)hash;
91 (void)hash_length;
92 (void)signature;
93 (void)signature_size;
94 (void)signature_length;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020095 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooremana70d5882020-07-16 20:26:18 +020096 }
Steven Cooremana70d5882020-07-16 20:26:18 +020097}
98
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020099psa_status_t verify_hash(const psa_key_attributes_t *attributes,
100 const uint8_t *key_buffer,
101 size_t key_buffer_size,
102 psa_algorithm_t alg,
103 const uint8_t *hash,
104 size_t hash_length,
105 const uint8_t *signature,
106 size_t signature_length)
Steven Cooremana70d5882020-07-16 20:26:18 +0200107{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200108# if defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
109 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS)
110 if (PSA_KEY_TYPE_IS_RSA(attributes->core.type)) {
111 return (mbedtls_transparent_test_driver_rsa_verify_hash(
112 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
113 signature, signature_length));
114 } else
115# endif /* defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
116 * defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) */
Ronald Crond2fb8542020-12-09 15:18:01 +0100117
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200118# if defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
119 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
120 if (PSA_KEY_TYPE_IS_ECC(attributes->core.type)) {
121 if (PSA_ALG_IS_ECDSA(alg)) {
122 return (mbedtls_transparent_test_driver_ecdsa_verify_hash(
123 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
124 signature, signature_length));
125 } else {
126 return PSA_ERROR_INVALID_ARGUMENT;
Ronald Cronb5399a82020-12-10 09:35:33 +0100127 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200128 } else
129# endif /* defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
130 * defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200131 {
Ronald Cronb5399a82020-12-10 09:35:33 +0100132 (void)attributes;
133 (void)key_buffer;
134 (void)key_buffer_size;
135 (void)alg;
136 (void)hash;
137 (void)hash_length;
138 (void)signature;
139 (void)signature_length;
140
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200141 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman55ae2172020-07-17 19:46:15 +0200142 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200143}
144
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200145psa_status_t mbedtls_test_transparent_signature_sign_message(
146 const psa_key_attributes_t *attributes,
147 const uint8_t *key_buffer,
148 size_t key_buffer_size,
149 psa_algorithm_t alg,
150 const uint8_t *input,
151 size_t input_length,
152 uint8_t *signature,
153 size_t signature_size,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200154 size_t *signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200155{
156 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
157 size_t hash_length;
158 uint8_t hash[PSA_HASH_MAX_SIZE];
159
160 ++mbedtls_test_driver_signature_sign_hooks.hits;
161
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200162 if (mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS)
163 return mbedtls_test_driver_signature_sign_hooks.forced_status;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200164
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200165 if (mbedtls_test_driver_signature_sign_hooks.forced_output != NULL) {
166 if (mbedtls_test_driver_signature_sign_hooks.forced_output_length >
167 signature_size)
168 return PSA_ERROR_BUFFER_TOO_SMALL;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200169
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200170 memcpy(signature,
171 mbedtls_test_driver_signature_sign_hooks.forced_output,
172 mbedtls_test_driver_signature_sign_hooks.forced_output_length);
173 *signature_length =
174 mbedtls_test_driver_signature_sign_hooks.forced_output_length;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200175
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200176 return PSA_SUCCESS;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200177 }
178
179 status = mbedtls_transparent_test_driver_hash_compute(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200180 PSA_ALG_SIGN_GET_HASH(alg), input, input_length, hash, sizeof(hash),
181 &hash_length);
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200182
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200183 if (status != PSA_SUCCESS)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200184 return status;
185
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200186 return sign_hash(attributes, key_buffer, key_buffer_size, alg, hash,
187 hash_length, signature, signature_size, signature_length);
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200188}
189
190psa_status_t mbedtls_test_opaque_signature_sign_message(
191 const psa_key_attributes_t *attributes,
192 const uint8_t *key,
193 size_t key_length,
194 psa_algorithm_t alg,
195 const uint8_t *input,
196 size_t input_length,
197 uint8_t *signature,
198 size_t signature_size,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200199 size_t *signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200200{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200201 (void)attributes;
202 (void)key;
203 (void)key_length;
204 (void)alg;
205 (void)input;
206 (void)input_length;
207 (void)signature;
208 (void)signature_size;
209 (void)signature_length;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200210
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200211 return PSA_ERROR_NOT_SUPPORTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200212}
213
214psa_status_t mbedtls_test_transparent_signature_verify_message(
215 const psa_key_attributes_t *attributes,
216 const uint8_t *key_buffer,
217 size_t key_buffer_size,
218 psa_algorithm_t alg,
219 const uint8_t *input,
220 size_t input_length,
221 const uint8_t *signature,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200222 size_t signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200223{
224 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
225 size_t hash_length;
226 uint8_t hash[PSA_HASH_MAX_SIZE];
227
228 ++mbedtls_test_driver_signature_verify_hooks.hits;
229
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200230 if (mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS)
231 return mbedtls_test_driver_signature_verify_hooks.forced_status;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200232
233 status = mbedtls_transparent_test_driver_hash_compute(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200234 PSA_ALG_SIGN_GET_HASH(alg), input, input_length, hash, sizeof(hash),
235 &hash_length);
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200236
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200237 if (status != PSA_SUCCESS)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200238 return status;
239
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200240 return verify_hash(attributes, key_buffer, key_buffer_size, alg, hash,
241 hash_length, signature, signature_length);
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200242}
243
244psa_status_t mbedtls_test_opaque_signature_verify_message(
245 const psa_key_attributes_t *attributes,
246 const uint8_t *key,
247 size_t key_length,
248 psa_algorithm_t alg,
249 const uint8_t *input,
250 size_t input_length,
251 const uint8_t *signature,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200252 size_t signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200253{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200254 (void)attributes;
255 (void)key;
256 (void)key_length;
257 (void)alg;
258 (void)input;
259 (void)input_length;
260 (void)signature;
261 (void)signature_length;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200262
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200263 return PSA_ERROR_NOT_SUPPORTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200264}
265
266psa_status_t mbedtls_test_transparent_signature_sign_hash(
267 const psa_key_attributes_t *attributes,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200268 const uint8_t *key_buffer,
269 size_t key_buffer_size,
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200270 psa_algorithm_t alg,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200271 const uint8_t *hash,
272 size_t hash_length,
273 uint8_t *signature,
274 size_t signature_size,
275 size_t *signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200276{
277 ++mbedtls_test_driver_signature_sign_hooks.hits;
278
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200279 if (mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS)
280 return mbedtls_test_driver_signature_sign_hooks.forced_status;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200281
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200282 if (mbedtls_test_driver_signature_sign_hooks.forced_output != NULL) {
283 if (mbedtls_test_driver_signature_sign_hooks.forced_output_length >
284 signature_size)
285 return PSA_ERROR_BUFFER_TOO_SMALL;
286 memcpy(signature,
287 mbedtls_test_driver_signature_sign_hooks.forced_output,
288 mbedtls_test_driver_signature_sign_hooks.forced_output_length);
289 *signature_length =
290 mbedtls_test_driver_signature_sign_hooks.forced_output_length;
291 return PSA_SUCCESS;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200292 }
293
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200294 return sign_hash(attributes, key_buffer, key_buffer_size, alg, hash,
295 hash_length, signature, signature_size, signature_length);
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200296}
297
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200298psa_status_t
299mbedtls_test_opaque_signature_sign_hash(const psa_key_attributes_t *attributes,
300 const uint8_t *key,
301 size_t key_length,
302 psa_algorithm_t alg,
303 const uint8_t *hash,
304 size_t hash_length,
305 uint8_t *signature,
306 size_t signature_size,
307 size_t *signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200308{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200309 (void)attributes;
310 (void)key;
311 (void)key_length;
312 (void)alg;
313 (void)hash;
314 (void)hash_length;
315 (void)signature;
316 (void)signature_size;
317 (void)signature_length;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200318
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200319 return PSA_ERROR_NOT_SUPPORTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200320}
321
322psa_status_t mbedtls_test_transparent_signature_verify_hash(
323 const psa_key_attributes_t *attributes,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200324 const uint8_t *key_buffer,
325 size_t key_buffer_size,
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200326 psa_algorithm_t alg,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200327 const uint8_t *hash,
328 size_t hash_length,
329 const uint8_t *signature,
330 size_t signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200331{
332 ++mbedtls_test_driver_signature_verify_hooks.hits;
333
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200334 if (mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS)
335 return mbedtls_test_driver_signature_verify_hooks.forced_status;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200336
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200337 return verify_hash(attributes, key_buffer, key_buffer_size, alg, hash,
338 hash_length, signature, signature_length);
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200339}
340
Ronald Cron7f13fa22021-04-13 12:41:34 +0200341psa_status_t mbedtls_test_opaque_signature_verify_hash(
Steven Cooreman55ae2172020-07-17 19:46:15 +0200342 const psa_key_attributes_t *attributes,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200343 const uint8_t *key,
344 size_t key_length,
Steven Cooreman55ae2172020-07-17 19:46:15 +0200345 psa_algorithm_t alg,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200346 const uint8_t *hash,
347 size_t hash_length,
348 const uint8_t *signature,
349 size_t signature_length)
Steven Cooreman55ae2172020-07-17 19:46:15 +0200350{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200351 (void)attributes;
352 (void)key;
353 (void)key_length;
354 (void)alg;
355 (void)hash;
356 (void)hash_length;
357 (void)signature;
358 (void)signature_length;
359 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman55ae2172020-07-17 19:46:15 +0200360}
361
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200362#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */