структура CMSG_STREAM_INFO (wincrypt.h)

Структура CMSG_STREAM_INFO используется для включения потоковой обработки данных, а не одноблочной обработки. Stream обработка чаще всего используется при обработке больших сообщений. Stream сообщения могут поступать из любого сериализованного источника, например файла на жестком диске, сервере или компакт-диске.

Эта структура передается в функции CryptMsgOpenToEncode и CryptMsgOpenToDecode .

Синтаксис

typedef struct _CMSG_STREAM_INFO {
  DWORD                  cbContent;
  PFN_CMSG_STREAM_OUTPUT pfnStreamOutput;
  void                   *pvArg;
} CMSG_STREAM_INFO, *PCMSG_STREAM_INFO;

Члены

cbContent

Указывает размер содержимого (в байтах). Используется обычная кодировка Distinguished Encoding Rules (DER), если не передается CMSG_INDEFINITE_LENGTH(0xFFFFFFFF), что указывает, что в приложении не указана длина содержимого. Это приводит к использованию кодировки BER с бессрочной длиной .

pfnStreamOutput

Адрес функции обратного вызова, используемой для чтения и записи данных на диск при обработке больших сообщений.

Функция обратного вызова должна иметь следующую сигнатуру и параметры:

#include <windows.h>
#include <Wincrypt.h>

BOOL WINAPI CmsgStreamOutputCallback(
  IN const void *pvArg,  //in
  IN BYTE *pbData,       //in
  IN DWORD cbData,       //in
  IN BOOL fFinal         //in
);

Значение Значение
pvArg
Аргументы, указанные CMSG_STREAM_INFO.
pbData
Указатель на блок обработанных данных, доступный приложению.
cbData
Размер блока обработанных данных в байтах в pbData.
fFinal
Указывает, что обрабатывается последний блок данных и что это последний раз, когда будет выполняться обратный вызов.

pvArg

Указатель на аргумент для передачи функции обратного вызова. Как правило, это используется для данных о состоянии, которые включают дескриптор более глубоко вложенного сообщения (при декодировании) или менее глубоко вложенного сообщения (при кодировании).

Комментарии

Сообщения могут быть настолько большими, что обработка их всех одновременно путем сохранения всего сообщения в памяти может быть сложной, если не невозможной. Можно обрабатывать большие сообщения, не сталкиваясь с ограничениями памяти, путем потоковой передачи данных, которые должны быть обработаны в блоки управляемого размера. Низкоуровневые функции сообщений можно использовать с потоковой передачей для кодирования или декодирования сообщения. Любой уровень вложения сообщений поддерживается при потоковой передаче для кодирования и потоковой передачи для декодирования.

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

Нельзя сделать никаких предположений о размере блока выходных данных, так как размер может отличаться по нескольким причинам, например из-за дрожания в размере выходного блока, вызванного размером блока для алгоритма шифрования при обработке конвертированного сообщения или при обработке блоков, содержащих заголовок сообщения и SignerInfo, как определено в PKCS #7.

Размер выходного блока передается в функцию обратного вызова в ее параметре cbData . Использование выходных данных определяется в вызывающем приложении. Как правило, выходные данные потоковой обработки не сохраняются в памяти в целом из-за ограничений памяти; вместо этого он будет сериализован в файл диска или сервера.

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Верхняя часть wincrypt.h