КриптоПро CSP  

CPDecrypt

Функция 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 World Wide Web link ,CryptDecrypt в MS CryptoAPI 2.0 World Wide Web link