public void Test_SecureConnection()
        {
            for (int i = 0; i < 32; i++)
            {
                TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 60000));
                listener.Start();
                var listenerAcceptSocket = listener.BeginAcceptSocket(null, null);

                TcpClient client = new TcpClient();
                client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 60000));

                var server = listener.EndAcceptSocket(listenerAcceptSocket);
                listener.Stop();

                DigitalSignature clientDigitalSignature = null;
                DigitalSignature serverDigitalSignature = null;

                if (_random.Next(0, 100) < 50)
                {
                    clientDigitalSignature = new DigitalSignature("NickName1", DigitalSignatureAlgorithm.EcDsaP521_Sha256);
                }

                if (_random.Next(0, 100) < 50)
                {
                    serverDigitalSignature = new DigitalSignature("NickName2", DigitalSignatureAlgorithm.EcDsaP521_Sha256);
                }

                SecureConnectionVersion clientVersion;
                SecureConnectionVersion serverVersion;

                {
                    clientVersion = SecureConnectionVersion.Version3;
                    serverVersion = SecureConnectionVersion.Version3;
                }

                {
                    //SecureConnectionVersion clientVersion = 0;
                    //SecureConnectionVersion serverVersion = 0;

                    //for (; ; )
                    //{
                    //    switch (_random.Next(0, 3))
                    //    {
                    //        case 0:
                    //            clientVersion = SecureConnectionVersion.Version2;
                    //            break;
                    //        case 1:
                    //            clientVersion = SecureConnectionVersion.Version3;
                    //            break;
                    //        case 2:
                    //            clientVersion = SecureConnectionVersion.Version2 | SecureConnectionVersion.Version3;
                    //            break;
                    //    }

                    //    switch (_random.Next(0, 3))
                    //    {
                    //        case 0:
                    //            serverVersion = SecureConnectionVersion.Version2;
                    //            break;
                    //        case 1:
                    //            serverVersion = SecureConnectionVersion.Version3;
                    //            break;
                    //        case 2:
                    //            serverVersion = SecureConnectionVersion.Version2 | SecureConnectionVersion.Version3;
                    //            break;
                    //    }

                    //    if ((clientVersion & serverVersion) != 0) break;
                    //}
                }

                //var TcpClient = new BaseConnection(client.Client, Test_Library_Net_Connection.MaxReceiveCount, _bufferManager);
                using (var secureClient = new SecureConnection(clientVersion, SecureConnectionType.Connect, new BaseConnection(new SocketCap(client.Client), null, Test_Library_Net_Connection.MaxReceiveCount, _bufferManager), clientDigitalSignature, _bufferManager))
                    using (var secureServer = new SecureConnection(serverVersion, SecureConnectionType.Accept, new BaseConnection(new SocketCap(server), null, Test_Library_Net_Connection.MaxReceiveCount, _bufferManager), serverDigitalSignature, _bufferManager))
                    {
                        try
                        {
                            var clientConnectTask = secureClient.ConnectAsync(new TimeSpan(0, 0, 20));
                            var serverConnectTask = secureServer.ConnectAsync(new TimeSpan(0, 0, 20));

                            Task.WaitAll(clientConnectTask, serverConnectTask);

                            if (clientDigitalSignature != null)
                            {
                                if (secureServer.Certificate.ToString() != clientDigitalSignature.ToString())
                                {
                                    throw new Exception();
                                }
                            }

                            if (serverDigitalSignature != null)
                            {
                                if (secureClient.Certificate.ToString() != serverDigitalSignature.ToString())
                                {
                                    throw new Exception();
                                }
                            }

                            using (MemoryStream stream = new MemoryStream())
                            {
                                var buffer = new byte[1024 * 8];
                                _random.NextBytes(buffer);

                                stream.Write(buffer, 0, buffer.Length);
                                stream.Seek(0, SeekOrigin.Begin);

                                var clientSendTask    = secureClient.SendAsync(stream, new TimeSpan(0, 0, 20));
                                var serverReceiveTask = secureServer.ReceiveAsync(new TimeSpan(0, 0, 20));

                                Task.WaitAll(clientConnectTask, serverReceiveTask);

                                using (var returnStream = serverReceiveTask.Result)
                                {
                                    var buff2 = new byte[(int)returnStream.Length];
                                    returnStream.Read(buff2, 0, buff2.Length);

                                    Assert.IsTrue(CollectionUtilities.Equals(buffer, buff2), "SecureConnection #1");
                                }
                            }

                            using (MemoryStream stream = new MemoryStream())
                            {
                                var buffer = new byte[1024 * 8];
                                _random.NextBytes(buffer);

                                stream.Write(buffer, 0, buffer.Length);
                                stream.Seek(0, SeekOrigin.Begin);

                                var serverSendTask    = secureServer.SendAsync(stream, new TimeSpan(0, 0, 20));
                                var clientReceiveTask = secureClient.ReceiveAsync(new TimeSpan(0, 0, 20));

                                Task.WaitAll(serverSendTask, clientReceiveTask);

                                using (var returnStream = clientReceiveTask.Result)
                                {
                                    var buff2 = new byte[(int)returnStream.Length];
                                    returnStream.Read(buff2, 0, buff2.Length);

                                    Assert.IsTrue(CollectionUtilities.Equals(buffer, buff2), "SecureConnection #2");
                                }
                            }
                        }
                        catch (AggregateException e)
                        {
                            Assert.IsTrue(e.InnerException.GetType() == typeof(ConnectionException) &&
                                          (clientVersion & serverVersion) == 0, "SecureConnection #Version test");
                        }
                    }

                client.Close();
                server.Close();
            }
        }