Skip to content

InvalidCastException в CpSignerInfo.ComputeCounterSignature (CpX509IssuerSerial → X509IssuerSerial) #89

Description

@Pakitoes

Окружение

ОС: Windows 10 / Windows 11
.NET: .NET 8
КриптоПРО CSP: 5.0.13455 КС1
LibCore: 2025.7.21

Описание проблемы

При вызове CpSignerInfo.ComputeCounterSignature возникает
InvalidCastException.

Исключение указывает на попытку приведения типа
CryptoPro.Security.Cryptography.Xml.CpX509IssuerSerial к типу System.Security.Cryptography.Xml.X509IssuerSerial.

Stack trace

System.InvalidCastException:
Unable to cast object of type
'CryptoPro.Security.Cryptography.Xml.CpX509IssuerSerial'
to type
'System.Security.Cryptography.Xml.X509IssuerSerial'.

at CryptoPro.Security.Cryptography.Pkcs.CpSubjectIdentifier.IsEquivalentTo(CpSubjectIdentifier other)
at CryptoPro.Security.Cryptography.Pkcs.CpSignerInfoCollection.FindIndexForSigner(CpSignerInfo[] signerInfos, CpSignerInfo signer)
at CryptoPro.Security.Cryptography.Pkcs.CpSignerInfoCollection.FindIndexForSigner(CpSignerInfo signer)
at CryptoPro.Security.Cryptography.Pkcs.CpSignerInfo.ComputeCounterSignature(CpCmsSigner signer)

Минимальный воспроизводимый пример

static void Main(string[] args)
{
    // Данные для подписи
    byte[] data = System.Text.Encoding.UTF8.GetBytes("Test data");

    ContentInfo contentInfo = new ContentInfo(data); // Создание объекта ContentInfo - OK

    CpSignedCms signedCms = new CpSignedCms(contentInfo, detached: true); // Создание объекта CpSignedCms для отсоединенной подписи - OK

    CpX509Certificate2 signerCert = GetGost2012_256Certificate("1200697fb47afaea7ddf30e3bf000300697fb4"); // Загрузка сертификата ГОСТ для подписи - OK
    CpCmsSigner signer = new CpCmsSigner(signerCert); // Создание CpCmsSigner для сертификата

    signedCms.ComputeSignature(signer); // Вычисление подписи - OK
    var signature = signedCms.Encode(); // Кодирование подписи в массив байт - OK

    // Проверка подписи

    ContentInfo contentInfoVerify = new ContentInfo(data); // Создание ContentInfo для проверки подписи - OK

    CpSignedCms signedCmsVerify = new CpSignedCms(contentInfoVerify, true); // Создание SignedCms для декодирования и проверки - OK

    signedCmsVerify.Decode(signature); // Декодирование подписи - OK

    signedCmsVerify.CheckSignature(true); // Проверка подписи - OK


    CpX509Certificate2 counterCert = GetGost2012_256Certificate("7c002b7df18a0e4e6c991ef26f0011002b7df1"); // Загрузка сертификата ГОСТ для CounterSignature - OK
    CpCmsSigner counterSigner = new CpCmsSigner(
        SubjectIdentifierType.IssuerAndSerialNumber,
        counterCert
    ); // Создание CpCmsSigner для CounterSignature - OK

    signedCms.SignerInfos[0].ComputeCounterSignature(counterSigner); // Вычисление CounterSignature - FAIL!!

    // Исключение:
    /*
     Unable to cast object of type 'CryptoPro.Security.Cryptography.Xml.CpX509IssuerSerial' to type 'System.Security.Cryptography.Xml.X509IssuerSerial
     */

    // Стек
    /*
     в CryptoPro.Security.Cryptography.Pkcs.CpSubjectIdentifier.IsEquivalentTo(CpSubjectIdentifier other)
       в CryptoPro.Security.Cryptography.Pkcs.CpSignerInfoCollection.FindIndexForSigner(CpSignerInfo[] signerInfos, CpSignerInfo signer)
       в CryptoPro.Security.Cryptography.Pkcs.CpSignerInfoCollection.FindIndexForSigner(CpSignerInfo signer)
       в CryptoPro.Security.Cryptography.Pkcs.CpSignerInfo.ComputeCounterSignature(CpCmsSigner signer)
     */
}

static CpX509Certificate2 GetGost2012_256Certificate(string serial)
{
    using(var store = new CpX509Store(storeName: StoreName.My,
                                      storeLocation: StoreLocation.CurrentUser))
    {
        store.Open(OpenFlags.ReadOnly);

        var cert = store.Certificates.Find(findType: X509FindType.FindBySerialNumber,
                                           findValue: serial,
                                           validOnly: true)[0];

        return cert;
    }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions