您的位置:首页 > 编程语言 > C#

c# 验证文件签名是否成功,获取签名时间戳

2013-05-10 10:45 429 查看
目前网上大多为C++版本,本文是c#版本,调用了WinAPI.

不多说了,上代码,对外接口见红色字体。

using System;

using System.Text;

using System.IO;

using System.Runtime.InteropServices;

using System.ComponentModel;

using System.Security.Cryptography.Pkcs;

namespace VerifySign

{

internal static class AuthenticodeTools

{

[DllImport("Wintrust.dll", PreserveSig = true, SetLastError = false)]

private static extern uint WinVerifyTrust(IntPtr hWnd, IntPtr pgActionID, IntPtr pWinTrustData);

/*

* return : 0 - verify success; else verify error

*/

private static uint WinVerifyTrust(string fileName)

{

Guid wintrust_action_generic_verify_v2 = new Guid("{00AAC56B-CD44-11d0-8CC2-00C04FC295EE}");

uint result = 0;

using (WINTRUST_FILE_INFO fileInfo = new WINTRUST_FILE_INFO(fileName,

Guid.Empty))

using (UnmanagedPointer guidPtr = new UnmanagedPointer(Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Guid))),

AllocMethod.HGlobal))

using (UnmanagedPointer wvtDataPtr = new UnmanagedPointer(Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WINTRUST_DATA))),

AllocMethod.HGlobal))

{

WINTRUST_DATA data = new WINTRUST_DATA(fileInfo);

IntPtr pGuid = guidPtr;

IntPtr pData = wvtDataPtr;

Marshal.StructureToPtr(wintrust_action_generic_verify_v2,

pGuid,

true);

Marshal.StructureToPtr(data,

pData,

true);

result = WinVerifyTrust(IntPtr.Zero,

pGuid,

pData);

}

return result;

}

public static bool IsSignedOK(string fileName)

{

return WinVerifyTrust(fileName) == 0;

}

#region get time smatp

public static string getTimestamp(string filename)

{

string strTimeStamp = string.Empty;

try

{

int encodingType;

int contentType;

int formatType;

IntPtr certStore = IntPtr.Zero;

IntPtr cryptMsg = IntPtr.Zero;

IntPtr context = IntPtr.Zero;

if (!WinCrypt.CryptQueryObject(

WinCrypt.CERT_QUERY_OBJECT_FILE,

Marshal.StringToHGlobalUni(filename),

WinCrypt.CERT_QUERY_CONTENT_FLAG_ALL,

WinCrypt.CERT_QUERY_FORMAT_FLAG_ALL,

0,

out encodingType,

out contentType,

out formatType,

ref certStore,

ref cryptMsg,

ref context))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

// Get size of the encoded message.

int cbData = 0;

if (!WinCrypt.CryptMsgGetParam(

cryptMsg,

WinCrypt.CMSG_ENCODED_MESSAGE,//Crypt32.CMSG_SIGNER_INFO_PARAM,

0,

IntPtr.Zero,

ref cbData))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

var vData = new byte[cbData];

// Get the encoded message.

if (!WinCrypt.CryptMsgGetParam(

cryptMsg,

WinCrypt.CMSG_ENCODED_MESSAGE,//Crypt32.CMSG_SIGNER_INFO_PARAM,

0,

vData,

ref cbData))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

var signedCms = new SignedCms();

signedCms.Decode(vData);

foreach (var signerInfo in signedCms.SignerInfos)

{

foreach (var unsignedAttribute in signerInfo.UnsignedAttributes)

{

if (unsignedAttribute.Oid.Value == WinCrypt.szOID_RSA_counterSign)

{

foreach (var counterSignInfo in signerInfo.CounterSignerInfos)

{

foreach (var signedAttribute in counterSignInfo.SignedAttributes)

{

if (signedAttribute.Oid.Value == WinCrypt.szOID_RSA_signingTime)

{

System.Runtime.InteropServices.ComTypes.FILETIME fileTime = new System.Runtime.InteropServices.ComTypes.FILETIME();

int fileTimeSize = Marshal.SizeOf(fileTime);

IntPtr fileTimePtr = Marshal.AllocCoTaskMem(fileTimeSize);

Marshal.StructureToPtr(fileTime, fileTimePtr, true);

byte[] buffdata = new byte[fileTimeSize];

Marshal.Copy(fileTimePtr, buffdata, 0, fileTimeSize);

uint buffSize = (uint)buffdata.Length;

uint encoding = WinCrypt.X509_ASN_ENCODING | WinCrypt.PKCS_7_ASN_ENCODING;

UIntPtr rsaSigningTime = (UIntPtr)(uint)Marshal.StringToHGlobalAnsi(WinCrypt.szOID_RSA_signingTime);

//WinCrypt.SIGNER_SUBJECT_INFO

byte[] pbData = signedAttribute.Values[0].RawData;

uint ucbData = (uint)pbData.Length;

bool workie = WinCrypt.CryptDecodeObject(encoding, rsaSigningTime/*.ToUInt32()*/, pbData, ucbData, 0, buffdata, ref buffSize);

if (workie)

{

IntPtr fileTimePtr2 = Marshal.AllocCoTaskMem(buffdata.Length);

Marshal.Copy(buffdata, 0, fileTimePtr2, buffdata.Length);

System.Runtime.InteropServices.ComTypes.FILETIME fileTime2 = (System.Runtime.InteropServices.ComTypes.FILETIME)Marshal.PtrToStructure(fileTimePtr2, typeof(System.Runtime.InteropServices.ComTypes.FILETIME));

long hFT2 = (((long)fileTime2.dwHighDateTime) << 32) + ((uint)fileTime2.dwLowDateTime);

DateTime dte = DateTime.FromFileTime(hFT2);

strTimeStamp = dte.ToString();

//Console.WriteLine(dte.ToString());

}

else

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

}

}

}

//return true;

}

}

}

/*

foreach (var signerInfo in signedCms.SignerInfos)

{

foreach (var unsignedAttribute in signerInfo.UnsignedAttributes)

{

if (unsignedAttribute.Oid.Value == WinCrypt.szOID_RSA_counterSign)

{

//Note at this point we assume this counter signature is the timestamp

//refer to http://support.microsoft.com/kb/323809 for the origins

//TODO: extract timestamp value, if required

return true;

}

}

}

*/

}

catch (Exception)

{

// no logging

}

return strTimeStamp;

}

#endregion

}

internal struct WINTRUST_FILE_INFO : IDisposable

{

public WINTRUST_FILE_INFO(string fileName, Guid subject)

{

cbStruct = (uint)Marshal.SizeOf(typeof(WINTRUST_FILE_INFO));

pcwszFilePath = fileName;

if (subject != Guid.Empty)

{

pgKnownSubject = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Guid)));

Marshal.StructureToPtr(subject, pgKnownSubject, true);

}

else

{

pgKnownSubject = IntPtr.Zero;

}

hFile = IntPtr.Zero;

}

public uint cbStruct;

[MarshalAs(UnmanagedType.LPTStr)]

public string pcwszFilePath;

public IntPtr hFile;

public IntPtr pgKnownSubject;

#region IDisposable Members

public void Dispose()

{

Dispose(true);

}

private void Dispose(bool disposing)

{

if (pgKnownSubject != IntPtr.Zero)

{

Marshal.DestroyStructure(this.pgKnownSubject, typeof(Guid));

Marshal.FreeHGlobal(this.pgKnownSubject);

}

}

#endregion

}

enum AllocMethod

{

HGlobal,

CoTaskMem

};

enum UnionChoice

{

File = 1,

Catalog,

Blob,

Signer,

Cert

};

enum UiChoice

{

All = 1,

NoUI,

NoBad,

NoGood

};

enum RevocationCheckFlags

{

None = 0,

WholeChain

};

enum StateAction

{

Ignore = 0,

Verify,

Close,

AutoCache,

AutoCacheFlush

};

enum TrustProviderFlags

{

UseIE4Trust = 1,

NoIE4Chain = 2,

NoPolicyUsage = 4,

RevocationCheckNone = 16,

RevocationCheckEndCert = 32,

RevocationCheckChain = 64,

RecovationCheckChainExcludeRoot = 128,

Safer = 256,

HashOnly = 512,

UseDefaultOSVerCheck = 1024,

LifetimeSigning = 2048

};

enum UIContext

{

Execute = 0,

Install

};

[StructLayout(LayoutKind.Sequential)]

internal struct WINTRUST_DATA : IDisposable

{

public WINTRUST_DATA(WINTRUST_FILE_INFO fileInfo)

{

this.cbStruct = (uint)Marshal.SizeOf(typeof(WINTRUST_DATA));

pInfoStruct = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WINTRUST_FILE_INFO)));

Marshal.StructureToPtr(fileInfo, pInfoStruct, false);

this.dwUnionChoice = UnionChoice.File;

pPolicyCallbackData = IntPtr.Zero;

pSIPCallbackData = IntPtr.Zero;

dwUIChoice = UiChoice.NoUI;

fdwRevocationChecks = RevocationCheckFlags.None;

dwStateAction = StateAction.Ignore;

hWVTStateData = IntPtr.Zero;

pwszURLReference = IntPtr.Zero;

dwProvFlags = TrustProviderFlags.Safer;

dwUIContext = UIContext.Execute;

}

public uint cbStruct;

public IntPtr pPolicyCallbackData;

public IntPtr pSIPCallbackData;

public UiChoice dwUIChoice;

public RevocationCheckFlags fdwRevocationChecks;

public UnionChoice dwUnionChoice;

public IntPtr pInfoStruct;

public StateAction dwStateAction;

public IntPtr hWVTStateData;

private IntPtr pwszURLReference;

public TrustProviderFlags dwProvFlags;

public UIContext dwUIContext;

#region IDisposable Members

public void Dispose()

{

Dispose(true);

}

private void Dispose(bool disposing)

{

if (dwUnionChoice == UnionChoice.File)

{

WINTRUST_FILE_INFO info = new WINTRUST_FILE_INFO();

Marshal.PtrToStructure(pInfoStruct, info);

info.Dispose();

Marshal.DestroyStructure(pInfoStruct, typeof(WINTRUST_FILE_INFO));

}

Marshal.FreeHGlobal(pInfoStruct);

}

#endregion

}

internal sealed class UnmanagedPointer : IDisposable

{

private IntPtr m_ptr;

private AllocMethod m_meth;

internal UnmanagedPointer(IntPtr ptr, AllocMethod method)

{

m_meth = method;

m_ptr = ptr;

}

~UnmanagedPointer()

{

Dispose(false);

}

#region IDisposable Members

private void Dispose(bool disposing)

{

if (m_ptr != IntPtr.Zero)

{

if (m_meth == AllocMethod.HGlobal)

{

Marshal.FreeHGlobal(m_ptr);

}

else if (m_meth == AllocMethod.CoTaskMem)

{

Marshal.FreeCoTaskMem(m_ptr);

}

m_ptr = IntPtr.Zero;

}

if (disposing)

{

GC.SuppressFinalize(this);

}

}

public void Dispose()

{

Dispose(true);

}

#endregion

public static implicit operator IntPtr(UnmanagedPointer ptr)

{

return ptr.m_ptr;

}

}

#region time stamp

static class WinCrypt

{

[StructLayout(LayoutKind.Sequential)]

public struct BLOB

{

public int cbData;

public IntPtr pbData;

}

[StructLayout(LayoutKind.Sequential)]

public struct CRYPT_ALGORITHM_IDENTIFIER

{

public String pszObjId;

BLOB Parameters;

}

[StructLayout(LayoutKind.Sequential)]

public struct CERT_ID

{

public int dwIdChoice;

public BLOB IssuerSerialNumberOrKeyIdOrHashId;

}

[StructLayoutAttribute(LayoutKind.Sequential)]

public struct SIGNER_SUBJECT_INFO

{

/// DWORD->unsigned int

public uint cbSize;

/// DWORD*

public System.IntPtr pdwIndex;

/// DWORD->unsigned int

public uint dwSubjectChoice;

/// SubjectChoiceUnion

public SubjectChoiceUnion Union1;

}

[StructLayoutAttribute(LayoutKind.Explicit)]

public struct SubjectChoiceUnion

{

/// SIGNER_FILE_INFO*

[FieldOffsetAttribute(0)]

public System.IntPtr pSignerFileInfo;

/// SIGNER_BLOB_INFO*

[FieldOffsetAttribute(0)]

public System.IntPtr pSignerBlobInfo;

}

[StructLayout(LayoutKind.Sequential)]

public struct CERT_NAME_BLOB

{

public uint cbData;

[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]

public byte[] pbData;

}

[StructLayout(LayoutKind.Sequential)]

public struct CRYPT_INTEGER_BLOB

{

public UInt32 cbData;

public IntPtr pbData;

}

[StructLayout(LayoutKind.Sequential)]

public struct CRYPT_ATTR_BLOB

{

public uint cbData;

[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]

public byte[] pbData;

}

[StructLayout(LayoutKind.Sequential)]

public struct CRYPT_ATTRIBUTE

{

[MarshalAs(UnmanagedType.LPStr)]

public string pszObjId;

public uint cValue;

[MarshalAs(UnmanagedType.LPStruct)]

public CRYPT_ATTR_BLOB rgValue;

}

[StructLayout(LayoutKind.Sequential)]

public struct CMSG_SIGNER_INFO

{

public int dwVersion;

private CERT_NAME_BLOB Issuer;

CRYPT_INTEGER_BLOB SerialNumber;

CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;

CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;

BLOB EncryptedHash;

CRYPT_ATTRIBUTE[] AuthAttrs;

CRYPT_ATTRIBUTE[] UnauthAttrs;

}

[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]

public static extern Boolean CryptQueryObject(

int dwObjectType,

IntPtr pvObject,

int dwExpectedContentTypeFlags,

int dwExpectedFormatTypeFlags,

int dwFlags,

out int pdwMsgAndCertEncodingType,

out int pdwContentType,

out int pdwFormatType,

ref IntPtr phCertStore,

ref IntPtr phMsg,

ref IntPtr ppvContext);

[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]

public static extern Boolean CryptMsgGetParam(

IntPtr hCryptMsg,

int dwParamType,

int dwIndex,

IntPtr pvData,

ref int pcbData

);

[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]

public static extern Boolean CryptMsgGetParam(

IntPtr hCryptMsg,

int dwParamType,

int dwIndex,

[In, Out] byte[] vData,

ref int pcbData

);

[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

public static extern bool CryptDecodeObject(

uint CertEncodingType,

UIntPtr lpszStructType,

byte[] pbEncoded,

uint cbEncoded,

uint flags,

[In, Out] byte[] pvStructInfo,

ref uint cbStructInfo);

#region get signer name

[DllImport("crypt32.dll", EntryPoint = "CertGetNameString", CharSet = CharSet.Auto, SetLastError = true)]

static extern UInt32 CertGetNameString(

IntPtr CertContext,

UInt32 lType,

UInt32 lFlags,

IntPtr pTypeParameter,

System.Text.StringBuilder str,

UInt32 cch);

public const uint CERT_NAME_EMAIL_TYPE = 1;

public const uint CERT_NAME_RDN_TYPE = 2;

public const uint CERT_NAME_ATTR_TYPE = 3;

public const uint CERT_NAME_SIMPLE_DISPLAY_TYPE = 4;

public const uint CERT_NAME_FRIENDLY_DISPLAY_TYPE = 5;

public const uint CERT_NAME_DNS_TYPE = 6;

public const uint CERT_NAME_URL_TYPE = 7;

public const uint CERT_NAME_UPN_TYPE = 8;

public const uint CERT_NAME_ISSUER_FLAG = 0x1;

public const uint CERT_NAME_DISABLE_IE4_UTF8_FLAG = 0x00010000;

#endregion

public const int CRYPT_ASN_ENCODING = 0x00000001;

public const int CRYPT_NDR_ENCODING = 0x00000002;

public const int X509_ASN_ENCODING = 0x00000001;

public const int X509_NDR_ENCODING = 0x00000002;

public const int PKCS_7_ASN_ENCODING = 0x00010000;

public const int PKCS_7_NDR_ENCODING = 0x00020000;

public static UIntPtr PKCS7_SIGNER_INFO = new UIntPtr(500);

public static UIntPtr CMS_SIGNER_INFO = new UIntPtr(501);

public static string szOID_RSA_signingTime = "1.2.840.113549.1.9.5";

public static string szOID_RSA_counterSign = "1.2.840.113549.1.9.6";

//+-------------------------------------------------------------------------

// Get parameter types and their corresponding data structure definitions.

//--------------------------------------------------------------------------

public const int CMSG_TYPE_PARAM = 1;

public const int CMSG_CONTENT_PARAM = 2;

public const int CMSG_BARE_CONTENT_PARAM = 3;

public const int CMSG_INNER_CONTENT_TYPE_PARAM = 4;

public const int CMSG_SIGNER_COUNT_PARAM = 5;

public const int CMSG_SIGNER_INFO_PARAM = 6;

public const int CMSG_SIGNER_CERT_INFO_PARAM = 7;

public const int CMSG_SIGNER_HASH_ALGORITHM_PARAM = 8;

public const int CMSG_SIGNER_AUTH_ATTR_PARAM = 9;

public const int CMSG_SIGNER_UNAUTH_ATTR_PARAM = 10;

public const int CMSG_CERT_COUNT_PARAM = 11;

public const int CMSG_CERT_PARAM = 12;

public const int CMSG_CRL_COUNT_PARAM = 13;

public const int CMSG_CRL_PARAM = 14;

public const int CMSG_ENVELOPE_ALGORITHM_PARAM = 15;

public const int CMSG_RECIPIENT_COUNT_PARAM = 17;

public const int CMSG_RECIPIENT_INDEX_PARAM = 18;

public const int CMSG_RECIPIENT_INFO_PARAM = 19;

public const int CMSG_HASH_ALGORITHM_PARAM = 20;

public const int CMSG_HASH_DATA_PARAM = 21;

public const int CMSG_COMPUTED_HASH_PARAM = 22;

public const int CMSG_ENCRYPT_PARAM = 26;

public const int CMSG_ENCRYPTED_DIGEST = 27;

public const int CMSG_ENCODED_SIGNER = 28;

public const int CMSG_ENCODED_MESSAGE = 29;

public const int CMSG_VERSION_PARAM = 30;

public const int CMSG_ATTR_CERT_COUNT_PARAM = 31;

public const int CMSG_ATTR_CERT_PARAM = 32;

public const int CMSG_CMS_RECIPIENT_COUNT_PARAM = 33;

public const int CMSG_CMS_RECIPIENT_INDEX_PARAM = 34;

public const int CMSG_CMS_RECIPIENT_ENCRYPTED_KEY_INDEX_PARAM = 35;

public const int CMSG_CMS_RECIPIENT_INFO_PARAM = 36;

public const int CMSG_UNPROTECTED_ATTR_PARAM = 37;

public const int CMSG_SIGNER_CERT_ID_PARAM = 38;

public const int CMSG_CMS_SIGNER_INFO_PARAM = 39;

//-------------------------------------------------------------------------

//dwObjectType for CryptQueryObject

//-------------------------------------------------------------------------

public const int CERT_QUERY_OBJECT_FILE = 0x00000001;

public const int CERT_QUERY_OBJECT_BLOB = 0x00000002;

//-------------------------------------------------------------------------

//dwContentType for CryptQueryObject

//-------------------------------------------------------------------------

//encoded single certificate

public const int CERT_QUERY_CONTENT_CERT = 1;

//encoded single CTL

public const int CERT_QUERY_CONTENT_CTL = 2;

//encoded single CRL

public const int CERT_QUERY_CONTENT_CRL = 3;

//serialized store

public const int CERT_QUERY_CONTENT_SERIALIZED_STORE = 4;

//serialized single certificate

public const int CERT_QUERY_CONTENT_SERIALIZED_CERT = 5;

//serialized single CTL

public const int CERT_QUERY_CONTENT_SERIALIZED_CTL = 6;

//serialized single CRL

public const int CERT_QUERY_CONTENT_SERIALIZED_CRL = 7;

//a PKCS#7 signed message

public const int CERT_QUERY_CONTENT_PKCS7_SIGNED = 8;

//a PKCS#7 message, such as enveloped message. But it is not a signed message,

public const int CERT_QUERY_CONTENT_PKCS7_UNSIGNED = 9;

//a PKCS7 signed message embedded in a file

public const int CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED = 10;

//an encoded PKCS#10

public const int CERT_QUERY_CONTENT_PKCS10 = 11;

//an encoded PKX BLOB

public const int CERT_QUERY_CONTENT_PFX = 12;

//an encoded CertificatePair (contains forward and/or reverse cross certs)

public const int CERT_QUERY_CONTENT_CERT_PAIR = 13;

//-------------------------------------------------------------------------

//dwExpectedConentTypeFlags for CryptQueryObject

//-------------------------------------------------------------------------

//encoded single certificate

public const int CERT_QUERY_CONTENT_FLAG_CERT = (1 << CERT_QUERY_CONTENT_CERT);

//encoded single CTL

public const int CERT_QUERY_CONTENT_FLAG_CTL = (1 << CERT_QUERY_CONTENT_CTL);

//encoded single CRL

public const int CERT_QUERY_CONTENT_FLAG_CRL = (1 << CERT_QUERY_CONTENT_CRL);

//serialized store

public const int CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE = (1 << CERT_QUERY_CONTENT_SERIALIZED_STORE);

//serialized single certificate

public const int CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT = (1 << CERT_QUERY_CONTENT_SERIALIZED_CERT);

//serialized single CTL

public const int CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL = (1 << CERT_QUERY_CONTENT_SERIALIZED_CTL);

//serialized single CRL

public const int CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL = (1 << CERT_QUERY_CONTENT_SERIALIZED_CRL);

//an encoded PKCS#7 signed message

public const int CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED = (1 << CERT_QUERY_CONTENT_PKCS7_SIGNED);

//an encoded PKCS#7 message. But it is not a signed message

public const int CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED = (1 << CERT_QUERY_CONTENT_PKCS7_UNSIGNED);

//the content includes an embedded PKCS7 signed message

public const int CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED = (1 << CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED);

//an encoded PKCS#10

public const int CERT_QUERY_CONTENT_FLAG_PKCS10 = (1 << CERT_QUERY_CONTENT_PKCS10);

//an encoded PFX BLOB

public const int CERT_QUERY_CONTENT_FLAG_PFX = (1 << CERT_QUERY_CONTENT_PFX);

//an encoded CertificatePair (contains forward and/or reverse cross certs)

public const int CERT_QUERY_CONTENT_FLAG_CERT_PAIR = (1 << CERT_QUERY_CONTENT_CERT_PAIR);

//content can be any type

public const int CERT_QUERY_CONTENT_FLAG_ALL =

CERT_QUERY_CONTENT_FLAG_CERT |

CERT_QUERY_CONTENT_FLAG_CTL |

CERT_QUERY_CONTENT_FLAG_CRL |

CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE |

CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT |

CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL |

CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL |

CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED |

CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED |

CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED |

CERT_QUERY_CONTENT_FLAG_PKCS10 |

CERT_QUERY_CONTENT_FLAG_PFX |

CERT_QUERY_CONTENT_FLAG_CERT_PAIR;

//-------------------------------------------------------------------------

//dwFormatType for CryptQueryObject

//-------------------------------------------------------------------------

//the content is in binary format

public const int CERT_QUERY_FORMAT_BINARY = 1;

//the content is base64 encoded

public const int CERT_QUERY_FORMAT_BASE64_ENCODED = 2;

//the content is ascii hex encoded with "{ASN}" prefix

public const int CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED = 3;

//-------------------------------------------------------------------------

//dwExpectedFormatTypeFlags for CryptQueryObject

//-------------------------------------------------------------------------

//the content is in binary format

public const int CERT_QUERY_FORMAT_FLAG_BINARY = (1 << CERT_QUERY_FORMAT_BINARY);

//the content is base64 encoded

public const int CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED = (1 << CERT_QUERY_FORMAT_BASE64_ENCODED);

//the content is ascii hex encoded with "{ASN}" prefix

public const int CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = (1 << CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED);

//the content can be of any format

public const int CERT_QUERY_FORMAT_FLAG_ALL =

CERT_QUERY_FORMAT_FLAG_BINARY |

CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED |

CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED;

}

#endregion

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐