Поделиться через


Функция CryptDecodeObject (wincrypt.h)

Функция CryptDecodeObject декодирует структуру типа, указанного параметром lpszStructType . Рекомендуется использовать CryptDecodeObjectEx в качестве API, который выполняет ту же функцию со значительными улучшениями производительности.

Синтаксис

BOOL CryptDecodeObject(
  [in]      DWORD      dwCertEncodingType,
  [in]      LPCSTR     lpszStructType,
  [in]      const BYTE *pbEncoded,
  [in]      DWORD      cbEncoded,
  [in]      DWORD      dwFlags,
  [out]     void       *pvStructInfo,
  [in, out] DWORD      *pcbStructInfo
);

Параметры

[in] dwCertEncodingType

Тип используемой кодировки. Всегда допустимо указывать типы кодирования сертификатов и сообщений, объединяя их с побитовой операцией ИЛИ , как показано в следующем примере:

X509_ASN_ENCODING | PKCS_7_ASN_ENCODING

В настоящее время определены следующие типы кодирования:

  • X509_ASN_ENCODING
  • PKCS_7_ASN_ENCODING
Примечание Требуется сертификат или тип кодирования сообщения . X509_ASN_ENCODING используется по умолчанию. Если указан этот тип, он используется. В противном случае, если указан тип PKCS7_ASN_ENCODING, он используется.
 

[in] lpszStructType

Указатель на объект OID, определяющий тип структуры. Если слово высокого порядка параметра lpszStructType равно нулю, слово низкого порядка задает целочисленный идентификатор для типа указанной структуры. В противном случае этот параметр является длинным указателем на строку, завершаемую null.

Дополнительные сведения о строках идентификаторов объектов, их предопределенных константах и соответствующих структурах см. в разделе Константы для CryptEncodeObject и CryptDecodeObject.

[in] pbEncoded

Указатель на декодируемую закодированную структуру.

[in] cbEncoded

Число байтов, на которые указывает pbEncoded.

[in] dwFlags

Определены следующие флаги. Их можно объединить с побитовой операцией ИЛИ .

Значение Значение
CRYPT_DECODE_NOCOPY_FLAG
Этот флаг можно установить, чтобы указать, что оптимизация "без копирования" включена. Эта оптимизация, где это применимо, обновляет параметр pvStructInfo , указывая на содержимое, размещенное в pbEncoded , а не делает копию содержимого и добавляет его в pvStructInfo. В применимых случаях вызывающему приложению требуется выделить меньше памяти, и выполнение выполняется быстрее, так как копирование не выполняется. Обратите внимание, что компромисс при выполнении декодирования "без копирования" заключается в том, что pbEncoded не может быть освобожден до освобождения pvStructInfo .
CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG
Этот флаг применим при декодировании X509_UNICODE_NAME, X509_UNICODE_NAME_VALUE или X509_UNICODE_ANY_STRING. По умолчанию CERT_RDN_T61_STRING закодированные значения изначально декодируются как UTF8. Если декодирование UTF8 завершается сбоем, значение декодируется как восьмибитовые символы. Если этот флаг установлен, он пропускает начальную попытку декодировать значение как UTF8 и декодирует значение в виде восьми битовых символов.
CRYPT_DECODE_TO_BE_SIGNED_FLAG
По умолчанию содержимое буфера, на который указывает pbEncoded, включало подписанное содержимое и подпись. Если этот флаг установлен, буфер содержит только содержимое "для подписи". Этот флаг применим к объектам X509_CERT_TO_BE_SIGNED, X509_CERT_CRL_TO_BE_SIGNED, X509_CRT_REQUEST_TO_BE_SIGNED и X509_KEYGEN_REQUEST_TO_BE_SIGNED.
CRYPT_DECODE_SHARE_OID_STRING_FLAG
Если этот флаг установлен, строки OID выделяются в Crypt32.dll и совместно используются вместо копирования в возвращаемую структуру данных. Этот флаг можно установить, если Crypt32.dll не выгружается до выгрузки вызывающего объекта.
CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG
По умолчанию байты подписи отменяются. Если этот флаг установлен, этот разворот байтов блокируется.

[out] pvStructInfo

Указатель на буфер для получения декодированных структур. Если указанный буфер недостаточно велик для получения декодированных структур, функция задает код ERROR_MORE_DATA и сохраняет требуемый размер буфера в байтах в переменной, на которую указывает pcbStructInfo.

Этот параметр может иметь значение NULL , чтобы получить размер этих сведений для целей выделения памяти. Дополнительные сведения см. в разделе Извлечение данных неизвестной длины.

[in, out] pcbStructInfo

Указатель на значение DWORD , указывающее размер (в байтах) буфера, на который указывает параметр pvStructInfo . При возврате функции это значение DWORD содержит размер декодированных данных, скопированных в pvStructInfo. Размер, содержащийся в переменной, на которую указывает pcbStructInfo , может указывать на размер, превышающий декодированную структуру, так как декодированная структура может включать указатели на другие структуры. Этот размер представляет собой сумму размера, необходимого декодированной структуре и другим структурам, на которые указывает.

Примечание При обработке данных, возвращаемых в буфере, приложения должны использовать фактический размер возвращаемых данных. Фактический размер может быть немного меньше размера буфера, указанного во входных данных. (На входных данных размеры буфера обычно указываются достаточно большими, чтобы убедиться, что максимально возможные выходные данные помещаются в буфер.) В выходных данных переменная, на которую указывает этот параметр, обновляется с учетом фактического размера данных, скопированных в буфер.
 

Возвращаемое значение

Если функция выполнена успешно, возвращается ненулевое значение (TRUE).

Если функция завершается сбоем, возвращаемое значение равно нулю (FALSE). Чтобы получить дополнительные сведения об ошибке, вызовите Метод GetLastError. Некоторые возможные коды ошибок перечислены в следующей таблице.

Код возврата Описание
CRYPT_E_BAD_ENCODE
Во время декодирования произошла ошибка.
ERROR_FILE_NOT_FOUND
Не удалось найти функцию декодирования для указанных dwCertEncodingType и lpszStructType.
ERROR_MORE_DATA
Если буфер, заданный параметром pvStructInfo , недостаточно велик для хранения возвращаемых данных, функция задает код ERROR_MORE_DATA и сохраняет требуемый размер буфера в байтах в переменной, на которую указывает pcbStructInfo.
 

В случае сбоя функции GetLastError может вернуть ошибку кодирования и декодирования абстрактного синтаксиса (ASN.1). Сведения об этих ошибках см. в разделе Кодирование и декодирование возвращаемых значений ASN.1.

Комментарии

При кодировании криптографического объекта с помощью предпочтительной функции CryptEncodeObjectEx включается завершающий символ NULL . При декодировании с помощью предпочтительной функции CryptDecodeObjectEx завершающий символ NULL не сохраняется.

Примеры

Пример использования этой функции см. в разделе Пример программы C: кодирование и декодирование ASN.1.

Требования

   
Минимальная версия клиента Windows XP [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header wincrypt.h
Библиотека Crypt32.lib
DLL Crypt32.dll

См. также раздел

CryptDecodeObjectEx

CryptEncodeObject

Функции кодирования и декодирования объектов