public override void HandleAlertMessage(ReadableBuffer messageBuffer) { var level = messageBuffer.ReadBigEndian <Alerts.AlertLevel>(); messageBuffer = messageBuffer.Slice(sizeof(Alerts.AlertLevel)); var description = messageBuffer.ReadBigEndian <Alerts.AlertDescription>(); if (level == Alerts.AlertLevel.Warning && description == Alerts.AlertDescription.end_of_early_data && State == StateType.WaitEarlyDataFinished) { //0RTT data finished so we switch the reader key to the handshake key and wait for //the client to send it's finish message _readKey?.Dispose(); _readKey = KeySchedule.GenerateClientHandshakeKey(); ChangeState(StateType.WaitClientFinished); return; } Alerts.AlertException.ThrowAlert(level, description, "Alert from the client"); }
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(); } }