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);
            }
        }
Ejemplo n.º 2
0
 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
 );