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


Процедура кодирования и декодирования сообщений

Процедура кодирования общего сообщения выглядит следующим образом.

Кодирование сообщения

  1. Инициализируйте соответствующие структуры данных для требуемого типа данных.
  2. Вызовите CryptMsgOpenToEncode, передав необходимые аргументы. Если при вызове CryptMsgOpenToEncode данные, которые должны быть предоставлены CryptMsgUpdate , уже были закодированы в кодировке сообщений, передайте соответствующий идентификатор объекта в pszInnerContentObjID (например, "1.2.840.113549.1.7.2" для szOID_RSA_signedData). Если pszInnerContentObjID имеет значение NULL, внутренний тип контента предполагается, что ранее не был закодирован и обрабатывается соответствующим образом.
  3. Вызовите CryptMsgUpdate столько раз, сколько необходимо для завершения сообщения. При последнем вызове задайте для параметра fFinal значение TRUE. (Дополнительные сведения см. в разделе CryptMsgUpdate.
  4. Вызовите CryptMsgGetParam , чтобы получить указатель на нужные параметры, такие как содержимое. Для кодирования простых общих данных используйте CMSG_CONTENT_PARAM для dwParamtype.
  5. Закройте сообщение, вызвав CryptMsgClose.

Эта процедура приводит к закодированному сообщению типа, указанного в вызовах функции.

Процедура декодирования общего сообщения выглядит следующим образом.

Декодирование сообщения

  1. Определите длину буфера для хранения закодированных данных с помощью CryptMsgCalculateEncodedLength.
  2. Вызовите CryptMsgOpenToDecode, передав необходимые аргументы. Для обеспечения совместимости с Internet Обозреватель версии 3.0 предоставляется параметр dwMsgType. Подписанные данные, созданные в Internet Обозреватель 3.0, не содержат сведений о заголовке. Таким образом, если такое сообщение извлекается из сигнатур файлов, тип сообщения необходимо передать в функцию . Если в параметр dwMsgType передается ноль, функция считывает тип сообщения из заголовка сообщения. Если заголовок отсутствует, вызов функции завершится ошибкой. В случае успешного выполнения возвращается дескриптор открытого сообщения.
  3. Вызовите CryptMsgUpdate один раз. Это приводит к выполнению соответствующих действий с сообщением в зависимости от типа сообщения.
  4. Для дополнительной обработки сообщения, например для дополнительной расшифровки или проверки подписи, вызовите CryptMsgControl, передав нужное действие в dwCtrlType.
  5. Вызовите CryptMsgGetParam , чтобы получить указатель на нужные параметры, такие как содержимое. Для декодирования простых общих данных используйте CMSG_CONTENT_PARAM для параметра dwParamtype .
  6. Вызовите CryptMsgClose , чтобы закрыть сообщение.

Пример реализации этих действий см. в разделе Пример программы C: кодирование и декодирование данных. Процедуры и пример, демонстрирующий процесс кодирования, декодирования и проверки подписи подписанного сообщения, см. в разделе Пример программы C: подписывание, кодирование, декодирование и проверка сообщения.