Как извлечь информацию о подписывающей стороне из Authenticode PE-файла с цифровой подписью, закодированного с использованием ASN1?

Мне нужно извлечь SignerInfo из Authenticode PE-файла с цифровой подписью в структуре ASN1.

INFO: PE-файл содержит аутентификационный код по смещению, указанному Security Directory RVA внутри Optional Header Data Directories. Я попытался начать после прочтения документа, доступного по адресу Microsoft Authenticode PE Signature. Format, но не повезло, так как я новичок в SSL/TSL.

Мой вопрос:

  1. Есть ли способ проанализировать двоичные файлы и распечатать структуру данных в формате строки C?

  2. Есть ли способ, которым я могу проанализировать данные двоичные файлы и указать на SignerInfo или SignerName?

NOTE: Я не хочу использовать API-интерфейсы, зависящие от платформы, поскольку я хочу, чтобы код не зависел от платформы.

Заранее спасибо всем гуру :-)

UPDATE: Я нашел код на C#. Кто-нибудь поможет мне найти эквивалент C того же самого.

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography.X509Certificates;

public class CertInfo
{
 public static void Main(String[] args)
 {
    byte[] certBytes;
    X509Certificate x509cert;

    while (true)
    {
        Console.WriteLine("\nEnter File Name: ");
        String filename = Console.ReadLine();
        if (filename == "")  //exit while(true) loop
            break;
        if (!File.Exists(filename))
        {
            Console.WriteLine("File \"{0}\" does not exist!\n", filename);
            continue;
        }

        try
        {             //try binary DER format first
            x509cert = X509Certificate.CreateFromCertFile(filename);
            showCertInfo(x509cert);
        }

        catch (System.Security.Cryptography.CryptographicException cryptder)
        { //not binary DER
            StreamReader sr = File.OpenText(filename);
            String filestr = sr.ReadToEnd();
            sr.Close();
            StringBuilder sb = new StringBuilder(filestr);
            sb.Replace("-----BEGIN CERTIFICATE-----", "");
            sb.Replace("-----END CERTIFICATE-----", "");
            //Decode 
            try
            {        //see if the file is a valid Base64 encoded cert
                certBytes = Convert.FromBase64String(sb.ToString());
                x509cert = new X509Certificate(certBytes);
                showCertInfo(x509cert);
            }
            catch (System.FormatException formexc)
            {
                Console.WriteLine("Not valid binary DER or Base64 X509 certificate format");
            }
            catch (System.Security.Cryptography.CryptographicException cryptb64)
            {
                Console.WriteLine("Not valid binary DER or Base64 X509 certificate format");
            }
        }


    } // end while true
}

private static void showCertInfo(X509Certificate x509cert)
{
    Console.WriteLine("Name: " + x509cert.GetName());
    Console.WriteLine("Issuer: " + x509cert.GetIssuerName());
    Console.WriteLine("Serial Number: " + x509cert.GetSerialNumberString());
    Console.WriteLine("Expiration Date: " + x509cert.GetExpirationDateString());
    Console.WriteLine("PublicKey: " + x509cert.GetPublicKeyString());
}
}

person Abhineet    schedule 10.07.2012    source источник
comment
stackoverflow.com/questions/1494372/asn- 1-парсер-в-c-python   -  person fkl    schedule 10.07.2012
comment
@fayyazkl- я уже просмотрел пост, на который вы ссылались, но он мне немного не помог. Я также прошел через компилятор asn1c. Компилятор не предназначен для разбора через PE.   -  person Abhineet    schedule 10.07.2012
comment
Код, который вы нашли, покажет информацию внутри сертификата. Это не то же самое, что подпись Authenticode. Подписи Authenticode также не связаны с SSL/TLS (за исключением того, что они оба используют сертификаты X.509).   -  person poupou    schedule 19.07.2012