public static CERT_SIGNED_CONTENT_INFO Decode_CERT_SIGNED_CONTENT_INFO(IntPtr pEncoded, int iEncodedSize)
{
IntPtr pData1 = IntPtr.Zero;
int dwDataSize1 = 0;
try
{
// calculate amount of memory required.
int bResult = Win32.CryptDecodeObjectEx(
Win32.X509_ASN_ENCODING | Win32.PKCS_7_ASN_ENCODING,
(IntPtr)Win32.X509_CERT,
pEncoded,
iEncodedSize,
Win32.CRYPT_DECODE_NOCOPY_FLAG,
IntPtr.Zero,
pData1,
ref dwDataSize1);
if (bResult == 0)
{
throw GetLastError(StatusCodes.BadDecodingError, "Could not get size for CERT_SIGNED_CONTENT_INFO.");
}
// allocate memory.
pData1 = Marshal.AllocHGlobal(dwDataSize1);
// decode blob.
bResult = Win32.CryptDecodeObjectEx(
Win32.X509_ASN_ENCODING | Win32.PKCS_7_ASN_ENCODING,
(IntPtr)Win32.X509_CERT,
pEncoded,
iEncodedSize,
Win32.CRYPT_DECODE_NOCOPY_FLAG,
IntPtr.Zero,
pData1,
ref dwDataSize1);
if (bResult == 0)
{
throw GetLastError(StatusCodes.BadDecodingError, "Could not decode CERT_SIGNED_CONTENT_INFO.");
}
return (Win32.CERT_SIGNED_CONTENT_INFO)Marshal.PtrToStructure(pData1, typeof(Win32.CERT_SIGNED_CONTENT_INFO));
}
finally
{
if (pData1 != IntPtr.Zero)
{
Marshal.FreeHGlobal(pData1);
}
}
}