Функция
CPCExportKey() используется для экспорта криптографических ключей из ключевого контейнера криптопровайдера, сохраняя их в защищённом виде.
DWORD CPCAPI CPCExportKey(
HCRYPTMODULE hCSP,
HCRYPTPROV hProv,
HCRYPTKEY hKey,
HCRYPTKEY hExpKey,
DWORD dwBlobType,
DWORD dwFlags,
BYTE * pbData,
DWORD * pdwDataLen
);
Аргументы
- hCSP
- [in] Указатель на таблицу функций криптопровайдера. Получается при помощи функции CPCCreateProvider()
- hProv
- [in] Дескриптор криптопровайдера. Получается при помощи функции CPCAcquireContext().
- hKey
- [in] Дескриптор экспортируемого ключа.
- hExpKey
- [in] Дескриптор ключа, на котором осуществляется криптографическая защита экспортируемого ключа. Необходимо, чтобы этот ключ был общим с получателем корреспонденции. Зашифрованные данные ключа помещаются в ключевой блоб, предназначенный для внешнего хранения и передачи по каналам связи. Алгоритмы функции экспорта ключей гарантируют, что только пользователь предназначения сможет использовать этот ключевой блоб. Для защиты ключа используется алгоритм, указанный при создании ключа экспорта. Если ключевой блоб не будет зашифрован (например, если тип ключевого блоба - PUBLICKEYBLOB), этот параметр должен быть нулевым.
- dwBlobType
- [in] Тип ключевого блоба, предназначенного для экспорта ключа. В настоящее время определены три типа ключевых блобов:
Тип | Использование |
SIMPLEBLOB | Используется для транспортировки симметричных ключей CALG_G28147, CALG_UECSYMMETRIC. pbData указывает на структуру CRYPT_SIMPLEBLOB . |
OPAQUEKEYBLOB | Используется для транспортировки ключа сессии с накопленным состоянием. pbData указывает на структуру CRYPT_OPAQUEBLOB . |
PUBLICKEYBLOB | Используется для транспортировки открытых ключей. pbData указывает на структуру CRYPT_PUBLICKEYBLOB . |
PRIVATEKEYBLOB | Используется для транспортировки закрытых ключей). pbData указывает на структуру CRYPT_PRIVATEKEYBLOB . |
- dwFlags
- [in] Значения флагов. Должен быть нулевым во всех случаях за исключеием экспорта ключевой пары в PUBLICKEYBLOB. В последнем случае, если dwFlags = 0, отрытый ключ в PUBLICKEYBLOB представляется координатами (x,y) точки эллиптической кривой, длина блоба 100 байт, а при dwFlags = CRYPT_PUBLICCOMPRESS - парой (x,b), де байт b равен 2, если координата y чётная и 3 в противном случае, длина блоба 69 байт.
- pbData
- [in] Указатель на буфер данных, в который функция копирует ключевой блоб. Если значение этого параметра NULL, функция устанавливает по адресу pdwDataLen значение необходимой длины буфера и возвращает TRUE.
- pdwDataLen
- [in/out] Указатель на буфер, содержащий длину ключевого блоба. При вызове функции указанный параметр содержит число байтов в буфере pbData. После выполнения функции параметр будет установлен числом байтов данных, скопированных в буфер pbData. Если буфер, соответствующий pbData, недостаточно большой, будет возвращён код ошибки ERROR_MORE_DATA через функцию SetLastError(). В этом случае требуемый размер буфера возвращается в pdwDataLen. Если эта функция завершается с кодом ошибки, отличным от ERROR_MORE_DATA, в этом параметре возвращается ноль.
Возвращаемые значения
При успешном завершении функция возвращает 0 (S_OK), в противном случае возвращается соответствующий код ошибки (см. таблицу).
Коды возврата | Описание |
---|
ERROR_INVALID_PARAMETER | Один из параметров содержит некорректное значение. Чаще всего это некорректный указатель. |
ERROR_MORE_DATA | Буфер pbData недостаточно большой, чтобы копировать затребованные данные. |
NTE_BAD_FLAGS | Величина dwFlags имеет ненулевое значение. |
NTE_BAD_KEY | Один или оба из ключей, указанных hKey и hExpKey, не действительны. |
NTE_BAD_KEY_STATE | Попытка экспорта ключа, когда право экспорта криптопровайдером не предоставлено; попытка экспорта на ключе, для которого разрешение экспортировать не установлено. |
NTE_BAD_TYPE | dwBlobType параметр определяет неизвестный тип блоба. |
NTE_NO_MEMORY | Криптопровайдер во время операции исчерпал память. |
NTE_FAIL | Ошибка при считывании данных из системного реестра. см. Дополнительные параметры и определения . |
SCARD_W_CANCELLED_BY_USER | Пользователь прервал операцию. |
Примечания
PUBLICKEYBLOB длины 69 байт в настоящее время не может использоваться в составе сертификата открытого ключа. Блобы данного вида критичны к искажениям, поэтому должны использоваться в приложениях с контролем целостности.
Требования:
Ядро FreeBSD: 7/8/9 или выше
Ядро Linux: ядро 2.4.x/2.6.x/3.0.х/3.2.х или выше
Ядро Solaris: 10/11 или выше.
Ядро Windows 2000/XP/2003/Vista/2008/7: Необходимо Windows 2000 SP4 или старше.
Ядро ОС: Поддерживается только типы SIMPLEBLOB и OPAQUEKEYBLOB.
См. также
CRYPT_SIMPLEBLOB ,CRYPT_OPAQUEBLOB ,CPCImportKey() ,CPExportKey в MS CSP ,CryptExportKey в MS CryptoAPI 2.0