BOOL WINAPI CPDecrypt( HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE * pbData, DWORD * pdwDataLen );
Коды возврата | Описание |
---|---|
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 рассчитанное значение хэш-функции не совпало со значением, полученным из пакета. |
NTE_FAIL | Нарушение целостности ключей в ОЗУ. см. Дополнительные параметры и определения . |
Расшифрование в AEAD-режиме (CRYPT_MODE_MGM) может осуществляться следующим образом. При работе с потоком данных (параметр dwFlags = 0) непосредственно расшифрование производится обычным образом. Обработка дополнительных нешифруемых данных осуществляется путём вызова функции CPSetKeyParam() с параметром KP_AUTH_DATA. Тэг аутентификации может быть проверен путём вызова функции CPSetKeyParam() с параметром KP_AUTH_TAG.
CRYPT_DATA_BLOB cdbAuthTag; CRYPT_DATA_BLOB cdbAdditionalData; CPSetKeyParam(hProv, hKey, KP_AUTH_DATA, (BYTE*)&cdbAdditionalData, 0); CPDecrypt(hProv, hKey, 0, TRUE, 0, pbData, &dwLen); CPSetKeyParam(hProv, hKey, KP_AUTH_TAG, (BYTE*)&cdbAuthTag, 0);
При наличии дополнительных нешифруемых данных и отсутствии расшифровываемых данных тэг аутентификации может быть финализирован и получен путём вызова функции CPGetKeyParam() с параметром KP_AUTH_TAG.
CRYPT_DATA_BLOB cdbAdditionalData; CPSetKeyParam(hCSP, hProv, hKey, KP_AUTH_DATA, (BYTE*)&cdbAdditionalData, 0); CPGetKeyParam(hCSP, hProv, hKey, KP_AUTH_TAG, pbAuthTag, &cbAuthTag, 0);
Работа в пакетном режиме поддерживается как с линейными пакетами, так и через IOVEC'и. И обработка дополнительных данных, и непосредственно расшифрование, и проверка тэга аутентификации производятся единым вызовом CPDecrypt(). Дополнительные данные должны располагаться в начале пакета, затем следует шифртекст, за которым должен находиться тэг аутентификации.
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)) CPDecrypt(hProv, hKey, dwFlags, TRUE, 0, pbData, &dwLen);
AIX: 6/7.
FreeBSD: 11/12, pfSense 2.x.
Linux: LSB 4.x (RHEL 5/6/7/8, SuSE 11SP4/12/15, Oracle Linux 5/6/7/8, CentOS 6/7/8, Ubuntu 14.04/16.04/18.04/19.10, Linux Mint 18/19, Fedora 28/29/30/31, Debian 8/9/10 и др.).
Solaris: 10/11.
Mac OS X: 10.9/10.10/10.11/10.12/10.13/10.14/10.15.
iOS: 8/9/10/11/12/13.
Sailfish: 2/3.
Windows: 7/8/8.1/10, Server 2008/2008R2/2012/2012R2/2016/2019.
Файл описания: Прототип описан в файле wincsp.h.
Ядро ОС: Вместо неё используется аналогичная функция CPCDecrypt .
CPEncrypt() ,CPGenKey() ,CPDecrypt в MS CSP ,CryptDecrypt в MS CryptoAPI 2.0