Функция
CPCEncrypt() производит зашифрование данных. Одновременно может быть произведено их хэширование.
DWORD CPCAPI CPCEncrypt(
HCRYPTMODULE hCSP,
HCRYPTPROV hProv,
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE * pbData,
DWORD * pdwDataLen,
DWORD dwBufLen
);
Аргументы
- hCSP
- [in] Указатель на таблицу функций криптопровайдера. Получается при помощи функции CPCCreateProvider()
- hProv
- [in] Дескриптор криптопровайдера. Получается при помощи функции CPCAcquireContext().
- 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_ENC, задающий массив пакетов для параллельной обработки на платформах, поддерживающих SIMD архитектуру SSSE3, AVX. См. Мультипакетная обработка .
- pdwDataLen
- [in/out] Если значение dwFlags нулевое, указатель на буфер, содержащий длину данных. Параметр dwDataLen определяет число байтов открытого текста в буфере pbData. Через этот параметр функция возвращает указатель на число байтов шифртекста, помещённого в буфер pbData. Если установлен флаг CP_CRYPT_HASH_PACKET, указатель на буфер, содержащий длину пакета. Если установлены флаги 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_ENC.
- dwBufLen
- [in] Если значение dwFlags нулевое, размер буфера pbData в байтах при условии возможности помещения в буфер зашифрованных данных. Если установлен флаг CP_CRYPT_HASH_PACKET, размер буфера pbData в байтах. Если установлены флаги CP_CRYPT_HASH_PACKET и CP_CRYPT_DATA_IOVEC, число элементов массива CSP_iovec. Если установлены флаги CP_CRYPT_HASH_PACKET, CP_CHP_MULTIPACKET, данный параметр должен иметь нулевое значение.
Возвращаемые значения
При успешном завершении функция возвращает 0 (S_OK), в противном случае возвращается соответствующий код ошибки (см. таблицу).
Коды возврата | Описание |
---|
ERROR_INVALID_PARAMETER | Один из параметров содержит некорректное значение. Чаще всего это некорректный указатель. |
NTE_BAD_ALGID | Ключ hKey определяет алгоритм, который данный криптопровайдер не поддерживает. |
NTE_BAD_FLAGS | Величина dwFlags имеет некорректное значение, например, ненулевое значение при неустановленном флаге CP_CRYPT_HASH_PACKET. |
NTE_BAD_DATA | Данные для зашифрования недействительны. В частности, в блочных режимах шифрования, если Final = FALSE, а длина шифруемого текста не кратна длине блока шифрования, возвращается данная ошибка. При шифровании пакета - ошибка формирования пакета. |
NTE_BAD_KEY | Ключ недействителен. В частности, эта ошибка возвращается, если на ключе в состоянии CRYPT_SIMPLEMIX_MODE зашифровано более 4-x мегабайт текста. |
NTE_BAD_HASH | Дескриптор хэша ошибочен. |
NTE_BAD_LEN | Размер буфера недостаточен для помещения в него шифртекста. Если установлены флаги CP_CRYPT_HASH_PACKET,CP_CRYPT_DATA_IOVEC - длина, передаваемая в dwDataLen не совпадает с суммой длин координат IOVEC. |
NTE_PERM | Право зашифрования на данном ключе криптопровайдером не предоставлено. |
ERROR_FUNCTION_FAILED | нет лицензии, дающей право на выполнение функции шифрования |
NTE_FAIL | Нарушение целостности ключей в ОЗУ. см. Дополнительные параметры и определения . |
Требования:
Ядро FreeBSD: 7/8/9 или выше
Ядро Linux: ядро 2.4.x/2.6.x/3.0.х/3.2.х или выше
Ядро Solaris: 10/11 или выше.
Ядро Windows 2000 или выше: Необходимо Windows 2000 SP4 или старше.
См. также
CPCDecrypt() ,CPCGenKey() ,CPEncrypt в MS CSP ,CryptEncrypt в MS CryptoAPI 2.0