public void S2_DataTransfer_SecurityChannelCreation_ReliableConnection() { Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ..."); StartRDPConnection(); this.TestSite.Log.Add(LogEntryKind.Comment, "Create a reliable UDP connection."); this.EstablishUDPConnection(TransportMode.Reliable, waitTime, true, true); // Set the autoHandle to true, then can be used for create security channel. this.TestSite.Log.Add(LogEntryKind.Comment, "Start TLS handshake."); String certFile = this.Site.Properties["CertificatePath"]; String certPwd = this.Site.Properties["CertificatePassword"]; X509Certificate2 cert = new X509Certificate2(certFile, certPwd); rdpemtServerR = new RdpemtServer(rdpeudpSocketR, cert, false); this.TestSite.Log.Add(LogEntryKind.Comment, "Wait for a RDP_TUNNEL_CREATEREQUEST message from client after security channel creation"); RDP_TUNNEL_CREATEREQUEST createReq = rdpemtServerR.ExpectTunnelCreateRequest(waitTime); Site.Assert.IsNotNull(createReq, "Client should send a RDP_TUNNEL_CREATEREQUEST message after security channel creation."); }
/// <summary> /// Used to establish a RDPEMT connection /// </summary> /// <param name="udpTransportMode">Transport Mode: Reliable or Lossy</param> /// <param name="timeout">wait time</param> private void EstablishRdpemtConnection(TransportMode udpTransportMode, TimeSpan timeout, bool verifyPacket = false) { RdpeudpSocket rdpeudpSocket = rdpeudpSocketR; if (udpTransportMode == TransportMode.Lossy) { rdpeudpSocket = rdpeudpSocketL; } String certFile = this.Site.Properties["CertificatePath"]; String certPwd = this.Site.Properties["CertificatePassword"]; X509Certificate2 cert = new X509Certificate2(certFile, certPwd); RdpemtServer rdpemtServer = new RdpemtServer(rdpeudpSocket, cert, false); uint receivedRequestId; byte[] receivedSecurityCookie; if (!rdpemtServer.ExpectConnect(waitTime, out receivedRequestId, out receivedSecurityCookie)) { Site.Assert.Fail("RDPEMT tunnel creation failed"); } if (verifyPacket) { VerifyTunnelCreateRequestPacket(receivedRequestId, receivedSecurityCookie); } if (udpTransportMode == TransportMode.Reliable) { rdpemtServerR = rdpemtServer; } else { rdpemtServerL = rdpemtServer; } }
/// <summary> /// Establish a MultiTransport Connection /// </summary> private void EstablishTransportConnection() { // Send the Server Initial multitransport byte[] securityCookie = new byte[16]; Random rnd = new Random(); rnd.NextBytes(securityCookie); Server_Initiate_Multitransport_Request_PDU requestPDU = rdpbcgrServer.CreateServerInitiateMultitransportRequestPDU(serverSessionContext, ++multitransportId, transportProtocol, securityCookie); rdpbcgrServer.SendPdu(serverSessionContext, requestPDU); //Create RDP-UDP Connection CreateRdpeudpServer(this.serverSessionContext); TransportMode transMode = TransportMode.Reliable; if (transportProtocol == Multitransport_Protocol_value.INITITATE_REQUEST_PROTOCOL_UDPFECL) { transMode = TransportMode.Lossy; } rdpeudpSocket = rdpeudpServer.Accept(((IPEndPoint)serverSessionContext.Identity).Address, transMode, timeout); if(rdpeudpSocket == null) { if (rdpeudpServer != null && rdpeudpServer.Running) rdpeudpServer.Dispose(); throw new NotSupportedException("RDPEMT Server create rdpedupSocket failed."); } rdpemtServer = new RdpemtServer(rdpeudpSocket, rdpbcgrServer.AuthCertificate, true); rdpemtServer.Received += ReceivedBytes; uint receivedRequestId; byte[] receivedCookie; if (!rdpemtServer.ExpectConnect(timeout, out receivedRequestId, out receivedCookie)) { throw new ProtocolViolationException("RDPEMT Server Expect Connection failed"); } if (receivedRequestId != multitransportId || receivedCookie == null || receivedCookie.Length != 16) { throw new ProtocolViolationException("RDPEMT Server received a connection with un-expected request id or Cookie is null (or cookie's length is not 16)!"); } for (int i = 0; i < receivedCookie.Length; i++) { if (receivedCookie[i] != securityCookie[i]) { throw new ProtocolViolationException("RDPEMT Server received a connection with un-correct cookie!"); } } }