На процессорах Intel Pentium 4 и новее можно достичь ускорения алгоритмов шифрования и хэширования за счёт использования инструкций расширений MMX, SSE2, SSSE3, AVX. Настройка захвата SSE2 осуществляется с помощью данной структуры.
Криптографические функции, использующие расширения, сведены в следующие наборы:
Идентификатор набора | Группа |
---|---|
CSP_OPERATION_CIPHER1 | Неспараллеливаемые функции шифрования по ГОСТ 28147-89. Для них необходимо только командное расширение MMX. |
CSP_OPERATION_CIPHER2 | Спараллеленные функции шифрования по ГОСТ 28147-89. Для них необходимо только командное расширение MMX, возможно использование SSSE3 и AVX. |
CSP_OPERATION_IMIT | Функция выработки имитовставки по ГОСТ 28147-89. Для нее необходимо только командное расширение MMX. |
CSP_OPERATION_HASH | Функции хэширования по ГОСТ Р 34.11-94. Для них необходимы командные расширения MMX и SSE2. |
CSP_OPERATION_MULT | Функция умножения в поле по модулю P (Применяется в протоколах подписи и Диффи-Хеллмана). Для неё необходимы командные расширения MMX и SSE2. |
CSP_FAST_CODE_DISABLE_SSSE3 | Запрет использования командного расширения SSSE3. |
CSP_FAST_CODE_DISABLE_AVX | Запрет использования командного расширения AVX. |
В связи с большим разнообразием аппаратных платформ на базе процессоров архитектуры x86 и эмуляций x86 на архитектурах x64 и IA64, нет возможности заранее определить, какой из наборов функций в группах будет работать быстрее на конкретном процессоре, с конкретной частотой шины, скоростью памяти и т.п.
Настроить провайдер на использование наиболее быстрого сочетания наборов можно:
У провайдера есть три режима использования функций MMX/SSE/SSSE3/AVX:
Первое из них при работе через уровни Crypt и CP устанавливаются из реестра, или, если реестр недоступен или параметр не определён, как некоторое стандартное сочетание, задаваемое провайдером для данной системы. При работе на уровне CPC первое сочетание передаётся пользователем при инициализации провайдера, или запрашивается установка стандартного для провайдера сочетания.
При установке некоторого выбираемого пользователем сочетания наборов возможен выбор используемого набора расширений: MMX, SSE2, SSSE3 или AVX. При установке нового сочетания наборов провайдер в любом случае проверит, возможно ли на данном процессоре использование таких наборов функций MMX/SSE/SSSE3/AVX, и, если возможность есть, установит наборы. В режиме ядра, кроме того, перед вызовом каждой функции, использующей MMX/SSE/SSSE3/AVX, будет осуществлён вызов callback'а захвата FPU, и специализированный код будет использоваться только в случае успешного захвата, после чего будет вызван callback функции освобождения FPU. Если захват не удался, будет выполняться универсальный код функции.
typedef struct _CPC_FAST_CODE {
DWORD UsesFunctions;
CPC_Kernel_Fpu_Begin_Callback * cp_kernel_fpu_begin;
CPC_Kernel_Fpu_End_Callback * cp_kernel_fpu_end;
DWORD Kernel_Buf_Size;
DWORD UsedMask; } CPC_FAST_CODE;
Возможные значения: | Интерпретация: |
---|---|
CPC_FAST_CODE_DEFAULT | Использовать сочетание наборов по умолчанию. |
CPC_FAST_CODE_NO | Использовать сочетание наборов универсальных функций. |
CPC_FAST_CODE_USER | Использовать сочетание наборов функций, задаваемое параметром UsedMask. |
Поддержка командных расширений по умолчанию на уровне пользователя согласно возможностям процессора и ОС.
Поддержка командных расширений по умолчанию на уровне ядра ОС:
Ядро ОС | Поддержка |
---|---|
Windows 7/2008R2 SP1 | до AVX |
Windows иные | до SSSE3 |
Linux с версии ядра 2.6.30 | до AVX |
Linux ранее | до SSSE3 |
FreeBSD с версии 8.2 | до AVX |
FreeBSD ранее | базовый код без использования FPU/MMX/SSE2/SSSE3/AVX |
Solaris 10/11 amd64 | до SSSE3 |
Solaris 10/11 ia32 | базовый код без использования FPU/MMX/SSE2/SSSE3/AVX |