Att dekryptera EnvelopedCms innebär inte att paketet avkodas två gånger.

I .NET Core 2.0 på macOS och Linux omsluter EnvelopedCms implementeringen felaktigt innehåll i ett extra ASN.1 OCTET STRING-värde. För att upprätthålla kompatibiliteten vid bearbetning av innehåll som skapats med det här felet EnvelopedCms tittade klassen fortfarande på det dekrypterade innehållet och försökte ta bort extra data. EnvelopedCms tog bort extra data i Windows när en extern privat nyckel användes och på alla andra operativsystem vid dekryptering.

Tyvärr kan inte den här opportunistiska kompatibilitetskoden skilja mellan dokument som har skapats felaktigt och dokument som har skapats korrekt men som har samma dataform.

Tidigare beteende

Tidigare, om det dekrypterade innehållet började med bytevärdet 0x04 och ett juridiskt kodat ASN.1 BER-längdvärde som var mindre än eller lika med det antal byte som finns kvar i innehållet, tog de data som tillhandahålls i envelopedCms.ContentInfo.Content egenskapen endast emot de data som är associerade med innehållsoktetsdelen av värdet när de behandlades som en ASN.1 OCTET STRING.

Om det ursprungligen dekrypterade innehållet till exempel var byte-serien { 0x04, 0x03, 0x01, 0x02, 0x03 } eller { 0x04, 0x03, 0x01, 0x02, 0x03, [continued content] }var värdet envelopedCms.ContentInfo.Content för byte-serien { 0x01, 0x02, 0x03 }.

Värden som inte började med 0x04, eller började med 0x04 men som inte följdes av ett acceptabelt kodat längdvärde, rapporterades fullständigt.

För vissa överlagringar av EnvelopedCms.Decryptinträffade det här beteendet endast på andra operativsystem än Windows. Mer information finns i Berörda API:er.

Nytt beteende

Klassen EnvelopedCms försöker inte längre kringgå det tidigare problemet och rapporterar alltid det dekrypterade innehållet troget.

Om du bearbetar dokument som har skapats av .NET Core 2.0-versionen av EnvelopedCms klassen i macOS eller Linux visas extra data i början av innehållet.

Version lanserad

.NET 7

Typ av brytande ändring

Den här ändringen kan påverka binär kompatibilitet.

Orsak till ändring

Kompatibilitetskoden kunde inte skilja mellan felaktigt skapade dokument och dokument som korrekt transporterade data som såg ut som en BER-kodad ASN.1 OCTET STRING.

På grund av ber-kodningens karaktär kunde anropare som påverkades negativt av den här kompatibilitetskoden inte enkelt återställa sina saknade data.

Anropare som läser dokument som skapats med EnvelopedCms på .NET Core 2.0 för macOS eller Linux kan lägga till kod för att ta bort extra data. Om du vill ta bort den använder du AsnDecoder klassen från NuGet-paketet System.Formats.Asn1, som redan är ett beroende av EnvelopedCms klassen.

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)
        {
        }
    }
}

Berörda API:er