Функция add_keyboard_randomness()
Функция add_mouse_randomness()
mouse_data
— это позиция указателя, которая возвращается аппаратным обеспечением.Эти три функции добавляют передаваемые данные в пул энтропии, вычисляют оценку энтропии добавляемых данных и увеличивают оценку энтропии пула на вычисленное значение.
Все эти экспортируемые интерфейсы используют внутреннюю функцию add_timer_randomness()
Интерфейсы для вывода энтропии
Для получения случайных чисел внутри ядра экспортируется один интерфейс.
void get_random_bytes(void *buf, int nbytes);
Эта функция сохраняет nbytes
buf
. Функция возвращает данные, даже если оценка энтропии равна нулю. Для ядра это не так критично, как для пользовательских криптографических программ. Случайные данные мало используются в ядре, в основном они нужны сетевой подсистеме для генерации стартового номера последовательности сегментов при соединении по протоколу TCP.Код ядра может выполнить следующий код для получения случайных данных размером в одно машинное слово.
unsigned long rand;
get_random_bytes(&rand, sizeof(rand));
Для программ, которые выполняются в пространстве пользователя, предоставляется два символьных устройства: /dev/random
/dev/urandom
. Первое устройство, /dev/random
, используется, когда необходимы гарантированно случайные данные для криптографических приложений с высоким уровнем безопасности. Это устройство выдает только то количество битов данных, которое соответствует оценке энтропии в ядре. Когда оценка энтропии становится равной нулю, операция чтения устройства /dev/random
блокируется и не возвращает данные, пока значение энтропии не станет существенно положительным. Устройство /dev/urandom
не имеет последней возможности, а в остальном работает аналогично. Оба устройства возвращают данные из одного и того же пула.Чтение из обоих файлов выполняется очень просто. Ниже показана функция пользовательской программы, которая служит для считывания одного машинного слова случайных данных.
unsigned long get_random(void) {
unsigned long seed = 0;
int fd;
fd = open("/dev/urandom", O_RDONLY);
if (fd == -1) {
perror("open");
return 0;
}
if (read(fd, &seed, sizeof(seed)) < 0) {
perror("read");
seed = 0;
}
if (close(fd))
perror("close");
return seed;
}
Можно также считать $bytes
$file
, используя программу dd
.dd if=/dev/urandom of=$file count=1 bs=$bytes
Приложение В
Сложность алгоритмов