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