Share via


structure CMSG_STREAM_INFO (wincrypt.h)

La structure CMSG_STREAM_INFO est utilisée pour activer le traitement de flux de données plutôt que le traitement d’un seul bloc. Stream traitement est le plus souvent utilisé lors du traitement de messages volumineux. Stream messages traités peuvent provenir de n’importe quelle source sérialisée telle qu’un fichier sur un disque dur, un serveur ou un CD-ROM.

Cette structure est transmise aux fonctions CryptMsgOpenToEncode et CryptMsgOpenToDecode .

Syntaxe

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

Membres

cbContent

Spécifie la taille, en octets, du contenu. L’encodage de Distinguished Encoding Rules normal (DER) est utilisé, sauf si CMSG_INDEFINITE_LENGTH(0xFFFFFFFF) est passé, ce qui indique que l’application ne spécifie pas la longueur du contenu. Cela force l’utilisation de l’encodage BER ( Basic Encoding Rules ) de longueur indéfinie.

pfnStreamOutput

Adresse d’une fonction de rappel utilisée pour lire et écrire des données sur un disque lors du traitement de messages volumineux.

La fonction de rappel doit avoir la signature et les paramètres suivants :

#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
);

Valeur Signification
pvArg
Arguments spécifiés par CMSG_STREAM_INFO.
pbData
Pointeur vers un bloc de données traitées qui est disponible pour l’application.
cbData
Taille, en octets, du bloc de données traitées sur pbData.
fFinal
Spécifie que le dernier bloc de données est en cours de traitement et qu’il s’agit de la dernière fois que le rappel sera exécuté.

pvArg

Pointeur vers l’argument à passer à la fonction de rappel. En règle générale, cela est utilisé pour les données d’état qui incluent le handle vers un message imbriqué plus profondément (lors du décodage) ou un message moins profondément imbriqué (lors de l’encodage).

Remarques

Les messages peuvent être si volumineux qu’il peut être difficile, voire impossible, de les traiter en même temps en stockant l’ensemble du message en mémoire. Il est possible de traiter des messages volumineux sans rencontrer de limitations de mémoire en continuant les données qui doivent être traitées dans des blocs de taille gérable. Les fonctions de message de bas niveau peuvent être utilisées avec le streaming pour encoder ou décoder un message. N’importe quel niveau d’imbrication des messages est pris en charge lors de la diffusion en continu à encoder et de la diffusion en continu à décoder.

Le message d’entrée à traiter en tant que flux est envoyé dans CryptMsgUpdate un bloc à la fois, l’application déterminant la taille du bloc. Lorsque le message diffusé en continu est traité pour l’encodage ou le décodage, les données de sortie obtenues sont transmises à l’application via une fonction de rappel spécifiée par l’application spécifiée par le membre pfnStreamOutput .

Aucune hypothèse ne peut être faite concernant la taille de bloc des données de sortie, car la taille peut varier pour plusieurs raisons, telles que la gigue dans la taille du bloc de sortie provoquée par la taille de bloc pour l’algorithme de chiffrement lors du traitement d’un message enveloppe, ou lorsque les blocs qui contiennent l’en-tête du message et signerInfo tel que défini par PKCS #7 sont traités.

La taille du bloc de sortie est passée à la fonction de rappel dans son paramètre cbData . L’utilisation des données de sortie est déterminée dans l’application appelante. En règle générale, la sortie du traitement de flux ne sera pas conservée dans la mémoire dans son ensemble en raison de limitations de mémoire ; au lieu de cela, il sera sérialisé dans un fichier de disque ou de serveur.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau uniquement]
En-tête wincrypt.h