Процедура кодирования и декодирования сообщений
Ниже приведена процедура кодирования общего сообщения.
Кодирование сообщения
- Инициализировать соответствующие структуры данных для требуемого типа данных.
- Вызов 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 Explorer версии 3.0, предоставляется параметр dwMsgType. Подписанные данные, созданные в Internet Explorer 3.0, не содержат сведения о заголовке. Таким образом, если такое сообщение извлекается из подписей файлов, тип сообщения должен быть передан в функцию. Если в параметр dwMsgType передается ноль, функция считывает тип сообщения из заголовка. Если заголовок отсутствует, вызов функции завершится ошибкой. В случае успешного выполнения возвращается дескриптор открытого сообщения.
- Вызовите CryptMsgUpdate один раз. Это означает, что в зависимости от типа сообщения будут применены соответствующие действия.
- Для дополнительной обработки сообщения, например дополнительной расшифровки или проверки подписи, вызовите CryptMsgControl, передав требуемое действие в dwCtrlType.
- Вызовите CryptMsgGetParam, чтобы получить указатель на нужные параметры, например содержимое. Чтобы декодировать простые общие данные, используйте CMSG_CONTENT_PARAM для параметра dwParamtype.
- Вызовите CryptMsgClose, чтобы закрыть сообщение.
Пример, реализующий эти действия, см. в разделе Пример программы C: кодировка и декодирование данных. Процедуры и пример, демонстрирующий процесс кодирования, декодирования и проверки подписи подписанного сообщения, см. в разделе Пример программы C: подпись, кодировка, декодирование и проверкасообщения.