blob: be8c1792bcbba265ff063083c0568abbbba1c8db [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
22#if !defined(MBEDTLS_CONFIG_FILE)
23#include "mbedtls/config.h"
24#else
25#include MBEDTLS_CONFIG_FILE
26#endif
27
Steven Cooremanf1720ea2020-07-24 18:41:58 +020028#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) && defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana70d5882020-07-16 20:26:18 +020029#include "psa/crypto.h"
Steven Cooreman15f58d22020-09-04 13:05:23 +020030#include "psa_crypto_core.h"
Ronald Cronb5399a82020-12-10 09:35:33 +010031#include "psa_crypto_ecp.h"
Ronald Crond2fb8542020-12-09 15:18:01 +010032#include "psa_crypto_rsa.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020033#include "mbedtls/ecp.h"
34
Steven Cooreman0d7c64d2020-09-07 16:17:55 +020035#include "test/drivers/signature.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020036
37#include "mbedtls/md.h"
38#include "mbedtls/ecdsa.h"
39
Steven Cooreman55ae2172020-07-17 19:46:15 +020040#include "test/random.h"
41
Steven Cooremana70d5882020-07-16 20:26:18 +020042#include <string.h>
43
Ronald Cron7f13fa22021-04-13 12:41:34 +020044mbedtls_test_driver_signature_hooks_t
45 mbedtls_test_driver_signature_sign_hooks = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
46mbedtls_test_driver_signature_hooks_t
47 mbedtls_test_driver_signature_verify_hooks = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
Steven Cooreman55ae2172020-07-17 19:46:15 +020048
Ronald Cron7f13fa22021-04-13 12:41:34 +020049psa_status_t mbedtls_test_transparent_signature_sign_hash(
Steven Cooremana70d5882020-07-16 20:26:18 +020050 const psa_key_attributes_t *attributes,
Ronald Cronb5399a82020-12-10 09:35:33 +010051 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooremana70d5882020-07-16 20:26:18 +020052 psa_algorithm_t alg,
53 const uint8_t *hash, size_t hash_length,
54 uint8_t *signature, size_t signature_size, size_t *signature_length )
55{
Ronald Cron7f13fa22021-04-13 12:41:34 +020056 ++mbedtls_test_driver_signature_sign_hooks.hits;
Steven Cooremana70d5882020-07-16 20:26:18 +020057
Ronald Cron7f13fa22021-04-13 12:41:34 +020058 if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
59 return( mbedtls_test_driver_signature_sign_hooks.forced_status );
Steven Cooremana70d5882020-07-16 20:26:18 +020060
Ronald Cron7f13fa22021-04-13 12:41:34 +020061 if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
Steven Cooremana70d5882020-07-16 20:26:18 +020062 {
Ronald Cron7f13fa22021-04-13 12:41:34 +020063 if( mbedtls_test_driver_signature_sign_hooks.forced_output_length >
64 signature_size )
Steven Cooremana70d5882020-07-16 20:26:18 +020065 return( PSA_ERROR_BUFFER_TOO_SMALL );
Ronald Cron7f13fa22021-04-13 12:41:34 +020066 memcpy( signature,
67 mbedtls_test_driver_signature_sign_hooks.forced_output,
68 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
69 *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
Steven Cooremana70d5882020-07-16 20:26:18 +020070 return( PSA_SUCCESS );
71 }
72
Ronald Crond2fb8542020-12-09 15:18:01 +010073#if defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
74 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS)
75 if( attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR )
76 {
77 return( mbedtls_transparent_test_driver_rsa_sign_hash(
78 attributes,
79 key_buffer, key_buffer_size,
80 alg, hash, hash_length,
81 signature, signature_size, signature_length ) );
82 }
Ronald Cronb5399a82020-12-10 09:35:33 +010083 else
Ronald Crond2fb8542020-12-09 15:18:01 +010084#endif /* defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) ||
85 * defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) */
86
Ronald Cronb5399a82020-12-10 09:35:33 +010087#if defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
88 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
89 if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
90 {
91 if(
92#if defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
93 PSA_ALG_IS_ECDSA( alg )
94#else
95 PSA_ALG_IS_RANDOMIZED_ECDSA( alg )
96#endif
97 )
98 {
99 return( mbedtls_transparent_test_driver_ecdsa_sign_hash(
100 attributes,
101 key_buffer, key_buffer_size,
102 alg, hash, hash_length,
103 signature, signature_size, signature_length ) );
104 }
105 else
106 {
107 return( PSA_ERROR_INVALID_ARGUMENT );
108 }
109 }
110 else
111#endif /* defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) ||
112 * defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) */
113 {
114 (void)attributes;
115 (void)key_buffer;
116 (void)key_buffer_size;
117 (void)alg;
118 (void)hash;
119 (void)hash_length;
120 (void)signature;
121 (void)signature_size;
122 (void)signature_length;
Steven Cooremana70d5882020-07-16 20:26:18 +0200123 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremana70d5882020-07-16 20:26:18 +0200124 }
Steven Cooremana70d5882020-07-16 20:26:18 +0200125}
126
Ronald Cron7f13fa22021-04-13 12:41:34 +0200127psa_status_t mbedtls_test_opaque_signature_sign_hash(
Steven Cooremana70d5882020-07-16 20:26:18 +0200128 const psa_key_attributes_t *attributes,
129 const uint8_t *key, size_t key_length,
130 psa_algorithm_t alg,
131 const uint8_t *hash, size_t hash_length,
132 uint8_t *signature, size_t signature_size, size_t *signature_length )
133{
134 (void) attributes;
135 (void) key;
136 (void) key_length;
137 (void) alg;
138 (void) hash;
139 (void) hash_length;
140 (void) signature;
141 (void) signature_size;
142 (void) signature_length;
Ronald Cronb5399a82020-12-10 09:35:33 +0100143
Steven Cooremana70d5882020-07-16 20:26:18 +0200144 return( PSA_ERROR_NOT_SUPPORTED );
145}
146
Ronald Cron7f13fa22021-04-13 12:41:34 +0200147psa_status_t mbedtls_test_transparent_signature_verify_hash(
Steven Cooreman55ae2172020-07-17 19:46:15 +0200148 const psa_key_attributes_t *attributes,
Ronald Cronb5399a82020-12-10 09:35:33 +0100149 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman55ae2172020-07-17 19:46:15 +0200150 psa_algorithm_t alg,
151 const uint8_t *hash, size_t hash_length,
152 const uint8_t *signature, size_t signature_length )
153{
Ronald Cron7f13fa22021-04-13 12:41:34 +0200154 ++mbedtls_test_driver_signature_verify_hooks.hits;
Steven Cooreman55ae2172020-07-17 19:46:15 +0200155
Ronald Cron7f13fa22021-04-13 12:41:34 +0200156 if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
157 return( mbedtls_test_driver_signature_verify_hooks.forced_status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200158
Ronald Crond2fb8542020-12-09 15:18:01 +0100159#if defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
160 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS)
161 if( PSA_KEY_TYPE_IS_RSA( attributes->core.type ) )
162 {
163 return( mbedtls_transparent_test_driver_rsa_verify_hash(
164 attributes,
165 key_buffer, key_buffer_size,
166 alg, hash, hash_length,
167 signature, signature_length ) );
168 }
Ronald Cronb5399a82020-12-10 09:35:33 +0100169 else
Ronald Crond2fb8542020-12-09 15:18:01 +0100170#endif /* defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) ||
171 * defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) */
172
Ronald Cronb5399a82020-12-10 09:35:33 +0100173#if defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
174 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
175 if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200176 {
Ronald Cronb5399a82020-12-10 09:35:33 +0100177 if( PSA_ALG_IS_ECDSA( alg ) )
178 {
179 return( mbedtls_transparent_test_driver_ecdsa_verify_hash(
180 attributes,
181 key_buffer, key_buffer_size,
182 alg, hash, hash_length,
183 signature, signature_length ) );
184 }
185 else
186 {
187 return( PSA_ERROR_INVALID_ARGUMENT );
188 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200189 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200190 else
Ronald Cronb5399a82020-12-10 09:35:33 +0100191#endif /* defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) ||
192 * defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200193 {
Ronald Cronb5399a82020-12-10 09:35:33 +0100194 (void)attributes;
195 (void)key_buffer;
196 (void)key_buffer_size;
197 (void)alg;
198 (void)hash;
199 (void)hash_length;
200 (void)signature;
201 (void)signature_length;
202
203 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200204 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200205}
206
Ronald Cron7f13fa22021-04-13 12:41:34 +0200207psa_status_t mbedtls_test_opaque_signature_verify_hash(
Steven Cooreman55ae2172020-07-17 19:46:15 +0200208 const psa_key_attributes_t *attributes,
209 const uint8_t *key, size_t key_length,
210 psa_algorithm_t alg,
211 const uint8_t *hash, size_t hash_length,
212 const uint8_t *signature, size_t signature_length )
213{
214 (void) attributes;
215 (void) key;
216 (void) key_length;
217 (void) alg;
218 (void) hash;
219 (void) hash_length;
220 (void) signature;
221 (void) signature_length;
222 return( PSA_ERROR_NOT_SUPPORTED );
223}
224
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200225#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */