Skip to content

Commit 8c1412d

Browse files
authored
Merge pull request #21821 from mguetschow/psa-ed25519-sizes
sys/psa_crypto: unify buffer size size handling for ed25519 backends
2 parents 05cac03 + 36e09cc commit 8c1412d

File tree

4 files changed

+80
-104
lines changed

4 files changed

+80
-104
lines changed

pkg/c25519/psa_c25519/edsign.c

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -22,72 +22,42 @@
2222
#include "edsign.h"
2323
#include "random.h"
2424

25-
psa_status_t psa_generate_ecc_ed25519_key_pair( uint8_t *priv_key_buffer, uint8_t *pub_key_buffer,
26-
size_t *priv_key_buffer_length,
27-
size_t *pub_key_buffer_length)
25+
psa_status_t psa_generate_ecc_ed25519_key_pair( uint8_t *priv_key_buffer,
26+
uint8_t *pub_key_buffer)
2827
{
29-
*priv_key_buffer_length = EDSIGN_SECRET_KEY_SIZE;
30-
*pub_key_buffer_length = EDSIGN_PUBLIC_KEY_SIZE;
31-
28+
/* todo: maybe this should usa psa_random instead */
3229
random_bytes(priv_key_buffer, EDSIGN_SECRET_KEY_SIZE);
3330
ed25519_prepare(priv_key_buffer);
3431
edsign_sec_to_pub(pub_key_buffer, priv_key_buffer);
3532

3633
return PSA_SUCCESS;
3734
}
3835

39-
psa_status_t psa_derive_ecc_ed25519_public_key( const uint8_t *priv_key_buffer, uint8_t *pub_key_buffer,
40-
size_t priv_key_buffer_length,
41-
size_t *pub_key_buffer_length)
36+
psa_status_t psa_derive_ecc_ed25519_public_key( const uint8_t *priv_key_buffer,
37+
uint8_t *pub_key_buffer)
4238
{
43-
*pub_key_buffer_length = EDSIGN_PUBLIC_KEY_SIZE;
44-
4539
edsign_sec_to_pub(pub_key_buffer, priv_key_buffer);
4640

47-
(void)priv_key_buffer_length;
4841
return PSA_SUCCESS;
4942
}
5043

51-
psa_status_t psa_ecc_ed25519_sign_message( const uint8_t *priv_key_buffer,
52-
size_t priv_key_buffer_size,
53-
const uint8_t *pub_key_buffer,
54-
size_t pub_key_buffer_size,
55-
const uint8_t *input,
56-
size_t input_length,
57-
uint8_t *signature,
58-
size_t signature_size,
59-
size_t *signature_length)
44+
psa_status_t psa_ecc_ed25519_sign_message(const uint8_t *priv_key_buffer,
45+
const uint8_t *pub_key_buffer,
46+
const uint8_t *input, size_t input_length,
47+
uint8_t *signature)
6048
{
61-
if (signature_size < EDSIGN_SIGNATURE_SIZE) {
62-
return PSA_ERROR_BUFFER_TOO_SMALL;
63-
}
64-
65-
*signature_length = EDSIGN_SIGNATURE_SIZE;
6649
edsign_sign(signature, pub_key_buffer, priv_key_buffer, input, input_length);
6750

68-
(void)priv_key_buffer_size;
69-
(void)pub_key_buffer_size;
7051
return PSA_SUCCESS;
7152
}
7253

73-
psa_status_t psa_ecc_ed25519_verify_message(const uint8_t *key_buffer,
74-
size_t key_buffer_size,
75-
const uint8_t *input,
76-
size_t input_length,
77-
const uint8_t *signature,
78-
size_t signature_length)
54+
psa_status_t psa_ecc_ed25519_verify_message(const uint8_t *pub_key_buffer,
55+
const uint8_t *input, size_t input_length,
56+
const uint8_t *signature)
7957
{
80-
uint8_t ret = 0;
81-
82-
if (signature_length < EDSIGN_SIGNATURE_SIZE) {
83-
return PSA_ERROR_INVALID_SIGNATURE;
84-
}
85-
86-
ret = edsign_verify(signature, key_buffer, input, input_length);
87-
if (!ret) {
58+
if (!edsign_verify(signature, pub_key_buffer, input, input_length)) {
8859
return PSA_ERROR_INVALID_SIGNATURE;
8960
}
9061

91-
(void)key_buffer_size;
9262
return PSA_SUCCESS;
9363
}

pkg/driver_cryptocell_310/psa_cryptocell_310/ecc_ed25519.c

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@
2929
extern CRYS_RND_State_t *rndState_ptr;
3030

3131
psa_status_t psa_generate_ecc_ed25519_key_pair( uint8_t *priv_key_buffer,
32-
uint8_t *pub_key_buffer,
33-
size_t *priv_key_buffer_length,
34-
size_t *pub_key_buffer_length)
32+
uint8_t *pub_key_buffer)
3533
{
3634
CRYS_ECEDW_TempBuff_t tmp;
3735
CRYSError_t ret;
@@ -40,12 +38,11 @@ psa_status_t psa_generate_ecc_ed25519_key_pair( uint8_t *priv_key_buffer,
4038
uint8_t secret_key[CRYS_ECEDW_ORD_SIZE_IN_BYTES + CRYS_ECEDW_MOD_SIZE_IN_BYTES] = { 0x0 };
4139
size_t secret_key_size = sizeof(secret_key);
4240

43-
*priv_key_buffer_length = CRYS_ECEDW_ORD_SIZE_IN_BYTES;
44-
*pub_key_buffer_length = CRYS_ECEDW_MOD_SIZE_IN_BYTES;
41+
size_t pub_key_size = 32;
4542

4643
cryptocell_310_enable();
4744
ret = CRYS_ECEDW_KeyPair(secret_key, &secret_key_size,
48-
pub_key_buffer, pub_key_buffer_length,
45+
pub_key_buffer, &pub_key_size,
4946
rndState_ptr, CRYS_RND_GenerateVector, &tmp);
5047
cryptocell_310_disable();
5148
if (ret != CRYS_OK) {
@@ -60,9 +57,8 @@ psa_status_t psa_generate_ecc_ed25519_key_pair( uint8_t *priv_key_buffer,
6057
return CRYS_to_psa_error(ret);
6158
}
6259

63-
psa_status_t psa_derive_ecc_ed25519_public_key( const uint8_t *priv_key_buffer, uint8_t *pub_key_buffer,
64-
size_t priv_key_buffer_length,
65-
size_t *pub_key_buffer_length)
60+
psa_status_t psa_derive_ecc_ed25519_public_key( const uint8_t *priv_key_buffer,
61+
uint8_t *pub_key_buffer)
6662
{
6763
CRYS_ECEDW_TempBuff_t tmp;
6864
CRYSError_t ret;
@@ -76,14 +72,15 @@ psa_status_t psa_derive_ecc_ed25519_public_key( const uint8_t *priv_key_buffer,
7672
uint8_t secret_key[CRYS_ECEDW_ORD_SIZE_IN_BYTES + CRYS_ECEDW_MOD_SIZE_IN_BYTES] = { 0x0 };
7773
size_t secret_key_size = sizeof(secret_key);
7874

79-
*pub_key_buffer_length = CRYS_ECEDW_MOD_SIZE_IN_BYTES;
75+
size_t pub_key_size = 32;
8076

8177
cryptocell_310_enable();
82-
ret = CRYS_ECEDW_SeedKeyPair(priv_key_buffer, priv_key_buffer_length, secret_key, &secret_key_size,
83-
pub_key_buffer, pub_key_buffer_length, &tmp);
78+
ret = CRYS_ECEDW_SeedKeyPair(priv_key_buffer, 32, secret_key, &secret_key_size,
79+
pub_key_buffer, &pub_key_size, &tmp);
8480
cryptocell_310_disable();
8581
if (ret != CRYS_OK) {
86-
DEBUG("CRYS_ECEDW_SeedKeyPair failed with %s\n", cryptocell310_status_to_humanly_readable(ret));
82+
DEBUG("CRYS_ECEDW_SeedKeyPair failed with %s\n",
83+
cryptocell310_status_to_humanly_readable(ret));
8784
goto done;
8885
}
8986

@@ -93,14 +90,9 @@ psa_status_t psa_derive_ecc_ed25519_public_key( const uint8_t *priv_key_buffer,
9390
}
9491

9592
psa_status_t psa_ecc_ed25519_sign_message(const uint8_t *priv_key_buffer,
96-
size_t priv_key_buffer_size,
9793
const uint8_t *pub_key_buffer,
98-
size_t pub_key_buffer_size,
99-
const uint8_t *input,
100-
size_t input_length,
101-
uint8_t *signature,
102-
size_t signature_size,
103-
size_t *signature_length)
94+
const uint8_t *input, size_t input_length,
95+
uint8_t *signature)
10496
{
10597
CRYS_ECEDW_TempBuff_t tmp;
10698
CRYSError_t ret;
@@ -119,16 +111,14 @@ psa_status_t psa_ecc_ed25519_sign_message(const uint8_t *priv_key_buffer,
119111
/* contains seed (private key), concatenated with public key */
120112
uint8_t secret_key[CRYS_ECEDW_ORD_SIZE_IN_BYTES + CRYS_ECEDW_MOD_SIZE_IN_BYTES] = { 0x0 };
121113

122-
if (priv_key_buffer_size != CRYS_ECEDW_ORD_SIZE_IN_BYTES || pub_key_buffer_size != CRYS_ECEDW_MOD_SIZE_IN_BYTES) {
123-
return PSA_ERROR_INVALID_ARGUMENT;
124-
}
125-
126-
memcpy(secret_key, priv_key_buffer, CRYS_ECEDW_ORD_SIZE_IN_BYTES);
114+
memcpy(&secret_key[0], priv_key_buffer, CRYS_ECEDW_ORD_SIZE_IN_BYTES);
127115
memcpy(&secret_key[CRYS_ECEDW_ORD_SIZE_IN_BYTES], pub_key_buffer, CRYS_ECEDW_MOD_SIZE_IN_BYTES);
128-
*signature_length = signature_size;
116+
117+
size_t signature_size = 64;
129118

130119
cryptocell_310_enable();
131-
ret = CRYS_ECEDW_Sign(signature, signature_length, input, input_length, secret_key, sizeof(secret_key), &tmp);
120+
ret = CRYS_ECEDW_Sign(signature, &signature_size, input, input_length,
121+
secret_key, sizeof(secret_key), &tmp);
132122
cryptocell_310_disable();
133123
if (ret != CRYS_OK) {
134124
DEBUG("CRYS_ECEDW_Sign failed with %s\n", cryptocell310_status_to_humanly_readable(ret));
@@ -138,21 +128,16 @@ psa_status_t psa_ecc_ed25519_sign_message(const uint8_t *priv_key_buffer,
138128
done:
139129
explicit_bzero(&secret_key, sizeof(secret_key));
140130
return CRYS_to_psa_error(ret);
141-
142-
(void)signature_size;
143131
}
144132

145-
psa_status_t psa_ecc_ed25519_verify_message(const uint8_t *key_buffer,
146-
size_t key_buffer_size,
147-
const uint8_t *input,
148-
size_t input_length,
149-
const uint8_t *signature,
150-
size_t signature_length)
133+
psa_status_t psa_ecc_ed25519_verify_message(const uint8_t *pub_key_buffer,
134+
const uint8_t *input, size_t input_length,
135+
const uint8_t *signature)
151136
{
152137
CRYS_ECEDW_TempBuff_t tmp;
153138
CRYSError_t ret;
154139

155-
if (!cryptocell_310_data_within_ram(key_buffer) ||
140+
if (!cryptocell_310_data_within_ram(pub_key_buffer) ||
156141
!cryptocell_310_data_within_ram(input) ||
157142
!cryptocell_310_data_within_ram(signature)) {
158143
DEBUG("%s : cryptocell_310 data required to be in RAM.\n", __FILE__);
@@ -164,7 +149,8 @@ psa_status_t psa_ecc_ed25519_verify_message(const uint8_t *key_buffer,
164149
}
165150

166151
cryptocell_310_enable();
167-
ret = CRYS_ECEDW_Verify(signature, signature_length, key_buffer, key_buffer_size, (uint8_t *)input, input_length, &tmp);
152+
ret = CRYS_ECEDW_Verify(signature, 64, pub_key_buffer, 32,
153+
(uint8_t *)input, input_length, &tmp);
168154
cryptocell_310_disable();
169155
if (ret != CRYS_OK) {
170156
DEBUG("CRYS_ECEDW_Verify failed with %s\n", cryptocell310_status_to_humanly_readable(ret));

sys/psa_crypto/include/psa_ecc.h

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -148,41 +148,49 @@ psa_status_t psa_ecc_p256r1_verify_message(const psa_key_attributes_t *attribute
148148
/**
149149
* @brief Low level wrapper function to call a driver for an ECC key generation
150150
* with an ed25519 key.
151-
* See @ref psa_generate_key()
151+
*
152+
* @param[out] priv_key_buffer buffer of size 32B to write the private key to
153+
* @param[out] pub_key_buffer buffer of size 32B to write the public key to
152154
*/
153-
psa_status_t psa_generate_ecc_ed25519_key_pair( uint8_t *priv_key_buffer, uint8_t *pub_key_buffer,
154-
size_t *priv_key_buffer_length,
155-
size_t *pub_key_buffer_length);
155+
psa_status_t psa_generate_ecc_ed25519_key_pair( uint8_t *priv_key_buffer,
156+
uint8_t *pub_key_buffer);
156157

157158
/**
158159
* @brief Low level wrapper function for deriving an ed25519 public key from the private key.
160+
*
161+
* @param[in] priv_key_buffer buffer of size 32B containing the private key
162+
* @param[out] pub_key_buffer buffer of size 32B to write the public key to
159163
*/
160164
psa_status_t psa_derive_ecc_ed25519_public_key( const uint8_t *priv_key_buffer,
161-
uint8_t *pub_key_buffer,
162-
size_t priv_key_buffer_length,
163-
size_t *pub_key_buffer_length);
165+
uint8_t *pub_key_buffer);
164166

165167
/**
166168
* @brief Low level wrapper function to call a driver for an ECC hash signature
167169
* with an ed25519 key.
168-
* See @ref psa_sign_message()
170+
*
171+
* @param[in] priv_key_buffer buffer of size 32B containing the private key
172+
* @param[in] pub_key_buffer buffer of size 32B containing the public key
173+
* @param[in] input input message to be signed
174+
* @param[in] input_length length of @p input in bytes
175+
* @param[out] signature buffer of size 64 to write the signature to
169176
*/
170177
psa_status_t psa_ecc_ed25519_sign_message(const uint8_t *priv_key_buffer,
171-
size_t priv_key_buffer_size,
172178
const uint8_t *pub_key_buffer,
173-
size_t pub_key_buffer_size,
174179
const uint8_t *input, size_t input_length,
175-
uint8_t *signature, size_t signature_size,
176-
size_t *signature_length);
180+
uint8_t *signature);
177181

178182
/**
179183
* @brief Low level wrapper function to call a driver for an ECC hash verification
180184
* with a ed25519 key.
181-
* See @ref psa_verify_message()
185+
*
186+
* @param[in] pub_key_buffer buffer of size 32B containing the public key
187+
* @param[in] input input message whose signature should be checked
188+
* @param[in] input_length length of @p input in bytes
189+
* @param[in] signature buffer of size 64 containing the signature
182190
*/
183-
psa_status_t psa_ecc_ed25519_verify_message(const uint8_t *key_buffer, size_t key_buffer_size,
191+
psa_status_t psa_ecc_ed25519_verify_message(const uint8_t *pub_key_buffer,
184192
const uint8_t *input, size_t input_length,
185-
const uint8_t *signature, size_t signature_length);
193+
const uint8_t *signature);
186194

187195
#ifdef __cplusplus
188196
}

sys/psa_crypto/psa_crypto_algorithm_dispatch.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,14 @@ psa_status_t psa_algorithm_dispatch_sign_message(const psa_key_attributes_t *att
366366
#if IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519)
367367
case PSA_ECC_ED25519:
368368
psa_get_public_key_data_from_key_slot(slot, &pub_key_data, &pub_key_bytes);
369-
return psa_ecc_ed25519_sign_message(key_data, *key_bytes, pub_key_data, *pub_key_bytes,
370-
input, input_length,
371-
signature, signature_size, signature_length);
369+
assert(*key_bytes == 32);
370+
assert(*pub_key_bytes == 32);
371+
if (signature_size < 64) {
372+
return PSA_ERROR_BUFFER_TOO_SMALL;
373+
}
374+
*signature_length = 64;
375+
return psa_ecc_ed25519_sign_message(key_data, pub_key_data,
376+
input, input_length, signature);
372377
#endif
373378
default:
374379
(void)alg;
@@ -467,8 +472,11 @@ psa_status_t psa_algorithm_dispatch_verify_message(const psa_key_attributes_t *a
467472
#endif
468473
#if IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519)
469474
case PSA_ECC_ED25519:
470-
return psa_ecc_ed25519_verify_message(pubkey_data, *pubkey_data_len, input,
471-
input_length, signature, signature_length);
475+
assert(*pubkey_data_len == 32);
476+
if (signature_length < 64) {
477+
return PSA_ERROR_INVALID_SIGNATURE;
478+
}
479+
return psa_ecc_ed25519_verify_message(pubkey_data, input, input_length, signature);
472480
#endif
473481
default:
474482
(void)alg;
@@ -525,8 +533,9 @@ psa_status_t psa_algorithm_dispatch_generate_key( const psa_key_attributes_t *
525533
#endif
526534
#if IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519)
527535
case PSA_ECC_ED25519:
528-
return psa_generate_ecc_ed25519_key_pair(key_data, pubkey_data,
529-
key_bytes, pubkey_data_len);
536+
*key_bytes = 32;
537+
*pubkey_data_len = 32;
538+
return psa_generate_ecc_ed25519_key_pair(key_data, pubkey_data);
530539
#endif
531540
default:
532541
(void)status;
@@ -585,8 +594,11 @@ psa_status_t psa_algorithm_dispatch_import_key(const psa_key_attributes_t *attri
585594
#endif
586595
#if IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519)
587596
case PSA_ECC_ED25519:
588-
ret = psa_derive_ecc_ed25519_public_key(data, pubkey_data,
589-
data_length, pubkey_data_len);
597+
if (data_length < 32) {
598+
return PSA_ERROR_INVALID_ARGUMENT;
599+
}
600+
ret = psa_derive_ecc_ed25519_public_key(data, pubkey_data);
601+
*pubkey_data_len = 32;
590602
break;
591603
#endif
592604
default:

0 commit comments

Comments
 (0)