Заметки об энтропии

29 Ноя 2014

Заметки об энтропии

Событие, ожидаемое специалистами в области криптографии, моделирования различных систем, а также просто любителями энтропии (есть и такие), произошло. Процессоры Intel получили аппаратную поддержку генерации случайных чисел. В системе команд появилась инструкция RDRAND в трех формах: 16, 32 и 64 битной. Источник энтропии, недавно появившийся в составе процессора, уже снабжен средствами для его виртуализации. Давайте детально ознакомимся с его устройством и постараемся применить на практике полученные знания.

 

Инструкция RDRAND

Для определения поддержки инструкции RDRAND, следует воспользоваться CPUID функцией 1 (Processor Feature Information). После ее выполнения, бит 30 регистра ECX индицирует наличие в процессоре генератора случайных чисел.

Бит 30 регистра ECX после выполнения CPUID функции 1 индицирует наличие в процессоре генератора случайных чисел
Рис 1. Бит 30 регистра ECX после выполнения CPUID функции 1 индицирует
наличие в процессоре генератора случайных чисел

В зависимости от формата, инструкция возвращает результат – случайное число в 16, 32 или 64-битном регистре общего назначения.

Инструкция RDRAND в качестве кода завершения использует флаг переноса. Если он установлен (условие Carry) – выполнение успешно. Если сброшен (условие Not Carry), это означает, что генератор случайных чисел не готов и попытку следует повторить. Согласно документации Intel, возникновение состояния неготовности вероятно при одновременном использовании данного ресурса несколькими процессорными ядрами. Из этого вывод – в процессоре всего один рандомайзер.

Рассматриваемый узел имеет специальный статус как привилегированный ресурс процессора. При использовании технологии виртуализации, супервизор может запретить гостевому модулю прямо использовать инструкцию RDRAND. Если гостевой модуль сделает такую попытку, операция будет аппаратно перехвачена и запротоколирована процессором. При этом супервизору будет передан отчет, содержащий информацию о том, как именно гостевой модуль попытался использовать генератор случайных чисел: регистр получатель и разрядность операнда.

Процессор протоколирует незаконные попытки использования генератора случайных чисел виртуальной машиной: аппаратно генерируемый отчет содержит адрес регистра-получателя и разрядность операнда инструкции RDRAND
Рис 2. Процессор протоколирует незаконные попытки использования генератора случайных чисел виртуальной машиной: аппаратно генерируемый отчет содержит адрес регистра-получателя и разрядность операнда инструкции RDRAND

Проверим на практике

Для демонстрации возможностей генератора случайных чисел, встроенного в процессоры Intel, мы написали небольшое приложение с открытым исходным кодом UEFIrand, работающее в среде x64 UEFI и выполняющее динамический вывод цветных пикселей в матрице 512x512.

Применяется 64-битная форма инструкции RDRAND. Вывод графики происходит с помощью UEFI Graphics Output Protocol (GOP). В соответствии с требованиями GOP, используется 32-битное кодирование пикселей, при котором для кодирования цвета задействовано 24 бита, по 8 бит на каждый цвет: Red, Green, Blue и 8 бит зарезервировано. Горизонтальное и вертикальное разрешение определяются возможностями видео подсистемы и параметрами Xsize, Ysize в конфигурационном файле.

Работа приложения состоит в выводе пикселей, цвет и координата которых определяются результатами работы генератора случайных чисел. Пиксели выводятся в матрице 512x512 в центре экрана. 

64-битная форма инструкции RDRAND с получателем в регистре RBX кодируется как последовательность байт:

048h, 00Fh, 0C7h, 0F3h RDRAND RBX

Таким образом, в 64-битном результате инструкции RDRAND используется 42 бита: 24 бита для представления цвета пикселя, 9 бит для X-координаты и 9 бит для Y-координаты.

Визуализированная энтропия
Рис 3. Визуализированная энтропия

Пояснения к примеру

Применив линейный доступ к видеопамяти и переопределение MTRR- атрибутов для диапазона доступа мы ускорили визуализацию и сделали картинку более динамичной. 

В силу специфики нашего приложения, запись в видео память происходит индивидуально для каждого пикселя, поэтому, в отличие, например, от процедур визуализации окон и графических объектов с большой площадью, применение одиночных команд MOV для записи в видео память, здесь более эффективно, чем использование видео акселератора или функции Block Transfer.

Пример написан на языке ассемблера x86 и предназначен для выполнения в среде x64 UEFI. Для его трансляции использовался Flat Assembler 1.69.50. Исходный код и выполняемый модуль программы предоставляются на условиях AS IS.

Для экспериментов использовалось следующее оборудование:

  • Системная плата ASUS Z87-K на основе системной логики Intel Z87 для процессоров Socket 1150.
  • Процессор - Intel® Xeon® CPU E3-1270 v3 @ 3.50GHz. 
  • Мультимедийный ноутбук ASUS N550JV.

Резюме

Насколько можно судить по результатам визуализации, качество аппаратной генерации случайных чисел новыми процессорами Intel, достаточно высокое. При отладке нашей программы, для сравнения был протестирован альтернативный метод, а именно, использование регистра TSC (Time Stamp Counter), инкрементируемого в каждом процессорном такте. При этом получить приемлемые результаты практически невозможно. Основная причина – строгая периодичность и детерминированность переключения битов в этом регистре, преодолеть которую программным путем достаточно сложно. Также вспомним, что при работе механизмов Power Management, частота обновления TSC может зависеть от текущего состояния процессора.