public void TestAesCrypto() { // Arrange IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Loopback, _port); BasicLidgrenCryptoProviderResolver resolver = new BasicLidgrenCryptoProviderResolver(); ObservableAESEncryption encryption = new ObservableAESEncryption(_applicationId, "topsecret"); int cryptoFired = 0; // 0: request before encrypt; 1: request after encrypt // 2: request received before decrypt; 3: request recieved after decrypt // 4: response before encrypt; 5: response after encrypt // 6: response received before decrypt; 7: response received after decrypt List <byte[]> serializedBytes = new List <byte[]>(); encryption.OnEncrypt = (b, a) => { serializedBytes.Add(b); serializedBytes.Add(a); cryptoFired++; }; encryption.OnDecrypt = (b, a) => { serializedBytes.Add(b); serializedBytes.Add(a); cryptoFired++; }; using (CreateServer(resolver)) using (ClientConnection client = CreateClientConnection(resolver)) { client.Open(); // Act + Assert ICalculator calculator = client.RemoteExecutor.Create <ICalculator>(); Assert.AreEqual(5, calculator.Add(3, 2)); Assert.AreEqual(0, cryptoFired); IPEndPoint clientEndPoint = client.GetClientEndpoint(); resolver.Register(clientEndPoint, encryption); resolver.Register(serverEndPoint, encryption); Assert.AreEqual(11, calculator.Add(5, 6)); Assert.AreEqual(4, cryptoFired); CollectionAssert.AreNotEqual(serializedBytes[0], serializedBytes[1]); CollectionAssert.AreEqual(serializedBytes[1], serializedBytes[2]); CollectionAssert.AreNotEqual(serializedBytes[2], serializedBytes[3]); CollectionAssert.AreNotEqual(serializedBytes[4], serializedBytes[5]); CollectionAssert.AreEqual(serializedBytes[5], serializedBytes[6]); CollectionAssert.AreNotEqual(serializedBytes[6], serializedBytes[7]); } }
static void Main(string[] args) { BasicLidgrenCryptoProviderResolver resolver = new BasicLidgrenCryptoProviderResolver(); EncryptedConfigurator.Configure(resolver); IOperationDispatcher callbackDispatcher = new OperationDispatcher(); SessionEncryptedCallback callback = new SessionEncryptedCallback(); callbackDispatcher.RegisterHandler <ISessionEncryptedCallback>(callback); using (ClientConnection client = new ClientConnection("net://localhost:3133/EncryptedServices", callbackDispatcher)) { Console.WriteLine("Opening client..."); Console.WriteLine(); client.Open(); IAuthenticator authenticator = client.RemoteExecutor.Create <IAuthenticator>(); Console.WriteLine("Note that encryption is not strictly enforced. Enforcement is left up to the developer."); Console.WriteLine("11 + 6 = " + authenticator.Add(11, 6)); Console.WriteLine(); Console.WriteLine("Generating secret key..."); byte[] secretBytes = CreateByteKey(96); string secretString = Convert.ToBase64String(secretBytes); Console.WriteLine("Secret key is " + secretString); Console.WriteLine(); Console.WriteLine("Encrypting secret key..."); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(authenticator.GetRsaParameters().ToParams()); byte[] encryptedBytes = rsa.Encrypt(secretBytes, false); Console.WriteLine("Encrypted key is " + Convert.ToBase64String(encryptedBytes)); Console.WriteLine(); Console.WriteLine("Establishing encrypted session..."); authenticator.EncryptSession(encryptedBytes); Console.WriteLine("Awaiting encryption confirmation..."); callback.Wait(); Console.WriteLine("Encryption confirmed; registering crypto provider..."); resolver.Register(new IPEndPoint(IPAddress.Loopback, 3133), new DebugNetAESEncryption(EmptyPeer, secretString)); Console.WriteLine("Connection is encrypted."); const int wait = 160; Console.WriteLine($"Pausing for {wait} milliseconds to ensure server has time to register crypto provider..."); Thread.Sleep(wait); Console.WriteLine("Done waiting."); Console.WriteLine(); Console.WriteLine("5 + 6 = " + authenticator.Add(5, 6)); Console.WriteLine(); Console.WriteLine("Done. Press enter to exit."); Console.ReadLine(); } }