public void MakeAndReadFragments5_2()
        {
            var origmsgs = new List <TunnelMessage>();

            for (int i = 0; i < 5; ++i)
            {
                var adatarec = new DataMessage(new BufLen(BufUtils.RandomBytes(2048)));

                var amsg = new TunnelMessageRouter(
                    adatarec,
                    new I2PIdentHash(true));

                origmsgs.Add(amsg);
            }

            var msgs = TunnelDataMessage.MakeFragments(origmsgs, BufUtils.RandomUint());

            var mkmsg     = new TunnelDataFragmentReassembly();
            var recvtmsgs = msgs
                            .Chunk(a => 2)
                            .Shuffle()
                            .Select(m => mkmsg.Process(m, out var _))
                            .SelectMany(b => b);

            Assert.IsTrue(origmsgs.All(o => recvtmsgs.Any(m =>
                                                          m.Delivery == o.Delivery &&
                                                          m.Message.CreateHeader16.HeaderAndPayload == o.Message.CreateHeader16.HeaderAndPayload
                                                          )));
        }
        public void MakeAndReadFragment()
        {
            var arec = new DatabaseLookupMessage(
                new I2PIdentHash(true),
                new I2PIdentHash(true),
                DatabaseLookupMessage.LookupTypes.Normal);

            var msg = new TunnelMessageRouter(
                arec,
                new I2PIdentHash(true));

            var refmsgdata = msg.Message.CreateHeader16.HeaderAndPayload;

            var fragments = TunnelDataMessage.MakeFragments(
                new TunnelMessage[] { msg },
                BufUtils.RandomUint());

            var mkmsg     = new TunnelDataFragmentReassembly();
            var recvtmsgs = mkmsg.Process(fragments.Shuffle().ToArray(), out var _);

            foreach (var rmsg in recvtmsgs)
            {
                var rmsgdata = rmsg.Message.CreateHeader16.HeaderAndPayload;
                Assert.IsTrue(msg.Delivery == rmsg.Delivery);
                Assert.IsTrue(refmsgdata == rmsgdata);
            }
        }
Beispiel #3
0
 public GarlicClove(GarlicCloveDelivery delivery)
 {
     Delivery   = delivery;
     Message    = delivery.Message;
     CloveId    = BufUtils.RandomUint();
     Expiration = new I2PDate(DateTime.UtcNow + TimeSpan.FromSeconds(8));
 }
Beispiel #4
0
        void StartNewUpdatesRouterInfo()
        {
            var list = GetNewFFList(
                RouterContext.Inst.MyRouterIdentity.IdentHash,
                4);

            foreach (var ff in list)
            {
                try
                {
                    var token = BufUtils.RandomUint() | 1;

                    Logging.Log(string.Format("FloodfillUpdater: {0}, RI, token: {1,10}, dist: {2}.",
                                              ff.Id32Short, token,
                                              ff ^ RouterContext.Inst.MyRouterIdentity.IdentHash.RoutingKey));

                    OutstandingRequests[token] = new FFUpdateRequestInfo(
                        ff,
                        token,
                        RouterContext.Inst.MyRouterIdentity.IdentHash);

                    SendUpdate(ff, token);
                }
                catch (Exception ex)
                {
                    Logging.Log(ex);
                }
            }
        }
Beispiel #5
0
 public GarlicClove(GarlicCloveDelivery delivery, I2PDate exp)
 {
     Delivery   = delivery;
     Message    = delivery.Message;
     CloveId    = BufUtils.RandomUint();
     Expiration = exp;
 }
        public void MakeAndReadFragmentsWithSerialize()
        {
            var origmsgs = new List <TunnelMessage>();

            for (int i = 0; i < 200; ++i)
            {
                switch (BufUtils.RandomInt(3))
                {
                case 0:
                    var adatarec = new DataMessage(
                        new BufLen(
                            BufUtils.RandomBytes(2048 + BufUtils.RandomInt(1024))));

                    origmsgs.Add(new TunnelMessageLocal(adatarec));
                    break;

                case 1:
                    var arec = new DatabaseLookupMessage(
                        new I2PIdentHash(true),
                        new I2PIdentHash(true),
                        DatabaseLookupMessage.LookupTypes.RouterInfo);

                    origmsgs.Add(new TunnelMessageRouter(
                                     arec,
                                     new I2PIdentHash(true)));
                    break;

                case 2:
                    var adatarec2 = new DataMessage(
                        new BufLen(
                            BufUtils.RandomBytes(2048 + BufUtils.RandomInt(1024))));

                    origmsgs.Add(new TunnelMessageTunnel(adatarec2,
                                                         new I2PIdentHash(true),
                                                         BufUtils.RandomUint()));
                    break;
                }
            }

            var msgs     = TunnelDataMessage.MakeFragments(origmsgs, BufUtils.RandomUint());
            var recvlist = new List <TunnelDataMessage>();

            foreach (var msg in msgs)
            {
                recvlist.Add((TunnelDataMessage)I2NPMessage.ReadHeader16(
                                 new BufRefLen(msg.CreateHeader16.HeaderAndPayload)).Message);
            }

            var mkmsg     = new TunnelDataFragmentReassembly();
            var recvtmsgs = mkmsg.Process(recvlist, out var _);

            foreach (var rmsg in recvtmsgs)
            {
                Assert.IsTrue(origmsgs.SingleOrDefault(m =>
                                                       m.Delivery == rmsg.Delivery &&
                                                       m.Message.CreateHeader16.HeaderAndPayload == rmsg.Message.CreateHeader16.HeaderAndPayload
                                                       ) != null);
            }
        }
Beispiel #7
0
        public FragmentedMessage(II2NPHeader5 msg)
        {
            Message      = msg;
            MessageBytes = new BufLen(msg.HeaderAndPayload);
            MessageId    = BufUtils.RandomUint();

            FragmentReader = new BufRefLen(MessageBytes);
        }
Beispiel #8
0
        public DeliveryStatusMessage(ulong networkid)
        {
            AllocateBuffer(12);
            var writer = new BufRefLen(Payload);

            writer.PokeFlip64(networkid, 4);
            StatusMessageId = BufUtils.RandomUint();
        }
Beispiel #9
0
        public static uint GenerateMessageId()
        {
            int  iter = 0;
            uint result;

            lock ( RecentMessageIds )
            {
                do
                {
                    result = BufUtils.RandomUint();
                } while (result == 0 || (RecentMessageIds.Count(result) > 0 && ++iter < 100));

                RecentMessageIds.Update(result);
            }
            return(result);
        }
Beispiel #10
0
        public void MakeAndReadFragments()
        {
            var origmsgs = new List <TunnelMessage>();

            for (int i = 0; i < 200; ++i)
            {
                switch (BufUtils.RandomInt(3))
                {
                case 0:
                    var adatarec = new DataMessage(new BufLen(BufUtils.Random(2048 + BufUtils.RandomInt(1024))));

                    origmsgs.Add(new TunnelMessageTunnel(
                                     adatarec.Header16,
                                     new I2PIdentHash(true),
                                     BufUtils.RandomUint()));
                    break;

                case 1:
                    var arec = new DatabaseLookupMessage(
                        new I2PIdentHash(true),
                        new I2PIdentHash(true),
                        DatabaseLookupMessage.LookupTypes.Normal);

                    origmsgs.Add(new TunnelMessageRouter(arec.Header16, new I2PIdentHash(true)));
                    break;

                case 2:
                    var adatarec2 = new DataMessage(new BufLen(BufUtils.Random(2048 + BufUtils.RandomInt(1024))));

                    origmsgs.Add(new TunnelMessageLocal(adatarec2.Header16));
                    break;
                }
            }

            var msgs = TunnelDataMessage.MakeFragments(origmsgs, BufUtils.RandomUint());

            var mkmsg     = new TunnelDataFragmentReassembly();
            var recvtmsgs = mkmsg.Process(msgs);

            foreach (var rmsg in recvtmsgs)
            {
                Assert.IsTrue(origmsgs.SingleOrDefault(m =>
                                                       m.Delivery == rmsg.Delivery &&
                                                       m.Header.HeaderAndPayload == rmsg.Header.HeaderAndPayload
                                                       ) != null);
            }
        }
Beispiel #11
0
        public FragmentedMessage(II2NPHeader16 msg)
        {
            BufLen msgbytes;

            // Convert to 5 byte header
            var orig    = new BufLen(msg.HeaderAndPayload);
            var msgtype = orig[0];
            var exp     = new I2PDate(orig.PeekFlip64(5));

            msgbytes    = new BufLen(orig, 16 - 5);
            msgbytes[0] = msgtype;
            msgbytes.PokeFlip32((uint)((ulong)exp / 1000), 1);

            MessageId = BufUtils.RandomUint();

            FragmentReader = new BufRefLen(msgbytes);
        }
Beispiel #12
0
        public Garlic(I2PDate expiration, IEnumerable <GarlicClove> cloves)
        {
            BufRefStream buf = new BufRefStream();

            buf.Write((byte)cloves.Count());
            foreach (var clove in cloves)
            {
                clove.Write(buf);
            }

            // Certificate
            buf.Write(new byte[] { 0, 0, 0 });

            buf.Write((BufRefLen)BufUtils.Flip32BL(BufUtils.RandomUint()));
            expiration.Write(buf);

            Data = new BufLen(buf.ToArray());
            ParseData(new BufRefLen(Data));
        }
Beispiel #13
0
        public void VariableTunnelBuildMessageTest()
        {
            var msg = VariableTunnelBuildMessage.BuildInboundTunnel(
                new TunnelInfo(
                    new List <HopInfo>
            {
                new HopInfo(new I2PDestination(Public, PublicSigning), BufUtils.RandomUint()),
                new HopInfo(new I2PDestination(Public, PublicSigning), BufUtils.RandomUint()),
                new HopInfo(new I2PDestination(Public, PublicSigning), BufUtils.RandomUint()),
            })
                );

            var msgdata = msg.CreateHeader16.HeaderAndPayload;

            var msg2     = new VariableTunnelBuildMessage(new BufRefLen(msg.Payload));
            var msg2data = msg2.CreateHeader16.HeaderAndPayload;

            Assert.IsTrue(msgdata == msg2data);
        }
Beispiel #14
0
        public Garlic(I2PDate expiration, IEnumerable <GarlicClove> cloves)
        {
            List <byte> buf = new List <byte>();

            buf.Add((byte)cloves.Count());
            foreach (var clove in cloves)
            {
                clove.Write(buf);
            }

            // Certificate
            buf.Add(0);
            buf.Add(0);
            buf.Add(0);

            buf.AddRange(BufUtils.Flip32BL(BufUtils.RandomUint()));
            expiration.Write(buf);

            Data = new BufLen(buf.ToArray());
            ParseData(new BufRefLen(Data));
        }
Beispiel #15
0
        void StartNewUpdates()
        {
            var list = GetNewFFList();

            foreach (var ff in list)
            {
                try
                {
                    var token = BufUtils.RandomUint() | 1;

                    DebugUtils.Log(string.Format("FloodfillUpdater: {0}, token: {1,10}, dist: {2}.",
                                                 ff.Id32Short, token,
                                                 ff ^ RouterContext.Inst.MyRouterIdentity.IdentHash.RoutingKey));

                    SendUpdate(ff, token);
                }
                catch (Exception ex)
                {
                    DebugUtils.Log(ex);
                }
            }
        }
Beispiel #16
0
        void StartNewUpdatesLeaseSet(I2PLeaseSet ls)
        {
            // old lease sets are out of date
            while (OutstandingRequests.TryRemove(
                       OutstandingRequests.Where(r => r.Value?.LeaseSet == ls)
                       .Select(r => r.Key)
                       .FirstOrDefault(),
                       out var _))
            {
            }

            var list = GetNewFFList(
                ls.Destination.IdentHash,
                2);

            var destinations = list.Select(i => NetDb.Inst[i]);

            foreach (var ff in destinations)
            {
                try
                {
                    var ffident = ff.Identity.IdentHash;
                    var token   = BufUtils.RandomUint() | 1;

                    Logging.Log($"FloodfillUpdater: New LS update started for " +
                                $"{ls.Destination.IdentHash.Id32Short}, {ls.Leases.Count()} leases " +
                                $"update {ffident.Id32Short}, token {token,10}, " +
                                $"dist: {ffident ^ ls.Destination.IdentHash.RoutingKey}.");

                    OutstandingRequests[token] = new FFUpdateRequestInfo(ffident, token, ls, 0);

                    SendLeaseSetUpdateGarlic(ffident, ff.Identity.PublicKey, ls, token);
                }
                catch (Exception ex)
                {
                    Logging.Log(ex);
                }
            }
        }
Beispiel #17
0
        private void SendRelayRequest()
        {
            foreach (var one in Introducers)
            {
                var introducer = one.Key;
                var isession   = one.Value;

                Logging.LogTransport($"SSU {this}: Sending RelayRequest to {introducer.EndPoint}");

                SendMessage(
                    isession.RemoteEP,
                    SSUHeader.MessageTypes.RelayRequest,
                    isession.MACKey,
                    isession.SharedKey,
                    (start, writer) =>
                {
                    writer.WriteFlip32(introducer.IntroTag);

                    // The IP address is only included if it is be different than the packet's
                    // source address and port. In the current implementation, the IP length is
                    // always 0 and the port is always 0, and the receiver should use the
                    // packet's source address and port. https://geti2p.net/spec/ssu
                    writer.Write8(0);
                    writer.Write16(0);

                    // Challenge is unimplemented, challenge size is always zero. https://geti2p.net/spec/ssu
                    writer.Write8(0);

                    writer.Write(Session.MyRouterContext.IntroKey);

                    Nonce = BufUtils.RandomUint();
                    writer.Write32(Nonce);

                    return(true);
                });
            }
        }
Beispiel #18
0
        void CheckTimeouts()
        {
            KeyValuePair <uint, FFUpdateRequestInfo>[] timeout;

            lock ( OutstandingRequests )
            {
                timeout = OutstandingRequests.Where(r => r.Value.Start.DeltaToNow > DatabaseStoreNonReplyTimeout).ToArray();
                foreach (var item in timeout.ToArray())
                {
                    OutstandingRequests.Remove(item.Key);
                }
            }

            foreach (var one in timeout)
            {
                Logging.Log(string.Format("FloodfillUpdater: Update {0,10} to {1} failed with timeout.",
                                          one.Key, one.Value.FFRouter.Id32Short));

                NetDb.Inst.Statistics.FloodfillUpdateTimeout(one.Value.FFRouter);
            }

            // Get a wider selection
            var list = NetDb.Inst.GetClosestFloodfill(RouterContext.Inst.MyRouterIdentity.IdentHash, 100, null, false);

            list = list.Shuffle().Take(timeout.Length);

            foreach (var ff in list)
            {
                var token = BufUtils.RandomUint() | 1;

                Logging.Log(string.Format("FloodfillUpdater: replacement update {0}, token {1,10}, dist: {2}.",
                                          ff.Id32Short, token,
                                          ff ^ RouterContext.Inst.MyRouterIdentity.IdentHash.RoutingKey));

                SendUpdate(ff, token);
            }
        }
Beispiel #19
0
        private void TimeoutRegenerateLSUpdate(IEnumerable <FFUpdateRequestInfo> lsets)
        {
            foreach (var lsinfo in lsets)
            {
                OutstandingRequests.TryRemove(lsinfo.Token, out _);

                var token = BufUtils.RandomUint() | 1;

                var ls = lsinfo.LeaseSet;

                var getnext = DateTime.UtcNow.Hour >= 23;
                var list    = NetDb.Inst.GetClosestFloodfill(
                    ls.Destination.IdentHash,
                    2 + 2 * lsinfo.Retries,
                    null,
                    getnext);

                var ff      = list.Random();
                var ffident = NetDb.Inst[ff];

                Logging.Log($"FloodfillUpdater: LS {ls.Destination.IdentHash.Id32Short} " +
                            $"replacement update {ff.Id32Short}, token {token,10}, " +
                            $"dist: {ff ^ ls.Destination.IdentHash.RoutingKey}.");

                SendLeaseSetUpdateGarlic(
                    ffident.Identity.IdentHash,
                    ffident.Identity.PublicKey,
                    ls,
                    token);

                OutstandingRequests[token] = new FFUpdateRequestInfo(
                    ff,
                    token,
                    ls,
                    lsinfo.Retries + 1);
            }
        }
Beispiel #20
0
        private void SendRelayRequest()
        {
            if (CurrentIntroducer == null)
            {
                return;
            }

            Logging.LogTransport($"SSU RelayRequestState: {Session.DebugId} Sending RelayRequest to {CurrentIntroducer.EndPoint}");

            SendMessage(
                CurrentIntroducer.EndPoint,
                SSUHeader.MessageTypes.RelayRequest,
                CurrentIntroducer.IntroKey,
                CurrentIntroducer.IntroKey,
                (start, writer) =>
            {
                writer.WriteFlip32(CurrentIntroducer.IntroTag);

                // The IP address is only included if it is be different than the packet's
                // source address and port. In the current implementation, the IP length is
                // always 0 and the port is always 0, and the receiver should use the
                // packet's source address and port. https://geti2p.net/spec/ssu
                writer.Write8(0);
                writer.Write16(0);

                // Challenge is unimplemented, challenge size is always zero. https://geti2p.net/spec/ssu
                writer.Write8(0);

                writer.Write(Session.MyRouterContext.IntroKey);

                Nonce = BufUtils.RandomUint();
                writer.Write32(Nonce);

                return(true);
            });
        }
Beispiel #21
0
        private void TimeoutRegenerateRIUpdate(IEnumerable <FFUpdateRequestInfo> rinfos)
        {
            var list = GetNewFFList(
                RouterContext.Inst.MyRouterIdentity.IdentHash,
                rinfos.Count());

            foreach (var rinfo in rinfos)
            {
                OutstandingRequests.TryRemove(rinfo.Token, out _);
                var ff = list.Random();

                var token = BufUtils.RandomUint() | 1;

                Logging.LogDebug(string.Format("FloodfillUpdater: RI replacement update {0}, token {1,10}, dist: {2}.",
                                               ff.Id32Short, token,
                                               ff ^ RouterContext.Inst.MyRouterIdentity.IdentHash.RoutingKey));

                SendUpdate(ff, token);
                OutstandingRequests[token] = new FFUpdateRequestInfo(
                    ff,
                    token,
                    RouterContext.Inst.MyRouterIdentity.IdentHash);
            }
        }
Beispiel #22
0
 public I2PTunnelId()
 {
     Id = BufUtils.RandomUint();
 }
        public void MakeAndReadFragments100()
        {
            var origmsgs = new List <TunnelMessage>();

            for (int i = 0; i < 100; ++i)
            {
                switch (BufUtils.RandomInt(3))
                {
                case 0:
                    var adatarec = new DataMessage(new BufLen(BufUtils.RandomBytes(2048)));

                    origmsgs.Add(new TunnelMessageTunnel(
                                     adatarec,
                                     new I2PIdentHash(true),
                                     BufUtils.RandomUint()));
                    break;

                case 1:
                    var arec = new DatabaseLookupMessage(
                        new I2PIdentHash(true),
                        new I2PIdentHash(true),
                        DatabaseLookupMessage.LookupTypes.Normal);

                    origmsgs.Add(new TunnelMessageRouter(
                                     arec,
                                     new I2PIdentHash(true)));
                    break;

                case 2:
                    var adatarec2 = new DataMessage(
                        new BufLen(
                            BufUtils.RandomBytes(2048 + BufUtils.RandomInt(1024))));

                    origmsgs.Add(new TunnelMessageLocal(adatarec2));
                    break;
                }
            }

            var msgs   = TunnelDataMessage.MakeFragments(origmsgs, BufUtils.RandomUint());
            var mkmsg  = new TunnelDataFragmentReassembly();
            var chunks = msgs
                         .Shuffle()
                         .ToArray()
                         .Chunk(a => 1 + BufUtils.RandomInt(10))
                         .Shuffle();

            var recvtmsgs = chunks.SelectMany(c => mkmsg.Process(c, out var _)).ToArray();

            Assert.IsTrue(origmsgs.All(o => recvtmsgs.Any(m =>
                                                          m.Delivery == o.Delivery &&
                                                          m.Message.CreateHeader16.HeaderAndPayload == o.Message.CreateHeader16.HeaderAndPayload
                                                          )));

            var mkmsg2  = new TunnelDataFragmentReassembly();
            var chunks2 = msgs
                          .Shuffle()
                          .ToArray()
                          .Skip(1)
                          .Chunk(a => 1 + BufUtils.RandomInt(10))
                          .Shuffle();

            var recvtmsgs2 = chunks2.SelectMany(c => mkmsg2.Process(c, out var _)).ToArray();

            Assert.IsFalse(origmsgs.All(o => recvtmsgs2.Any(m =>
                                                            m.Delivery == o.Delivery &&
                                                            m.Message.CreateHeader16.HeaderAndPayload == o.Message.CreateHeader16.HeaderAndPayload
                                                            )));
        }