КриптоПро CSP  

_CPC_FAST_CODE

Настройки использования расширений процессора: MMX, SSE2, SSSE3, AVX.

На процессорах Intel Pentium 4 и новее можно достичь ускорения алгоритмов шифрования и хэширования за счёт использования инструкций расширений MMX, SSE2, SSSE3, AVX. Настройка захвата FPU осуществляется с помощью данной структуры.

Криптографические функции, использующие расширения, сведены в следующие наборы:

Идентификатор набора Группа
CSP_OPERATION_CIPHER1 Нераспараллеливаемые функции шифрования по ГОСТ 28147-89 и ГОСТ Р 34.12–2015 (Магма, Кузнечик). Для быстрой работы необходимо только командное расширение MMX.
CSP_OPERATION_CIPHER2 Распараллеливаемые функции шифрования по ГОСТ 28147-89 и ГОСТ Р 34.12–2015 (Магма, Кузнечик). Быстрая работа возможна в режимах MMX, SSSE3 и AVX.
CSP_OPERATION_IMIT Функция выработки имитовставки по ГОСТ 28147-89 и ГОСТ Р 34.12–2015 (Магма, Кузнечик). Для быстрой работы необходимо только командное расширение MMX.
CSP_OPERATION_HASH Функции хэширования по ГОСТ Р 34.11-94 и ГОСТ Р 34.11-2012. Для них необходимы командные расширения MMX и SSE2.
CSP_OPERATION_MULT Функция умножения в поле по модулю P (Применяется в протоколах подписи и Диффи-Хеллмана). Для быстрой работы необходимы командные расширения MMX и SSE2.
CSP_OPERATION_FOREIGN Функции зарубежной криптографии, в настоящий момент включают в себя только AES шифрование. Для быстрой работы необходимо командное расширение AES-NI.
CSP_FAST_CODE_DISABLE_SSSE3 Запрет использования командного расширения SSSE3.
CSP_FAST_CODE_DISABLE_AVX Запрет использования командного расширения AVX.
CSP_FAST_CODE_RT_TS Захват FPU только на время операции, применяется в случае если для захвата используется TS-бит (Solaris, Linux).
Совокупность выборов универсальных или использующих командные расширения наборов функций будем называть сочетанием наборов. Любое сочетание наборов кодируется в одном 32-битном значении как логическая сумма идентификаторов наборов функций MMX, SSE2, SSSE3 и AVX.

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

Настроить провайдер на использование наиболее быстрого сочетания наборов можно:

  • с помощью вызова SetProvParam (PP_FAST_CODE_FUNCS), в который передаётся данная структура
  • на уровне CPC, при инициализации криптографического модуля, путём передачи данной структуры в инициализатор провайдера
  • при использовании криптопровайдера в пользовательском режиме, путём установки маски оптимального набора функций в реестр в '\Crypto Pro\Cryptography\CurrentVersion\Parameters\MMXFuncs' или на Unix командой: "cpconfig -ini '\\config\\Parameters' -add long MMXFuncs значение_маски", куда надо вписать значение соответствующее полю UsedMask из структуры.
  • c помощью команды 'csptest -speed -type ALL -mode REG'. Такой вызов проведёт короткий тест и запишет оптимальные параметры в указанный выше ключ реестра.
  • У провайдера есть три режима использования функций MMX/SSE2/SSSE3/AVX:

  • Некое стандартное сочетание, считающиеся наиболее производительным.
  • Сочетание, состоящее только из наборов универсальных функций.
  • Сочетание, устанавливаемое пользователем с помощью функции SetProvParam.
  • Первое из них при работе через уровни Crypt и CP устанавливаются из реестра, или, если реестр недоступен или параметр не определён, как некоторое стандартное сочетание, задаваемое провайдером для данной системы. При работе на уровне CPC первое сочетание передаётся пользователем при инициализации провайдера, или запрашивается установка стандартного для провайдера сочетания.

    При установке некоторого выбираемого пользователем сочетания наборов возможен выбор используемого набора расширений: MMX, SSE2, SSSE3 или AVX. При установке нового сочетания наборов провайдер в любом случае проверит, возможно ли на данном процессоре использование таких наборов функций MMX/SSE2/SSSE3/AVX, и, если возможность есть, установит наборы. В режиме ядра, кроме того, перед вызовом каждой функции, использующей MMX/SSE/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;

    Члены

    UsesFunctions
    Обязательный параметр, может быть равен CPC_FAST_CODE_DEFAULT, CPC_FAST_CODE_NO, CPC_FAST_CODE_USER.
    Возможные значения:Интерпретация:
    CPC_FAST_CODE_DEFAULT Использовать сочетание наборов по умолчанию.
    CPC_FAST_CODE_NO Использовать сочетание наборов универсальных функций.
    CPC_FAST_CODE_USER Использовать сочетание наборов функций, задаваемое параметром UsedMask.
    cp_kernel_fpu_begin
    Указатель на функцию захвата FPU. Применяется в режиме ядра. Указывает на функцию захвата FPU, которую будут вызывать функции, использующие расширения MMX/SSE2/SSSE3/AVX. Устанавливается только при UsesFunctions == CPC_FAST_CODE_USER. Если равно нулю при использовании в CPCSetProvParam(), сохраняется предыдущее значение. См. CPC_Kernel_Fpu_Begin_Callback
    cp_kernel_fpu_end
    Указатель на функцию освобождения FPU. Применяется в режиме ядра. Указывает на функцию освобождения FPU. Используется только при UsesFunctions == CPC_FAST_CODE_USER. Если равно нулю при использовании в CPCSetProvParam(), сохраняется предыдущее значение. См. CPC_Kernel_Fpu_End_Callback
    Kernel_Buf_Size
    Размер невыровненного буфера, который будет передаваться в функции захвата и освобождения FPU для сохранения регистров. Используется только при UsesFunctions == CPC_FAST_CODE_USER. Значение не может превышать 2048. См. CPC_Kernel_Fpu_Begin_Callback , CPC_Kernel_Fpu_End_Callback
    UsedMask
    Маска, задающая сочетание наборов функций. Является логической суммой идентификаторов наборов функций, использующих командные расширения, которые следует вызывать в криптопровайдере (см. выше). В пользовательском режиме в ней передаются любые возможные сочетания всех пяти наборов, в режиме ядра - всех, кроме набора умножения по модулю P.

    Примечания

    Семантика работы функции 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

    См. также

    CPC_CONFIG_