[sw/dif] Move AES to a single error space.
Part of lowrisc/opentitan#6137
Signed-off-by: Miguel Osorio <miguelosorio@google.com>
diff --git a/sw/device/lib/dif/dif_aes.c b/sw/device/lib/dif/dif_aes.c
index 9a1acdf..e37199d 100644
--- a/sw/device/lib/dif/dif_aes.c
+++ b/sw/device/lib/dif/dif_aes.c
@@ -134,12 +134,12 @@
* @param cipher_mode_val Cipher Mode register write value.
* @return `dif_aes_start_result_t`.
*/
-static dif_aes_start_result_t configure(
- const dif_aes_t *aes, const dif_aes_transaction_t *transaction,
- aes_mode_field_val_t cipher_mode_val) {
+static dif_aes_result_t configure(const dif_aes_t *aes,
+ const dif_aes_transaction_t *transaction,
+ aes_mode_field_val_t cipher_mode_val) {
aes_key_field_val_t key_len_val = key_to_field(transaction->key_len);
if (key_len_val == kAesKeyFieldValInvalid) {
- return kDifAesStartError;
+ return kDifAesError;
}
uint32_t reg =
@@ -172,7 +172,7 @@
aes_shadowed_write(aes->params.base_addr, AES_CTRL_SHADOWED_REG_OFFSET, reg);
- return kDifAesStartOk;
+ return kDifAesOk;
}
/**
@@ -202,9 +202,9 @@
return kDifAesOk;
}
-dif_aes_reset_result_t dif_aes_reset(const dif_aes_t *aes) {
+dif_aes_result_t dif_aes_reset(const dif_aes_t *aes) {
if (aes == NULL) {
- return kDifAesResetBadArg;
+ return kDifAesBadArg;
}
aes_clear_internal_state(aes);
@@ -221,23 +221,22 @@
aes_shadowed_write(aes->params.base_addr, AES_CTRL_SHADOWED_REG_OFFSET, reg);
- return kDifAesResetOk;
+ return kDifAesOk;
}
-dif_aes_start_result_t dif_aes_start_ecb(
- const dif_aes_t *aes, const dif_aes_transaction_t *transaction,
- dif_aes_key_share_t key) {
+dif_aes_result_t dif_aes_start_ecb(const dif_aes_t *aes,
+ const dif_aes_transaction_t *transaction,
+ dif_aes_key_share_t key) {
if (aes == NULL || transaction == NULL) {
- return kDifAesStartBadArg;
+ return kDifAesBadArg;
}
if (!aes_idle(aes)) {
- return kDifAesStartBusy;
+ return kDifAesBusy;
}
- dif_aes_start_result_t result =
- configure(aes, transaction, kAesModeFieldValEcb);
- if (result != kDifAesStartOk) {
+ dif_aes_result_t result = configure(aes, transaction, kAesModeFieldValEcb);
+ if (result != kDifAesOk) {
return result;
}
@@ -247,23 +246,22 @@
aes_set_multireg(aes, &key.share1[0], AES_KEY_SHARE1_MULTIREG_COUNT,
AES_KEY_SHARE1_0_REG_OFFSET);
- return kDifAesStartOk;
+ return kDifAesOk;
}
-dif_aes_start_result_t dif_aes_start_cbc(
- const dif_aes_t *aes, const dif_aes_transaction_t *transaction,
- dif_aes_key_share_t key, dif_aes_iv_t iv) {
+dif_aes_result_t dif_aes_start_cbc(const dif_aes_t *aes,
+ const dif_aes_transaction_t *transaction,
+ dif_aes_key_share_t key, dif_aes_iv_t iv) {
if (aes == NULL || transaction == NULL) {
- return kDifAesStartBadArg;
+ return kDifAesBadArg;
}
if (!aes_idle(aes)) {
- return kDifAesStartBusy;
+ return kDifAesBusy;
}
- dif_aes_start_result_t result =
- configure(aes, transaction, kAesModeFieldValCbc);
- if (result != kDifAesStartOk) {
+ dif_aes_result_t result = configure(aes, transaction, kAesModeFieldValCbc);
+ if (result != kDifAesOk) {
return result;
}
@@ -275,23 +273,22 @@
aes_set_multireg(aes, &iv.iv[0], AES_IV_MULTIREG_COUNT, AES_IV_0_REG_OFFSET);
- return kDifAesStartOk;
+ return kDifAesOk;
}
-dif_aes_start_result_t dif_aes_start_ctr(
- const dif_aes_t *aes, const dif_aes_transaction_t *transaction,
- dif_aes_key_share_t key, dif_aes_iv_t iv) {
+dif_aes_result_t dif_aes_start_ctr(const dif_aes_t *aes,
+ const dif_aes_transaction_t *transaction,
+ dif_aes_key_share_t key, dif_aes_iv_t iv) {
if (aes == NULL || transaction == NULL) {
- return kDifAesStartBadArg;
+ return kDifAesBadArg;
}
if (!aes_idle(aes)) {
- return kDifAesStartBusy;
+ return kDifAesBusy;
}
- dif_aes_start_result_t result =
- configure(aes, transaction, kAesModeFieldValCtr);
- if (result != kDifAesStartOk) {
+ dif_aes_result_t result = configure(aes, transaction, kAesModeFieldValCtr);
+ if (result != kDifAesOk) {
return result;
}
@@ -303,47 +300,47 @@
aes_set_multireg(aes, &iv.iv[0], AES_IV_MULTIREG_COUNT, AES_IV_0_REG_OFFSET);
- return kDifAesStartOk;
+ return kDifAesOk;
}
-dif_aes_end_result_t dif_aes_end(const dif_aes_t *aes) {
+dif_aes_result_t dif_aes_end(const dif_aes_t *aes) {
if (aes == NULL) {
- return kDifAesEndBadArg;
+ return kDifAesBadArg;
}
if (!aes_idle(aes)) {
- return kDifAesEndBusy;
+ return kDifAesBusy;
}
aes_clear_internal_state(aes);
- return kDifAesEndOk;
+ return kDifAesOk;
}
-dif_aes_load_data_result_t dif_aes_load_data(const dif_aes_t *aes,
- const dif_aes_data_t data) {
+dif_aes_result_t dif_aes_load_data(const dif_aes_t *aes,
+ const dif_aes_data_t data) {
if (aes == NULL) {
- return kDifAesLoadDataBadArg;
+ return kDifAesBadArg;
}
if (!aes_input_ready(aes)) {
- return kDifAesLoadDataBusy;
+ return kDifAesBusy;
}
aes_set_multireg(aes, &data.data[0], AES_DATA_IN_MULTIREG_COUNT,
AES_DATA_IN_0_REG_OFFSET);
- return kDifAesLoadDataOk;
+ return kDifAesOk;
}
-dif_aes_read_output_result_t dif_aes_read_output(const dif_aes_t *aes,
- dif_aes_data_t *data) {
+dif_aes_result_t dif_aes_read_output(const dif_aes_t *aes,
+ dif_aes_data_t *data) {
if (aes == NULL || data == NULL) {
- return kDifAesReadOutputBadArg;
+ return kDifAesBadArg;
}
if (!aes_output_valid(aes)) {
- return kDifAesReadOutputInvalid;
+ return kDifAesOutputInvalid;
}
for (int i = 0; i < AES_DATA_OUT_MULTIREG_COUNT; ++i) {
@@ -352,7 +349,7 @@
data->data[i] = mmio_region_read32(aes->params.base_addr, offset);
}
- return kDifAesReadOutputOk;
+ return kDifAesOk;
}
dif_aes_result_t dif_aes_trigger(const dif_aes_t *aes,
diff --git a/sw/device/lib/dif/dif_aes.h b/sw/device/lib/dif/dif_aes.h
index 968d3f1..bca4e5f 100644
--- a/sw/device/lib/dif/dif_aes.h
+++ b/sw/device/lib/dif/dif_aes.h
@@ -5,11 +5,6 @@
#ifndef OPENTITAN_SW_DEVICE_LIB_DIF_DIF_AES_H_
#define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_AES_H_
-/**
- * @file
- * @brief <a href="/hw/ip/aes/doc/">AES</a> Device Interface Functions
- */
-
#include <stdbool.h>
#include <stdint.h>
@@ -21,6 +16,10 @@
#endif // __cplusplus
/**
+ *
+ * @file
+ * @brief <a href="/hw/ip/aes/doc/">AES</a> Device Interface Functions
+ *
* This API assumes transactional nature of work, where the peripheral is
* configured once per message (data consisting of 1..N 128-bit blocks), and
* then "de-initialised" when this message has been fully encrypted/decrypted.
@@ -212,6 +211,14 @@
* When this value is returned, no hardware operations occurred.
*/
kDifAesBadArg = 2,
+ /**
+ * Device is busy, and cannot perform the requested operation.
+ */
+ kDifAesBusy,
+ /**
+ * The AES unit has no valid output.
+ */
+ kDifAesOutputInvalid,
} dif_aes_result_t;
/**
@@ -227,31 +234,6 @@
dif_aes_result_t dif_aes_init(dif_aes_params_t params, dif_aes_t *aes);
/**
- * The result of a AES reset operation.
- */
-typedef enum dif_aes_reset_result {
- /**
- * Indicates that the operation succeeded.
- */
- kDifAesResetOk = kDifAesOk,
- /**
- * Indicates some unspecified failure.
- */
- kDifAesResetError = kDifAesError,
- /**
- * Indicates that some parameter passed into a function failed a
- * precondition.
- *
- * When this value is returned, no hardware operations occurred.
- */
- kDifAesResetBadArg = kDifAesBadArg,
- /**
- * Device is busy, and cannot perform the requested operation.
- */
- kDifAesResetBusy,
-} dif_aes_reset_result_t;
-
-/**
* Resets an instance of AES.
*
* Clears the internal state along with the interface registers.
@@ -260,32 +242,7 @@
* @return The result of the operation.
*/
DIF_WARN_UNUSED_RESULT
-dif_aes_reset_result_t dif_aes_reset(const dif_aes_t *aes);
-
-/**
- * The result of a AES start operation.
- */
-typedef enum dif_aes_start_result {
- /**
- * Indicates that the operation succeeded.
- */
- kDifAesStartOk = kDifAesOk,
- /**
- * Indicates some unspecified failure.
- */
- kDifAesStartError = kDifAesError,
- /**
- * Indicates that some parameter passed into a function failed a
- * precondition.
- *
- * When this value is returned, no hardware operations occurred.
- */
- kDifAesStartBadArg = kDifAesBadArg,
- /**
- * Device is busy, and cannot perform the requested operation.
- */
- kDifAesStartBusy,
-} dif_aes_start_result_t;
+dif_aes_result_t dif_aes_reset(const dif_aes_t *aes);
/**
* Begins an AES transaction in ECB mode.
@@ -299,18 +256,17 @@
* Note: it is discouraged to use this cipher mode, due to inpractical amount
* of different keys required to encrypt/decrypt multi-block messages.
*
- * The peripheral must be in IDLE state for this operation to take
- * effect, and will return `kDifAesStartBusy` if this condition is not
- * met.
+ * The peripheral must be in IDLE state for this operation to take effect, and
+ * will return `kDifAesBusy` if this condition is not met.
*
* @param aes AES state data.
* @param transaction Configuration data.
* @return The result of the operation.
*/
DIF_WARN_UNUSED_RESULT
-dif_aes_start_result_t dif_aes_start_ecb(
- const dif_aes_t *aes, const dif_aes_transaction_t *transaction,
- dif_aes_key_share_t key);
+dif_aes_result_t dif_aes_start_ecb(const dif_aes_t *aes,
+ const dif_aes_transaction_t *transaction,
+ dif_aes_key_share_t key);
/**
* Begins an AES transaction in CBC mode.
@@ -335,9 +291,9 @@
* @return The result of the operation.
*/
DIF_WARN_UNUSED_RESULT
-dif_aes_start_result_t dif_aes_start_cbc(
- const dif_aes_t *aes, const dif_aes_transaction_t *transaction,
- dif_aes_key_share_t key, dif_aes_iv_t iv);
+dif_aes_result_t dif_aes_start_cbc(const dif_aes_t *aes,
+ const dif_aes_transaction_t *transaction,
+ dif_aes_key_share_t key, dif_aes_iv_t iv);
/**
* Begins an AES transaction in CTR mode.
@@ -360,34 +316,9 @@
* @return The result of the operation.
*/
DIF_WARN_UNUSED_RESULT
-dif_aes_start_result_t dif_aes_start_ctr(
- const dif_aes_t *aes, const dif_aes_transaction_t *transaction,
- dif_aes_key_share_t key, dif_aes_iv_t iv);
-
-/**
- * The result of an AES end operation.
- */
-typedef enum dif_aes_end_result {
- /**
- * Indicates that the operation succeeded.
- */
- kDifAesEndOk = kDifAesOk,
- /**
- * Indicates some unspecified failure.
- */
- kDifAesEndError = kDifAesError,
- /**
- * Indicates that some parameter passed into a function failed a
- * precondition.
- *
- * When this value is returned, no hardware operations occurred.
- */
- kDifAesEndBadArg = kDifAesBadArg,
- /**
- * Device is busy, and cannot perform the requested operation.
- */
- kDifAesEndBusy,
-} dif_aes_end_result_t;
+dif_aes_result_t dif_aes_start_ctr(const dif_aes_t *aes,
+ const dif_aes_transaction_t *transaction,
+ dif_aes_key_share_t key, dif_aes_iv_t iv);
/**
* Ends an AES transaction.
@@ -402,32 +333,7 @@
* @return The result of the operation.
*/
DIF_WARN_UNUSED_RESULT
-dif_aes_end_result_t dif_aes_end(const dif_aes_t *aes);
-
-/**
- * The result of an AES load data operation.
- */
-typedef enum dif_aes_load_data_result {
- /**
- * Indicates that the operation succeeded.
- */
- kDifAesLoadDataOk = kDifAesOk,
- /**
- * Indicates some unspecified failure.
- */
- kDifAesLoadDataError = kDifAesError,
- /**
- * Indicates that some parameter passed into a function failed a
- * precondition.
- *
- * When this value is returned, no hardware operations occurred.
- */
- kDifAesLoadDataBadArg = kDifAesBadArg,
- /**
- * Device is busy, and cannot perform the requested operation.
- */
- kDifAesLoadDataBusy,
-} dif_aes_load_data_result_t;
+dif_aes_result_t dif_aes_end(const dif_aes_t *aes);
/**
* Loads AES Input Data.
@@ -443,33 +349,8 @@
* @return The result of the operation.
*/
DIF_WARN_UNUSED_RESULT
-dif_aes_load_data_result_t dif_aes_load_data(const dif_aes_t *aes,
- const dif_aes_data_t data);
-
-/**
- * The result of an AES data read operation.
- */
-typedef enum dif_aes_read_data_result {
- /**
- * Indicates that the operation succeeded.
- */
- kDifAesReadOutputOk = kDifAesOk,
- /**
- * Indicates some unspecified failure.
- */
- kDifAesReadOutputError = kDifAesError,
- /**
- * Indicates that some parameter passed into a function failed a
- * precondition.
- *
- * When this value is returned, no hardware operations occurred.
- */
- kDifAesReadOutputBadArg = kDifAesBadArg,
- /**
- * The AES unit has no valid output.
- */
- kDifAesReadOutputInvalid,
-} dif_aes_read_output_result_t;
+dif_aes_result_t dif_aes_load_data(const dif_aes_t *aes,
+ const dif_aes_data_t data);
/**
* Reads AES Output Data.
@@ -483,8 +364,8 @@
* @return The result of the operation.
*/
DIF_WARN_UNUSED_RESULT
-dif_aes_read_output_result_t dif_aes_read_output(const dif_aes_t *aes,
- dif_aes_data_t *data);
+dif_aes_result_t dif_aes_read_output(const dif_aes_t *aes,
+ dif_aes_data_t *data);
/**
* AES Trigger flags.
diff --git a/sw/device/tests/dif/dif_aes_smoketest.c b/sw/device/tests/dif/dif_aes_smoketest.c
index 318c09c..4daf33b 100644
--- a/sw/device/tests/dif/dif_aes_smoketest.c
+++ b/sw/device/tests/dif/dif_aes_smoketest.c
@@ -83,7 +83,7 @@
.base_addr = mmio_region_from_addr(TOP_EARLGREY_AES_BASE_ADDR),
};
CHECK(dif_aes_init(params, &aes) == kDifAesOk);
- CHECK(dif_aes_reset(&aes) == kDifAesResetOk);
+ CHECK(dif_aes_reset(&aes) == kDifAesOk);
// Mask the key. Note that this should not be done manually. Software is
// expected to get the key in two shares right from the beginning.
@@ -103,7 +103,7 @@
.mode = kDifAesModeEncrypt,
.operation = kDifAesOperationAuto,
};
- CHECK(dif_aes_start_ecb(&aes, &transaction, key) == kDifAesStartOk);
+ CHECK(dif_aes_start_ecb(&aes, &transaction, key) == kDifAesOk);
// "Convert" plain data byte arrays to `dif_aes_data_t`.
dif_aes_data_t in_data_plain;
@@ -112,16 +112,16 @@
// Load the plain text to trigger the encryption operation.
while (!aes_input_ready(&aes)) {
}
- CHECK(dif_aes_load_data(&aes, in_data_plain) == kDifAesLoadDataOk);
+ CHECK(dif_aes_load_data(&aes, in_data_plain) == kDifAesOk);
// Read out the produced cipher text.
dif_aes_data_t out_data_cipher;
while (!aes_output_valid(&aes)) {
}
- CHECK(dif_aes_read_output(&aes, &out_data_cipher) == kDifAesReadOutputOk);
+ CHECK(dif_aes_read_output(&aes, &out_data_cipher) == kDifAesOk);
// Finish the ECB encryption transaction.
- CHECK(dif_aes_end(&aes) == kDifAesEndOk);
+ CHECK(dif_aes_end(&aes) == kDifAesOk);
// Check the produced cipher text against the reference.
uint32_t cipher_text_gold_words[TEXT_LENGTH_IN_WORDS];
@@ -134,22 +134,22 @@
// Setup ECB decryption transaction.
transaction.mode = kDifAesModeDecrypt;
- CHECK(dif_aes_start_ecb(&aes, &transaction, key) == kDifAesStartOk);
+ CHECK(dif_aes_start_ecb(&aes, &transaction, key) == kDifAesOk);
// Load the previously produced cipher text to start the decryption operation.
while (!aes_input_ready(&aes)) {
}
- CHECK(dif_aes_load_data(&aes, out_data_cipher) == kDifAesLoadDataOk);
+ CHECK(dif_aes_load_data(&aes, out_data_cipher) == kDifAesOk);
// Read out the produced plain text.
dif_aes_data_t out_data_plain;
while (!aes_output_valid(&aes)) {
}
- CHECK(dif_aes_read_output(&aes, &out_data_plain) == kDifAesReadOutputOk);
+ CHECK(dif_aes_read_output(&aes, &out_data_plain) == kDifAesOk);
// Finish the ECB encryption transaction.
- CHECK(dif_aes_end(&aes) == kDifAesEndOk);
+ CHECK(dif_aes_end(&aes) == kDifAesOk);
// Check the produced plain text against the reference.
uint32_t plain_text_gold_words[TEXT_LENGTH_IN_WORDS];