Files
base/drivers/source/crypto/mailbox/sdrv_crypto_mailbox_trng.c
2025-11-07 09:57:14 +08:00

55 lines
1.5 KiB
C

/**
* @file sdrv_crypto_mailbox_trng.c
* @brief crypto mailbox trng cmd interface
*
* @copyright Copyright (c) 2021 Semidrive Semiconductor.
* All rights reserved.
*/
#include <sdrv_crypto_mailbox_trng.h>
/**
* @brief get trng
*
* This function get trng
*
* @param[out] rand_output rand buff
* @param[in] rand_bytes rand len
*/
sdrv_crypto_error_status_e cmd_trng_get_rand(uint8_t *rand_output,
uint32_t rand_bytes)
{
sdrv_crypto_error_status_e RetVal = CMD_RETURN_FAIL;
uint32_t cmd_buf[8] = {0};
uint32_t ret;
uint32_t *rand;
uint8_t count;
cmd_tng_t *cmd_get_random = NULL;
rand = (uint32_t *)rand_output;
cmd_get_random = (cmd_tng_t *)cmd_buf;
cmd_get_random->cmd_id = GENERATE_RAND;
set_big_endian_4byte((uint8_t *)cmd_get_random->random_ptr, (uint32_t)rand);
set_big_endian_4byte((uint8_t *)cmd_get_random->random_len,
(uint32_t)rand_bytes);
count = RETRY_COUNT;
do {
ret = send_cmd_and_wait_response((uint32_t *)cmd_buf);
if (SEIP_SUCCESS == ret) {
RetVal = CMD_RETURN_SUCCESS;
break;
} else if (SEIP_ERROR_TRNG_FAIL == ret) {
RetVal = CMD_RETURN_FAIL;
/* retry */
} else {
RetVal = CMD_RETURN_FAIL;
break;
}
count--;
} while (count);
return RetVal;
}