public void GetClientCertificateOrDefault3()
        {
            var text          = new StringBuilder();
            var loggerFactory = LoggerFactory.Create(builder => builder.AddStringBuilder(text));

            var path = GetCertificatesPath();

            Console.WriteLine("Path: " + path);

            var options = new SslOptions
            {
                CertificateName     = "cert-not",
                CertificatePath     = Path.Combine(path, "client-not.pfx"),
                CertificatePassword = "******"
            };
            var ssl = new SslLayer(options, loggerFactory);
            X509Certificate2Collection certs = null;

            try
            {
                certs = ssl.GetClientCertificatesOrDefault();
                Assert.Fail("Expected an exception.");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            Console.WriteLine(text.ToString());
            Assert.That(text.ToString(), Does.Contain("Failed to load client certificate"));
            text.Clear();
        }
        public void GetClientCertificateOrDefault1()
        {
            var text          = new StringBuilder();
            var loggerFactory = LoggerFactory.Create(builder => builder.AddStringBuilder(text));

            var path = GetCertificatesPath();

            Console.WriteLine("Path: " + path);

            var options = new SslOptions
            {
                CertificatePath = null
            };
            var ssl   = new SslLayer(options, loggerFactory);
            var certs = ssl.GetClientCertificatesOrDefault();

            Assert.That(certs, Is.Null);
        }
        public async Task GetStreamAsync()
        {
            var options = new SslOptions();
            var ssl     = new SslLayer(options, new NullLoggerFactory());

            await AssertEx.ThrowsAsync <ArgumentNullException>(async() => await ssl.GetStreamAsync(null));

            var stream    = new MemoryStream();
            var sslStream = await ssl.GetStreamAsync(stream);

            Assert.That(sslStream, Is.SameAs(stream));

            options = new SslOptions {
                Enabled = true
            };
            ssl = new SslLayer(options, new NullLoggerFactory());

            await AssertEx.ThrowsAsync <ConnectionException>(async() => sslStream = await ssl.GetStreamAsync(stream));
        }
        public void GetClientCertificateOrDefault2()
        {
            var text          = new StringBuilder();
            var loggerFactory = LoggerFactory.Create(builder => builder.AddStringBuilder(text));

            var path = GetCertificatesPath();

            Console.WriteLine("Path: " + path);

            var options = new SslOptions
            {
                CertificateName     = "cert1",
                CertificatePath     = Path.Combine(path, "client1.pfx"),
                CertificatePassword = "******"
            };
            var ssl   = new SslLayer(options, loggerFactory);
            var certs = ssl.GetClientCertificatesOrDefault();

            Assert.That(certs, Is.Not.Null);
            Assert.That(certs.Count, Is.EqualTo(1));
        }
        public void ValidateCertificate()
        {
            var text          = new StringBuilder();
            var loggerFactory = LoggerFactory.Create(builder => builder.AddStringBuilder(text));

            var sender = new object();
            var cert   = new X509Certificate();
            var chain  = new X509Chain();

            var options = new SslOptions {
                ValidateCertificateChain = true
            };
            var ssl          = new SslLayer(options, loggerFactory);
            var policyErrors = SslPolicyErrors.RemoteCertificateChainErrors;
            var valid        = ssl.ValidateCertificate(sender, cert, chain, policyErrors);

            Console.WriteLine(text.ToString());
            Assert.That(text.ToString(), Does.Contain("certificate error: RemoteCertificateChainErrors"));
            Assert.That(text.ToString(), Does.Contain("chain status:"));
            text.Clear();

            options = new SslOptions {
                ValidateCertificateChain = false
            };
            ssl          = new SslLayer(options, loggerFactory);
            policyErrors = SslPolicyErrors.RemoteCertificateChainErrors;
            valid        = ssl.ValidateCertificate(sender, cert, chain, policyErrors);

            Console.WriteLine(text.ToString());
            Assert.That(text.ToString(), Does.Contain("certificate errors (chain validation) ignored by client configuration"));
            text.Clear();

            options = new SslOptions {
                ValidateCertificateName = false
            };
            ssl          = new SslLayer(options, loggerFactory);
            policyErrors = SslPolicyErrors.RemoteCertificateNameMismatch;
            valid        = ssl.ValidateCertificate(sender, cert, chain, policyErrors);

            Console.WriteLine(text.ToString());
            Assert.That(text.ToString(), Does.Contain("certificate errors (name validation) ignored by client configuration"));
            text.Clear();

            options = new SslOptions {
                ValidateCertificateName = true
            };
            ssl          = new SslLayer(options, loggerFactory);
            policyErrors = SslPolicyErrors.RemoteCertificateNameMismatch;
            valid        = ssl.ValidateCertificate(sender, cert, chain, policyErrors);

            Console.WriteLine(text.ToString());
            Assert.That(text.ToString(), Does.Contain("certificate error: RemoteCertificateNameMismatch"));
            text.Clear();

            options      = new SslOptions();
            ssl          = new SslLayer(options, loggerFactory);
            policyErrors = SslPolicyErrors.RemoteCertificateNotAvailable;
            valid        = ssl.ValidateCertificate(sender, cert, chain, policyErrors);

            Console.WriteLine(text.ToString());
            Assert.That(text.ToString(), Does.Contain("certificate error: RemoteCertificateNotAvailable"));
            text.Clear();
        }