1 /*
2  * Copyright (c) 2023, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 
9 #include "trng.h"
10 #include "cc3xx_rng_external_trng.h"
11 
12 #include <stdint.h>
13 #include <stddef.h>
14 #include <string.h>
15 
otp_trng_get_random_uint32_t(void)16 static uint32_t otp_trng_get_random_uint32_t(void)
17 {
18     const volatile uint32_t *rng_ptr = (uint32_t *)0x500A5270;
19     return *rng_ptr;
20 }
21 
bl1_trng_generate_random(uint8_t * output,size_t output_size)22 int32_t bl1_trng_generate_random(uint8_t *output, size_t output_size)
23 {
24     size_t copy_size;
25     uint32_t random_word;
26 
27     random_word = otp_trng_get_random_uint32_t();
28     copy_size = sizeof(uint32_t) - ((uintptr_t)output % sizeof(uint32_t));
29     copy_size = output_size < copy_size ? output_size : copy_size;
30     memcpy(output, &random_word, copy_size);
31     output += copy_size;
32     output_size -= copy_size;
33 
34     while(output_size >= sizeof(uint32_t)) {
35         *((uint32_t *)output) = otp_trng_get_random_uint32_t();
36         output += sizeof(uint32_t);
37         output_size -= sizeof(uint32_t);
38     }
39 
40     random_word = otp_trng_get_random_uint32_t();
41     copy_size = output_size % sizeof(uint32_t);
42     memcpy(output, &random_word, copy_size);
43 
44     return 0;
45 }
46 
rng_get_random(uint8_t * buf,size_t length)47 cc3xx_err_t rng_get_random(uint8_t* buf, size_t length)
48 {
49     bl1_trng_generate_random(buf, length);
50     return CC3XX_ERR_SUCCESS;
51 }
52 
fih_delay_random_uchar(void)53 unsigned char fih_delay_random_uchar(void)
54 {
55     return (uint8_t)otp_trng_get_random_uint32_t();
56 }
57