DWORD CPCAPI CPCEncrypt( HCRYPTMODULE hCSP, HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE * pbData, DWORD * pdwDataLen, DWORD dwBufLen );
Коды возврата | Описание |
---|---|
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 | Нарушение целостности ключей в ОЗУ. см. Дополнительные параметры и определения . |
Шифрование в AEAD-режиме (CRYPT_MODE_MGM) может осуществляться следующим образом. При работе с потоком данных (параметр dwFlags = 0) непосредственно шифрование производится обычным образом. Обработка дополнительных нешифруемых данных осуществляется путём вызова функции CPCSetKeyParam() с параметром KP_AUTH_DATA. Тэг аутентификации может быть получен путём вызова функции CPCGetKeyParam() с параметром KP_AUTH_TAG.
CRYPT_DATA_BLOB cdbAdditionalData; CPCSetKeyParam(hCSP, hProv, hKey, KP_AUTH_DATA, (BYTE*)&cdbAdditionalData, 0); CPCEncrypt(hCSP, hProv, hKey, 0, TRUE, 0, pbData, &dwDataLen, dwBufLen); CPCGetKeyParam(hCSP, hProv, hKey, KP_AUTH_TAG, pbAuthTag, &cbAuthTag, 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'и. И обработка дополнительных данных, и непосредственно шифрование, и получение тэга аутентификации производятся единым вызовом CPCEncrypt(). Дополнительные данные должны располагаться в начале пакета, затем следует открытый текст, за которым должно находиться место для тэга аутентификации.
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)) CPCEncrypt(hCSP, hProv, hKey, dwFlags, TRUE, 0, pbData, *pdwDataLen, dwBufLen);
Ядро 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.
CPCDecrypt() ,CPCGenKey() ,CPEncrypt в MS CSP ,CryptEncrypt в MS CryptoAPI 2.0