Skip to content

SignedCms: throws when manipulating certificates collection that contains a non-X.509 certificate #79935

@dtivel

Description

@dtivel

Description

SignedCms.AddCertificate(...) throws when attempting to add a certificate when the existing certificates collection contains a non-X.509 certificate. It's worth reviewing other code paths in the class for similar behavior. For example, from a quick glance at the source code, it appears that SignedCms.RemoveCertificate(...) has a similar issue.

#62307 is related.

CC @bartonjs, @vcsjones, @clairernovotny

Reproduction Steps

internal class Program
{
    static void Main()
    {
        string base64 = "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";
        byte[] bytes = Convert.FromBase64String(base64);
        SignedCms signedCms = new();

        signedCms.Decode(bytes);

        using (RSA keyPair = RSA.Create(keySizeInBits: 4096))
        {
            CertificateRequest certificateRequest = new("CN=test", keyPair, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

            using (X509Certificate2 certificate = certificateRequest.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddMinutes(1)))
            {
                signedCms.AddCertificate(certificate);
            }
        }
    }
}

Expected behavior

Based on the resolution of #62307, the expected behavior here is that non-X.509 certificates will be ignored and adding/removing X.509 certificates will succeed/fail in the same way as if the SignedCms instance contained only X.509 certificates.

Actual behavior

System.InvalidOperationException: Nullable object must have a value.
   at System.Nullable`1.get_Value()
   at System.Security.Cryptography.Pkcs.SignedCms.AddCertificate(X509Certificate2 certificate)
   at ConsoleApp2.Program.Main() in E:\\throwaway\\ConsoleApp2\\Program.cs:line 23

Regression?

No

Known Workarounds

No response

Configuration

The version of System.Security.Cryptography.Pkcs used here contains #64348.

PS C:\> [System.Diagnostics.FileVersionInfo]::GetVersionInfo('***\System.Security.Cryptography.Pkcs.dll') | Format-List

OriginalFilename  : System.Security.Cryptography.Pkcs.dll
FileDescription   : System.Security.Cryptography.Pkcs
ProductName       : Microsoft® .NET
Comments          : Provides support for PKCS and CMS algorithms.

                    Commonly Used Types:
                    System.Security.Cryptography.Pkcs.EnvelopedCms
CompanyName       : Microsoft Corporation
FileName          : ***\System.Security.Cryptography.Pkcs.dll
FileVersion       : 7.0.22.51805
ProductVersion    : 7.0.0+d099f075e45d2aa6007a22b71b45a08758559f80
IsDebug           : False
IsPatched         : False
IsPreRelease      : False
IsPrivateBuild    : False
IsSpecialBuild    : False
Language          : Language Neutral
LegalCopyright    : © Microsoft Corporation. All rights reserved.
LegalTrademarks   :
PrivateBuild      :
SpecialBuild      :
FileVersionRaw    : 7.0.22.51805
ProductVersionRaw : 7.0.0.0

Other information

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions