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


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

Ниже приведена процедура кодирования общего сообщения.

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

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

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