Update psa_get() to return psa_status_t

pull/9823/head
Oren Cohen 2019-02-27 14:01:22 +02:00
parent 3edcf455a6
commit 306a51f6c0
10 changed files with 156 additions and 52 deletions

View File

@ -38,7 +38,10 @@ void client_part_main(void *ptr)
while (1) {
signals = psa_wait(CLIENT_TESTS_PART1_WAIT_ANY_SID_MSK, PSA_BLOCK);
if (signals & PART1_ROT_SRV1_MSK) {
psa_get(PART1_ROT_SRV1_MSK, &msg);
if (PSA_SUCCESS != psa_get(PART1_ROT_SRV1_MSK, &msg)) {
continue;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT:
@ -50,6 +53,7 @@ void client_part_main(void *ptr)
offset += psa_read(msg.handle, 1, (void *)(data + offset), msg.in_size[1]);
psa_read(msg.handle, 2, (void *)(data + offset), msg.in_size[2]);
}
if (msg.out_size[0] > 0) {
uint8_t resp_size = data[0];
uint8_t resp_offset = data[1];
@ -57,13 +61,18 @@ void client_part_main(void *ptr)
}
break;
}
default: {
SPM_PANIC("Invalid msg type");
}
}
psa_reply(msg.handle, PSA_SUCCESS);
} else if (signals & DROP_CONN_MSK) {
psa_get(DROP_CONN_MSK, &msg);
if (PSA_SUCCESS != psa_get(DROP_CONN_MSK, &msg)) {
continue;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT:
@ -76,7 +85,10 @@ void client_part_main(void *ptr)
SPM_PANIC("Invalid msg type");
}
} else if (signals & SECURE_CLIENTS_ONLY_MSK) {
psa_get(SECURE_CLIENTS_ONLY_MSK, &msg);
if (PSA_SUCCESS != psa_get(SECURE_CLIENTS_ONLY_MSK, &msg)) {
continue;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT:

View File

@ -58,7 +58,9 @@ void server_part1_main(void *ptr)
SPM_PANIC("returned from psa_wait without CONTROL_ROT_SRV bit on signals=(0x%08x)\n", signals);
}
psa_get(CONTROL_MSK, &msg);
if (PSA_SUCCESS != psa_get(CONTROL_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
switch (msg.type) {
case PSA_IPC_CALL:
if (msg.in_size[0] == 0) {

View File

@ -46,7 +46,9 @@ void server_part2_main(void *ptr)
}
if (signals & ROT_SRV_REVERSE_MSK) {
psa_get(ROT_SRV_REVERSE_MSK, &msg);
if (PSA_SUCCESS != psa_get(ROT_SRV_REVERSE_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
switch (msg.type) {
case PSA_IPC_CALL: {
if ((msg.in_size[0] + msg.in_size[1] + msg.in_size[2]) == 0) {
@ -81,7 +83,9 @@ void server_part2_main(void *ptr)
psa_reply(msg.handle, PSA_SUCCESS);
} else { // -- Doorbell test
psa_get(ROT_SRV_DB_TST_MSK, &msg);
if (PSA_SUCCESS != psa_get(ROT_SRV_DB_TST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
switch (msg.type) {
case PSA_IPC_CALL: {
int32_t caller_part_id = msg.client_id;

View File

@ -44,7 +44,10 @@ static psa_status_t process_connect_request(void)
res = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CONNECT) {
res = ((res != PSA_SUCCESS) ? res : PSA_TEST_ERROR);
}
@ -67,7 +70,10 @@ static psa_status_t process_disconnect_request(void)
res = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_DISCONNECT) {
res = ((res != PSA_SUCCESS) ? res : PSA_TEST_ERROR);
}
@ -89,7 +95,10 @@ PSA_TEST_SERVER(identity_during_connect)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CONNECT) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -123,7 +132,10 @@ PSA_TEST_SERVER(identity_during_call)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CALL) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -164,7 +176,10 @@ PSA_TEST_SERVER(msg_size_assertion)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CALL) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -196,7 +211,10 @@ PSA_TEST_SERVER(reject_connection)
res = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CONNECT) {
res = ((res != PSA_SUCCESS) ? res : PSA_TEST_ERROR);
}
@ -224,7 +242,10 @@ PSA_TEST_SERVER(read_at_outofboud_offset)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CALL) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -267,7 +288,10 @@ PSA_TEST_SERVER(msg_read_truncation)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CALL) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -313,7 +337,10 @@ PSA_TEST_SERVER(skip_zero)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CALL) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -360,7 +387,10 @@ PSA_TEST_SERVER(skip_some)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CALL) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -409,7 +439,10 @@ PSA_TEST_SERVER(skip_more_than_left)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (msg.type != PSA_IPC_CALL) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -449,7 +482,10 @@ PSA_TEST_SERVER(rhandle_factorial)
SPM_PANIC("returned from psa_wait without TEST_MSK bit on\n");
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
switch (msg.type) {
case PSA_IPC_CONNECT:
if (NULL != msg.rhandle) {
@ -551,7 +587,10 @@ PSA_TEST_SERVER(cross_partition_call)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if ((msg.in_size[0] + msg.in_size[1] + msg.in_size[2]) == 0) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}
@ -613,7 +652,10 @@ PSA_TEST_SERVER(doorbell_test)
test_status = PSA_TEST_ERROR;
}
psa_get(TEST_MSK, &msg);
if (PSA_SUCCESS != psa_get(TEST_MSK, &msg)) {
SPM_PANIC("psa_get() failed\n");
}
if (((msg.in_size[0] + msg.in_size[1] + msg.in_size[2]) != 0) || (msg.out_size[0] != 0)) {
test_status = ((test_status != PSA_SUCCESS) ? test_status : PSA_TEST_ERROR);
}

View File

@ -58,7 +58,10 @@ void smoke_part_main(void *ptr)
SPM_PANIC("Received unknown signal (0x%08lx)\n", signals);
}
psa_get(ROT_SRV1_MSK, &msg);
if (PSA_SUCCESS != psa_get(ROT_SRV1_MSK, &msg)) {
continue;
}
if (msg.handle != PSA_NULL_HANDLE) {
client_id = msg.client_id;
if (client_id != -1) {

View File

@ -233,7 +233,7 @@ psa_signal_t psa_wait(psa_signal_t signal_mask, uint32_t timeout)
return (osFlagsErrorTimeout == asserted_signals) ? 0 : asserted_signals;
}
void psa_get(psa_signal_t signum, psa_msg_t *msg)
psa_status_t psa_get(psa_signal_t signal, psa_msg_t *msg)
{
spm_partition_t *curr_partition = get_active_partition();
SPM_ASSERT(NULL != curr_partition); // active thread in SPM must be in partition DB
@ -244,24 +244,24 @@ void psa_get(psa_signal_t signum, psa_msg_t *msg)
memset(msg, 0, sizeof(*msg));
// signum must be ONLY ONE of the bits of curr_partition->flags_rot_srv
bool is_one_bit = ((signum != 0) && !(signum & (signum - 1)));
if (!is_one_bit || !(signum & curr_partition->flags)) {
// signal must be ONLY ONE of the bits of curr_partition->flags_rot_srv
bool is_one_bit = ((signal != 0) && !(signal & (signal - 1)));
if (!is_one_bit || !(signal & curr_partition->flags)) {
SPM_PANIC(
"signum 0x%lx must have only 1 bit ON and must be a subset of 0x%lx!\n",
signum,
"signal 0x%lx must have only 1 bit ON and must be a subset of 0x%lx!\n",
signal,
curr_partition->flags
);
}
uint32_t active_flags = osThreadFlagsGet();
if (0 == (signum & active_flags)) {
if (0 == (signal & active_flags)) {
SPM_PANIC("flag is not active!\n");
}
spm_rot_service_t *curr_rot_service = get_rot_service(curr_partition, signum);
spm_rot_service_t *curr_rot_service = get_rot_service(curr_partition, signal);
if (curr_rot_service == NULL) {
SPM_PANIC("Received signal (0x%08lx) that does not match any root of trust service", signum);
SPM_PANIC("Received signal (0x%08lx) that does not match any root of trust service", signal);
}
spm_ipc_channel_t *curr_channel = spm_rot_service_queue_dequeue(curr_rot_service);
@ -294,6 +294,7 @@ void psa_get(psa_signal_t signum, psa_msg_t *msg)
}
copy_message_to_spm(curr_channel, msg);
return PSA_SUCCESS;
}
static size_t read_or_skip(psa_handle_t msg_handle, uint32_t invec_idx, void *buf, size_t num_bytes)

View File

@ -53,10 +53,13 @@ psa_signal_t psa_wait(psa_signal_t signal_mask, uint32_t timeout);
/**
* Get the message that corresponds to a given signal.
*
* @param[in] signum An asserted signal returned from psa_wait().
* @param[in] signal An asserted signal returned from psa_wait().
* @param[out] msg Pointer to a psa_msg structure.
*
* @return 0 for success or@n
* @a PSA_ERR_NOMSG if the message could not be delivered.
*/
void psa_get(psa_signal_t signum, psa_msg_t *msg);
psa_status_t psa_get(psa_signal_t signal, psa_msg_t *msg);
/**
* Associate the caller-provided private data with a specified handle.

View File

@ -127,7 +127,9 @@ static void psa_crypto_init_operation(void)
psa_msg_t msg = { 0 };
psa_status_t status = PSA_SUCCESS;
psa_get(PSA_CRYPTO_INIT, &msg);
if (PSA_SUCCESS != psa_get(PSA_CRYPTO_INIT, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT: {
@ -161,7 +163,9 @@ static void psa_crypto_free_operation(void)
psa_msg_t msg = { 0 };
psa_status_t status = PSA_SUCCESS;
psa_get(PSA_CRYPTO_FREE, &msg);
if (PSA_SUCCESS != psa_get(PSA_CRYPTO_FREE, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT: {
@ -199,7 +203,9 @@ static void psa_mac_operation(void)
psa_msg_t msg = { 0 };
psa_status_t status = PSA_SUCCESS;
psa_get(PSA_MAC, &msg);
if (PSA_SUCCESS != psa_get(PSA_MAC, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT: {
psa_mac_operation_t *psa_operation = mbedtls_calloc(1, sizeof(psa_mac_operation_t));
@ -382,7 +388,9 @@ static void psa_hash_operation(void)
psa_msg_t msg = { 0 };
psa_status_t status = PSA_SUCCESS;
psa_get(PSA_HASH, &msg);
if (PSA_SUCCESS != psa_get(PSA_HASH, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT: {
psa_hash_operation_t *psa_operation = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
@ -572,7 +580,9 @@ static void psa_asymmetric_operation(void)
psa_msg_t msg = { 0 };
psa_status_t status = PSA_SUCCESS;
psa_get(PSA_ASYMMETRIC, &msg);
if (PSA_SUCCESS != psa_get(PSA_ASYMMETRIC, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT: {
@ -764,7 +774,9 @@ static void psa_aead_operation()
psa_msg_t msg = { 0 };
psa_status_t status = PSA_SUCCESS;
psa_get(PSA_AEAD, &msg);
if (PSA_SUCCESS != psa_get(PSA_ASYMMPSA_AEADETRIC, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT: {
@ -879,7 +891,9 @@ static void psa_symmetric_operation(void)
psa_status_t status = PSA_SUCCESS;
psa_msg_t msg = { 0 };
psa_get(PSA_SYMMETRIC, &msg);
if (PSA_SUCCESS != psa_get(PSA_SYMMETRIC, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT: {
psa_cipher_operation_t *psa_operation =
@ -1063,7 +1077,9 @@ static void psa_key_management_operation(void)
psa_status_t status = PSA_SUCCESS;
int32_t partition_id = 0;
psa_get(PSA_KEY_MNG, &msg);
if (PSA_SUCCESS != psa_get(PSA_KEY_MNG, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT: {
@ -1398,7 +1414,9 @@ static void psa_entropy_operation(void)
psa_msg_t msg = { 0 };
psa_status_t status = PSA_SUCCESS;
psa_get(PSA_ENTROPY_INJECT, &msg);
if (PSA_SUCCESS != psa_get(PSA_ENTROPY_INJECT, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT: {
@ -1449,7 +1467,9 @@ static void psa_rng_operation(void)
psa_msg_t msg = { 0 };
psa_status_t status = PSA_SUCCESS;
psa_get(PSA_RNG, &msg);
if (PSA_SUCCESS != psa_get(PSA_RNG, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT:
case PSA_IPC_DISCONNECT: {
@ -1488,8 +1508,9 @@ void psa_crypto_generator_operations(void)
psa_status_t status = PSA_SUCCESS;
psa_msg_t msg = { 0 };
psa_get(PSA_GENERATOR, &msg);
if (PSA_SUCCESS != psa_get(PSA_GENERATOR, &msg)) {
return;
}
switch (msg.type) {
case PSA_IPC_CONNECT: {
psa_crypto_generator_t *psa_operation =

View File

@ -92,15 +92,21 @@ void platform_partition_entry(void *ptr)
while (1) {
signals = psa_wait(PLATFORM_WAIT_ANY_SID_MSK, PSA_BLOCK);
if ((signals & PSA_PLATFORM_LC_GET_MSK) != 0) {
psa_get(PSA_PLATFORM_LC_GET_MSK, &msg);
if (PSA_SUCCESS != psa_get(PSA_PLATFORM_LC_GET_MSK, &msg)) {
continue;
}
message_handler(&msg, lifecycle_get);
}
if ((signals & PSA_PLATFORM_LC_SET_MSK) != 0) {
psa_get(PSA_PLATFORM_LC_SET_MSK, &msg);
if (PSA_SUCCESS != psa_get(PSA_PLATFORM_LC_SET_MSK, &msg)) {
continue;
}
message_handler(&msg, lifecycle_change_request);
}
if ((signals & PSA_PLATFORM_SYSTEM_RESET_MSK) != 0) {
psa_get(PSA_PLATFORM_SYSTEM_RESET_MSK, &msg);
if (PSA_SUCCESS != psa_get(PSA_PLATFORM_SYSTEM_RESET_MSK, &msg)) {
continue;
}
message_handler(&msg, system_reset_request);
}
}

View File

@ -188,23 +188,33 @@ void its_entry(void *ptr)
}
if ((signals & PSA_ITS_SET_MSK) != 0) {
psa_get(PSA_ITS_SET_MSK, &msg);
if (PSA_SUCCESS != psa_get(PSA_ITS_SET_MSK, &msg)) {
continue;
}
message_handler(&msg, storage_set);
}
if ((signals & PSA_ITS_GET_MSK) != 0) {
psa_get(PSA_ITS_GET_MSK, &msg);
if (PSA_SUCCESS != psa_get(PSA_ITS_GET_MSK, &msg)) {
continue;
}
message_handler(&msg, storage_get);
}
if ((signals & PSA_ITS_INFO_MSK) != 0) {
psa_get(PSA_ITS_INFO_MSK, &msg);
if (PSA_SUCCESS != psa_get(PSA_ITS_INFO_MSK, &msg)) {
continue;
}
message_handler(&msg, storage_info);
}
if ((signals & PSA_ITS_REMOVE_MSK) != 0) {
psa_get(PSA_ITS_REMOVE_MSK, &msg);
if (PSA_SUCCESS != psa_get(PSA_ITS_REMOVE_MSK, &msg)) {
continue;
}
message_handler(&msg, storage_remove);
}
if ((signals & PSA_ITS_RESET_MSK) != 0) {
psa_get(PSA_ITS_RESET_MSK, &msg);
if (PSA_SUCCESS != psa_get(PSA_ITS_RESET_MSK, &msg)) {
continue;
}
message_handler(&msg, storage_reset);
}