internal static IntPtr ImportRsaPublicKey(byte[] rawData)
        {
            CryptoProvider provider            = new CryptoProvider();
            IntPtr         nativeStructure     = IntPtr.Zero;
            int            nativeStructureSize = 0;

            try {
                if (!Advapi32.CryptDecodeObjectEx(CertificateEncodingType.X509Asn,
                                                  InteropHelpers.GetWellKnownOIDPointer(InteropHelpers.WellKnownOIDs.X509PublicKeyInfo),
                                                  rawData, rawData.Length, Advapi32.EncodingFlags.AllocateMemory, IntPtr.Zero,
                                                  ref nativeStructure, ref nativeStructureSize))
                {
                    throw new CryptographyException((WinErrors)(uint)Marshal.GetLastWin32Error());
                }
                IntPtr result = IntPtr.Zero;
                if (!Crypt32.CryptImportPublicKeyInfo(provider.Handle, CertificateEncodingType.X509Asn,
                                                      nativeStructure, out result))
                {
                    throw new CryptographyException((WinErrors)(uint)Marshal.GetLastWin32Error());
                }
                return(result);
            }
            finally {
                if (IntPtr.Zero != nativeStructure)
                {
                    if (IntPtr.Zero != Kernel32.LocalFree(nativeStructure))
                    {
                        throw new InteropException(Marshal.GetLastWin32Error());
                    }
                }
                provider.Dispose();
            }
        }