Fonction CryptMsgOpenToEncode (wincrypt.h)

La fonction CryptMsgOpenToEncode ouvre un message de chiffrement pour l’encodage et retourne un handle du message ouvert. Le message reste ouvert jusqu’à ce que CryptMsgClose soit appelé.

Syntaxe

HCRYPTMSG CryptMsgOpenToEncode(
  [in]           DWORD             dwMsgEncodingType,
  [in]           DWORD             dwFlags,
  [in]           DWORD             dwMsgType,
  [in]           void const        *pvMsgEncodeInfo,
  [in, optional] LPSTR             pszInnerContentObjID,
  [in]           PCMSG_STREAM_INFO pStreamInfo
);

Paramètres

[in] dwMsgEncodingType

Spécifie le type d’encodage utilisé. Il est toujours acceptable de spécifier les types d’encodage de certificat et de message en les combinant avec une opération OR au niveau du bit, comme illustré dans l’exemple suivant :

X509_ASN_ENCODING | PKCS_7_ASN_ENCODING

Les types d’encodage actuellement définis sont les suivants :

  • X509_ASN_ENCODING
  • PKCS_7_ASN_ENCODING

[in] dwFlags

Les dwFlags actuellement définis sont indiqués dans le tableau suivant.

Valeur Signification
CMSG_BARE_CONTENT_FLAG
La sortie diffusée en continu n’aura pas de wrapper ContentInfo externe (tel que défini par PKCS #7). Cela le rend approprié pour être diffusé en continu dans un message englobant.
CMSG_DETACHED_FLAG
Des données détachées sont fournies pour les appels suivants à CryptMsgUpdate.
CMSG_AUTHENTICATED_ATTRIBUTES_FLAG
Les attributs authentifiés sont obligés d’être inclus dans SignerInfo (tel que défini par PKCS #7) dans les cas où ils ne seraient pas requis autrement.
CMSG_CONTENTS_OCTETS_FLAG
Utilisé lors du calcul de la taille d’un message qui a été encodé à l’aide de Distinguished Encoding Rules (DER) et qui est imbriqué à l’intérieur d’un message enveloppe. Cela est particulièrement utile lors de la diffusion en continu.
CMSG_CMS_ENCAPSULATED_CONTENT_FLAG
Lorsqu’il est défini, le contenu interne non-type de données est encapsulé dans une chaîne OCTET. Applicable aux messages signés et enveloppes.
CMSG_CRYPT_RELEASE_CONTEXT_FLAG
S’il est défini, le hCryptProv passé à cette fonction est publié sur la dernière version de CryptMsgUpdate. Le handle n’est pas libéré si la fonction échoue.
Note Les hCryptProvdes destinataires de l’enveloppe ne sont pas libérés.
 

[in] dwMsgType

Indique le type de message. Il doit s’agir de l’une des valeurs suivantes.

Valeur Signification
CMSG_DATA
Cette valeur n'est pas utilisée.
CMSG_SIGNED
Le paramètre pvMsgEncodeInfo est l’adresse d’une structure CMSG_SIGNED_ENCODE_INFO qui contient les informations d’encodage.
CMSG_ENVELOPED
Le paramètre pvMsgEncodeInfo est l’adresse d’une structure CMSG_ENVELOPED_ENCODE_INFO qui contient les informations d’encodage.
CMSG_SIGNED_AND_ENVELOPED
Cette valeur n’est actuellement pas implémentée.
CMSG_HASHED
Le paramètre pvMsgEncodeInfo est l’adresse d’une structure CMSG_HASHED_ENCODE_INFO qui contient les informations d’encodage.

[in] pvMsgEncodeInfo

Adresse d’une structure qui contient les informations d’encodage. Le type de données dépend de la valeur du paramètre dwMsgType . Pour plus d’informations, consultez dwMsgType.

[in, optional] pszInnerContentObjID

Si CryptMsgCalculateEncodedLength est appelé et que les données de CryptMsgUpdate ont déjà été encodées par message, l’identificateur d’objet approprié (OID) est passé dans pszInnerContentObjID. Si pszInnerContentObjID a la valeur NULL, le type de contenu interne est supposé ne pas avoir été encodé précédemment et est donc encodé en tant que chaîne d’octets et donné le type CMSG_DATA.

Note Lorsque la diffusion en continu est utilisée, pszInnerContentObjID doit être NULL ou szOID_RSA_data.
 
Les OID d’algorithme suivants sont couramment utilisés. Un utilisateur peut définir une nouvelle utilisation interne du contenu en s’assurant que l’expéditeur et le destinataire du message sont d’accord sur la sémantique associée à l’OID.
  • szOID_RSA_data
  • szOID_RSA_signedData
  • szOID_RSA_envelopedData
  • szOID_RSA_signEnvData
  • szOID_RSA_digestedData
  • szOID_RSA_encryptedData
  • SPC_INDIRECT_DATA_OBJID

[in] pStreamInfo

Lorsque la diffusion en continu est utilisée, ce paramètre est l’adresse d’une structure CMSG_STREAM_INFO . La fonction de rappel spécifiée par le membre pfnStreamOutput de la structure CMSG_STREAM_INFO est appelée lors de l’exécution de CryptMsgUpdate . Le rappel est passé les octets encodés qui résultent de l’encodage. Pour plus d’informations sur l’utilisation du rappel, consultez CMSG_STREAM_INFO.

Note Lorsque la diffusion en continu est utilisée, l’application ne doit pas libérer les handles de données transmis dans le paramètre pvMsgEncodeInfo , tel que le handle de fournisseur dans le membre hCryptProv de la structure CMSG_SIGNER_ENCODE_INFO , tant que le handle de message retourné par cette fonction n’est pas fermé à l’aide de la fonction CryptMsgClose .
 
Lorsque la diffusion en continu n’est pas utilisée, ce paramètre est défini sur NULL.

La diffusion en continu n’est pas utilisée avec le type de message CMSG_HASHED . Lorsque vous traitez des données hachées, ce paramètre doit être défini sur NULL.

Considérez le cas d’un message signé placé dans un message enveloppe. La sortie encodée à partir de l’encodage en continu du message signé est redirigée vers un autre encodage de streaming du message enveloppé. Le rappel pour l’encodage de streaming appelle CryptMsgUpdate pour encoder le message enveloppe. Le rappel du message enveloppé reçoit les octets encodés du message signé imbriqué.

Valeur retournée

Si la fonction réussit, elle retourne un handle au message ouvert. Ce handle doit être fermé lorsqu’il n’est plus nécessaire en le transmettant à la fonction CryptMsgClose .

Si cette fonction échoue, null est retourné.

Pour récupérer des informations d’erreur étendues, utilisez la fonction GetLastError .

Le tableau suivant répertorie les codes d’erreur les plus couramment retournés par la fonction GetLastError .

Code de retour Description
CRYPT_E_INVALID_MSG_TYPE
Le type de message n'est pas valide.
CRYPT_E_OID_FORMAT
L’OID est mal formaté.
CRYPT_E_UNKNOWN_ALGO
L’algorithme de chiffrement est inconnu.
E_INVALIDARG
Un ou plusieurs arguments ne sont pas valides.
E_OUTOFMEMORY
Il n’y a pas assez de mémoire.
 

En outre, si dwMsgType est CMSG_SIGNED, les erreurs peuvent être propagées à partir de CryptCreateHash.

Si dwMsgType est CMSG_ENVELOPED, les erreurs peuvent être propagées à partir de CryptGenKey, CryptImportKey et CryptExportKey.

Si dwMsgType est CMSG_HASHED, les erreurs peuvent être propagées à partir de CryptCreateHash.

Remarques

Pour les fonctions qui effectuent le chiffrement, les clés symétriques chiffrées sont inversées du format little-endian au format big-endian après l’appel interne de CryptExportKey . Pour les fonctions qui effectuent le déchiffrement, les clés symétriques chiffrées sont inversées du format big-endian au format little-endian avant l’appel de CryptImportKey .

CRYPT_NO_SALT est spécifié lorsque des clés symétriques sont générées et importées avec CryptGenKey et CryptImportKey.

Les messages chiffrés avec l’algorithme de chiffrement RC2 utilisent KP_EFFECTIVE_KEYLEN avec CryptGetKeyParam pour déterminer la longueur effective des clés d’importation ou d’exportation de clé RC2.

Pour les messages chiffrés avec l’algorithme de chiffrement RC2, les opérations d’encodage et de décodage ont été mises à jour pour gérer les paramètres ASN RC2 pour le membre ContentEncryptionAlgorithm de la structure CMSG_ENVELOPED_ENCODE_INFO .

Pour les messages chiffrés avec les algorithmes de chiffrement RC4, DES et 3DES, les opérations d’encodage et de décodage gèrent désormais le paramètre de chaîne d’octet ASN IV pour le membre ContentEncryptionAlgorithm de la structure CMSG_ENVELOPED_ENCODE_INFO .

Exemples

Pour obtenir des exemples qui utilisent cette fonction, consultez Exemple de programme C : signature, encodage, décodage et vérification d’un message, Code de substitution pour l’encodage d’un message enveloppe,exemple de programme C : encodage d’un message enveloppe, message signé et exemple de programme C : encodage et décodage d’un message haché.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP [applications de bureau | applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête wincrypt.h
Bibliothèque Crypt32.lib
DLL Crypt32.dll

Voir aussi

CryptMsgClose

CryptMsgGetParam

CryptMsgOpenToDecode

CryptMsgUpdate

Fonctions de message de bas niveau

Fonctions de message simplifiées