private static byte[] DecodeOctetString(byte[] data) { const EncodingType type = EncodingType.X509_ASN_ENCODING; var handle = default(GCHandle); try { handle = GCHandle.Alloc(data, GCHandleType.Pinned); var size = 0u; const CryptDecodeFlags flags = CryptDecodeFlags.CRYPT_DECODE_ALLOC_FLAG; if (!Crypto32.CryptDecodeObjectEx(type, X509_OCTET_STRING, handle.AddrOfPinnedObject(), (uint)data.Length, flags, IntPtr.Zero, out LocalBufferSafeHandle buffer, ref size)) { return(null); } using (buffer) { unsafe { var structure = (CRYPT_OBJID_BLOB)Marshal.PtrToStructure(buffer.DangerousGetHandle(), typeof(CRYPT_OBJID_BLOB)); var ret = new byte[structure.cbData]; Marshal.Copy(structure.pbData, ret, 0, ret.Length); return(ret); } } } finally { if (handle.IsAllocated) { handle.Free(); } } }
public static extern bool CryptDecodeObject( CryptEncodingFlags certEncodingType, IntPtr lpszStructType, byte[] pbEncoded, int cbEncoded, CryptDecodeFlags flags, [In, Out] byte[] pvStructInfo, ref uint cbStructInfo );
public static extern unsafe bool CryptDecodeObjectEx ( [param: In, MarshalAs(UnmanagedType.U4)] EncodingType dwCertEncodingType, [param: In, MarshalAs(UnmanagedType.SysInt)] IntPtr lpszStructType, [param: In, MarshalAs(UnmanagedType.SysInt)] IntPtr pbEncoded, [param: In, MarshalAs(UnmanagedType.U4)] uint cbEncoded, [param: In, MarshalAs(UnmanagedType.U4)] CryptDecodeFlags dwFlags, [param: In, MarshalAs(UnmanagedType.SysInt)] IntPtr pDecodePara, [param: Out] out LocalBufferSafeHandle pvStructInfo, [param: In, Out, MarshalAs(UnmanagedType.U4)] ref uint pcbStructInfo );
internal static extern int CCGetCertNameList(IntPtr certContext, AltNameType dwAltNameChoice, CryptDecodeFlags dwFlags, out int cName, out IntPtr papwszName);