public void TestSslClientConfiguration5()
        {
            var location = new IPEndPoint(IPAddress.Loopback, 5055);

            server = new SslServer(location)
            {
                ServerCertificate =
                    SslServer.LoadCertificate(
                        serverCert),
                AuthenticateClient = true
            };
            server.Start();
            TcpClient client = new TcpClient();

            try
            {
                IXmlDocument xmlDoc = XmlHelper.LoadXml("./Net/Ssl/Configs/config5.xml");

                IStreamProvider streamProvider = StreamProviderFactory.CreateProvider(xmlDoc);

                client.Connect(location);
                Stream stream = streamProvider.GetStream(client);

                string echo = SslClient.Echo(stream, "Hello World");
                Assert.AreEqual(echo, "Hello World");
            }
            finally
            {
                client.Close();
                server.Stop();
                client = null;
            }
        }
        public void TestSslConfigurationWithSelector()
        {
            IXmlDocument xmlDoc = XmlHelper.LoadXml("./Net/Ssl/Configs/config6.xml");

            Assert.NotNull(xmlDoc);

            IStreamProvider streamProvider = StreamProviderFactory.CreateProvider(xmlDoc);

            Assert.NotNull(streamProvider);
            Assert.IsTrue(streamProvider is SslStreamProvider);

            SslStreamProvider sslStreamProvider = (streamProvider as SslStreamProvider);

            Assert.IsTrue(sslStreamProvider.LocalCertificateSelector is LocalCertificateSelectionCallback);

            var location = new IPEndPoint(IPAddress.Loopback, 5055);

            server = new SslServer(location)
            {
                ServerCertificate  = SslServer.LoadCertificate(serverCert),
                AuthenticateClient = true
            };
            server.Start();

            TcpClient client = new TcpClient();

            try
            {
                client.Connect(location);
                Stream stream = streamProvider.GetStream(client);

                string echo = SslClient.Echo(stream, "Hello World");
                Assert.Fail("Expected Exception, but got none");
            }
            catch (Exception e)
            {
                Console.WriteLine("SslTests.TestSslConfigurationWithSelector(), exception: " + e.ToString());
                Assert.IsTrue(e is AuthenticationException);
                Assert.NotNull(e.Message);
                Assert.IsTrue(e.Message.Contains("RemoteCertificateNameMismatch"));
            }
            finally
            {
                client.Close();
                server.Stop();
                client = null;
            }
        }
        public void TestSslRemoteCertValidation()
        {
            IXmlDocument xmlDoc = XmlHelper.LoadXml("./Net/Ssl/Configs/config7.xml");

            Assert.NotNull(xmlDoc);

            IStreamProvider streamProvider = StreamProviderFactory.CreateProvider(xmlDoc);

            Assert.NotNull(streamProvider);
            Assert.IsTrue(streamProvider is SslStreamProvider);

            SslStreamProvider sslStreamProvider = (streamProvider as SslStreamProvider);

            Assert.IsTrue(sslStreamProvider.RemoteCertificateValidator is RemoteCertificateValidationCallback);

            var location = new IPEndPoint(IPAddress.Loopback, 5055);

            server = new SslServer(location)
            {
                ServerCertificate  = SslServer.LoadCertificate(serverCert),
                AuthenticateClient = true
            };
            server.Start();

            TcpClient client = new TcpClient();

            try
            {
                client.Connect(location);
                Stream stream = streamProvider.GetStream(client);
                Assert.NotNull(stream);
                Assert.AreEqual(sslStreamProvider.ServerName, "MyServerName");

                string echo = SslClient.Echo(stream, "Hello World");
                Assert.AreEqual(echo, "Hello World");
            }
            finally
            {
                client.Close();
                server.Stop();
                client = null;
            }
        }
        /// <summary>
        /// Configure the controllable service.
        /// </summary>
        /// <remarks>
        /// <p/>
        /// This method can only be called before the controllable service
        /// is started.
        /// </remarks>
        /// <param name="xml">
        /// An <see cref="IXmlElement"/> carrying configuration information
        /// specific to the IControllable object.
        /// </param>
        /// <exception cref="InvalidOperationException">
        /// Thrown if the service is already running.
        /// </exception>
        /// <exception cref="ArgumentException">
        /// Thrown if the configuration information is invalid.
        /// </exception>
        public override void Configure(IXmlElement xml)
        {
            lock (this)
            {
                base.Configure(xml);
                if (xml == null)
                {
                    return;
                }

                // <tcp-initiator>
                IXmlElement xmlCat = xml.GetSafeElement("tcp-initiator");

                // <stream-provider/>
                IXmlElement xmlSub = xmlCat.GetSafeElement("stream-provider");
                StreamProvider = StreamProviderFactory.CreateProvider(xmlSub);

                // <local-address>
                xmlSub = xmlCat.GetSafeElement("local-address");

                // <address>
                // <port>
                LocalAddress = ParseLocalSocketAddress(xmlSub);

                // <reusable>
                IsLocalAddressReusable = xmlSub.GetSafeElement("reusable").
                                         GetBoolean(IsLocalAddressReusable);

                // <remote-addresses>
                bool isNameService = false;
                xmlSub = xmlCat.GetElement("name-service-addresses");
                if (xmlSub == null)
                {
                    xmlSub = xmlCat.GetSafeElement("remote-addresses");
                }
                else
                {
                    isNameService = true;
                }
                IAddressProviderFactory factory;

                IXmlElement xmlProvider = xmlSub.GetElement("address-provider");
                bool        missing     = xmlProvider == null;
                bool        empty       = !missing && xmlProvider.IsEmpty;
                if (empty || missing)
                {
                    ConfigurableAddressProviderFactory factoryImpl =
                        new ConfigurableAddressProviderFactory();
                    factoryImpl.Config = missing ? xmlSub : xmlProvider;
                    factory            = factoryImpl;
                }
                else
                {
                    String name = xmlProvider.GetString();
                    factory = (IAddressProviderFactory)
                              OperationalContext.AddressProviderMap[name];
                    if (factory == null)
                    {
                        throw new ArgumentException("Address provider "
                                                    + name + " not found.");
                    }
                }
                RemoteAddressProvider = factory.CreateAddressProvider();
                if (RemoteAddressProvider is ConfigurableAddressProvider && ConnectTimeout > 0)
                {
                    ((ConfigurableAddressProvider)RemoteAddressProvider).RequestTimeout = ConnectTimeout;
                }

                IsNameService = isNameService;
                if (isNameService)
                {
                    Subport = (int)WellKnownSubPorts.NameService;
                }
                else
                {
                    Subport = -1;
                }

                // <reuse-address>
                IsLocalAddressReusable = xmlCat.GetSafeElement("reuse-address").
                                         GetBoolean(IsLocalAddressReusable);

                // <keep-alive-enabled/>
                IsKeepAliveEnabled = xmlCat.GetSafeElement("keep-alive-enabled")
                                     .
                                     GetBoolean(IsKeepAliveEnabled);

                // <tcp-delay-enabled>
                IsTcpDelayEnabled = xmlCat.GetSafeElement("tcp-delay-enabled").
                                    GetBoolean(IsTcpDelayEnabled);

                // <receive-buffer-size>
                ReceiveBufferSize = ParseMemorySize(
                    xmlCat, "receive-buffer-size", ReceiveBufferSize);

                // <send-buffer-size>
                SendBufferSize = ParseMemorySize(
                    xmlCat, "send-buffer-size", SendBufferSize);

                // <linger-timeout>
                LingerTimeout = ParseTime(
                    xmlCat, "linger-timeout", LingerTimeout);
            }
        }