Esempio n. 1
0
        public void TestDeserialization()
        {
            var deserialized = LaunchSpecification.Deserialize(expectedLaunchSpec);

            //Assert.Equal(handshakeKey, deserialized.HandshakeKey);
            Assert.Equal(sessionId, deserialized.SessionId);
        }
Esempio n. 2
0
        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)))));
                    }
                }
            }
        }