El descifrado de EnvelopedCms no duplica el desajuste

En .NET Core 2.0 en macOS y Linux, la implementación EnvelopedCms ajustaba incorrectamente el contenido en un valor ASN.1 OCTET STRING adicional. A fin de mantener la compatibilidad al procesar el contenido creado con este error, la clase EnvelopedCms seguía examinando el contenido descifrado e intentaba quitar los datos adicionales. EnvelopedCms quitaba los datos adicionales en Windows al usar una clave privada externa y en todos los demás sistemas operativos para cualquier descifrado.

Desafortunadamente, este código de compatibilidad oportunista no puede distinguir los documentos que se crean incorrectamente de los que se crean correctamente, pero que tienen la misma forma de datos.

Comportamiento anterior

Anteriormente, si el contenido descifrado comenzaba con el valor de byte 0x04 y un valor de longitud ASN.1 BER codificado legalmente que era menor o igual que el número de bytes restantes en el contenido, los datos proporcionados en la propiedad envelopedCms.ContentInfo.Content solo recibían los datos asociados a la parte de octetos de contenido del valor si se trataban como un tipo ASN.1 OCTET STRING.

Por ejemplo, si el contenido inicialmente descifrado era la serie de bytes { 0x04, 0x03, 0x01, 0x02, 0x03 } o { 0x04, 0x03, 0x01, 0x02, 0x03, [continued content] }, el valor de envelopedCms.ContentInfo.Content era la serie de bytes { 0x01, 0x02, 0x03 }.

Los valores que no comenzaban por 0x04, o que lo hacían con 0x04, pero que no iban acompañados de un valor de longitud codificado de forma aceptable, se notificaban por completo.

Para algunas sobrecargas de EnvelopedCms.Decrypt, este comportamiento solo se produjo en sistemas operativos que no son Windows. Para obtener más información, consulte API afectadas.

Comportamiento nuevo

La clase EnvelopedCms ya no intenta buscar una solución alternativa al problema anterior y siempre informa fielmente del contenido descifrado.

Si está procesando documentos creados por la versión 2.0 de .NET Core de la clase EnvelopedCms en macOS o Linux, verá datos adicionales al principio del contenido.

Versión introducida

.NET 7

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria.

Motivo del cambio

El código de compatibilidad no podía diferenciar entre documentos creados incorrectamente y documentos que transportaban legítimamente datos que parecían un tipo ASN.1 OCTET STRING codificado en BER.

Debido a la naturaleza de la codificación en BER, los autores de llamadas que se vieron afectados negativamente por este código de compatibilidad no pudieron recuperar fácilmente los datos que faltaban.

Los autores de llamadas que leen documentos creados con EnvelopedCms en .NET Core 2.0 para macOS o Linux pueden agregar código para quitar los datos adicionales. Para ello, use la clase AsnDecoder del paquete NuGet System.Formats.Asn1, que ya es una dependencia de la clase 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 afectadas