Skip to content

Commit 34c6e8a

Browse files
authored
Merge pull request #8700 from valeriosetti/issue8461
psa_asymmetric_encrypt() doesn't work with opaque driver
2 parents fb12d92 + 4f34b15 commit 34c6e8a

File tree

7 files changed

+85
-35
lines changed

7 files changed

+85
-35
lines changed

ChangeLog.d/8461.txt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Bugfix
2+
* Fix unsupported PSA asymmetric encryption and decryption
3+
(psa_asymmetric_[en|de]crypt) with opaque keys.
4+
Resolves #8461.

library/psa_crypto.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -3113,7 +3113,7 @@ psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key,
31133113
return PSA_ERROR_INVALID_ARGUMENT;
31143114
}
31153115

3116-
status = psa_get_and_lock_transparent_key_slot_with_policy(
3116+
status = psa_get_and_lock_key_slot_with_policy(
31173117
key, &slot, PSA_KEY_USAGE_ENCRYPT, alg);
31183118
if (status != PSA_SUCCESS) {
31193119
return status;
@@ -3165,7 +3165,7 @@ psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key,
31653165
return PSA_ERROR_INVALID_ARGUMENT;
31663166
}
31673167

3168-
status = psa_get_and_lock_transparent_key_slot_with_policy(
3168+
status = psa_get_and_lock_key_slot_with_policy(
31693169
key, &slot, PSA_KEY_USAGE_DECRYPT, alg);
31703170
if (status != PSA_SUCCESS) {
31713171
return status;

tests/include/test/drivers/key_management.h

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ void mbedtls_test_transparent_free(void);
6767
psa_status_t mbedtls_test_opaque_init(void);
6868
void mbedtls_test_opaque_free(void);
6969

70+
psa_status_t mbedtls_test_opaque_unwrap_key(
71+
const uint8_t *wrapped_key, size_t wrapped_key_length, uint8_t *key_buffer,
72+
size_t key_buffer_size, size_t *key_buffer_length);
73+
7074
psa_status_t mbedtls_test_transparent_generate_key(
7175
const psa_key_attributes_t *attributes,
7276
uint8_t *key, size_t key_size, size_t *key_length);

tests/src/drivers/test_driver_asymmetric_encryption.c

+55-23
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@
1313
#include "psa_crypto_rsa.h"
1414
#include "string.h"
1515
#include "test/drivers/asymmetric_encryption.h"
16+
#include "test/drivers/key_management.h"
1617

1718
#if defined(MBEDTLS_TEST_LIBTESTDRIVER1)
1819
#include "libtestdriver1/library/psa_crypto_rsa.h"
1920
#endif
2021

22+
#define PSA_RSA_KEY_PAIR_MAX_SIZE \
23+
PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS)
24+
2125
mbedtls_test_driver_asymmetric_encryption_hooks_t mbedtls_test_driver_asymmetric_encryption_hooks =
2226
MBEDTLS_TEST_DRIVER_ASYMMETRIC_ENCRYPTION_INIT;
2327

@@ -104,25 +108,39 @@ psa_status_t mbedtls_test_transparent_asymmetric_decrypt(
104108
}
105109

106110
/*
107-
* opaque versions - TODO
111+
* opaque versions
108112
*/
109113
psa_status_t mbedtls_test_opaque_asymmetric_encrypt(
110114
const psa_key_attributes_t *attributes, const uint8_t *key,
111115
size_t key_length, psa_algorithm_t alg, const uint8_t *input,
112116
size_t input_length, const uint8_t *salt, size_t salt_length,
113117
uint8_t *output, size_t output_size, size_t *output_length)
114118
{
115-
(void) attributes;
116-
(void) key;
117-
(void) key_length;
118-
(void) alg;
119-
(void) input;
120-
(void) input_length;
121-
(void) salt;
122-
(void) salt_length;
123-
(void) output;
124-
(void) output_size;
125-
(void) output_length;
119+
unsigned char unwrapped_key[PSA_RSA_KEY_PAIR_MAX_SIZE];
120+
size_t unwrapped_key_length;
121+
psa_status_t status;
122+
123+
status = mbedtls_test_opaque_unwrap_key(key, key_length,
124+
unwrapped_key, sizeof(unwrapped_key),
125+
&unwrapped_key_length);
126+
if (status != PSA_SUCCESS) {
127+
return status;
128+
}
129+
130+
#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
131+
(defined(MBEDTLS_PSA_ACCEL_ALG_RSA_OAEP) || defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_CRYPT))
132+
return libtestdriver1_mbedtls_psa_asymmetric_encrypt(
133+
(const libtestdriver1_psa_key_attributes_t *) attributes,
134+
unwrapped_key, unwrapped_key_length,
135+
alg, input, input_length, salt, salt_length,
136+
output, output_size, output_length);
137+
#else
138+
return mbedtls_psa_asymmetric_encrypt(
139+
attributes, unwrapped_key, unwrapped_key_length,
140+
alg, input, input_length, salt, salt_length,
141+
output, output_size, output_length);
142+
#endif
143+
126144
return PSA_ERROR_NOT_SUPPORTED;
127145
}
128146

@@ -132,17 +150,31 @@ psa_status_t mbedtls_test_opaque_asymmetric_decrypt(
132150
size_t input_length, const uint8_t *salt, size_t salt_length,
133151
uint8_t *output, size_t output_size, size_t *output_length)
134152
{
135-
(void) attributes;
136-
(void) key;
137-
(void) key_length;
138-
(void) alg;
139-
(void) input;
140-
(void) input_length;
141-
(void) salt;
142-
(void) salt_length;
143-
(void) output;
144-
(void) output_size;
145-
(void) output_length;
153+
unsigned char unwrapped_key[PSA_RSA_KEY_PAIR_MAX_SIZE];
154+
size_t unwrapped_key_length;
155+
psa_status_t status;
156+
157+
status = mbedtls_test_opaque_unwrap_key(key, key_length,
158+
unwrapped_key, sizeof(unwrapped_key),
159+
&unwrapped_key_length);
160+
if (status != PSA_SUCCESS) {
161+
return status;
162+
}
163+
164+
#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
165+
(defined(MBEDTLS_PSA_ACCEL_ALG_RSA_OAEP) || defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_CRYPT))
166+
return libtestdriver1_mbedtls_psa_asymmetric_decrypt(
167+
(const libtestdriver1_psa_key_attributes_t *) attributes,
168+
unwrapped_key, unwrapped_key_length,
169+
alg, input, input_length, salt, salt_length,
170+
output, output_size, output_length);
171+
#else
172+
return mbedtls_psa_asymmetric_decrypt(
173+
attributes, unwrapped_key, unwrapped_key_length,
174+
alg, input, input_length, salt, salt_length,
175+
output, output_size, output_length);
176+
#endif
177+
146178
return PSA_ERROR_NOT_SUPPORTED;
147179
}
148180

tests/src/drivers/test_driver_key_management.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ static psa_status_t mbedtls_test_opaque_wrap_key(
159159
* The argument key_buffer_length is filled with the unwrapped(clear)
160160
* key_size on success.
161161
* */
162-
static psa_status_t mbedtls_test_opaque_unwrap_key(
162+
psa_status_t mbedtls_test_opaque_unwrap_key(
163163
const uint8_t *wrapped_key,
164164
size_t wrapped_key_length,
165165
uint8_t *key_buffer,

0 commit comments

Comments
 (0)