private static byte[] EncodeData(byte[] publicKey, byte[] serialNumber) { IntPtr publicKeyPtr = IntPtr.Zero, serialNumberPtr = IntPtr.Zero; try { var identifier = new CERT_AUTHORITY_KEY_ID2_INFO(); identifier.AuthorityCertIssuer = new CERT_ALT_NAME_INFO { cAltEntry = 0 }; if (serialNumber != null) { serialNumberPtr = Marshal.AllocHGlobal(serialNumber.Length); Marshal.Copy(serialNumber, 0, serialNumberPtr, serialNumber.Length); identifier.AuthorityCertSerialNumber = new CRYPTOAPI_BLOB { cbData = (uint)serialNumber.Length, pbData = serialNumberPtr }; } if (publicKey != null) { publicKeyPtr = Marshal.AllocHGlobal(publicKey.Length); Marshal.Copy(publicKey, 0, publicKeyPtr, publicKey.Length); identifier.KeyId = new CRYPTOAPI_BLOB { cbData = (uint)publicKey.Length, pbData = publicKeyPtr }; } uint dataSize = 0; byte[] data; if (Crypt32.CryptEncodeObjectEx(EncodingType.X509_ASN_ENCODING, OIDs.szOID_AUTHORITY_KEY_IDENTIFIER2, ref identifier, 0x8000, IntPtr.Zero, out data, ref dataSize)) { return data; } throw new Win32Exception(Marshal.GetLastWin32Error()); } finally { Marshal.FreeHGlobal(publicKeyPtr); Marshal.FreeHGlobal(serialNumberPtr); } }
public static extern bool CryptEncodeObjectEx ( [param: In, MarshalAs(UnmanagedType.U4)] EncodingType dwCertEncodingType, [param: In, MarshalAs(UnmanagedType.LPStr)] string lpszStructType, [param: In, MarshalAs(UnmanagedType.Struct)] ref CERT_AUTHORITY_KEY_ID2_INFO pvStructInfo, [param: In, MarshalAs(UnmanagedType.U4)] uint dwFlags, [param: In, MarshalAs(UnmanagedType.SysInt)] IntPtr pEncodePara, [param: Out] out LocalBufferSafeHandle pvEncoded, [param: In, Out, MarshalAs(UnmanagedType.U4)] ref uint pcbEncoded );