xref: /optee_os/core/crypto/rng_hw.c (revision 60296dff4e3d3adc4bafd5afe6d40b05363f9dd4)
16e954a6eSJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
26e954a6eSJens Wiklander /* Copyright (c) 2018, Linaro Limited */
36e954a6eSJens Wiklander 
46e954a6eSJens Wiklander #include <compiler.h>
56e954a6eSJens Wiklander #include <crypto/crypto.h>
6*60296dffSAndrew Davis #include <kernel/panic.h>
7ea6cd913SJens Wiklander #include <rng_support.h>
86e954a6eSJens Wiklander #include <tee/tee_cryp_utl.h>
96e954a6eSJens Wiklander #include <types_ext.h>
106e954a6eSJens Wiklander 
11*60296dffSAndrew Davis /*
12*60296dffSAndrew Davis  * This is only here to keep the compiler happy while we convert over
13*60296dffSAndrew Davis  * platforms. Either hw_get_random_bytes() is overridden or this
14*60296dffSAndrew Davis  * function is, in either case this is never called.
15*60296dffSAndrew Davis  */
16*60296dffSAndrew Davis uint8_t __weak hw_get_random_byte(void)
17*60296dffSAndrew Davis {
18*60296dffSAndrew Davis 	panic();
19*60296dffSAndrew Davis 	return 4; // chosen by fair dice roll.
20*60296dffSAndrew Davis 		  // guaranteed to be random.
21*60296dffSAndrew Davis }
22*60296dffSAndrew Davis 
23391a3854SAndrew Davis TEE_Result __weak hw_get_random_bytes(void *buf, size_t blen)
24391a3854SAndrew Davis {
25391a3854SAndrew Davis 	uint8_t *b = buf;
26391a3854SAndrew Davis 	size_t n = 0;
27391a3854SAndrew Davis 
28391a3854SAndrew Davis 	for (n = 0; n < blen; n++)
29391a3854SAndrew Davis 		b[n] = hw_get_random_byte();
30391a3854SAndrew Davis 
31391a3854SAndrew Davis 	return TEE_SUCCESS;
32391a3854SAndrew Davis }
33391a3854SAndrew Davis 
34391a3854SAndrew Davis /* This is a HW RNG, no need for seeding */
356e954a6eSJens Wiklander TEE_Result __weak crypto_rng_init(const void *data __unused,
366e954a6eSJens Wiklander 				  size_t dlen __unused)
376e954a6eSJens Wiklander {
386e954a6eSJens Wiklander 	return TEE_SUCCESS;
396e954a6eSJens Wiklander }
406e954a6eSJens Wiklander 
41391a3854SAndrew Davis /* This is a HW RNG, no need to add entropy */
426e954a6eSJens Wiklander void __weak crypto_rng_add_event(enum crypto_rng_src sid __unused,
436e954a6eSJens Wiklander 				 unsigned int *pnum __unused,
446e954a6eSJens Wiklander 				 const void *data __unused,
456e954a6eSJens Wiklander 				 size_t dlen __unused)
466e954a6eSJens Wiklander {
476e954a6eSJens Wiklander }
486e954a6eSJens Wiklander 
496e954a6eSJens Wiklander TEE_Result __weak crypto_rng_read(void *buf, size_t blen)
506e954a6eSJens Wiklander {
51391a3854SAndrew Davis 	if (!buf)
52ea6cd913SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
53ea6cd913SJens Wiklander 
54391a3854SAndrew Davis 	return hw_get_random_bytes(buf, blen);
556e954a6eSJens Wiklander }
56