КриптоПро CSP  

_CPC_FAST_CODE

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

На процессорах 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.
Совокупность выборов универсальных или использующих командные расширения наборов функций будем называть сочетанием наборов. Любое сочетание наборов кодируется в одном двойном машинном слове, как логическая сумма идентификаторов наборов функций MMX и SSE.

В связи с большим разнообразием аппаратных платформ на базе процессоров архитектуры 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/SSE/SSSE3/AVX:

  • Некое стандартное сочетание, считающиеся наиболее производительным.
  • Сочетание, состоящее только из наборов универсальных функций.
  • Сочетание, устанавливаемое пользователем с помощью функции SetProvParam.
  • Первое из них при работе через уровни 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;

    Члены

    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/SSE/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.

    Примечания

    Поддержка командных расширений по умолчанию на уровне пользователя согласно возможностям процессора и ОС.

    Поддержка командных расширений по умолчанию на уровне ядра ОС:

    Ядро ОС Поддержка
    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_