Exemplo n.º 1
0
        private void ProcessPeerCommand(SocketState connection, PacketEnvelope envelope)
        {
            if (envelope.Label == IntraServiceLables.ApplyNegotiationToken)
            {
                connection.KeyNegotiator = new SecureKeyExchange.SecureKeyNegotiator();
                byte[] replyToken = connection.KeyNegotiator.ApplyNegotiationToken(envelope.Payload);

                SendPacketEnvelope(connection, new PacketEnvelope
                {
                    Label   = IntraServiceLables.ApplyResponseNegotiationToken,
                    Payload = replyToken
                });

                SendPacketEnvelope(connection, new PacketEnvelope
                {
                    Label = IntraServiceLables.EncryptionNegotationComplete
                });
            }
            else if (envelope.Label == IntraServiceLables.ApplyResponseNegotiationToken)
            {
                connection.KeyNegotiator.ApplyNegotiationResponseToken(envelope.Payload);

                SendPacketEnvelope(connection, new PacketEnvelope
                {
                    Label = IntraServiceLables.EncryptionNegotationComplete
                });
            }
            else if (envelope.Label == IntraServiceLables.EncryptionNegotationComplete)
            {
                connection.IsEncryptionNegotationComplete = true;
                //Console.WriteLine("--{0} Shared Secret: {1}", connection.Route.Name, connection.KeyNegotiator.SharedSecretString);

                string sharedSecretString = connection.IsEncryptionNegotationComplete ? connection.KeyNegotiator.SharedSecretString : null;

                string commonSalt = null;
                if (connection.IsIncomming && connection.IsEncryptionNegotationComplete)
                {
                    commonSalt = _route.BindingPreSharedKey;
                }
                else if (connection.IsOutgoing && connection.IsEncryptionNegotationComplete)
                {
                    commonSalt = _route.EndpointPreSharedKey;
                }

                SendPacketEnvelope(connection, new PacketEnvelope
                {
                    Label = IntraServiceLables.TunnelNegotationComplete,
                }, sharedSecretString, commonSalt);
            }
            else if (envelope.Label == IntraServiceLables.TunnelNegotationComplete)
            {
                connection.SetTunnelNegotationComplete();
                //Console.WriteLine("--{0} TunnelNegotationComplete", connection.Route.Name);
                //Console.WriteLine("--{0} Shared Secret: {1}", connection.Route.Name, connection.KeyNegotiator.SharedSecretString);
            }
        }