/// <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; }