/// <summary>
        /// Create an authority key info X509 extension
        /// </summary>
        /// <param name="serialNumber">Serial number of the info</param>
        /// <param name="issuer">Issuer subject name</param>
        /// <param name="key">RSA key</param>
        /// <returns>The constructed X509 extension</returns>
        private X509Extension CreateAuthorityKeyInfo2(byte[] serialNumber, X500DistinguishedName issuer, RSACryptoServiceProvider key)
        {
            CryptoApiMethods.CERT_AUTHORITY_KEY_ID2_INFO keyInfo       = new CryptoApiMethods.CERT_AUTHORITY_KEY_ID2_INFO();
            CryptoApiMethods.CERT_ALT_NAME_DIRECTORY     directoryName = new CryptoApiMethods.CERT_ALT_NAME_DIRECTORY();
            // CERT_ALT_NAME_DIRECTORY_NAME = 5
            X509Extension ret = null;

            try
            {
                keyInfo.AuthorityCertSerialNumber      = new CryptoApiMethods.CRYPTOAPI_BLOB(serialNumber);
                directoryName.dwAltNameChoice          = 5;
                directoryName.DirectoryName            = new CryptoApiMethods.CRYPTOAPI_BLOB(issuer.RawData);
                keyInfo.AuthorityCertIssuer            = new CryptoApiMethods.CERT_ALT_NAME_INFO();
                keyInfo.AuthorityCertIssuer.cAltEntry  = 1;
                keyInfo.AuthorityCertIssuer.rgAltEntry = Marshal.AllocHGlobal(Marshal.SizeOf(directoryName));
                Marshal.StructureToPtr(directoryName, keyInfo.AuthorityCertIssuer.rgAltEntry, false);

                keyInfo.KeyId = new CryptoApiMethods.CRYPTOAPI_BLOB(HashPublicKeyInfo(key));

                ret = EncodeExtension(CryptoApiMethods.szOID_AUTHORITY_KEY_IDENTIFIER2, keyInfo, false);
            }
            finally
            {
                if (keyInfo.AuthorityCertSerialNumber != null)
                {
                    keyInfo.AuthorityCertSerialNumber.Release();
                }

                if (keyInfo.AuthorityCertIssuer.rgAltEntry != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(keyInfo.AuthorityCertIssuer.rgAltEntry);
                }

                if (directoryName.DirectoryName != null)
                {
                    directoryName.DirectoryName.Release();
                }

                if (keyInfo.KeyId != null)
                {
                    keyInfo.KeyId.Release();
                }
            }

            return(ret);
        }
        /// <summary>
        /// Create an authority key info X509 extension
        /// </summary>
        /// <param name="serialNumber">Serial number of the info</param>
        /// <param name="issuer">Issuer subject name</param>
        /// <param name="key">RSA key</param>
        /// <returns>The constructed X509 extension</returns>
        private X509Extension CreateAuthorityKeyInfo2(byte[] serialNumber, X500DistinguishedName issuer, RSACryptoServiceProvider key)
        {
            CryptoApiMethods.CERT_AUTHORITY_KEY_ID2_INFO keyInfo = new CryptoApiMethods.CERT_AUTHORITY_KEY_ID2_INFO();
            CryptoApiMethods.CERT_ALT_NAME_DIRECTORY directoryName = new CryptoApiMethods.CERT_ALT_NAME_DIRECTORY();
            // CERT_ALT_NAME_DIRECTORY_NAME = 5
            X509Extension ret = null;

            try
            {
                keyInfo.AuthorityCertSerialNumber = new CryptoApiMethods.CRYPTOAPI_BLOB(serialNumber);
                directoryName.dwAltNameChoice = 5;
                directoryName.DirectoryName = new CryptoApiMethods.CRYPTOAPI_BLOB(issuer.RawData);
                keyInfo.AuthorityCertIssuer = new CryptoApiMethods.CERT_ALT_NAME_INFO();
                keyInfo.AuthorityCertIssuer.cAltEntry = 1;
                keyInfo.AuthorityCertIssuer.rgAltEntry = Marshal.AllocHGlobal(Marshal.SizeOf(directoryName));
                Marshal.StructureToPtr(directoryName, keyInfo.AuthorityCertIssuer.rgAltEntry, false);

                keyInfo.KeyId = new CryptoApiMethods.CRYPTOAPI_BLOB(HashPublicKeyInfo(key));

                ret = EncodeExtension(CryptoApiMethods.szOID_AUTHORITY_KEY_IDENTIFIER2, keyInfo, false);
            }
            finally
            {
                if (keyInfo.AuthorityCertSerialNumber != null)
                {
                    keyInfo.AuthorityCertSerialNumber.Release();
                }

                if (keyInfo.AuthorityCertIssuer.rgAltEntry != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(keyInfo.AuthorityCertIssuer.rgAltEntry);
                }

                if (directoryName.DirectoryName != null)
                {
                    directoryName.DirectoryName.Release();
                }

                if (keyInfo.KeyId != null)
                {
                    keyInfo.KeyId.Release();
                }
            }

            return ret;
        }