Esempio n. 1
0
        //https://tools.ietf.org/rfc/rfc7301.txt
        //should return no_application_protocol
        public static async Task UnknownALPN(SecurePipeOptions securePipeOptions)
        {
            var exception = await Assert.ThrowsAsync <Leto.Alerts.AlertException>(async() => await TestForAlert(securePipeOptions, s_unknownALPN));

            Assert.Equal(Leto.Alerts.AlertLevel.Fatal, exception.Level);
            Assert.Equal(Leto.Alerts.AlertDescription.no_application_protocol, exception.Description);
        }
Esempio n. 2
0
        public static async Task WrongInitialHandshakeMessage(SecurePipeOptions securePipeOptions)
        {
            var exception = await Assert.ThrowsAsync <Leto.Alerts.AlertException>(async() => await TestForAlert(securePipeOptions, s_wrongHandshakeMessage));

            Assert.Equal(Leto.Alerts.AlertLevel.Fatal, exception.Level);
            Assert.Equal(Leto.Alerts.AlertDescription.unexpected_message, exception.Description);
        }
Esempio n. 3
0
        public static async Task StartWithApplicationRecord(SecurePipeOptions securePipeOptions)
        {
            var exception = await Assert.ThrowsAsync <Leto.Alerts.AlertException>(async() => await TestForAlert(securePipeOptions, s_StartedWithApplication));

            Assert.Equal(Leto.Alerts.AlertLevel.Fatal, exception.Level);
            Assert.Equal(Leto.Alerts.AlertDescription.unexpected_message, exception.Description);
        }
Esempio n. 4
0
        public static async Task SendHelloWithExtraTrailingBytes(SecurePipeOptions securePipeOptions)
        {
            var exception = await Assert.ThrowsAsync <Leto.Alerts.AlertException>(async() => await TestForAlert(securePipeOptions, s_extraBytesAtEnd));

            Assert.Equal(Leto.Alerts.AlertLevel.Fatal, exception.Level);
            Assert.Equal(Leto.Alerts.AlertDescription.decode_error, exception.Description);
        }
Esempio n. 5
0
        public static async Task InvalidVectorSizeForExtensions(SecurePipeOptions securePipeOptions)
        {
            var exception = await Assert.ThrowsAsync <Leto.Alerts.AlertException>(async() => await TestForAlert(securePipeOptions, s_invalidVectorSizeForExtensions));

            Assert.Equal(Leto.Alerts.AlertLevel.Fatal, exception.Level);
            Assert.Equal(Leto.Alerts.AlertDescription.decode_error, exception.Description);
            Assert.Contains(Leto.Alerts.AlertLevel.Fatal.ToString(), exception.Message);
            Assert.Contains(Leto.Alerts.AlertDescription.decode_error.ToString(), exception.Message);
            Assert.Equal(exception.Message, exception.ToString());
        }
Esempio n. 6
0
 internal SecurePipeConnection(IPipeConnection connection, SecurePipeOptions securePipeOptions, IConnectionState connectionState)
 {
     RecordHandler      = new GeneralRecordHandler(null, TlsVersion.Tls1, connection.Output);
     _securePipeOptions = securePipeOptions;
     _inputPipe         = new Pipe(securePipeOptions.PipeOptions);
     _outputPipe        = new Pipe(securePipeOptions.PipeOptions);
     _connection        = connection;
     _state             = connectionState;
     _state.Connection  = this;
     _handshakeInput    = new Pipe(securePipeOptions.PipeOptions);
     _handshakeOutput   = new Pipe(securePipeOptions.PipeOptions);
     RecordHandler      = new GeneralRecordHandler(_state, TlsVersion.Tls12, _connection.Output);
     var ignore = ReadingLoop();
 }
Esempio n. 7
0
        private static async Task TestForAlert(SecurePipeOptions securePipeOptions, byte[] messageToSend)
        {
            using (var pool = new MemoryPool())
            {
                var pipeFactory      = new PipeOptions(pool);
                var connection       = new LoopbackPipeline(pipeFactory);
                var secureConnection = securePipeOptions.CreateConnection(connection.ServerPipeline);

                var writer = connection.ClientPipeline.Output.Alloc();
                writer.Write(messageToSend);
                await writer.FlushAsync();

                var result = await connection.ClientPipeline.Input.ReadAsync();

                var exception = CheckForAlert(result.Buffer);
                connection.ClientPipeline.Input.Advance(result.Buffer.End);
                var closeConnection = await secureConnection;
                closeConnection.Dispose();
                throw exception;
            }
        }
        private static async Task ConnectWithSslStream(PipeOptions factory, SecurePipeOptions securePipeOptions, byte[] message)
        {
            var loopback         = new LoopbackPipeline(factory);
            var stream           = loopback.ClientPipeline.GetStream();
            var secureConnection = securePipeOptions.CreateConnection(loopback.ServerPipeline);
            var ignore           = Echo(secureConnection);

            using (var sslStream = new SslStream(stream, false, CertVal))
            {
                await sslStream.AuthenticateAsClientAsync("localhost");

                await sslStream.WriteAsync(message, 0, message.Length);

                var returnBuffer = new byte[message.Length];
                var byteCount    = 0;
                while (byteCount < message.Length)
                {
                    byteCount += await sslStream.ReadAsync(returnBuffer, byteCount, returnBuffer.Length - byteCount);
                }
                Assert.Equal(message, returnBuffer);
            }
            secureConnection.Result.Dispose();
        }
 public static Task MultiBufferFact(PipeOptions factory, SecurePipeOptions securePipeOptions) => ConnectWithSslStream(factory, securePipeOptions, s_MessageLargerThanOneBuffer);
 public static Task SmallMessageFact(PipeOptions factory, SecurePipeOptions securePipeOptions) => ConnectWithSslStream(factory, securePipeOptions, s_SmallMessage);
Esempio n. 11
0
 internal SecurePipeClientConnection(IPipeConnection connection, SecurePipeOptions securePipeOptions)
     : base(connection, securePipeOptions, new Client12ConnectionState())
 {
 }
Esempio n. 12
0
 internal SecurePipeServerConnection(IPipeConnection connection, SecurePipeOptions securePipeOptions)
     : base(connection, securePipeOptions, new Server12ConnectionState())
 {
 }