使用RNDADDENTROPY将熵添加到/ dev / random

时间:2013-06-14 23:30:12

标签: c linux embedded-linux ioctl

我有一个设备会产生一些噪音,我想将它添加到嵌入式Linux系统中/ dev / random设备的熵池中。

我正在阅读man page on /dev/random并且我并不真正理解您传递给RNDADDENTROPY ioctl调用的结构。

   RNDADDENTROPY
          Add some additional entropy to the input pool, incrementing
          the entropy count.  This differs from writing to /dev/random
          or /dev/urandom, which only adds some data but does not
          increment the entropy count.  The following structure is used:

              struct rand_pool_info {
                  int    entropy_count;
                  int    buf_size;
                  __u32  buf[0];
              };

          Here entropy_count is the value added to (or subtracted from)
          the entropy count, and buf is the buffer of size buf_size
          which gets added to the entropy pool.

此结构中entropy_count是我添加的位数吗?为什么这不总是buf_size * 8(假设buf_size以字节为单位)?

另外为什么buf是一个零大小的数组?我该如何为它分配值?

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我正在使用硬件RNG存储我的熵池。我的结构是静态大小 看起来像这样(我的内核有一个稍微不同的random.h;只是复制什么 你找到你的,并将数组大小增加到你想要的任何东西):

#define BUFSIZE 256
/* WARNING - this struct must match random.h's struct rand_pool_info */
typedef struct {
    int bit_count;               /* number of bits of entropy in data */
    int byte_count;              /* number of bytes of data in array */
    unsigned char buf[BUFSIZ];
} entropy_t;

无论你在buf中传递什么都会被哈希并且会搅动熵池。 如果您正在使用/ dev / urandom,那么为bit_count传递的内容并不重要 因为/ dev / urandom忽略它等于零而且只是继续前进。

bit_count的作用是推动/ dev / random阻止的点 并等待物理RNG源添加更多熵。 因此,可以猜测bit_count。如果你猜低,最差 会发生的事情是/ dev / random会比其他情况更快地阻止 将有。如果你猜高,/ dev / random将像/ dev / urandom一样运行 比它阻挡之前要长一点点。

您可以根据熵源的“质量”进行猜测。 如果它很低,就像人类输入的字符一样,你可以将它设置为1或2 每字节。如果它很高,就像从专用硬件RNG读取的值, 你可以将它设置为每字节8位。

答案 1 :(得分:1)

如果您的数据完全随机,那么我认为entropy_count适合您提供的缓冲区中的位数。然而,许多(大多数?)随机性源并不完美,因此将缓冲区大小和熵量保持为单独的参数是有意义的。

被宣布为大小为零的

buf是标准的C语言。这笔交易是当您实际分配rand_pool_info时,您执行malloc(sizeof(rand_pool_info) + size_of_desired_buf),然后使用buf成员引用缓冲区。注意:使用一些 C编译器,您可以声明buf[*]而不是buf[0]来明确指出实际上buf是“有弹性的”。

答案 2 :(得分:0)

缓冲区中的字节数与数据的熵相关,但不能仅根据该数据或其长度计算熵。

当然,如果数据来自一个好的,不可预测且相等分布的硬件随机噪声发生器,则熵(以位为单位)是缓冲区的8 *大小(以字节为单位)。

但如果比特分布不均匀或以某种方式可预测,则熵变小。

请参阅https://en.wikipedia.org/wiki/Entropy_(information_theory)

我希望有所帮助。