The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выявлена проблема с генерацией предсказуемых случайных чисел..."
Отправлено pavlinux, 10-Сен-13 00:14 
Блин, переводчика надо покромсать на маленьких тузиков...
Да и Тцо тоже, чтоб шухер не поднимал.


void add_device_randomness(const void *buf, unsigned int size)
{
         unsigned long time = get_cycles() ^ jiffies; // В случае МИПСа, time будет равен jiffies;
         // Эти функции пихают size байт по адресу из второго аргумента
         // и пихают в общий пул (первый арг.)              
         mix_pool_bytes(&input_pool, buf, size, NULL);
         mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
         mix_pool_bytes(&nonblocking_pool, buf, size, NULL);
         mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL);
}

mix_pool_bytes  - развернуто, это вот такая шняга.

static void _mix_pool_bytes(struct entropy_store *r, const void *in, int nbytes, __u8 out[64]) {

         unsigned long i, j, tap1, tap2, tap3, tap4, tap5;
         int input_rotate;
         int wordmask = r->poolinfo->poolwords - 1;
         const char *bytes = in;
         __u32 w;

         tap1 = r->poolinfo->tap1;
         tap2 = r->poolinfo->tap2;
         tap3 = r->poolinfo->tap3;
         tap4 = r->poolinfo->tap4;
         tap5 = r->poolinfo->tap5;

         smp_rmb();
         input_rotate = ACCESS_ONCE(r->input_rotate);
         i = ACCESS_ONCE(r->add_ptr);

         /* mix one byte at a time to simplify size handling and churn faster */
         while (nbytes--) {
                 w = rol32(*bytes++, input_rotate & 31);
                 i = (i - 1) & wordmask;

                 /* XOR in the various taps */
                 w ^= r->pool[i];
                 w ^= r->pool[(i + tap1) & wordmask];
                 w ^= r->pool[(i + tap2) & wordmask];
                 w ^= r->pool[(i + tap3) & wordmask];
                 w ^= r->pool[(i + tap4) & wordmask];
                 w ^= r->pool[(i + tap5) & wordmask];

                 /* Mix the result back in with a twist */
                 r->pool[i] = (w >> 3) ^ twist_table[w & 7];

                 /*
                  * Normally, we add 7 bits of rotation to the pool.
                  * At the beginning of the pool, add an extra 7 bits
                  * rotation, so that successive passes spread the
                  * input bits across the pool evenly.
                  */
                 input_rotate += i ? 7 : 14;
         }

         ACCESS_ONCE(r->input_rotate) = input_rotate;
         ACCESS_ONCE(r->add_ptr) = i;
         smp_wmb();

         if (out)
                 for (j = 0; j < 16; j++)
                         ((__u32 *)out)[j] = r->pool[(i - j) & wordmask];
}  

Вращения с семью побайтными XOR это необратимая ж...а. Входной аргумент у этой
функции это так сказать "волшебный пендаль", чтоб оно закрутилось. Достаточно различия
в один байт от предыдущего значения. А jiffies это такая клёвая штука - она два раза себя
одинаковой не возвращает, как бы не тужились.

И опять же, это всего лишь функция наполнения пула энтропии, для генерации чисел оттуда ещё выбирать нужно.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру