Beispiel #1
0
        private unsafe void GenerateServerApplicationKey()
        {
            var hash = stackalloc byte[HandshakeHash.HashSize];
            var span = new Span <byte>(hash, HandshakeHash.HashSize);

            HandshakeHash.InterimHash(hash, HandshakeHash.HashSize);
            KeySchedule.GenerateMasterSecret(span);
            Console.WriteLine("Application Write Key");
            _writeKey?.Dispose();
            _writeKey = KeySchedule.GenerateServerApplicationKey();
        }
Beispiel #2
0
        private unsafe void GenerateHandshakeKeys()
        {
            if (KeySchedule == null)
            {
                KeySchedule = Listener.KeyScheduleProvider.GetKeySchedule(this);
            }
            KeySchedule.SetDheDerivedValue(KeyShare);
            var hash = stackalloc byte[HandshakeHash.HashSize];
            var span = new Span <byte>(hash, HandshakeHash.HashSize);

            HandshakeHash.InterimHash(hash, HandshakeHash.HashSize);
            KeySchedule.GenerateHandshakeTrafficSecrets(span);
            _writeKey = KeySchedule.GenerateServerHandshakeKey();
            if (PskIdentity == -1 || !EarlyDataSupported)
            {
                _readKey?.Dispose();
                _readKey = KeySchedule.GenerateClientHandshakeKey();
            }
        }
Beispiel #3
0
        public async Task HandleHandshakeMessage(HandshakeType handshakeMessageType, ReadableBuffer buffer, IPipelineWriter pipe)
        {
            switch (State)
            {
            case StateType.WaitServerHello:
                if (handshakeMessageType == HandshakeType.server_hello)
                {
                    Hello.ReadServerHello(buffer, this);
                    GenerateHandshakeKeys();
                    State = StateType.WaitEncryptedExtensions;
                    return;
                }
                break;

            case StateType.WaitEncryptedExtensions:
                if (handshakeMessageType == HandshakeType.encrypted_extensions)
                {
                    HandshakeContext(buffer);
                    State = StateType.WaitServerVerification;
                    return;
                }
                break;

            case StateType.WaitServerVerification:
                if (handshakeMessageType == HandshakeType.certificate)
                {
                    Handshake.Certificates.ReadCertificates(buffer, Listener);
                    HandshakeContext(buffer);
                    return;
                }
                if (handshakeMessageType == HandshakeType.certificate_verify)
                {
                    HandshakeContext(buffer);
                    State = StateType.WaitServerFinished;
                    return;
                }
                break;

            case StateType.WaitServerFinished:
                if (handshakeMessageType == HandshakeType.finished)
                {
                    HandshakeContext(buffer);
                    var hash = new byte[HandshakeHash.HashSize];
                    HandshakeHash.InterimHash(hash);
                    var writer = pipe.Alloc();
                    ServerHandshakeTls13.ServerFinished(ref writer, this, KeySchedule.GenerateClientFinishedKey());
                    _dataForCurrentScheduleSent.Reset();
                    await writer.FlushAsync();

                    await _dataForCurrentScheduleSent;
                    GenerateApplicationKeys(hash);
                    KeySchedule.GenerateResumptionSecret();
                    HandshakeHash.Dispose();
                    HandshakeHash = null;
                    State         = StateType.HandshakeComplete;
                    return;
                }
                break;

            case StateType.HandshakeComplete:
                if (handshakeMessageType == HandshakeType.new_session_ticket)
                {
                    Listener.ResumptionProvider.RegisterSessionTicket(buffer);
                    return;
                }
                break;
            }
            Alerts.AlertException.ThrowAlert(Alerts.AlertLevel.Fatal, Alerts.AlertDescription.unexpected_message, "");
        }