public void TestDeserialization() { var deserialized = LaunchSpecification.Deserialize(expectedLaunchSpec); //Assert.Equal(handshakeKey, deserialized.HandshakeKey); Assert.Equal(sessionId, deserialized.SessionId); }
private void HandleControlMessage(byte[] payload, Session session) { if (payload[0] == 0) // Control Packet { byte[] message = payload; ControlMessage controlMessage = new ControlMessage(); using (MemoryStream memoryStream = new MemoryStream(message, 0, message.Length)) using (BinaryReader binaryWriter = new BinaryReader(memoryStream)) { controlMessage.Deserialize(binaryWriter); } if (controlMessage.ProtoBuffFlag == 1 && controlMessage.PLoadSize > 100) { TakionMessage takionMessage = ProtobufUtil.Deserialize <TakionMessage>(controlMessage.UnParsedPayload); if (takionMessage.bigPayload != null) { this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Big payload session key: " + takionMessage.bigPayload.sessionKey))); this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Big payload ecdh pub key in hex: " + HexUtil.Hexlify(takionMessage.bigPayload.ecdhPubKey)))); this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Big payload ecdh sig in hex: " + HexUtil.Hexlify(takionMessage.bigPayload.ecdhSig)))); if (session != null) { byte[] launchSpecBuffer = Convert.FromBase64String(takionMessage.bigPayload.launchSpec); byte[] cryptoBuffer = new byte[launchSpecBuffer.Length]; cryptoBuffer = session.Encrypt(cryptoBuffer, 0); byte[] newLaunchSpec = new byte[launchSpecBuffer.Length]; for (int j = 0; j < launchSpecBuffer.Length; j++) { newLaunchSpec[j] = (byte)(launchSpecBuffer[j] ^ cryptoBuffer[j]); } string launchSpecs = Encoding.UTF8.GetString(newLaunchSpec); LaunchSpecification launchSpecJsonObject = LaunchSpecification.Deserialize(launchSpecs); byte[] handshakeKey = launchSpecJsonObject.HandshakeKey; if (handshakeKey != null) { this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Big payload handshake key in launchSpec in hex: " + HexUtil.Hexlify(handshakeKey)))); var ecdhSignatureVerification = Session.CalculateHMAC(handshakeKey, takionMessage.bigPayload.ecdhPubKey); if (ecdhSignatureVerification.SequenceEqual(takionMessage.bigPayload.ecdhSig)) { this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("ECDH Signature matches!"))); } else { this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!!! ECDH Signature mismatch"))); } } this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Big payload full launchSpec: " + Environment.NewLine + launchSpecJsonObject.Serialize() + Environment.NewLine))); } else { this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox(Environment.NewLine))); } } else if (takionMessage.bangPayload != null) { this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Bang payload session key: " + takionMessage.bangPayload.sessionKey))); this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Bang payload ecdh pub key in hex: " + HexUtil.Hexlify(takionMessage.bangPayload.ecdhPubKey)))); this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Bang payload ecdh sig in hex: " + HexUtil.Hexlify(takionMessage.bangPayload.ecdhSig) + Environment.NewLine))); } } else { if (controlMessage.Crypto != 0) { this.textBoxPcapLogOutput.Invoke(new MethodInvoker(() => AppendLogOutputToPcapLogTextBox("!!! Control message with crypto value: " + HexUtil.Hexlify(ByteUtil.UIntToByteArray(controlMessage.Crypto))))); } } } }