Linux和BSD为从内核使用的RNG提供了一个很好的接口:
void get_random_bytes(void *buf, int nbytes);
因为KMD无法轻松打开设备文件。但我无法在Solaris'中找到类似的东西。 Kernel functions for drivers。
Solaris中的内核模块获取CS随机数的目的是什么(即您在usermode中从/dev/urandom
获得的那些)?
答案 0 :(得分:2)
扩展我上面的评论,这里对Solaris内核随机数生成进行了很好的讨论:https://blogs.oracle.com/darren/entry/solaris_random_number_generation
有一个内核模块(随机)用于实现这两个 / dev / random和/ dev / urandom设备。两个主要切入点是 rnd_read()和rnd_write()用于服务read(2)和write(2)系统 分别打电话。
rnd_read()调用kcf_rnd_get_bytes()或 kcf_rnd_get_pseudo_bytes()取决于设备节点是否为 / dev / random或/ dev / urandom的实例。在FIPS模式下,如果 已经为非阻塞读取打开了/ dev / random(都没有O_NBLOCK 并且O_NDELAY设置),rnd_read调用将调用fips_random_get_bytes() 可以传输的最大字节数上限 在一次读取中,MAXRETBYTES_RANDOM(1040)和 MAXRETBYTES_URANDOM(128 * 1040)。
...
1.2内核空间中的接口
kcf模块为内核KCF中的randomnes提供API 消费者。它实现了上面提到的被调用的函数 服务read(2)/ write(2)调用并提供接口 内核使用者访问随机和随机池。
和
5.0密钥生成的随机性
对于内核中的非对称密钥生成特殊 提供了random_get_nzero_bytes()API。它不同于 random_get_bytes()有两种方式,首先调用 random_get_bytes_fips140()函数只返回一次所有FIPS 140-2初始化已完成。 random_get_bytes() 因为某些功能需要稍早提供 早期内核函数需要它(特别是VM系统的设置 如果ZFS需要在挂载根目录时进行任何写操作 文件系统)。其次,它确保输出中没有字节 0值,那些被新鲜提取的额外随机替换 字节,它一直持续到整个请求的长度完全发生 非零字节。
也可以使用相应的random_get_nzero_pseduo_bytes() 我们不希望在其他随机序列中有0个字节,例如 会话密钥,随机数和cookie。
可以在此处找到内核函数random_get_pseudo_bytes(),random_get_bytes()和random_get_blocking_bytes()的旧OpenSolaris源代码:http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/crypto/api/kcf_random.c#1100