Декодирование обернутых данных
Общие задачи, необходимые для декодирования конвертированного сообщения, показаны на следующем рисунке и описаны в списке, который следует за ним.
Последовательность действий для декодирования закрытых данных с помощью управления ключами при их транспортировке, как показано на предыдущем рисунке, следующим образом:
- Извлекается указатель на цифрово обёрнутое сообщение.
- Хранилище сертификатов открыто.
- Из сообщения извлекается идентификатор получателя (мой идентификатор).
- Идентификатор получателя используется для получения сертификата.
- Закрытый ключ , связанный с этим сертификатом, извлекается.
- Закрытый ключ используется для расшифровки симметричного(сеанса) ключа.
- Алгоритм шифрования извлекается из сообщения.
- С помощью закрытого ключа и алгоритма шифрования данные расшифровываются.
Следующая процедура использует функции сообщения низкого уровня для выполнения только что перечисленных задач.
Расшифровка обернутого сообщения
- Получите указатель на закодированный BLOB-объект.
- Вызов CryptMsgOpenToDecode, передав необходимые аргументы.
- Вызовите CryptMsgUpdate один раз, передав дескриптор, полученный на шаге 2, и указатель на данные, которые необходимо декодировать. Это приводит к тому, что в зависимости от типа сообщения принимаются соответствующие меры в отношении сообщения.
- Вызовите CryptMsgGetParam, передав дескриптор, полученный на шаге 2 и CMSG_TYPE_PARAM, чтобы убедиться, что сообщение имеет тип данных конверта.
- Снова вызовите CryptMsgGetParam, передав CMSG_INNER_CONTENT_TYPE_PARAM, чтобы определить тип данных для внутреннего содержимого .
- Если внутренний тип данных контента данных, перейдите к расшифровке и декодированию содержимого. В противном случае выполните процедуру декодирования, соответствующую типу данных контента.
- Предполагая, что внутренний тип контента — "data", инициализировать структуру данных CMSG_CTRL_DECRYPT_PARA, затем вызвать CryptMsgControl, передавая CMSG_CTRL_DECRYPT и адрес структуры. Содержимое будет расшифровывается.
- Вызовите CryptMsgGetParam, передавая CMSG_CONTENT_PARAM, чтобы получить указатель на декодированные данные содержимого BLOB (строку типа BYTE).
- Вызовите CryptMsgClose, чтобы закрыть сообщение.
Результатом этой процедуры является то, что сообщение декодируется и расшифровывается, а указатель извлекается на BLOB-объект содержимого.