17.08.2006 12:07:40!!! ДАТА ОТЗЫВА !!! Ответов: 0
Дробязко Алексей
Добрый день.

Вот бьюсь уже который день...
Программирую на .NET.

Есть: сертификат (контекст сертификата или сертификат в кодировке BASE64) и список отзыва сертификатов (контекст СОС или СОС в кодировке BASE64).

Необходимо: получить дату отзыва сертификата!

Где искал, что пробовал: искал в обьектах CertAdmin, CertView, CertRequest, CAPICOM.

Что нашел: CryptoAPI есть функция CertFindCertificateInCRL. Вроде бы то, что надо...вот что делаю:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct CRYPT_INTEGER_BLOB
{
public uint cbData;
public IntPtr pbData;
}

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct CRL_ENTRY
{
public CRYPT_INTEGER_BLOB serialNumber;
public FILETIME RevocationDate;
public uint cExtension;
public IntPtr rgExtension;
}

[DllImport("Crypt32.DLL", EntryPoint="CertCreateCertificateContext", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=false, CallingConvention=CallingConvention.StdCall)]
private static extern IntPtr CertCreateCertificateContext(
int dwCertEncodingType,
byte[] pbCertEncoded,
int cbCertEncoded);

[DllImport("CRYPT32.DLL", SetLastError=true)]
private static extern IntPtr CertCreateCRLContext(
uint dwCertEncodingType,
byte[] pbCrlEncoded,
uint cbCrlEncoded);

[DllImport("crypt32.dll", SetLastError=true)]
private static extern bool CertFindCertificateInCRL(
IntPtr pCert,
IntPtr pCrlContext,
uint dwFlags,
IntPtr pvReserved,
ref IntPtr ppCrlEntry);

-------------------------------

private string GetRevocationDateTime(string certStr, string crlStr)
{
byte[] cert = Convert.FromBase64String(certStr);
byte[] crl = Convert.FromBase64String(crlStr);

IntPtr certContext = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, cert, cert.Length);

IntPtr crlContext = CertCreateCRLContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, crl, (uint)crl.Length);

IntPtr pCrlInfo = IntPtr.Zero;

if ( CertFindCertificateInCRL(certContext, crlContext, 0, IntPtr.Zero, ref pCrlInfo) )
{
if ( pCrlInfo != IntPtr.Zero )
{
CRL_ENTRY info = (CRL_ENTRY)Marshal.PtrToStructure(pCrlInfo, typeof(CRL_ENTRY));

string serialnuber = Marshal.PtrToStringUni(info.serialNumber.pbData, (int)info.serialNumber.cbData);
long ft = (long)(info.RevocationDate.dwHighDateTime << 32) + info.RevocationDate.dwLowDateTime;
DateTime revocationDate = DateTime.FromFileTimeUtc(ft);
string revocationDateStr = revocationDate.ToString();
}
}
return revocationDateStr;
} // END FUNCTION GetRevocationDateTime

-----------------------------------------------
Проблема в том, что в revocationDateStr, serialNumber я получаю всякую белеберду, совершенно не похожую на то, что надо!

Может у кого есть какие соображения...?
help plz