Example #1
0
        private void HandleIncomingPeerTestPackage(BufRefLen reader)
        {
            var msg       = new PeerTest(reader);
            var nonceinfo = Session.Host.GetNonceInfo(msg.TestNonce.Peek32(0));

            if (msg.AliceIPAddr.Length == 0 && msg.AlicePort.Peek16(0) == 0)
            {
                // We are Bob, and we got the first message from Alice
                RespondToPeerTestInitiationFromAlice(msg, nonceinfo);
                return;
            }

            if (!msg.IPAddressOk)
            {
                Logging.LogTransport($"SSU {this}: HandleIncomingPeerTestPackage: IP Address not accepted. Ignorning. {msg}");
                return;
            }

            if (nonceinfo != null)
            {
                switch (nonceinfo.Role)
                {
                case PeerTestRole.Bob:
                {
                    // Got initial response from Charlie
                    // Try to contact Alice
                    SendMessage(
                        new IPEndPoint(new IPAddress(msg.AliceIPAddr.ToByteArray()), msg.AlicePort.PeekFlip16(0)),
                        SSUHeader.MessageTypes.PeerTest,
                        msg.IntroKey,
                        msg.IntroKey,
                        (start, writer) =>
                        {
                            Logging.LogTransport($"SSU {this}: PeerTest. We are Bob, relaying response from Charlie to Alice {msg}");
                            msg.WriteTo(writer);

                            return(true);
                        });
                }
                    return;

                case PeerTestRole.Charlie:
                {
                    // We got the final test from Alice
                    SendMessage(
                        SSUHeader.MessageTypes.PeerTest,
                        Session.MACKey,
                        Session.SharedKey,
                        (start, writer) =>
                        {
                            Logging.LogTransport($"SSU {this}: PeerTest. We are Charlie, responding to the final message from Alice {msg}");
                            msg.WriteTo(writer);

                            return(true);
                        });
                }
                    return;

                default:
                    Logging.Log($"SSU {this}: PeerTest. Unexpedted PeerTest received. {msg}");
                    break;
                }
            }
            else
            {
                // We are Charlie receiving a relay from Bob.
                Session.Host.SetNonceInfo(msg.TestNonce.Peek32(0), PeerTestRole.Charlie);

                // Reply to Bob
                SendMessage(
                    SSUHeader.MessageTypes.PeerTest,
                    Session.MACKey,
                    Session.SharedKey,
                    (start, writer) =>
                {
                    Logging.LogTransport("SSU {this}: PeerTest. We are Charlie, responding to Bob. {msg}");
                    msg.WriteTo(writer);

                    return(true);
                });

                // Try to contact Alice
                var toalice = new PeerTest(msg.TestNonce, msg.AliceIPAddr, msg.AlicePort, Session.MyRouterContext.IntroKey);
                SendMessage(
                    new IPEndPoint(new IPAddress(msg.AliceIPAddr.ToByteArray()), msg.AlicePort.PeekFlip16(0)),
                    SSUHeader.MessageTypes.PeerTest,
                    msg.IntroKey,
                    msg.IntroKey,
                    (start, writer) =>
                {
                    Logging.LogTransport($"SSU {this}: PeerTest. We are Charlie, sending first probe to Alice. {toalice}");
                    toalice.WriteTo(writer);

                    return(true);
                });
            }
        }