Как извлечь информацию подписавшего из Authenticode файла PE с цифровой подписью, закодированного с использованием ASN1?
Мне нужно извлечь SignerInfo
от Authenticode
PE-файла с цифровой подписью в структуре ASN1.
INFO
: PE-файл содержит аутентичный код со смещением, заданным параметром Security Directory RVA
внутри Optional Header Data Directories
, Я попытался начать после прочтения документа, доступного в формате подписи Microsoft Authenticode PE, но не повезло, так как я очень плохо знаком с SSL/TSL.
Мой вопрос:
Есть ли способ проанализировать двоичные файлы и распечатать структуру данных в формате C String?
Есть ли способ, которым я могу разобрать данные двоичные файлы и указать на
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());
}
}