private async Task SendClientFinished(CancellationToken token) { // >>> IVU: create finished message by hand var finishedMsg = _handshakeSession.GetOutputMessages(); if (finishedMsg.Length != 1 || finishedMsg.First().Type != HandshakeMessageType.Finished) { throw new InvalidOperationException("Oops, I thought the handshake session should create a finished message?!?"); } foreach (var msg in finishedMsg) { logger?.Debug("Sending HandshakeMessage {0} back to server...", msg.Type); } // finished message resides in only one record var records = _handshakePacketizer.ProcessHandshakeMessages( _handshakeSession.NegotiatedVersion, finishedMsg, _recordStream.MaximumFragmentLength); foreach (var record in records) { _recordHandler.ProcessOutputRecord(record); } await _recordStream.SendAsync(records, token); // <<< IVU }
private void ProcessSendHandshakePacket(AsyncHandshakeResult asyncHandshakeResult) { HandshakeMessage[] messages = _handshakeSession.GetOutputMessages(); Record[] records = _handshakePacketizer.ProcessHandshakeMessages(_handshakeSession.NegotiatedVersion, messages, _recordStream.MaximumFragmentLength); if (records.Length > 0) { // Encrypt the handshake records for (int i = 0; i < records.Length; i++) { _recordHandler.ProcessOutputRecord(records[i]); } _recordStream.BeginSend(records, new AsyncCallback(SendHandshakeCallback), asyncHandshakeResult); } else { if (_handshakeSession.State == HandshakeState.Finished) { // Handshake finished, mark result as complete asyncHandshakeResult.SetComplete(); } else if (_handshakeSession.State == HandshakeState.SendChangeCipherSpec) { ProcessSendChangeCipherSpec(asyncHandshakeResult); } else { // Handshake not finished, receive the next handshake packet _recordStream.BeginReceive(new AsyncCallback(ReceiveHandshakeCallback), asyncHandshakeResult); } } }