public void ExportPrivateKey_InPemFormat()
        {
            // Arrange
            var certificateGenerator = new CertificateGenerator();
            var keyPair = certificateGenerator.GetKeyPair();

            //Act
            var privateKeyText = certificateGenerator.ExportKeyPair(keyPair);

            //Assert
            Assert.True(privateKeyText.StartsWith("-----BEGIN RSA PRIVATE KEY-----\r\n"));
            Assert.True(privateKeyText.EndsWith("\r\n-----END RSA PRIVATE KEY-----\r\n"));
        }
        public void GenerateCaCertificate_SubjectValid_ValidCertificate()
        {
            // Arrange
            var certificateGenerator = new CertificateGenerator();
            var caKeyPair = certificateGenerator.GetKeyPair();
            const string subjectName = "Test CA";

            IDictionary caCertificateDetails = new Hashtable();
            caCertificateDetails[X509Name.CN] = subjectName;

            IList caCertificateDetailsOrder = new ArrayList();
            caCertificateDetailsOrder.Add(X509Name.CN);

            // Act
            var caCertificate = certificateGenerator.GenerateCaCertificate(caKeyPair, caCertificateDetails, caCertificateDetailsOrder);

            // Assert
            Assert.AreEqual("CN=" + subjectName, caCertificate.SubjectDN.ToString());
        }
        private static void CreateCaCertificate(CertificateGenerator certificateGenerator, IProxyServerConfiguration proxyServerConfiguration)
        {
            var caKeyPair = certificateGenerator.GetKeyPair();

            IDictionary caCertificateDetails = new Hashtable();
            caCertificateDetails[X509Name.C] = "UK";
            caCertificateDetails[X509Name.O] = "Acceptance Test Proxy Organization";
            caCertificateDetails[X509Name.OU] = "Testing Department";
            //caCertificateDetails[X509Name.DnQualifier]; //populatated automatically from CN
            caCertificateDetails[X509Name.ST] = "London";
            caCertificateDetails[X509Name.CN] = "AcceptanceTestProxy CA";
            //caCertificateDetails[X509Name.SerialNumber] = CaCertificateName;  //populatated automatically

            //RFC 5208
            IList caCertificateDetailsOrder = new ArrayList();
            caCertificateDetailsOrder.Add(X509Name.C);
            caCertificateDetailsOrder.Add(X509Name.O);
            caCertificateDetailsOrder.Add(X509Name.OU);
            //caCertificateDetailsOrder.Add(X509Name.DnQualifier);
            caCertificateDetailsOrder.Add(X509Name.ST);
            caCertificateDetailsOrder.Add(X509Name.CN);
            //caCertificateDetailsOrder.Add(X509Name.SerialNumber);

            var caCertificate = certificateGenerator.GenerateCaCertificate(caKeyPair, caCertificateDetails, caCertificateDetailsOrder);

            var caKeyPairFileName = Path.Combine(proxyServerConfiguration.CertificatePath, proxyServerConfiguration.CaKeyPairFileName);
            if (File.Exists(caKeyPairFileName))
            {
                File.Delete(caKeyPairFileName);
            }
            var privateKeyText = certificateGenerator.ExportKeyPair(caKeyPair);
            File.WriteAllText(caKeyPairFileName, privateKeyText);

            var caCertificateFileName = Path.Combine(proxyServerConfiguration.CertificatePath, proxyServerConfiguration.CaCertificateFileName);
            if (File.Exists(caCertificateFileName))
            {
                File.Delete(caCertificateFileName);
            }
            var certificateText = certificateGenerator.ExportCertificate(caCertificate);
            File.WriteAllText(caCertificateFileName, certificateText);
        }
        public void ExportCertificate_InPemFormat()
        {
            // Arrange
            var certificateGenerator = new CertificateGenerator();
            var caKeyPair = certificateGenerator.GetKeyPair();
            const string caSubjectName = "Test CA";

            IDictionary caCertificateDetails = new Hashtable();
            caCertificateDetails[X509Name.CN] = caSubjectName;

            IList caCertificateDetailsOrder = new ArrayList();
            caCertificateDetailsOrder.Add(X509Name.CN);

            var caCertificate = certificateGenerator.GenerateCaCertificate(caKeyPair, caCertificateDetails, caCertificateDetailsOrder);

            //Act
            var certificateText = certificateGenerator.ExportCertificate(caCertificate);

            //Assert
            Assert.True(certificateText.StartsWith("-----BEGIN CERTIFICATE-----\r\n"));
            Assert.True(certificateText.EndsWith("\r\n-----END CERTIFICATE-----\r\n"));
        }
        public void GenerateCertificateSignedWithCaCertificate_SignedWithCaCertificate_ValidCertificate()
        {
            // Arrange
            var certificateGenerator = new CertificateGenerator();
            var caKeyPair = certificateGenerator.GetKeyPair();
            const string caSubjectName = "Test CA";

            IDictionary caCertificateDetails = new Hashtable();
            caCertificateDetails[X509Name.CN] = caSubjectName;

            IList caCertificateDetailsOrder = new ArrayList();
            caCertificateDetailsOrder.Add(X509Name.CN);

            var caCertificate = certificateGenerator.GenerateCaCertificate(caKeyPair, caCertificateDetails, caCertificateDetailsOrder);

            var keyPair = certificateGenerator.GetKeyPair();
            const string subjectName = "www.google.com";

            IDictionary certificateDetails = new Hashtable();
            certificateDetails[X509Name.CN] = subjectName;

            IList certificateDetailsOrder = new ArrayList();
            certificateDetailsOrder.Add(X509Name.CN);

            // Act
            var certificate = certificateGenerator.GenerateCertificateSignedWithCaCertificate(caKeyPair, caCertificate, keyPair, certificateDetails, certificateDetailsOrder);

            // Assert
            Assert.AreEqual("CN=" + caSubjectName, certificate.IssuerDN.ToString()); //Signed with CA
        }
        public void ImportKeyPair_InPemFormat()
        {
            // Arrange
            var certificateGenerator = new CertificateGenerator();
            var caKeyPair = certificateGenerator.GetKeyPair();

            var privateKeyText = certificateGenerator.ExportKeyPair(caKeyPair);

            //Act
            var keyPair = certificateGenerator.ImportKeyPair(privateKeyText);

            //Assert
            Assert.AreEqual(caKeyPair.Private, keyPair.Private);
            Assert.AreEqual(caKeyPair.Public, keyPair.Public);
        }
        public void ImportCertificate_InPemFormat()
        {
            // Arrange
            var certificateGenerator = new CertificateGenerator();
            var caKeyPair = certificateGenerator.GetKeyPair();
            const string caSubjectName = "Test CA";

            IDictionary caCertificateDetails = new Hashtable();
            caCertificateDetails[X509Name.CN] = caSubjectName;

            IList caCertificateDetailsOrder = new ArrayList();
            caCertificateDetailsOrder.Add(X509Name.CN);

            var caCertificate = certificateGenerator.GenerateCaCertificate(caKeyPair, caCertificateDetails, caCertificateDetailsOrder);
            var certificateText = certificateGenerator.ExportCertificate(caCertificate);

            //Act
            var certificate = certificateGenerator.ImportCertificate(certificateText);

            //Assert
            Assert.AreEqual(caCertificate.GetPublicKey(), certificate.GetPublicKey());
        }