AlexMAS / GostCryptography

.NET driver for ViPNet CSP and CryptoPro CSP
MIT License
132 stars 42 forks source link

Unknown algorithm '1.2.643.7.1.1.1.1' #54

Closed UseMuse closed 3 months ago

UseMuse commented 3 months ago

Добрый вечер! Использую net8.0 и

 <PackageReference Include="GostCryptography" Version="2.0.11" />

как применить Gost_R3411_2012_256... ?

на строке signer.CheckSignature(false); получаю ошибку Unknown algorithm '1.2.643.7.1.1.1.1' Помогите пожалуйста

UseMuse commented 3 months ago
using GostCryptography.Config;
using GostCryptography.Pkcs;
using Org.BouncyCastle.Utilities.IO.Pem;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;

class Program
{
    static void Main(string[] args)
    {

        string pdfFileName = "файл.pdf";
        string signatureFileName = "файл.pdf.sig";
        string filesDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "files");

        string pdfFilePath = Path.Combine(filesDirectory, pdfFileName);
        string signatureFilePath = Path.Combine(filesDirectory, signatureFileName);

        // Чтение содержимого файлов
        byte[] pdfBytes = File.ReadAllBytes(pdfFilePath);
        string pemData = File.ReadAllText(signatureFilePath);

        // Извлечение CMS данных
        PemObject pemObject = new PemReader(new StringReader(pemData)).ReadPemObject();
        byte[] cmsBytes = pemObject.Content;

        // Декодирование и проверка подписи
        VerifySignature(pdfBytes, cmsBytes);
    }

    static void VerifySignature(byte[] pdfBytes, byte[] cmsBytes)
    {
        // Создание объекта ContentInfo для проверки подписи файла PDF
        ContentInfo contentInfo = new ContentInfo(pdfBytes);
        GostSignedCms signedCms = new GostSignedCms(SubjectIdentifierType.SubjectKeyIdentifier,contentInfo, true);
        signedCms.Decode(cmsBytes);

        // Проверяем число основных и дополнительных подписей
        Console.WriteLine();
        Console.WriteLine("Количество подписавших: {0}", signedCms.SignerInfos.Count);
        if (signedCms.SignerInfos.Count == 0)
        {
            Console.WriteLine("Документ не подписан.");
            return;
        }

        bool valid = true;
        foreach (SignerInfo signer in signedCms.SignerInfos)
        {
            X509Certificate2 certificate = signer.Certificate;
            if (certificate != null)
                Console.Write("Проверка подписи для подписавшего '{0}'...", certificate.SubjectName.Name);
            else
                Console.Write("Проверка подписи для подписавшего без сертификата...");

            try
            {
                signer.CheckSignature(false);
                Console.WriteLine("Успешно.");
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("Ошибка:");
                Console.WriteLine("\t" + e.Message);
                valid = false;
            }

            // Проверка соподписей, если есть
            foreach (SignerInfo counterSigner in signer.CounterSignerInfos)
            {
                X509Certificate2 counterCertificate = counterSigner.Certificate;
                if (counterCertificate != null)
                    Console.Write("\tПроверка соподписи для соподписавшего '{0}'...", counterCertificate.SubjectName.Name);
                else
                    Console.Write("\tПроверка соподписи для соподписавшего без сертификата...");

                try
                {
                    counterSigner.CheckSignature(false);
                    Console.WriteLine("Успешно.");
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine("Ошибка:");
                    Console.WriteLine("\t\t" + e.Message);
                    valid = false;
                }
            }
        }

        Console.WriteLine();
        if (valid)
            Console.WriteLine("Проверка PKCS #7 сообщения завершилась успешно.");
        else
            Console.WriteLine(
            "Проверка PKCS #7 сообщения завершилась неудачно." +
            "Возможно сообщение, одна из подписей, или соподписей " +
            "модифицированы в процессе передачи или хранения. " +
            "Возможно, что не корректен или подменен один из " +
            "сертификатов подписывающих. Возможно подписывающий " +
            "не имеет соответствующих атрибутов для подписи. " +
            "Достоверность и/или целостность сообщения не гарантируется.");
    }
}
UseMuse commented 3 months ago

подскажите хоть что-нибудь, буду очень благодарен

AlexMAS commented 3 months ago

Здравствуйте!

Спасибо за обратную связь. К сожалению, пока поддерживается только .NET Framework и ОС Windows. Для новых версиий .NET, начиная с v5, пока поддержки нет. Там существенно переработали внутренности Security и практически полностью отказались от CryptoAPI.

Подобный запрос на доработку уже добавлен. Очевидно, мне нужно вернуться к работе над этим. :) Сейчас могу посоветовать только переключиться с .NET на .NET Framework, если это приемлемо.