次の方法で共有


EnvelopedCms の暗号化を解除してもラップが 2 回解除されない

macOS および Linux 上の .NET Core 2.0 では、 EnvelopedCms 実装によって、追加の ASN.1 OCTET STRING 値にコンテンツが誤ってラップされました。 このエラーで作成されたコンテンツを処理するときに互換性を維持するために、 EnvelopedCms クラスは復号化されたコンテンツを確認し、追加のデータを削除しようとしました。 EnvelopedCms は、外部秘密キーを使用する場合は Windows 上の追加データを削除し、復号化のために他のすべてのオペレーティング システム上で余分なデータを削除しました。

残念ながら、この日和見互換性コードでは、誤って作成されたドキュメントと、正しく作成されたが同じデータシェイプを持つドキュメントを区別できません。

以前の動作

以前は、暗号化解除されたコンテンツがバイト値 0x04 で開始され、有効にエンコードされた ASN.1 BER の長さの値がコンテンツに残っているバイト数以下の場合、 envelopedCms.ContentInfo.Content プロパティで指定されたデータは、ASN.1 OCTET STRING として扱われるときの値のコンテンツ オクテット部分に関連付けられたデータのみを受け取っていました。

たとえば、最初に復号化されたコンテンツがバイト系列の { 0x04, 0x03, 0x01, 0x02, 0x03 } または { 0x04, 0x03, 0x01, 0x02, 0x03, [continued content] }の場合、 envelopedCms.ContentInfo.Content の値はバイト系列の { 0x01, 0x02, 0x03 }です。

0x04で始まらない値、または0x04で始まり許容可能なエンコードされた長さの値が後に続かなかった値は、全て報告されました。

EnvelopedCms.Decryptの一部のオーバーロードでは、この動作は Windows 以外のオペレーティング システムでのみ発生しました。 詳細については、「 影響を受ける API」を参照してください。

新しい動作

EnvelopedCms クラスは、以前の問題の回避を試みなくなり、復号化されたコンテンツを常に忠実に報告します。

macOS または Linux 上の EnvelopedCms クラスの .NET Core 2.0 バージョンによって作成されたドキュメントを処理している場合は、コンテンツの先頭に追加のデータが表示されます。

導入されたバージョン

.NET 7

破壊的変更の種類

この変更は 、バイナリの互換性に影響する可能性があります。

変更の理由

互換性コードでは、誤って作成されたドキュメントと、BER でエンコードされた ASN.1 OCTET STRING のように見えるデータを正当に転送しているドキュメントを区別できませんでした。

BER エンコードの性質上、この互換性コードによって悪影響を受けた呼び出し元は、不足しているデータを簡単に回復できませんでした。

macOS または Linux 用の .NET Core 2.0 で EnvelopedCms で作成されたドキュメントを読み取る呼び出し元は、追加のデータを削除するコードを追加できます。 これを削除するには、既にAsnDecoder クラスの依存関係である System.Formats.Asn1 NuGet パッケージから 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