如果没有专门的硬件来hwrng,则客户用trustos的optee来产生hwrng,这个是的实现在driver/char/hwrng/optee-rng.c中,前面已经看过hwrng代码的架构,我们重点看看核心函数read的实现
static struct optee_rng_private pvt_data = {
.optee_rng = {
.name = DRIVER_NAME,
.init = optee_rng_init,
.cleanup = optee_rng_cleanup,
.read = optee_rng_read,
}
};
static int optee_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
{
struct optee_rng_private *pvt_data = to_optee_rng_private(rng);
size_t read = 0, rng_size = 0;
int timeout = 1;
u8 *data = buf;
if (max > MAX_ENTROPY_REQ_SZ)
max = MAX_ENTROPY_REQ_SZ;
#这里的while循环感觉没有作用,因为如果没有wait && pvt_data->data_rate 这个条件不成立的话,就直接走else返回了
while (read < max) {
#获取随机数,这里的rng_size 就是optee os返回的随机数
rng_size = get_optee_rng_data(pvt_data, data, (max - read));
data += rng_size;
read += rng_size;
#这个if成立估计是为了控制产生随机数的频率
if (wait && pvt_data->data_rate) {
if ((timeout-- == 0) || (read == max))
return read;
msleep((1000 * (max - read)) / pvt_da
optee 提供的hwrng
最新推荐文章于 2025-01-13 17:42:30 发布
本文详细分析了Linux内核中Optee Rng驱动的read函数实现,该函数用于从TrustZone的Optee OS获取硬件随机数。get_optee_rng_data函数通过调用Optee的API在共享内存中获取随机数。驱动根据等待标志和数据速率控制随机数生成的频率,确保高效且可靠的随机数生成。

最低0.47元/天 解锁文章
187

被折叠的 条评论
为什么被折叠?



