На процессорах Intel Pentium 4 и новее можно достичь ускорения алгоритмов шифрования и хэширования за счёт использования инструкций расширений MMX, SSE2, SSSE3, AVX. Настройка захвата FPU осуществляется с помощью данной структуры.
Криптографические функции, использующие расширения, сведены в следующие наборы:
Идентификатор набора | Группа |
---|---|
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 и ГОСТ Р 34.11-2012. Для них необходимы командные расширения MMX и SSE2. |
CSP_OPERATION_MULT | Функция умножения в поле по модулю P (Применяется в протоколах подписи и Диффи-Хеллмана). Для быстрой работы необходимы командные расширения MMX и SSE2. |
CSP_FAST_CODE_DISABLE_SSSE3 | Запрет использования командного расширения SSSE3. |
CSP_FAST_CODE_DISABLE_AVX | Запрет использования командного расширения AVX. |
CSP_FAST_CODE_RT_TS | Захват FPU только на время операции, применяется в случае если для захвата используется TS-бит (Solaris, Linux). |
В связи с большим разнообразием аппаратных платформ на базе процессоров архитектуры x86 и эмуляций x86 на архитектурах x64 и IA64, нет возможности заранее определить, какой из наборов функций в группах будет работать быстрее на конкретном процессоре, с конкретной частотой шины, скоростью памяти и т.п.
Настроить провайдер на использование наиболее быстрого сочетания наборов можно:
У провайдера есть три режима использования функций MMX/SSE2/SSSE3/AVX:
Первое из них при работе через уровни Crypt и CP устанавливаются из реестра, или, если реестр недоступен или параметр не определён, как некоторое стандартное сочетание, задаваемое провайдером для данной системы. При работе на уровне CPC первое сочетание передаётся пользователем при инициализации провайдера, или запрашивается установка стандартного для провайдера сочетания.
При установке некоторого выбираемого пользователем сочетания наборов возможен выбор используемого набора расширений: MMX, SSE2, SSSE3 или AVX. При установке нового сочетания наборов провайдер в любом случае проверит, возможно ли на данном процессоре использование таких наборов функций MMX/SSE2/SSSE3/AVX, и, если возможность есть, установит наборы. В режиме ядра, кроме того, перед вызовом каждой функции, использующей MMX/SSE2/SSSE3/AVX, будет осуществлён вызов callback'а захвата FPU, и специализированный код будет использоваться только в случае успешного захвата, после чего будет вызван callback функции освобождения FPU. Если захват не удался, будет выполняться универсальный код функции.
Пример заполнения структуры для выставления всех наборов функций в медленные с помощью CPCSetProvParam (CPC_FAST_CODE).
fastCodes.cp_kernel_fpu_begin = NULL; fastCodes.cp_kernel_fpu_end = NULL; fastCodes.Kernel_Buf_Size = 0; fastCodes.UsesFunctions = CPC_FAST_CODE_USER; fastCodes.UsedMask = 0;
Пример заполнения структуры для включения быстрого кода для всех функций распараллеливаемого шифрования, но с запретом использования AVX. Все наборы функций, кроме CSP_OPERATION_CIPHER2, будут медленными.
fastCodes.cp_kernel_fpu_begin = NULL; fastCodes.cp_kernel_fpu_end = NULL; fastCodes.Kernel_Buf_Size = 0; fastCodes.UsesFunctions = CPC_FAST_CODE_USER; fastCodes.UsedMask = CSP_FAST_CODE_DISABLE_AVX | CSP_OPERATION_CIPHER2;
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. |
Семантика работы функции CPCSetProvParam (CPC_FAST_CODE) следующая: сначала производится выставление всех наборов функций в медленные (не использующие расширения), а затем - включение быстрых в соответствии с переданными флагами.
Важно, что бы другие функции определяемые пользователем в конфигурации CPC_CONFIG_ сохраняли возможность использования расширений процессора текущим контекстом исполнения (начиная, со сборки 3.6.7747, определяемые пользователем функции блокировок с ожиданием CPC_LOCK_FUNCS_ не вызываются во время использования расширений процессора).
Поддержка командных расширений по умолчанию на уровне пользователя согласно возможностям процессора и ОС.
Поддержка командных расширений по умолчанию на уровне ядра ОС:
Ядро ОС | Поддержка |
---|---|
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 |