10.5. Аккумулятор
199
10.5.6
Добавление события
Источники энтропии вызывают функцию
AddRandomEvent
, когда у
них появляется очередное случайное событие. Обратите внимание, что каж-
дый источник энтропии идентифицируется уникальным номером. Мы не бу-
дем описывать, как система выделяет номера источников, так как это зависит
от конкретной ситуации.
функция
AddRandomEvent
вход:
R
Состояние ГПСЧ; изменяется этой функцией.
s
Номер источника в диапазоне
0
, . . . ,
255
.
i
Номер пула в диапазоне
0
, . . . ,
31
. Каждый источник должен
распределять свои события между пулами по циклическому
принципу.
e
Данные события. Строка байтов, длина которой находится
в диапазоне
1
, . . . ,
32
.
Вначале выполним проверку параметров.
assert
1
≤
length
(
e
)
≤
32
∧
0
≤
s
≤
255
∧
0
≤
i
≤
31
Добавим данные в пул.
P
i
←
P
i
k
s
k
length
(
e
)
k
e
Напомним, что каждое событие кодируется с помощью
2 +
length
(
e
)
байт,
причем на каждую из величин
s
и
length
(
e
)
отводится по одному байту. После
этого полученная конкатенация присоединяется к содержимому пула. Об-
ратите внимание, что в наших примерах мы просто присоединяем данные
к содержимому пула и не выполняем никакого хэширования. Хэширование
содержимого пула происходит только тогда, когда пользователь запрашивает
случайные данные. В реальной системе хэширование данных должно выпол-
няться “на лету” по мере их поступления. Это
функционально эквивалентно
нашему решению, к тому же проще в реализации, однако непосредственно
описывать этот процесс в книге было бы гораздо сложнее.
Мы ограничили длину данных события 32 байтами. События большей
длины довольно бесполезны. Источники энтропии должны передавать акку-
мулятору не все свои данные, а лишь те несколько байтов, которые и со-
держат непредсказуемые случайные данные. Если же энтропия разбросана
по большому объему данных, источник должен провести предварительное
хэширование передаваемых данных. Функция
AddRandomEvent
должна
выполняться как можно быстрее. Это особенно важно, поскольку многие ис-
точники энтропии в силу своей специфики работают в режиме реального
времени. Такие источники не могут тратить слишком много драгоценного
времени на вызов функции
AddRandomEvent
. Даже если источник выдает
небольшие события, он не должен ждать, пока функция
AddRandomEvent