Odszyfrowywanie kopertyCms nie powoduje podwójnego odpakowywania
W programie .NET Core 2.0 w systemach macOS i Linux implementacja EnvelopedCms niepoprawnie opakowana zawartość w dodatkowej wartości CIĄGU ASN.1 OCTET. Aby zachować zgodność podczas przetwarzania zawartości utworzonej przy użyciu tego błędu, EnvelopedCms klasa nadal patrzyła na odszyfrowaną zawartość i próbowała usunąć dodatkowe dane. EnvelopedCms usunięto dodatkowe dane w systemie Windows podczas korzystania z zewnętrznego klucza prywatnego i we wszystkich innych systemach operacyjnych w przypadku dowolnego odszyfrowywania.
Niestety, ten oportunistyczny kod zgodności nie może odróżnić dokumentów, które zostały utworzone niepoprawnie, a dokumenty, które zostały utworzone poprawnie, ale mają ten sam kształt danych.
Poprzednie zachowanie
Wcześniej, jeśli odszyfrowana zawartość rozpoczęła się od wartości bajtu i legalnie zakodowaną wartością 0x04
ASN.1 BER, która była mniejsza lub równa liczbie bajtów pozostałych w zawartości, dane podane we envelopedCms.ContentInfo.Content
właściwości otrzymały tylko dane skojarzone z częścią oktetów zawartości wartości, gdy są traktowane jako ciąg OCTET ASN.1.
Jeśli na przykład początkowo odszyfrowana zawartość była serią { 0x04, 0x03, 0x01, 0x02, 0x03 }
bajtów lub { 0x04, 0x03, 0x01, 0x02, 0x03, [continued content] }
, wartość to seria { 0x01, 0x02, 0x03 }
bajtów envelopedCms.ContentInfo.Content
.
Wartości, które nie rozpoczęły się od 0x04
, lub rozpoczęły 0x04
się, ale nie były zgodne z akceptowalnie zakodowaną wartością długości, zostały w pełni zgłoszone.
W przypadku niektórych przeciążeń programu EnvelopedCms.Decryptto zachowanie miało miejsce tylko w systemach operacyjnych innych niż Windows. Aby uzyskać więcej informacji, zobacz Interfejsy API, których dotyczy problem.
Nowe zachowanie
Klasa EnvelopedCms nie próbuje już obejść poprzedniego problemu i zawsze raportuje odszyfrowaną zawartość wiernie.
Jeśli przetwarzasz dokumenty utworzone przez wersję EnvelopedCms .NET Core 2.0 klasy w systemie macOS lub Linux, na początku zawartości będą widoczne dodatkowe dane.
Wprowadzona wersja
.NET 7
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność binarną.
Przyczyna wprowadzenia zmiany
Kod zgodności nie może odróżnić niepoprawnie utworzonych dokumentów i dokumentów, które legalnie transportowały dane, które wyglądały jak ciąg ASN.1 OCTET zakodowany w formacie BER.
Ze względu na charakter kodowania BER, wywołujące, które zostały negatywnie dotknięte tym kodem zgodności, nie mogą łatwo odzyskać brakujących danych.
Zalecana akcja
Osoby wywołujące, które odczytują dokumenty utworzone EnvelopedCms przy użyciu platformy .NET Core 2.0 dla systemu macOS lub Linux, mogą dodawać kod w celu usunięcia dodatkowych danych. Aby go usunąć, użyj AsnDecoder klasy z pakietu NuGet System.Formats.Asn1, który jest już zależnością EnvelopedCms klasy.
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)
{
}
}
}
Dotyczy interfejsów API
- System.Security.Cryptography.Pkcs.EnvelopedCms.Decrypt(RecipientInfo, AsymmetricAlgorithm)
- System.Security.Cryptography.Pkcs.EnvelopedCms.Decrypt(RecipientInfo, X509Certificate2Collection) (tylko system Inny niż Windows)
- System.Security.Cryptography.Pkcs.EnvelopedCms.Decrypt(RecipientInfo) (tylko system Inny niż Windows)
- System.Security.Cryptography.Pkcs.EnvelopedCms.Decrypt(X509Certificate2Collection) (tylko system Inny niż Windows)