КриптоПро CSP  

CPCSetKeyParam

Функция CPCSetKeyParam() устанавливает параметры ключа.

DWORD CPCAPI CPCSetKeyParam(
  HCRYPTMODULE hCSP,
  HCRYPTPROV hProv,
  HCRYPTKEY hKey,
  DWORD dwParam,
  BYTE * pbData,
  DWORD dwFlags
);

Аргументы

hCSP
[in] Указатель на таблицу функций криптопровайдера. Получается при помощи функции CPCCreateProvider()
hProv
[in] Дескриптор криптопровайдера. Получается при помощи функции CPCAcquireContext().
hKey
[in] Дескриптор ключа, параметры которого устанавливаются.
dwParam
[in] Параметр, принимающий следующие возможные значения:
Значение dwParam Содержимое буфера pbData
KP_ALGID Идентификатор алгоритма ключа (ALG_ID), соответствующий данному ключу. Передаётся функции через буфер pbData. Возможо установить значение CALG_G28147 для ключей класса ALG_CLASS_DATA_ENCRYPT (сессионных ключей).
ALG_ID Описание
CALG_G28147 Ключ шифрования и/или имтозащиты данных по ГОСТ 28147-89. Впоследствии этот ключ можно пометить как ключ для импорта/экспорта с помощью функции CPCSetKeyParam().
CALG_PRO_EXPORT Ключ экспорта/импорта ключей типа CALG_G28147 для хранения на диске или передачи по каналу связи.
CALG_SIMPLE_EXPORT Ключ экспорта/импорта ключей типа CALG_G28147 по ГОСТ 28147-89 в режиме простой замены для хранения на ключевом носителе.

Использование CALG_SIMPLE_EXPORT для ключей CALG_G28147, переданых в канале связи, возможно только в случае обеспечения строгой однократности операции импорта ключа принимающей стороной и гарантированой случайности получения ключа передающей стороной.

Недопустимо использование CALG_SIMPLE_EXPORT для экспорта/импорта ключей с целью их хранения на диске.
CALG_TLS1_MASTER Ключ для реализации протокола TLS.
CALG_TLS1_MAC_KEY Ключ для реализации протокола TLS.
CALG_TLS1_ENC_KEY Ключ для реализации протокола TLS.
Устанавливает значения CALG_EKE_CIPHER на ключ CALG_PRO_AGREEDKEY_DH. Так же на ключ CALG_EKE_CIPHER может быть установлен тип CALG_PRO_AGREEDKEY_DH. Специфика протокола ООО "КРИПТО-ПРО" взаимодействия с функциональным ключевым носителем.
KP_IV Устанавливает начальное значение вектора инициализации (IV или синхропосылки) алгоритма шифрования. Начальное значение синхропосылки по умолчанию (после создания, дублирования и или завершения операции шифрования) - случайное. Последовательность байтов, содержащая IV, передаётся функции через буфер pbData.
KP_CERTIFICATE Установка сертификата в контейнер (на носитель). Сертификат должен соответствовать ключу в контейнере.
KP_PADDING Способ дополнения. Величина DWORD, содержащая метод дополнения, используемый шифром ключа, передаётся функции через буфер pbData. В настоящее время определены следующие способы дополнения:
  • PKCS5_PADDING - PKCS#5.(См ПРИМЕЧАНИЕ в данном разделе и ПРИМЕЧАНИЕ к CryptSetKeyParam в MS CryptoAPI 2.0 World Wide Web link )
  • ZERO_PADDING - дополнение нулевыми байтами,
  • RANDOM_PADDING - дополнение случайными байтами.
KP_MODE Режим шифра. Переменная типа DWORD. Передаётся функции через буфер pbData. В следующем списке приведены режимы шифрования для ключей CALG_G28147 класса ALG_CLASS_DATA_ENCRYPT, доступные в настоящее время:
  • CRYPT_MODE_ECB - блочный шифр простой замены ГОСТ 28147-89;
  • CRYPT_MODE_CNT - шифрование гаммированием ГОСТ 28147-89;
  • CRYPT_MODE_CFB - шифрование гаммированием с обратной связью ГОСТ 28147-89;
  • CRYPT_MODE_CBCRFC4357 - блочный шифр с обратной связью на базе ГОСТ 28147-89, согласно RFC 4357;
  • CRYPT_MODE_CBCSTRICT - блочный шифр с обратной связью на базе ГОСТ 28147-89, шифр-текст блока всегда является IV для следующего. Для ключей CALG_EKE_CIPHER доступны режимы шифрования:
  • CRYPT_MODE_EKEXOR - одноразовый шифр гаммирования по модулю 2, в данном режиме вычисляется значение открытого ключа, соответствующего ключу CALG_PRO_AGREEDKEY_DH и координата X ключа накладывается по модулю 2 на данные, данные длиной 32 байта должны подаваться одним блоком;
  • CRYPT_MODE_EKEECADD - одноразовый шифр гаммирования в группе точек эллиптической кривой, в данном режиме вычисляется значение открытого ключа, соответсвующего ключу CALG_PRO_AGREEDKEY_DH и ключ накладывается на данные аддитивно в группе точек эллиптической кривой, данные должны быть блобом открытого ключа длиной 100 байт и подаваться одним блоком.
KP_MODE_BITS Глубина обратной связи. Переменная типа DWORD. Значение этой величины равно 64, что соответствует режиму гаммирования с обратной связью ГОСТ 28147-89.
KP_MIXMODE Дополнительный параметр ключа. Устанавливает режим преобразования ключа после зашифрования каждых 1024 байт информации. Режим преобразования ключа установлен по умолчанию. Выйти из этого режима можно, если для этого параметра pbData будет установлена в FALSE. Если pbData установлена в TRUE, устанавливается режим преобразования ключа. Размер pbData - 4 байта. Может быть установлен для ключей типа CALG_G28147. Возвращается в виде переменной типа DWORD.
KP_MIXSTART Осуществляет диверсификацию ключа по алгоритму CALG_PRO_DIVERS. Через параметр pbData передаётся блоб диверсификации ключа в форме CRYPR_DATA_BLOB, см. CPCImportKey(). Допускается многократный вызов с различными параметрами диверсификации.
KP_CIPHEROID Идентификатор узла замены. Строка, заканчивающаяся нулем.
KP_DHOID Идентификатор параметров ключа ГОСТ Р 34.10-2001, применяемых в алгоритме Диффи-Хеллмана. Строка, заканчивающаяся нулем. Начиная с версии 3.6 допускается устанавливать идентификаторы подписи. Необходимо устанавливать глобальным параметром PP_DHOID до генерации ключа.
KP_HASHOID Идентификатор функции хэширования. Строка, заканчивающаяся нулем. Необходимо устанавливать глобальным параметром PP_HASHOID до генерации ключа.
KP_CLIENT_RANDOM Идентификатор величины ClientRandom, используемой с ключами типа CALG_TLS1_MASTER. Размер ClientRandom - 32 байта. Используется при преобразовании premaster_secret в master_secret и при генерации ключевой информации в момент создания хеша CALG_TLS1_MASTER_HASH.
KP_SERVER_RANDOM Идентификатор величины ServerRandom, используемой с ключами типа CALG_TLS1_MASTER.Размер ServerRandom - 32 байта. Используется при преобразовании premaster_secret в master_secret и при генерации ключевой информации в момент создания хеша CALG_TLS1_MASTER_HASH.
KP_PREHASH

Идентификатор, используемый ключами типа CALG_TLS1_MASTER. Предварительно требуется установить KP_CLIENT_RANDOM и KP_SERVER_RANDOM. Вызов функции преобразует premaster_secret в master_secret.

KP_X Закрытый ключ в ключевой паре. 32 байта в форме little endian. Данные передаются в форме BLOB структуры, где член структуры pbData указывает на данные, а cbData передаёт длину данных.
KP_MULX Для произвольной ключевой пары осуществляет умножение закрытого и открытого ключей на значение передаваемого параметра pbData. Для ключа CALG_PRO_AGREEDKEY_DH осуществляет умножение закрытого ключа на значение передаваемого параметра pbData. Данные передаются в форме BLOB структуры, где член структуры pbData указывает на данные - 32 байта в форме little endian, а cbData передаёт длину данных.
KP_MULX_INVERS Аналогично KP_MULX осуществляет умножение на величину, обратную к величине, передаваемой в параметре pbData.
KP_ADDX Для закрытого ключа осуществляет сложение по модулю q значения ключа и значения смещения, передаваемого через параметр pbData. Данные передаются в форме BLOB структуры, где поле pbData указывает на данные - смещение, а cbData передаёт длину данных.
KP_SUBX Для открытого ключа осуществляет вычитание по модулю q из значения ключа значения смещения, передаваемого через параметр pbData. Данные передаются в форме BLOB структуры, где поле pbData указывает на данные - смещение, а cbData передаёт длину данных.
KP_ECADD Для открытого ключа осуществляет сложение в группе точек эллиптической кривойоткрытого ключа и значения блоба открытого ключа, передаваемого через параметр pbData. Данные передаются в форме BLOB структуры, где поле pbData указывает на данные - блоб открытого ключа, а cbData передаёт длину данных.
KP_ECSUB Для открытого ключа осуществляет вычитание в группе точек эллиптической кривой открытого из ключа значение блоба открытого ключа, передаваемого через параметр pbData. Данные передаются в форме BLOB структуры, где поле pbData указывает на данные - блоб открытого ключа, а cbData передаёт длину данных.
KP_DEMASKPUBLIC Устанавливает открытый ключ на ключ CALG_PRO_AGREEDKEY_DH, что обеспечивает расшифрование ключа в алгоритме выработки ключа обмена с использованием функционального ключевого носителя. Специфика протокола ООО "КРИПТО-ПРО" взаимодействия с функциональным ключевым носителем.
KP_SYNCRO Устанавливает значение синхропосылки на ключ пользователя. Ключ должен быть создан в контексте с флагом CRYPT_TOKEN_SHARED. Данные передаются в форме BLOB структуры, где pbData указывает на данные – 32 байта синхропосылки, а cbData передаёт длину данных. Специфика протокола ООО КриптоПро взаимодействия с функциональным ключевым носителем.
pbData
[in] Указатель на буфер данных параметра. При вызове функции буфер содержит, соответствующие значению параметра в dwParam. Формат данных зависит от типа параметра.
dwFlags
[in] Значения флагов. Параметр зарезервирован для будущего использования и должен быть нулевым.

Возвращаемые значения

При успешном завершении функция возвращает 0 (S_OK), в противном случае возвращается соответствующий код ошибки (см. таблицу).
Коды возвратаОписание
ERROR_INVALID_PARAMETERОдин из параметров содержит некорректное значение. Чаще всего это некорректный указатель.
NTE_BAD_FLAGSПараметр dwFlags имеет ненулевое значение.
NTE_BAD_TYPEПараметр dwParam передаёт неизвестное значение параметра.
NTE_BAD_KEYДескриптор ключа ошибочен.
NTE_PERMПопытка чтения ключевых параметров, когда право чтения криптопровайдером не предоставлено.
NTE_FIXEDPARAMETERБыла произведена попытка установить параметры, постоянные для данного криптопровайдера.
NTE_BAD_DATAНеправильные данные в буфере pbData.

Примечания

ДОПОЛНЕНИЕ PKCS #5 Эта схема дополнения определена RSA Data Security, Inc. и описана в "Public-Key Cryptography Standards (PKCS)", PKCS #5, раздел 6.2. При использовании данной схемы, последовательность всегда дополняется знаками, даже в случае, когда её длина кратна длине блока шифрования. Последовательность дополнения состоит из байтов, каждый из которых равен числу дополнительных байтов. Если дополняется последовательность из 24 бит, последовательность дополнения равна “05 05 05 05 05”. Если дополняется 64 бита, последовательность дополнения равна “08 08 08 08 08 08 08 08”. При расшифровании, если расширение блока удовлетворяет условиям дополнения PKCS #5, функция CPCDecrypt() в переменной pdwDataLen, возвращает истинное значение длины открытого текста. Если расширение блока не удовлетворяет условиям дополнения PKCS #5, функция CPCDecrypt() возвращает ошибку NTE_BAD_DATA,а в переменной pdeDataLen значение длины шифрованного текста. Дополнение PKCS #5 не обеспечивает контроль целостности данных. ДОПОЛНЕНИЕ ZERO При использовании данной схемы, последовательность дополняется нулевыми байтами до наименьшей длины, кратной длине блока шифрования. ДОПОЛНЕНИЕ RANDOM При использовании данной схемы, последовательность дополняется случайными байтами до наименьшей длины, кратной длине блока шифрования.

РЕЖИМ CRYPT_MODE_ECB В соответствии с требованиями ГОСТ 28147-89 режим шифрования простой заменой CRYPT_MODE_ECB может использоваться только для шифрования ключевой информации.

Требования:

Ядро FreeBSD: 7/8/9 или выше
Ядро Linux: ядро 2.4.x/2.6.x/3.0.х/3.2.х или выше
Ядро Solaris: 10/11 или выше.
Ядро Windows 2000/XP/2003/Vista/2008/7: Необходимо Windows 2000 SP4 или старше.

См. также

CPCGenKey() ,CPCGetKeyParam() ,CPSetKeyParam в MS CSP World Wide Web link ,CryptSetKeyParam в MS CryptoAPI 2.0 World Wide Web link