Az EnvelopedCms visszafejtése nem okoz dupla kicsomagolást.

A macOS-en és Linuxon futó .NET Core 2.0-ban az implementáció helytelenül csomagolta be a EnvelopedCms tartalmat egy további ASN.1 OCTET STRING értékben. Az ezzel a hibával létrehozott tartalom feldolgozásakor a kompatibilitás fenntartása érdekében az EnvelopedCms osztály továbbra is megvizsgálta a visszafejtett tartalmat, és megpróbálta eltávolítani a további adatokat. EnvelopedCms külső titkos kulcs használata esetén eltávolította a felesleges adatokat a Windowsról, és az összes többi operációs rendszerről a visszafejtéshez.

Ez az opportunista kompatibilitási kód sajnos nem tud különbséget tenni a helytelenül létrehozott dokumentumok és a helyesen létrehozott, de azonos adatalakzatú dokumentumok között.

Előző viselkedés

Korábban, ha a visszafejtett tartalom a bájtértékkel 0x04 és egy jogilag kódolt ASN.1 BER hosszértékkel indult, amely kisebb vagy egyenlő volt a tartalomban maradt bájtok számával, a tulajdonságban envelopedCms.ContentInfo.Content megadott adatok csak az érték tartalom-oktett-részéhez kapcsolódó adatokat fogadták, amikor ASN.1 OCTET-SZTRINGként kezelik.

Ha például az eredetileg visszafejtett tartalom a bájtsor { 0x04, 0x03, 0x01, 0x02, 0x03 } vagy { 0x04, 0x03, 0x01, 0x02, 0x03, [continued content] } volt, akkor a envelopedCms.ContentInfo.Content értéke a bájtsor { 0x01, 0x02, 0x03 } volt.

Azok az értékek, amelyek nem 0x04-val kezdődtek, vagy 0x04-vel kezdődtek, de nem követte őket elfogadhatóan kódolt hosszérték, teljes körűen jelentve lettek.

Bizonyos túlterhelések EnvelopedCms.Decryptesetén ez a viselkedés csak nem Windows operációs rendszereken fordult elő. További információ: Érintett API-k.

Új viselkedés

Az EnvelopedCms osztály már nem próbálja megkerülni az előző problémát, és mindig hűségesen jelenti a visszafejtött tartalmat.

Ha macOS vagy Linux rendszeren az osztály .NET Core 2.0-s verziójával EnvelopedCms létrehozott dokumentumokat dolgoz fel, a tartalom elején további adatok fognak megjelenni.

Bevezetett verzió

.NET 7

A kompatibilitástörő változás típusa

Ez a változás befolyásolhatja a bináris kompatibilitást.

A változás oka

A kompatibilitási kód nem tudott különbséget tenni a helytelenül létrehozott dokumentumok és a ber kódolású ASN.1 OKTET-sztringhez hasonló adatokat jogszerűen szállító dokumentumok között.

A BER kódolás jellege miatt a kompatibilitási kód által negatívan érintett hívók nem tudták könnyen helyreállítani a hiányzó adatokat.

A .NET Core 2.0-n macOS vagy Linux rendszeren létrehozott EnvelopedCms dokumentumokat olvasó hívók kódot adhatnak a további adatok eltávolításához. Az eltávolításához használja a AsnDecoder osztályt a System.Formats.Asn1 NuGet csomagból, amely már az EnvelopedCms osztály függősége.

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

Érintett API-k