КриптоПро CSP  

CPCDecrypt

Функция CPCDecrypt() расшифровывает данные, предварительно зашифрованные функцией CPCEncrypt(). Одновременно может быть произведено хэширование данных.

DWORD CPCAPI CPCDecrypt(
  HCRYPTMODULE hCSP,
  HCRYPTPROV hProv,
  HCRYPTKEY hKey,
  HCRYPTHASH hHash,
  BOOL Final,
  DWORD dwFlags,
  BYTE * pbData,
  DWORD * pdwDataLen
);

Аргументы

hCSP
[in] Указатель на таблицу функций криптопровайдера. Получается при помощи функции CPCCreateProvider()
hProv
[in] Дескриптор криптопровайдера. Получается при помощи функции CPCAcquireContext().
hKey
[in] Дескриптор сессионного ключа, используемого для расшифрования данных.
hHash
[in] Дескриптор объекта хэширования. Если хэширование данных одновременно с их расшифрованием не требуется, этот параметр должен быть нулевым.
Final
[in] Булева величина. Определяет, является ли переданный функции блок последним расшифрованным блоком данных. Она должна быть установлена TRUE, если блок - последний или единственный, и FALSE – в противном случае. При установке флага Final == TRUE, состояние усложнения ключа возвращается в первоначальное, а начальное значение синхропосылки устанавливается в случайное значение.
dwFlags
[in] Значения флагов. Параметр определяет способ обработки фрагмента данных в потоке. Нулевое значение соответствует шифрованию фрагмента данных потока, ненулевое значение соответствует обработке пакета данных. См. Шифрование и хэширование пакета .
pbData
[in/out] Если значение dwFlags нулевое, указатель на буфер, содержащий данные для расшифрования. Если установлен флаг CP_CRYPT_HASH_PACKET указатель на буфер, содержащий пакет. См. Шифрование и хэширование пакета . Если установлены флаги CP_CRYPT_HASH_PACKET и CP_CRYPT_DATA_IOVEC, указатель на массив структур CSP_iovec, определяющий пакет. См. Вектор ввода вывода . После расшифрования открытые данные помещаются в этот же буфер или передаются через массив структур CSP_iovec. Если установлены флаги CP_CRYPT_HASH_PACKET и CP_CHP_MULTIPACKET, указатель на массив структур CSP_Multipacket_DEC, задающий массив пакетов для параллельной обработки на платформах, поддерживающих SIMD архитектуру SSSE3, AVX. См. Мультипакетная обработка .
pdwDataLen
[in/out] Если значение dwFlags нулевое, указатель на буфер, содержащий длину данных. Параметр pdwDataLen определяет число байтов шифртекста в буфере pbData. Через этот параметр функция возвращает указатель на число байтов открытого текста, помещённого в буфер pbData. Если установлен флаг CP_CRYPT_HASH_PACKET, размер буфера pbData в байтах. Если установлены флаги CP_CRYPT_HASH_PACKET и CP_CRYPT_DATA_IOVEC, передаётся число элементов массива CSP_iovec. Если установлены флаги CP_CRYPT_HASH_PACKET и CP_CHP_STARTMIX, по указателю pdwDataLen передаётся длина пакета включая блоб диверсификации ключей. Если установлены флаги CP_CRYPT_HASH_PACKET,CP_CRYPT_DATA_IOVEC и CP_CHP_STARTMIX, по указателю pdwDataLen передаётся число элементов вектора включая блоб диверсификации ключей (в этом варианте использования, блоб диверсификации должен передаваться отдельным первым элементом). Если установлены флаги CP_CRYPT_HASH_PACKET и CP_CHP_MULTIPACKET, указатель на число структур CSP_Multipacket_DEC.

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

При успешном завершении функция возвращает 0 (S_OK), в противном случае возвращается соответствующий код ошибки (см. таблицу).
Коды возвратаОписание
ERROR_INVALID_PARAMETERОдин из параметров содержит некорректное значение. Чаще всего это некорректный указатель.
NTE_BAD_ALGIDПараметр AlgId определяет алгоритм, который не поддерживается криптопровайдером.
NTE_BAD_FLAGSВеличина dwFlags имеет некорректное значение, например, ненулевое значение при неустановленном флаге CP_CRYPT_HASH_PACKET.
NTE_BAD_DATAДанные для расшифрования недействительны. В частности, в блочных режимах шифрования, если Final = FALSE, а длина шифртекста не кратна длине блока шифрования, возвращается данная ошибка. Эта ошибка также возвращается в блочных режимах шифрования, если используется дополнение (паддинг) PKCS#5, ISO 10126 или ANSI X.923, Final = TRUE, а дополнение блока не удовлетворяет условиям соответствующего дополнения. При шифровании пакета - ошибка формирования пакета.
NTE_BAD_LENРазмер буфера недостаточен для полученного открытого текста.
NTE_PERMПраво расшифрования на данном ключе криптопровайдером не предоставлено.
NTE_BAD_KEYКлюч недействителен.
NTE_BAD_HASHДескриптор хэша ошибочен. А также при расшифровании пакета с флагами CP_CHP_HASH_CHAIN, либо CP_CHP_HASH_PACKET рассчитанное значение хэш-функции не совпало со значением, полученным из пакета.
ERROR_FUNCTION_FAILEDнет лицензии, дающей право на выполнение функции расшифрования
NTE_FAILНарушение целостности ключей в ОЗУ. см. Дополнительные параметры и определения .

Примечания

Расшифрование в AEAD-режиме (CRYPT_MODE_MGM) может осуществляться следующим образом. При работе с потоком данных (параметр dwFlags = 0) непосредственно расшифрование производится обычным образом. Обработка дополнительных нешифруемых данных осуществляется путём вызова функции CPCSetKeyParam() с параметром KP_AUTH_DATA. Тэг аутентификации может быть проверен путём вызова функции CPCSetKeyParam() с параметром KP_AUTH_TAG.

	    
 CRYPT_DATA_BLOB cdbAuthTag;
 CRYPT_DATA_BLOB cdbAdditionalData;
 CPCSetKeyParam(hCSP, hProv, hKey, KP_AUTH_DATA, (BYTE*)&cdbAdditionalData, 0);
 CPCDecrypt(hCSP, hProv, hKey, 0, TRUE, 0, pbData, &dwLen);
 CPCSetKeyParam(hCSP, hProv, hKey, KP_AUTH_TAG, (BYTE*)&cdbAuthTag, 0);
	

При наличии дополнительных нешифруемых данных и отсутствии расшифровываемых данных тэг аутентификации может быть финализирован и получен путём вызова функции CPCGetKeyParam() с параметром KP_AUTH_TAG.

	    
 CRYPT_DATA_BLOB cdbAdditionalData;
 CPCSetKeyParam(hCSP, hProv, hKey, KP_AUTH_DATA, (BYTE*)&cdbAdditionalData, 0);
 CPCGetKeyParam(hCSP, hProv, hKey, KP_AUTH_TAG, pbAuthTag, &cbAuthTag, 0);
	

Работа в пакетном режиме поддерживается как с линейными пакетами, так и через IOVEC'и. И обработка дополнительных данных, и непосредственно расшифрование, и проверка тэга аутентификации производятся единым вызовом CPCDecrypt(). Дополнительные данные должны располагаться в начале пакета, затем следует шифртекст, за которым должен находиться тэг аутентификации.

	    
 DWORD dwBlockLen; // Длиня тэга аутентификации.
 DWORD dwAddAuthDataLen; // Длина дополнительных данных.
 DWORD dwBaseFlags = BASE_AEAD_FLAGS | CP_CHP_HASH_ENCRYPT; // допускается и CP_CHP_ENCRYPT_HASH;
 DWORD dwFlags = CP_CHP(dwBaseFlags, dwAddAuthDataLen, 0, dwBlockLen / sizeof(DWORD))
 CPCDecrypt(hCSP, hProv, hKey, dwFlags, TRUE, 0, pbData, &dwLen);
	

Требования:

Ядро AIX: 6/7.
Ядро FreeBSD: 11/12.
Ядро Linux: 2.6.x и выше.
Ядро Solaris: 10/11.
Ядро Windows: 7/8/8.1/10, Server 2008/2008R2/2012/2012R2/2016/2019.

См. также

CPCEncrypt() ,CPCGenKey() ,CPDecrypt в MS CSP World Wide Web link ,CryptDecrypt в MS CryptoAPI 2.0 World Wide Web link