xref: /OK3568_Linux_fs/external/security/librkcrypto/src/rkcrypto_random.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun #include <fcntl.h>
5*4882a593Smuzhiyun #include <stdlib.h>
6*4882a593Smuzhiyun #include <unistd.h>
7*4882a593Smuzhiyun #include "rkcrypto_random.h"
8*4882a593Smuzhiyun #include "rkcrypto_trace.h"
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifdef ANDROID
11*4882a593Smuzhiyun #define HWRNG_NODE	"/dev/hw_random"
12*4882a593Smuzhiyun #else
13*4882a593Smuzhiyun #define HWRNG_NODE	"/dev/hwrng"
14*4882a593Smuzhiyun #endif
15*4882a593Smuzhiyun 
rk_get_random(uint8_t * data,uint32_t len)16*4882a593Smuzhiyun RK_RES rk_get_random(uint8_t *data, uint32_t len)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_SUCCESS;
19*4882a593Smuzhiyun 	int hwrng_fd = -1;
20*4882a593Smuzhiyun 	int read_len = 0;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	hwrng_fd = open(HWRNG_NODE, O_RDONLY, 0);
23*4882a593Smuzhiyun 	if (hwrng_fd < 0) {
24*4882a593Smuzhiyun 		E_TRACE("open %s error!", HWRNG_NODE);
25*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_GENERIC;
26*4882a593Smuzhiyun 	}
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	read_len = read(hwrng_fd, data, len);
29*4882a593Smuzhiyun 	if (read_len != len) {
30*4882a593Smuzhiyun 		E_TRACE("read %s error!", HWRNG_NODE);
31*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_GENERIC;
32*4882a593Smuzhiyun 	}
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	close(hwrng_fd);
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	return res;
37*4882a593Smuzhiyun }
38