Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ test/psa_devid_cryptocb_test
test/build-probe
test/build-cryptocb
test/build-cryptocb-asan
test/build-enroll
test/build-enroll-asan
test/psa_store_commit_test
test/psa_store_dir_validation_test
test/psa_store_read_open_test
Expand All @@ -80,6 +82,9 @@ test/psa_kdf_psk_to_ms_size_test
test/psa_kdf_zeroize_output_test
test/psa_import_zero_length_test
test/psa_copy_key_cross_lifetime_test
build-test/out/
test/psa_zero_capacity_buffer_test
test/psa_tf_psa_extra_test
test/psa_zero_capacity_buffer_test
test/psa_enrollment_alg_test
build-test/out/
.cache/
compile_commands.json
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ endif
ifeq ($(AES_FAST),1)
CPPFLAGS += -DWOLFPSA_AES_FAST
endif
# ENROLLMENT_ALG=1 allows the Mbed TLS enrollment algorithm on volatile keys
ifeq ($(ENROLLMENT_ALG),1)
CPPFLAGS += -DWOLFPSA_ENROLLMENT_ALG
endif
CFLAGS += $(DEBUG_FLAGS) $(SANITIZE_FLAGS)
LDFLAGS += $(SANITIZE_FLAGS)

Expand Down Expand Up @@ -204,6 +208,7 @@ UNIT_TESTS := psa_api_test \
psa_store_read_open_test \
psa_store_dir_validation_test \
psa_devid_cryptocb_test \
psa_enrollment_alg_test \
psa_kdf_zeroize_output_test \
psa_import_zero_length_test \
psa_copy_key_cross_lifetime_test \
Expand Down
97 changes: 33 additions & 64 deletions src/psa_aead.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,33 @@ static psa_status_t wolfpsa_aead_gcm_check_tag_size(size_t tag_length)
}
#endif

/* Whether permitted algorithm key_alg allows AEAD alg and its tag length */
static int wolfpsa_aead_alg_permitted(psa_algorithm_t key_alg,
psa_algorithm_t alg)
{
size_t key_tag_len = wolfpsa_aead_tag_length(key_alg);
size_t req_tag_len = wolfpsa_aead_tag_length(alg);

if (key_tag_len == 0 ||
PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(key_alg) !=
PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(alg)) {
return 0;
}
if ((key_alg & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0) {
return req_tag_len >= key_tag_len;
}
return req_tag_len == key_tag_len;
}

/* Whether the permitted or enrollment algorithm allows AEAD alg */
static int wolfpsa_aead_key_permits_alg(const psa_key_attributes_t *attributes,
psa_algorithm_t alg)
{
return wolfpsa_aead_alg_permitted(psa_get_key_algorithm(attributes), alg) ||
wolfpsa_aead_alg_permitted(
psa_get_key_enrollment_algorithm(attributes), alg);
}

static psa_status_t wolfpsa_aead_check_key(psa_key_id_t key,
psa_key_usage_t usage,
psa_algorithm_t alg,
Expand All @@ -161,11 +188,6 @@ static psa_status_t wolfpsa_aead_check_key(psa_key_id_t key,
{
psa_status_t status;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;
psa_algorithm_t key_base;
psa_algorithm_t req_base;
size_t key_tag_len;
size_t req_tag_len;

status = wolfpsa_get_key_data(key, attributes, key_data, key_data_length);
if (status != PSA_SUCCESS) {
Expand Down Expand Up @@ -207,43 +229,14 @@ static psa_status_t wolfpsa_aead_check_key(psa_key_id_t key,
return PSA_ERROR_NOT_PERMITTED;
}

key_alg = psa_get_key_algorithm(attributes);
if (key_alg == PSA_ALG_NONE) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
return PSA_ERROR_NOT_PERMITTED;
}

/* Algorithm match checks */
key_base = PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(key_alg);
req_base = PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(alg);
key_tag_len = wolfpsa_aead_tag_length(key_alg);
req_tag_len = wolfpsa_aead_tag_length(alg);

if (key_tag_len == 0 || req_tag_len == 0) {
if (wolfpsa_aead_tag_length(alg) == 0) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
return PSA_ERROR_INVALID_ARGUMENT;
}

if (key_base != req_base) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
return PSA_ERROR_NOT_PERMITTED;
}

if ((key_alg & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0) {
if (req_tag_len < key_tag_len) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
return PSA_ERROR_NOT_PERMITTED;
}
}
else if (req_tag_len != key_tag_len) {
if (!wolfpsa_aead_key_permits_alg(attributes, alg)) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
Expand Down Expand Up @@ -1525,7 +1518,6 @@ static psa_status_t wolfpsa_xchacha_oneshot_encrypt(
size_t key_data_length = 0;
psa_status_t status;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;
int ret;
/* Encrypt produces plaintext_length bytes of ciphertext plus 16-byte tag. */
size_t out_len;
Expand Down Expand Up @@ -1569,12 +1561,7 @@ static psa_status_t wolfpsa_xchacha_oneshot_encrypt(
return PSA_ERROR_NOT_PERMITTED;
}

key_alg = psa_get_key_algorithm(&attributes);
if (!PSA_ALG_AEAD_EQUAL(key_alg, PSA_ALG_XCHACHA20_POLY1305)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
if (!PSA_ALG_AEAD_EQUAL(key_alg, alg)) {
if (!wolfpsa_aead_key_permits_alg(&attributes, alg)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
Expand Down Expand Up @@ -1611,7 +1598,6 @@ static psa_status_t wolfpsa_xchacha_oneshot_decrypt(
size_t key_data_length = 0;
psa_status_t status;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;
int ret;
size_t pt_len;

Expand Down Expand Up @@ -1652,12 +1638,7 @@ static psa_status_t wolfpsa_xchacha_oneshot_decrypt(
return PSA_ERROR_NOT_PERMITTED;
}

key_alg = psa_get_key_algorithm(&attributes);
if (!PSA_ALG_AEAD_EQUAL(key_alg, PSA_ALG_XCHACHA20_POLY1305)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
if (!PSA_ALG_AEAD_EQUAL(key_alg, alg)) {
if (!wolfpsa_aead_key_permits_alg(&attributes, alg)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
Expand Down Expand Up @@ -1701,7 +1682,6 @@ static psa_status_t wolfpsa_ascon_oneshot_encrypt(
size_t key_data_length = 0;
psa_status_t status;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;
wc_AsconAEAD128 ascon;
int ret;
size_t out_len;
Expand Down Expand Up @@ -1749,12 +1729,7 @@ static psa_status_t wolfpsa_ascon_oneshot_encrypt(
return PSA_ERROR_NOT_PERMITTED;
}

key_alg = psa_get_key_algorithm(&attributes);
if (!PSA_ALG_AEAD_EQUAL(key_alg, PSA_ALG_ASCON_AEAD128)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
if (!PSA_ALG_AEAD_EQUAL(key_alg, alg)) {
if (!wolfpsa_aead_key_permits_alg(&attributes, alg)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
Expand Down Expand Up @@ -1807,7 +1782,6 @@ static psa_status_t wolfpsa_ascon_oneshot_decrypt(
size_t key_data_length = 0;
psa_status_t status;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;
wc_AsconAEAD128 ascon;
int ret;
size_t ct_len; /* ciphertext body length (without tag) */
Expand Down Expand Up @@ -1854,12 +1828,7 @@ static psa_status_t wolfpsa_ascon_oneshot_decrypt(
return PSA_ERROR_NOT_PERMITTED;
}

key_alg = psa_get_key_algorithm(&attributes);
if (!PSA_ALG_AEAD_EQUAL(key_alg, PSA_ALG_ASCON_AEAD128)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
if (!PSA_ALG_AEAD_EQUAL(key_alg, alg)) {
if (!wolfpsa_aead_key_permits_alg(&attributes, alg)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
Expand Down
36 changes: 17 additions & 19 deletions src/psa_asymmetric_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,19 @@ static int wolfpsa_sign_alg_permitted(psa_algorithm_t key_alg,
return 0;
}

static int wolfpsa_asymmetric_alg_permitted(psa_algorithm_t key_alg,
psa_algorithm_t alg,
psa_key_usage_t usage)
{
if (key_alg == PSA_ALG_NONE) {
return 0;
}
if (PSA_ALG_IS_KEY_AGREEMENT(alg) && PSA_ALG_IS_KEY_AGREEMENT(key_alg)) {
return wolfpsa_key_agreement_alg_permitted(key_alg, alg);
}
return wolfpsa_sign_alg_permitted(key_alg, alg, usage);
}

static psa_status_t wolfpsa_asymmetric_check_key(psa_key_id_t key,
psa_key_usage_t usage,
psa_algorithm_t alg,
Expand All @@ -284,7 +297,6 @@ static psa_status_t wolfpsa_asymmetric_check_key(psa_key_id_t key,
{
psa_status_t status;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;

status = wolfpsa_get_key_data(key, attributes, key_data, key_data_length);
if (status != PSA_SUCCESS) {
Expand All @@ -299,24 +311,10 @@ static psa_status_t wolfpsa_asymmetric_check_key(psa_key_id_t key,
return PSA_ERROR_NOT_PERMITTED;
}

key_alg = psa_get_key_algorithm(attributes);
if (key_alg == PSA_ALG_NONE) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
return PSA_ERROR_NOT_PERMITTED;
}

/* Algorithm match checks */
if (PSA_ALG_IS_KEY_AGREEMENT(alg) && PSA_ALG_IS_KEY_AGREEMENT(key_alg)) {
if (!wolfpsa_key_agreement_alg_permitted(key_alg, alg)) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
return PSA_ERROR_NOT_PERMITTED;
}
}
else if (!wolfpsa_sign_alg_permitted(key_alg, alg, usage)) {
if (!wolfpsa_asymmetric_alg_permitted(psa_get_key_algorithm(attributes),
alg, usage) &&
!wolfpsa_asymmetric_alg_permitted(
psa_get_key_enrollment_algorithm(attributes), alg, usage)) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
Expand Down
4 changes: 1 addition & 3 deletions src/psa_cipher.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,6 @@ static psa_status_t wolfpsa_cipher_check_key(
{
psa_status_t status;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;

status = wolfpsa_get_key_data(key, attributes, key_data, key_data_length);
if (status != PSA_SUCCESS) {
Expand Down Expand Up @@ -228,8 +227,7 @@ static psa_status_t wolfpsa_cipher_check_key(
return PSA_ERROR_NOT_PERMITTED;
}

key_alg = psa_get_key_algorithm(attributes);
if (key_alg == PSA_ALG_NONE || key_alg != alg) {
if (!wolfpsa_key_permits_alg(attributes, alg)) {
wolfpsa_forcezero_free_key_data(*key_data, *key_data_length);
*key_data = NULL;
*key_data_length = 0;
Expand Down
16 changes: 2 additions & 14 deletions src/psa_kem.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ psa_status_t psa_encapsulate(psa_key_id_t key,
psa_key_type_t key_type;
size_t key_bits;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;
psa_status_t status;
uint8_t ss[WOLFPSA_MLKEM_SS_SIZE];
/* Staging buffer: ciphertext is written here before the output key is
Expand Down Expand Up @@ -129,7 +128,6 @@ psa_status_t psa_encapsulate(psa_key_id_t key,
key_type = psa_get_key_type(&key_attr);
key_bits = psa_get_key_bits(&key_attr);
key_usage = psa_get_key_usage_flags(&key_attr);
key_alg = psa_get_key_algorithm(&key_attr);

if (key_type != PSA_KEY_TYPE_ML_KEM_KEY_PAIR &&
key_type != PSA_KEY_TYPE_ML_KEM_PUBLIC_KEY) {
Expand All @@ -142,11 +140,7 @@ psa_status_t psa_encapsulate(psa_key_id_t key,
return PSA_ERROR_NOT_PERMITTED;
}

if (key_alg != alg && key_alg != PSA_ALG_NONE) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
if (key_alg == PSA_ALG_NONE) {
if (!wolfpsa_key_permits_alg(&key_attr, alg)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
Expand Down Expand Up @@ -207,7 +201,6 @@ psa_status_t psa_decapsulate(psa_key_id_t key,
psa_key_type_t key_type;
size_t key_bits;
psa_key_usage_t key_usage;
psa_algorithm_t key_alg;
psa_status_t status;
uint8_t ss[WOLFPSA_MLKEM_SS_SIZE];

Expand Down Expand Up @@ -240,7 +233,6 @@ psa_status_t psa_decapsulate(psa_key_id_t key,
key_type = psa_get_key_type(&key_attr);
key_bits = psa_get_key_bits(&key_attr);
key_usage = psa_get_key_usage_flags(&key_attr);
key_alg = psa_get_key_algorithm(&key_attr);

/* Decapsulate requires the key pair (private key). */
if (key_type != PSA_KEY_TYPE_ML_KEM_KEY_PAIR) {
Expand All @@ -253,11 +245,7 @@ psa_status_t psa_decapsulate(psa_key_id_t key,
return PSA_ERROR_NOT_PERMITTED;
}

if (key_alg != alg && key_alg != PSA_ALG_NONE) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
if (key_alg == PSA_ALG_NONE) {
if (!wolfpsa_key_permits_alg(&key_attr, alg)) {
wolfpsa_forcezero_free_key_data(key_data, key_data_length);
return PSA_ERROR_NOT_PERMITTED;
}
Expand Down
Loading
Loading