gpt4 book ai didi

random - 在内核模块中获取/dev/random

转载 作者:行者123 更新时间:2023-12-02 01:24:23 37 4
gpt4 key购买 nike

我需要同时获得 /dev/random/dev/urandom在内核模块中。

get_random_bytes提供获取 /dev/urandom 的 API .

但是/dev/random 没有API所以我尝试在内核空间中 ioctl 和读取文件。
这是我所做的。

  1. 使用RNDGETPOOL读写控制

include/linux/random.h
RNDGETPOOL声明

/* Get the contents of the entropy pool.  (Superuser only.) */
#define RNDGETPOOL _IOR( 'R', 0x02, int [2] )

但是,它不会工作所以我检查了 driver/char/random.h注意到RNDGETPOOL不见了!!

static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
{
int size, ent_count;
int __user *p = (int __user *)arg;
int retval;

switch (cmd) {
case RNDGETENTCNT:
/* inherently racy, no point locking */
if (put_user(input_pool.entropy_count, p))
return -EFAULT;
return 0;
case RNDADDTOENTCNT:
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
if (get_user(ent_count, p))
return -EFAULT;
credit_entropy_bits(&input_pool, ent_count);
return 0;
case RNDADDENTROPY:
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
if (get_user(ent_count, p++))
return -EFAULT;
if (ent_count < 0)
return -EINVAL;
if (get_user(size, p++))
return -EFAULT;
retval = write_pool(&input_pool, (const char __user *)p,
size);
if (retval < 0)
return retval;
credit_entropy_bits(&input_pool, ent_count);
return 0;
case RNDZAPENTCNT:
case RNDCLEARPOOL:
/* Clear the entropy pool counters. */
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
rand_initialize();
return 0;
default:
return -EINVAL;
}
}

我搜索了 google并找出 ioctl RNDGETPOOL已移除。完成!

  1. 使用 random_read来自 driver/char/random.c:997 的函数

    static ssize_t random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)

这是我的内核模块的函数访问 /dev/random .

static void read_file()
{
struct file *file;
loff_t pos = 0;
//ssize_t wc;
unsigned char buf_ent[21]={0,};
int ent_c;
int i;
ssize_t length = 0;

mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);

file = filp_open("/dev/random", O_WRONLY, 0);
file->f_op->unlocked_ioctl(file, RNDGETENTCNT, &ent_c);
if(ent_c < sizeof(char))
{
printk("not enough entropy\n");
}
printk("ent counter : %d\n", ent_c);

//file->f_op->unlocked_ioctl(file, RNDGETPOOL, &ent_st.buf);
length = file->f_op->read(file, buf_ent, ent_c/ 8, &pos);
if(length <0)
{
printk("failed to random_read\n");
}
printk("length : %d\n", length);
printk("ent: ");
for(i=0;i<length; i++)
{
printk("%02x", buf_ent[i]);
}
printk("\n");
filp_close(file,0);
set_fs(old_fs);
}

输出似乎是随机的

第一次尝试

[1290902.992048] ent_c : 165  
[1290902.992060] length : 20
[1290902.992060] ent: d89290f4a5eea8e087a63943ed0129041e80b568

第二次尝试

[1290911.493990] ent_c : 33  
[1290911.493994] length : 4
[1290911.493994] ent: 7832640a

顺便说一句random_read函数参数有 __user关键词。缓冲区buf在代码中是在内核空间中。

适合使用 random_read内核空间中的函数??

最佳答案

获取随机字节的内核接口(interface)是get_random_bytes():

static void read_file(void)
{
unsigned char buf_ent[21];

get_random_bytes(buf_ent, 21);
print_hex_dump_bytes("ent: ", DUMP_PREFIX_NONE, buf_ent, 21);
}

关于random - 在内核模块中获取/dev/random,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38004388/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com