Example #1
0
        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
        }
Example #2
0
 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);
         }
     }
 }