Absence de désenveloppage pour le déchiffrement EnvelopedCms

Dans .NET Core 2.0 sur macOS et Linux, l’implémentation EnvelopedCms a incorrectement encapsulé le contenu dans une valeur supplémentaire ASN.1 OCTET STRING. Pour maintenir la compatibilité lors du traitement du contenu créé avec cette erreur, la classe EnvelopedCms a toujours examiné le contenu déchiffré et a essayé de supprimer les données supplémentaires. EnvelopedCms a supprimé les données supplémentaires sur Windows lors de l’utilisation d’une clé privée externe et sur tous les autres systèmes d’exploitation pour tout déchiffrement.

Malheureusement, ce code de compatibilité opportuniste ne peut pas faire la distinction entre les documents qui ont été créés de manière incorrecte et les documents qui ont été créés correctement, mais qui ont la même forme de données.

Comportement précédent

Auparavant, si le contenu déchiffré commençait avec la valeur d’octets 0x04 et une valeur de longueur BER ASN.1 légalement codée qui était inférieure ou égale au nombre d’octets restant dans le contenu, les données fournies dans la propriété envelopedCms.ContentInfo.Content recevaient uniquement les données associées à la partie octets de contenu de la valeur lorsqu’elles étaient traitées comme une valeur ASN.1 OCTET STRING.

Par exemple, si le contenu initialement déchiffré était la série d’octets { 0x04, 0x03, 0x01, 0x02, 0x03 } ou { 0x04, 0x03, 0x01, 0x02, 0x03, [continued content] }, la valeur de envelopedCms.ContentInfo.Content était la série d’octets { 0x01, 0x02, 0x03 }.

Les valeurs qui n’ont pas commencé par 0x04, ou qui ont commencé par 0x04, mais qui n’ont pas été suivies d’une valeur de longueur encodée de manière acceptable, ont été entièrement signalées.

Pour certaines surcharges de EnvelopedCms.Decrypt, ce comportement ne s’est produit que sur les systèmes d’exploitation autres que Windows. Pour plus d’informations, consultez API affectées.

Nouveau comportement

La classe EnvelopedCms ne tente plus de contourner le problème précédent et signale toujours fidèlement le contenu déchiffré.

Si vous traitez des documents créés par la version .NET Core 2.0 de la classe EnvelopedCms sur macOS ou Linux, vous verrez des données supplémentaires au début du contenu.

Version introduite

.NET 7

Type de changement cassant

Ce changement peut affecter la compatibilité binaire.

Raison du changement

Le code de compatibilité n’a pas pu faire la différence entre les documents créés de manière incorrecte et les documents qui transportaient légitimement des données qui ressemblaient à une valeur ASN.1 OCTET STRING codée sur BER.

En raison de la nature de l’encodage BER, les appelants qui ont été affectés négativement par ce code de compatibilité n’ont pas pu facilement récupérer leurs données manquantes.

Les appelants qui lisent les documents créés avec EnvelopedCms sur .NET Core 2.0 pour macOS ou Linux peuvent ajouter du code pour supprimer les données supplémentaires. Pour les supprimer, utilisez la classe AsnDecoder du package NuGet System.Formats.Asn1, qui est déjà une dépendance de la classe EnvelopedCms.

envelopedCms.Decrypt(...);

byte[] content = envelopedCms.ContentInfo.Content;

if (envelopedCms.ContentInfo.Oid.Value == "1.2.840.113549.1.7.1")
{
    if (content?.Length > 0 && content[0] == 0x04)
    {
        try
        {
            content = AsnDecoder.ReadOctetString(content, AsnEncodingRules.BER, out _);
        }
        catch (AsnContentException)
        {
        }
    }
}

API affectées