Hi,
I am trying to enable the oberon crypto aead drivers. I believe I have the Kconfigs set correctly, but I can confirm through print statements that the define `PSA_NEED_OBERON_AEAD_DRIVER` is not enabled. I can also confirm that the corresponding Kconfig `CONFIG_PSA_NEED_OBERON_AEAD_DRIVER` is enabled through menuconfig and print statements.
Below is the `psa_driver_wrapper_aead_decrypt` function with some print statements added.
psa_status_t psa_driver_wrapper_aead_decrypt(const psa_key_attributes_t *attributes,
const uint8_t *key_buffer, size_t key_buffer_size,
psa_algorithm_t alg, const uint8_t *nonce,
size_t nonce_length, const uint8_t *additional_data,
size_t additional_data_length,
const uint8_t *ciphertext, size_t ciphertext_length,
uint8_t *plaintext, size_t plaintext_size,
size_t *plaintext_length)
{
printk("psa_driver_wrapper_aead_decrypt nrf_security\n");
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
switch (location) {
case PSA_KEY_LOCATION_LOCAL_STORAGE:
#if defined(PSA_CRYPTO_DRIVER_TFM_BUILTIN_KEY_LOADER)
case TFM_BUILTIN_KEY_LOADER_KEY_LOCATION:
#endif /* defined(PSA_CRYPTO_DRIVER_TFM_BUILTIN_KEY_LOADER) */
/* Key is stored in the slot in export representation, so
* cycle through all known transparent accelerators
*/
#if defined(PSA_NEED_CRACEN_AEAD_DRIVER)
printk("cracen_aead_decrypt\n");
status = cracen_aead_decrypt(attributes, key_buffer, key_buffer_size, alg, nonce,
nonce_length, additional_data, additional_data_length,
ciphertext, ciphertext_length, plaintext,
plaintext_size, plaintext_length);
if (status != PSA_ERROR_NOT_SUPPORTED) {
return status;
}
#endif /* PSA_NEED_CRACEN_AEAD_DRIVER */
#if defined(PSA_NEED_CC3XX_AEAD_DRIVER)
printk("cc3xx_aead_decrypt\n");
status = cc3xx_aead_decrypt(attributes, key_buffer, key_buffer_size, alg, nonce,
nonce_length, additional_data, additional_data_length,
ciphertext, ciphertext_length, plaintext,
plaintext_size, plaintext_length);
if (status != PSA_ERROR_NOT_SUPPORTED) {
return status;
}
#endif /* PSA_NEED_CC3XX_AEAD_DRIVER */
printk("config %d\n", CONFIG_PSA_NEED_OBERON_AEAD_DRIVER);
#if defined(PSA_NEED_OBERON_AEAD_DRIVER)
printk("oberon_aead_decrypt\n");
status = oberon_aead_decrypt(attributes, key_buffer, key_buffer_size, alg, nonce,
nonce_length, additional_data, additional_data_length,
ciphertext, ciphertext_length, plaintext,
plaintext_size, plaintext_length);
if (status != PSA_ERROR_NOT_SUPPORTED) {
return status;
}
#endif /* PSA_NEED_OBERON_AEAD_DRIVER */
(void)attributes;
(void)attributes;
(void)key_buffer;
(void)key_buffer_size;
(void)alg;
(void)nonce;
(void)nonce_length;
(void)additional_data;
(void)additional_data_length;
(void)ciphertext;
(void)ciphertext_length;
(void)plaintext;
(void)plaintext_size;
(void)plaintext_length;
printk("not supported\n");
return PSA_ERROR_NOT_SUPPORTED;
default:
/* Key is declared with a lifetime not known to us */
(void)status;
return PSA_ERROR_INVALID_ARGUMENT;
}
}After running with these modification, the following gets printed:
psa_driver_wrapper_aead_decrypt nrf_security config 1 not supported
As you can see, no drivers are ever called, including the oberon one, but the Kconfig is clearly enabled, since it's printed with a value of 1.
Looking at where `PSA_NEED_OBERON_AEAD_DRIVER` is defined, in `nrf/ext/oberon/psa/core/library/oberon_config.h`, All the conditions necessary for enabling it should be met (confirmed through menuconfig)
#if defined(PSA_WANT_KEY_TYPE_AES) && defined(PSA_WANT_ALG_CCM) #if defined(PSA_WANT_AES_KEY_SIZE_128) && !defined(PSA_ACCEL_CCM_AES_128) #define PSA_NEED_OBERON_AEAD_DRIVER 2 #define PSA_NEED_OBERON_CCM_AES 1 #endif #if defined(PSA_WANT_AES_KEY_SIZE_192) && !defined(PSA_ACCEL_CCM_AES_192) #define PSA_NEED_OBERON_AEAD_DRIVER 1 #define PSA_NEED_OBERON_CCM_AES 1 #endif #if defined(PSA_WANT_AES_KEY_SIZE_256) && !defined(PSA_ACCEL_CCM_AES_256) #define PSA_NEED_OBERON_AEAD_DRIVER 1 #define PSA_NEED_OBERON_CCM_AES 1 #endif #endif #if defined(PSA_WANT_KEY_TYPE_AES) && defined(PSA_WANT_ALG_GCM) #if defined(PSA_WANT_AES_KEY_SIZE_128) && !defined(PSA_ACCEL_GCM_AES_128) #define PSA_NEED_OBERON_AEAD_DRIVER 1 #define PSA_NEED_OBERON_GCM_AES 1 #endif #if defined(PSA_WANT_AES_KEY_SIZE_192) && !defined(PSA_ACCEL_GCM_AES_192) #define PSA_NEED_OBERON_AEAD_DRIVER 1 #define PSA_NEED_OBERON_GCM_AES 1 #endif #if defined(PSA_WANT_AES_KEY_SIZE_256) && !defined(PSA_ACCEL_GCM_AES_256) #define PSA_NEED_OBERON_AEAD_DRIVER 1 #define PSA_NEED_OBERON_GCM_AES 1 #endif #endif #if defined(PSA_WANT_ALG_CHACHA20_POLY1305) && !defined(PSA_ACCEL_CHACHA20_POLY1305) #define PSA_NEED_OBERON_AEAD_DRIVER 1 #define PSA_NEED_OBERON_CHACHA20_POLY1305 1 #endif
It seems like it may also be defined in Cmake files, but I'm assuming it would just take the value of CONFIG_PSA_NEED_OBERON_AEAD_DRIVER`, which is also enabled.
Is there any other reason why this could not be working as expected?
Thanks,
Alex