Процедура кодирования и декодирования сообщений
Процедура кодирования общего сообщения выглядит следующим образом.
Кодирование сообщения
- Инициализируйте соответствующие структуры данных для требуемого типа данных.
- Вызовите CryptMsgOpenToEncode, передав необходимые аргументы. Если при вызове CryptMsgOpenToEncode данные, которые должны быть предоставлены CryptMsgUpdate , уже были закодированы в кодировке сообщений, передайте соответствующий идентификатор объекта в pszInnerContentObjID (например, "1.2.840.113549.1.7.2" для szOID_RSA_signedData). Если pszInnerContentObjID имеет значение NULL, внутренний тип контента предполагается, что ранее не был закодирован и обрабатывается соответствующим образом.
- Вызовите CryptMsgUpdate столько раз, сколько необходимо для завершения сообщения. При последнем вызове задайте для параметра fFinal значение TRUE. (Дополнительные сведения см. в разделе CryptMsgUpdate.
- Вызовите CryptMsgGetParam , чтобы получить указатель на нужные параметры, такие как содержимое. Для кодирования простых общих данных используйте CMSG_CONTENT_PARAM для dwParamtype.
- Закройте сообщение, вызвав CryptMsgClose.
Эта процедура приводит к закодированному сообщению типа, указанного в вызовах функции.
Процедура декодирования общего сообщения выглядит следующим образом.
Декодирование сообщения
- Определите длину буфера для хранения закодированных данных с помощью CryptMsgCalculateEncodedLength.
- Вызовите CryptMsgOpenToDecode, передав необходимые аргументы. Для обеспечения совместимости с Internet Обозреватель версии 3.0 предоставляется параметр dwMsgType. Подписанные данные, созданные в Internet Обозреватель 3.0, не содержат сведений о заголовке. Таким образом, если такое сообщение извлекается из сигнатур файлов, тип сообщения необходимо передать в функцию . Если в параметр dwMsgType передается ноль, функция считывает тип сообщения из заголовка сообщения. Если заголовок отсутствует, вызов функции завершится ошибкой. В случае успешного выполнения возвращается дескриптор открытого сообщения.
- Вызовите CryptMsgUpdate один раз. Это приводит к выполнению соответствующих действий с сообщением в зависимости от типа сообщения.
- Для дополнительной обработки сообщения, например для дополнительной расшифровки или проверки подписи, вызовите CryptMsgControl, передав нужное действие в dwCtrlType.
- Вызовите CryptMsgGetParam , чтобы получить указатель на нужные параметры, такие как содержимое. Для декодирования простых общих данных используйте CMSG_CONTENT_PARAM для параметра dwParamtype .
- Вызовите CryptMsgClose , чтобы закрыть сообщение.
Пример реализации этих действий см. в разделе Пример программы C: кодирование и декодирование данных. Процедуры и пример, демонстрирующий процесс кодирования, декодирования и проверки подписи подписанного сообщения, см. в разделе Пример программы C: подписывание, кодирование, декодирование и проверка сообщения.