public void SendMessageEncryptsMessage() { var innerConnection = new TestConnection(); var outerConnection = new EncryptingConnection(innerConnection); var request = new ServerRequest(); var expectedResponse = new Response(request); var actionName = "DoSomething"; string iv = null; string key = null; innerConnection.SendMessageAction = (a, r) => { Response sendResponse = null; if (a == "RetrievePublicKey") { sendResponse = this.GenerateKeyResponse(r); } else if (a == "InitialiseSecureConnection") { Assert.IsInstanceOf <LoginRequest>(r); sendResponse = this.GenerateConnectioResponse(r as LoginRequest, out iv, out key); } else if (a == "ProcessSecureRequest") { Assert.IsInstanceOf <EncryptedRequest>(r); var actualRequest = r as EncryptedRequest; Assert.AreEqual(actionName, actualRequest.Action); var crypto = new RijndaelManaged(); crypto.Key = Convert.FromBase64String(key); crypto.IV = Convert.FromBase64String(iv); var requestData = DecryptMessage(crypto, actualRequest.EncryptedData); Assert.AreEqual(request.ToString(), requestData); var encryptedResponse = new EncryptedResponse(); encryptedResponse.Result = ResponseResult.Success; encryptedResponse.EncryptedData = EncryptMessage(crypto, expectedResponse.ToString()); sendResponse = encryptedResponse; } else { Assert.Fail("Unknown action: " + a); } return(sendResponse); }; var response = outerConnection.SendMessage(actionName, request); Assert.IsNotNull(response); Assert.AreEqual(expectedResponse.RequestIdentifier, response.RequestIdentifier); }