Solaris中的get_random_bytes()等效项

时间:2016-04-04 20:52:16

标签: c random kernel solaris kernel-module

LinuxBSD为从内核使用的RNG提供了一个很好的接口:

 void get_random_bytes(void *buf, int nbytes);

因为KMD无法轻松打开设备文件。但我无法在Solaris'中找到类似的东西。 Kernel functions for drivers

Solaris中的内核模块获取CS随机数的目的是什么(即您在usermode中从/dev/urandom获得的那些)?

1 个答案:

答案 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