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(); }
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(); } }
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, ""); }