Пример #1
0
        public I2PRouterInfo(
            I2PRouterIdentity identity,
            I2PDate publisheddate,
            I2PRouterAddress[] adresses,
            I2PMapping options,
            I2PSigningPrivateKey privskey)
        {
            Identity      = identity;
            PublishedDate = publisheddate;
            Adresses      = adresses;
            Options       = options;

            var dest = new BufRefStream();

            Identity.Write(dest);
            PublishedDate.Write(dest);
            dest.Write((byte)Adresses.Length);
            foreach (var addr in Adresses)
            {
                addr.Write(dest);
            }
            dest.Write(0);   // Always zero
            Options.Write(dest);
            Data = new BufLen(dest.ToArray());

            Signature = new I2PSignature(new BufRefLen(I2PSignature.DoSign(privskey, Data)), privskey.Certificate);
        }
Пример #2
0
        private static ZipArchive GetRouterInfoFiles(BufLen data)
        {
            try
            {
                var reader = new BufRefLen(data);
                var header = new I2PSU3Header(reader);

                if (header.FileType != I2PSU3Header.SU3FileTypes.Zip)
                {
                    throw new ArgumentException($"Unknown FileType in SU3: {header.FileType}");
                }

                if (header.ContentType != I2PSU3Header.SU3ContentTypes.SeedData)
                {
                    throw new ArgumentException($"Unknown ContentType in SU3: {header.ContentType}");
                }

                // TODO: Verify signature

                var s = new BufRefStream();
                s.Write(reader);

                return(new ZipArchive(s));
            }
            catch (Exception ex)
            {
                Logging.Log(ex);
            }

            return(null);
        }
Пример #3
0
 public void Write(BufRefStream dest)
 {
     Delivery.Write(dest);
     dest.Write((BufRefLen)BufUtils.Flip32BL(CloveId));
     Expiration.Write(dest);
     dest.Write(ThreeZero);
 }
Пример #4
0
 public override void Write(BufRefStream dest)
 {
     dest.Write((BufRefLen)BufUtils.Flip16BL(SessionId));
     dest.Write(TwentyBytes);
     PrivateKey.Write(dest);
     Leases.Write(dest);
 }
Пример #5
0
        public byte[] ToByteArray()
        {
            var buf = new BufRefStream();

            Write(buf);
            return(buf.ToArray());
        }
Пример #6
0
 public override void Write(BufRefStream dest)
 {
     dest.Write(BufUtils.Flip32B(3));
     dest.Write((byte)MessageType);
     dest.Write(BitConverter.GetBytes(SessionId));
     dest.Write((byte)SessionState);
 }
Пример #7
0
        internal static BufLen Send(DHHandshakeContext context)
        {
            context.TimestampA = (uint)Math.Ceiling((DateTime.UtcNow - I2PDate.RefDate).TotalSeconds);

            var cleartext = new BufRefStream();
            var ri        = RouterContext.Inst.MyRouterIdentity.ToByteArray();

            cleartext.Write(BufUtils.Flip16B((ushort)ri.Length));
            cleartext.Write(ri);

            cleartext.Write(BufUtils.Flip32B(context.TimestampA));
#if LOG_ALL_TRANSPORT
            Logging.LogTransport("SessionConfirmA send TimestampA: " + (I2PDate.RefDate.AddSeconds(context.TimestampA).ToString()));
            Logging.LogTransport("SessionConfirmA send TimestampB: " + (I2PDate.RefDate.AddSeconds(context.TimestampB).ToString()));
#endif

            var sign = I2PSignature.DoSign(RouterContext.Inst.PrivateSigningKey,
                                           context.X.Key,
                                           context.Y.Key,
                                           context.RemoteRI.IdentHash.Hash,
                                           BufUtils.Flip32BL(context.TimestampA),
                                           BufUtils.Flip32BL(context.TimestampB));

            var padsize = BufUtils.Get16BytePadding((int)(sign.Length + cleartext.Length));
            cleartext.Write(BufUtils.Random(padsize));

            cleartext.Write(sign);

            var buf = new BufLen(cleartext.ToArray());
            context.Encryptor.ProcessBytes(buf);

            return(buf);
        }
Пример #8
0
        public void Write(BufRefStream dest)
        {
            Destination.Write(dest);
            Info.PublicKey.Write(dest);
            Info.PublicSigningKey.Write(dest);

            var cnt = (byte)Leases.Count;

            if (cnt > 16)
            {
                throw new OverflowException("Max 16 leases per I2PLeaseSet");
            }

            var signfields = new List <BufLen>();

            signfields.Add(new BufLen(Destination.ToByteArray()));
            signfields.Add(Info.PublicKey.Key);
            signfields.Add(Info.PublicSigningKey.Key);
            signfields.Add((BufLen)cnt);

            lock ( Leases )
            {
                dest.Write((byte)Leases.Count);

                foreach (var lease in Leases)
                {
                    var buf = lease.ToByteArray();
                    dest.Write(buf);
                    signfields.Add(new BufLen(buf));
                }
            }

            dest.Write(I2PSignature.DoSign(Info.PrivateSigningKey, signfields.ToArray()));
        }
Пример #9
0
        public void TestAESBlock()
        {
            for (int runs = 0; runs < 10; ++runs)
            {
                var buf    = new BufLen(new byte[30000]);
                var writer = new BufRefLen(buf);

                var data  = BufUtils.RandomBytes(1 + BufUtils.RandomInt(45));
                var datar = new BufRefLen(data);
                var tags  = new List <I2PSessionTag>();
                for (int i = 0; i < BufUtils.RandomInt(5); ++i)
                {
                    tags.Add(new I2PSessionTag());
                }

                var newsession = BufUtils.RandomDouble(1.0) < 0.3 ? new I2PSessionKey() : null;
                var b1         = new GarlicAESBlock(writer, tags, newsession, datar);

                var bldata = new BufLen(buf, 0, writer - buf).Clone();

                var b2 = new GarlicAESBlock(new BufRefLen(bldata));

                var b1ar = new BufLen(b1.ToByteArray());
                var b2ar = new BufLen(b2.ToByteArray());
                Assert.IsTrue(b1ar == b2ar);

                var bufs = new BufRefStream();
                b1.Write(bufs);

                var b3 = new GarlicAESBlock(new BufRefLen(bufs.ToByteArray()));

                var b3ar = new BufLen(b3.ToByteArray());
                Assert.IsTrue(b1ar == b3ar);
            }
        }
Пример #10
0
 public void Write(BufRefStream dest)
 {
     Delivery.Write(dest);
     dest.Write((BufRefLen)(BufLen)CloveId);
     Expiration.Write(dest);
     dest.Write(0);
     dest.Write(0);
     dest.Write(0);
 }
Пример #11
0
        public override void Write(BufRefStream dest)
        {
            var header = new byte[6];
            var writer = new BufRefLen(header);

            writer.WriteFlip16(SessionId);
            writer.WriteFlip32(MessageId);
            dest.Write(header);
        }
Пример #12
0
 public override void Write(BufRefStream dest)
 {
     base.Write(dest);
     if ((Flag & (byte)DeliveryFlags.Delay) != 0)
     {
         dest.Write(BufUtils.Flip32B(0));
     }
     dest.Write((BufRefLen)Message.CreateHeader16.HeaderAndPayload);
 }
Пример #13
0
        public override void Write(BufRefStream dest)
        {
            Version.Write(dest);

            if (Mapping != null)
            {
                Mapping.Write(dest);
            }
        }
Пример #14
0
        public override void Write(BufRefStream dest)
        {
            var header = new byte[3];
            var writer = new BufRefLen(header);

            writer.WriteFlip16(SessionId);
            writer.Write8((byte)SessionState);
            dest.Write(header);
        }
Пример #15
0
 public void Write(BufRefStream dest)
 {
     if (SignedData == null)
     {
         throw new InvalidOperationException("No signed data available");
     }
     dest.Write(SignedData);
     dest.Write(Hash);
 }
Пример #16
0
        public void Write(BufRefStream dest)
        {
            var l = (byte)Math.Min(255, Str.Length);
            var v = new byte[System.Text.Encoding.UTF8.GetMaxByteCount(l) + 1];

            v[0] = l;
            var bytes = System.Text.Encoding.UTF8.GetBytes(Str, 0, l, v, 1);

            dest.Write(v, 0, bytes + 1);
        }
Пример #17
0
        public override void Write(BufRefStream dest)
        {
            if (Destination != null)
            {
                Destination.Write(dest);
                return;
            }

            Ident.Write(dest);
        }
Пример #18
0
        public void Write(BufRefStream dest)
        {
            Id.Write(dest);
            LastSeen.Write(dest);
            Created.Write(dest);
            dest.Write(BufUtils.RandomBytes(52));     // Reserved space

            var mapping = CreateMapping();

            mapping.Write(dest);
        }
Пример #19
0
        public override void Write(BufRefStream dest)
        {
            var header = new byte[10];
            var writer = new BufRefLen(header);

            writer.WriteFlip16(SessionId);
            writer.WriteFlip32(MessageId);
            writer.WriteFlip32((uint)Payload.Length);

            dest.Write(header);
            dest.Write((BufRefLen)Payload);
        }
Пример #20
0
        public override void Write(BufRefStream dest)
        {
            var header = new byte[15];
            var writer = new BufRefLen(header);

            writer.WriteFlip16(SessionId);
            writer.WriteFlip32(MessageId);
            writer.Write8((byte)MessageStatus);
            writer.WriteFlip32(AvailableMessageSize);
            writer.WriteFlip32(ClientNonce);
            dest.Write(header);
        }
Пример #21
0
        public void WriteMessage(BufRefStream dest, params I2PType[] fields)
        {
            var buf = new BufRefStream();

            foreach (var field in fields)
            {
                field.Write(buf);
            }

            dest.Write(BufUtils.Flip32B((uint)buf.Length));
            dest.Write((byte)MessageType);
            dest.Write(buf);
        }
Пример #22
0
        public void Write(BufRefStream dest)
        {
            // Routers MUST set this (expire) field to all zeros. As of release 0.9.12,
            // a non-zero expiration field is again recognized, however we must
            // wait several releases to use this field, until the vast majority
            // of the network recognizes it.
            // TODO: Hmmm?

            dest.Write(Cost);
            Expiration.Write(dest);
            TransportStyle.Write(dest);
            Options.Write(dest);
        }
Пример #23
0
        public void Write(BufRefStream dest)
        {
            var dest2 = new BufRefStream();

            Destination.Write(dest2);
            Map.Write(dest2);
            Date.Write(dest2);
            var dest2data = dest2.ToArray();

            var sig = new I2PSignature(new BufRefLen(I2PSignature.DoSign(PrivateSigningKey, new BufLen(dest2data))), PrivateSigningKey.Certificate);

            dest.Write(dest2data);
            sig.Write(dest);
        }
        public override void Write(BufRefStream dest)
        {
            var header = new byte[3];
            var writer = new BufRefLen(header);

            writer.WriteFlip16(SessionId);
            writer.Write8((byte)Leases.Count);
            dest.Write(header);

            for (int i = 0; i < Leases.Count; ++i)
            {
                Leases[i].Write(dest);
            }
        }
Пример #25
0
        public override void Write(BufRefStream dest)
        {
            var header = new byte[7];
            var writer = new BufRefLen(header);

            writer.WriteFlip16(SessionId);
            writer.WriteFlip32(RequestId);
            writer.Write8((byte)ResultCode);
            dest.Write(header);

            if (ResultCode == HostLookupResults.Success)
            {
                Destination.Write(dest);
            }
        }
Пример #26
0
        public override void Write( BufRefStream dest )
        {
            var buf = new byte[3];
            var writer = new BufRefLen( buf );
            writer.WriteFlip16( SessionId );
            writer.Write8( (byte)Leases.Count );
            dest.Write( buf );

            for ( int i = 0; i < Leases.Count; ++i )
            {
                Leases[i].TunnelGw.Write( dest );
                Leases[i].TunnelId.Write( dest );
            }
            new I2PDate( DateTime.UtcNow.AddMinutes( 9 ) ).Write( dest );
        }
Пример #27
0
        public void Write(BufRefStream dest)
        {
            var buf = new BufRefStream();

            foreach (var one in Mappings)
            {
                one.Key.Write(buf);
                buf.Write((byte)'=');
                one.Value.Write(buf);
                buf.Write((byte)';');
            }

            dest.Write(BufUtils.Flip16B((ushort)buf.Length));
            dest.Write(buf);
        }
Пример #28
0
        static void MyDestination_DataReceived(ClientDestination dest, BufLen data)
        {
            Logging.LogInformation($"Program {PublishedDestination}: data received {data:15}");

            var reader = new BufRefLen(data);
            var unzip  = LZUtils.BCGZipDecompressNew((BufLen)reader);
            var packet = new StreamingPacket((BufRefLen)unzip);

            Logging.LogInformation($"Program {PublishedDestination}: {packet} {packet.Payload}");

            PublishedDestination.LookupDestination(packet?.From.IdentHash, (hash, ls, tag) =>
            {
                if (ls is null)
                {
                    Logging.LogInformation($"Program {PublishedDestination}: Failed to lookup {hash?.Id32Short}.");
                    return;
                }

                var s  = new BufRefStream();
                var sh = new StreamingPacket(
                    PacketFlags.SYNCHRONIZE
                    | PacketFlags.FROM_INCLUDED
                    | PacketFlags.SIGNATURE_INCLUDED
                    | PacketFlags.MAX_PACKET_SIZE_INCLUDED
                    | PacketFlags.NO_ACK)
                {
                    From            = PublishedDestination.Destination,
                    SigningKey      = MyDestinationInfo.PrivateSigningKey,
                    ReceiveStreamId = packet.ReceiveStreamId,
                    SendStreamId    = SendId,
                    NACKs           = new List <uint>(),
                    Payload         = new BufLen(BufUtils.RandomBytes(30)),
                };

                sh.Write(s);
                var buf    = s.ToByteArray();
                var zipped = LZUtils.BCGZipCompressNew(new BufLen(buf));
                zipped.PokeFlip16(4353, 4);                // source port
                zipped.PokeFlip16(25, 6);                  // dest port
                zipped[9] = (byte)PayloadFormat.Streaming; // streaming

                Logging.LogInformation($"Program {PublishedDestination}: Sending {zipped:20}.");
                PublishedDestination.Send(ls.Destination, zipped);
            });
        }
Пример #29
0
        public virtual void Write(BufRefStream dest)
        {
            byte flag = Flag;

            if (SessionKey != null)
            {
                flag |= (byte)DeliveryFlags.Encrypted;
            }
            if (Delay != 0)
            {
                flag |= (byte)DeliveryFlags.Delay;
            }
            dest.Write(flag);

            if (SessionKey != null)
            {
                SessionKey.Write(dest);
            }
        }
Пример #30
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));
        }