/// <summary>
        /// Export the public RSA keyinfo from the current crypto provider
        /// </summary>
        /// <param name="hProv">Handle to the crypto provider</param>
        /// <param name="signature">Set to true for AT_SIGNATURE, false for AT_KEYEXCHANGE</param>
        /// <returns>An IntPtr pointing to the public key info structure</returns>
        private IntPtr ExportPublicKeyInfo(CryptoApiMethods.SafeCryptProviderHandle hProv, bool signature)
        {
            CryptoApiMethods.CALG type = signature ? CryptoApiMethods.CALG.AT_SIGNATURE : CryptoApiMethods.CALG.AT_KEYEXCHANGE;
            IntPtr ret     = IntPtr.Zero;
            uint   infoLen = 0;

            if (!CryptoApiMethods.CryptExportPublicKeyInfoEx(hProv, type, CryptoApiMethods.CertEncoding.X509_ASN_ENCODING,
                                                             CryptoApiMethods.szOID_RSA_RSA, 0, IntPtr.Zero, ret, ref infoLen))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }

            ret = Marshal.AllocHGlobal((int)infoLen);

            if (!CryptoApiMethods.CryptExportPublicKeyInfoEx(hProv, type, CryptoApiMethods.CertEncoding.X509_ASN_ENCODING,
                                                             CryptoApiMethods.szOID_RSA_RSA, 0, IntPtr.Zero, ret, ref infoLen))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }

            return(ret);
        }