Книга: Разработка ядра Linux
Интерфейсы для вывода энтропии
Интерфейсы для вывода энтропии
Для получения случайных чисел внутри ядра экспортируется один интерфейс.
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
- Устройство ввода-вывода
- Интерфейсы для ввода энтропии
- Включение и отключение синхронного вывода
- 5.21 IP-адреса, интерфейсы и множественное пребывание
- Множественные интерфейсы и имена методов
- 2. Правила вывода Армстронга
- 3. Производные правила вывода
- 1.6 Драйверы и буферы ввода-вывода
- 2.2 Интерфейсы IDE, EIDE и АТА
- 7.5 Программные интерфейсы приложений для адаптеров шины
- Глава 6 BIOS – базовая система ввода-вывода
- Абстрактные базы как двоичные интерфейсы