Функция
CPDecrypt() расшифровывает данные, предварительно зашифрованные функцией
CPEncrypt(). Одновременно может быть произведено хэширование данных.
BOOL WINAPI CPDecrypt(
HCRYPTPROV hProv,
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE * pbData,
DWORD * pdwDataLen
);
Аргументы
- hProv
- [in] Дескриптор криптопровайдера. Получается при помощи функции CPAcquireContext().
- hKey
- [in] Дескриптор сессионного ключа, используемого для расшифрования данных. Недопустимо использование одного ключа в многопоточной обработке. Для организации многопоточной обработки необходимо размножать ключ с использованием функции CPCDuplicateKey().
- 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 архитектуру SSE_x, SSSE_x, 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.
Возвращаемые значения
При успешном завершении функция возвращает TRUE, в противном случае возвращается FALSE. Если возвращается FALSE, соответствующий код ошибки (см. таблицу) может быть получен через функцию GetLastError().
Коды возврата | Описание |
---|
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 | Нарушение целостности ключей в ОЗУ. см. Дополнительные параметры и определения . |
Требования:
AIX: 5/6/7 или выше.
FreeBSD: 7/8/9 или выше.
Linux: LSB 3.1 (RHEL 4, SuSE 10) или выше.
Solaris: 10 или выше.
Mac OSX: 10.7/8 или выше.
iOS: 6/7 или выше.
Windows 2000 или выше: Необходимо Windows 2000 SP4 или старше с Internet Explorer 6.0 или старше.
Файл описания: Прототип описан в файле wincsp.h.
Ядро ОС: Вместо неё используется аналогичная функция CPCDecrypt .
См. также
CPEncrypt() ,CPGenKey() ,CPDecrypt в MS CSP ,CryptDecrypt в MS CryptoAPI 2.0