コード例 #1
0
ファイル: RouterContext.cs プロジェクト: glasgowdev/i2p-cs
        private void Load(string filename)
        {
            using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                using (var ms = new MemoryStream())
                {
                    byte[] buf = new byte[8192];
                    int    len;
                    while ((len = fs.Read(buf, 0, buf.Length)) != 0)
                    {
                        ms.Write(buf, 0, len);
                    }

                    var reader = new BufRefLen(ms.ToArray());

                    Certificate       = new I2PCertificate(reader);
                    PrivateSigningKey = new I2PSigningPrivateKey(reader, Certificate);
                    PublicSigningKey  = new I2PSigningPublicKey(reader, Certificate);

                    PrivateKey = new I2PPrivateKey(reader, Certificate);
                    PublicKey  = new I2PPublicKey(reader, Certificate);

                    MyRouterIdentity = new I2PRouterIdentity(reader);
                    Published        = new I2PDate(reader);
                    IntroKey         = reader.ReadBufLen(32);
                }
            }
        }
コード例 #2
0
 public GarlicClove(GarlicCloveDelivery delivery)
 {
     Delivery   = delivery;
     Message    = delivery.Message;
     CloveId    = BufUtils.RandomUint();
     Expiration = new I2PDate(DateTime.UtcNow + TimeSpan.FromSeconds(8));
 }
コード例 #3
0
        public BufLen GetPayload()
        {
            if (!AllFragmentsFound)
            {
                throw new Exception("Cannot reassemble payload without all the fragments!");
            }

            var messagesize = Fragments.Sum(f => f.Data.Length);

            const int h5inh16offset = 11;
            var       result        = new BufLen(new byte[h5inh16offset + messagesize]);

            var writer = new BufRefLen(result, h5inh16offset);

            foreach (var onef in Fragments)
            {
                writer.Write(onef.Data);
            }

            // Fake a I2NP16 header
            var exp = new I2PDate(SSUHost.SSUDateTime(result.PeekFlip32(1 + h5inh16offset)));

            result[0] = result[h5inh16offset];
            result.PokeFlip64((ulong)exp, 5);
            result.PokeFlip16((ushort)(messagesize - 5), 13);
            // Not wasting time on faking checksum

            return(result);
        }
コード例 #4
0
 public GarlicClove(GarlicCloveDelivery delivery, I2PDate exp)
 {
     Delivery   = delivery;
     Message    = delivery.Message;
     CloveId    = BufUtils.RandomUint();
     Expiration = exp;
 }
コード例 #5
0
 public GarlicClove(BufRef reader)
 {
     Delivery   = GarlicCloveDelivery.CreateGarlicCloveDelivery(reader);
     Message    = I2NPMessage.ReadHeader16(reader).Message;
     CloveId    = reader.Read32();
     Expiration = new I2PDate(reader);
     reader.Seek(3);   // Cert
 }
コード例 #6
0
        public DeliveryStatusMessage(uint msgid)
        {
            AllocateBuffer(12);
            var writer = new BufRefLen(Payload);

            Timestamp       = new I2PDate(DateTime.UtcNow);
            StatusMessageId = msgid;
        }
コード例 #7
0
        public DeliveryStatusMessage()
        {
            AllocateBuffer(12);
            var writer = new BufRefLen(Payload);

            Timestamp       = new I2PDate(DateTime.UtcNow);
            StatusMessageId = I2NPMessage.GenerateMessageId();
        }
コード例 #8
0
        GarlicCreationInfo UseExistingSessionTags(bool explack, uint trackingid, GarlicCloveDelivery[] cloves)
        {
            Garlic msg;
            DeliveryStatusMessage ackmsg = null;

            if (explack)
            {
                msg = AddExplAck(cloves, out ackmsg);
            }
            else
            {
                var exp = new I2PDate(DateTime.UtcNow.AddMinutes(5));
                msg = new Garlic(cloves.Select(d => new GarlicClove(d, exp)).ToArray());
            }

#if LOG_ALL_TUNNEL_TRANSFER
            Logging.LogDebug(() => string.Format(
                                 "DestinationSession: Garlic generated with {0} cloves. {1} tags available.",
                                 msg.Cloves.Count, SessionTags.Count));
#endif

            var payload = msg.ToByteArray();
            var dest    = new BufLen(new byte[61000]);
            var writer  = new BufRefLen(dest, 4);  // Reserve 4 bytes for GarlicMessageLength

            I2PSessionTag tag;
            lock ( SessionTags )
            {
                var ix = BufUtils.RandomInt(SessionTags.Count);
                tag = SessionTags[ix];
                SessionTags.RemoveAt(ix);
            }

            // Tag as header
            writer.Write(tag.Value);

            // AES block
            var aesstart = new BufLen(writer);
            var aesblock = new GarlicAESBlock(writer, null, null, new BufRefLen(payload));

            var pivh = I2PHashSHA256.GetHash(tag.Value);

            Cipher.Init(true, SessionKey.Key.ToParametersWithIV(new BufLen(pivh, 0, 16)));
            Cipher.ProcessBytes(aesblock.DataBuf);

            var length = writer - dest;
            dest.PokeFlip32((uint)(length - 4), 0);

            return(new GarlicCreationInfo(
                       Destination.IdentHash,
                       cloves,
                       new EGGarlic(new BufRefLen(dest, 0, length)),
                       GarlicCreationInfo.KeyUsed.Aes,
                       SessionTags.Count(),
                       trackingid,
                       explack ? (uint?)ackmsg.MessageId : null,
                       LatestEGAckMessageId));
        }
コード例 #9
0
ファイル: I2NPHeader5.cs プロジェクト: kyapp69/i2p-cs
            public I2NPHeader5(I2NPMessage msg) : base(msg.Header5Buf)
            {
                MessageRef = msg;

                MessageType = msg.MessageType;
                Expiration  = I2PDate.DefaultI2NPExpiration();
#if DEBUG
                DebugCheckMessageCreation(MessageRef);
#endif
            }
コード例 #10
0
ファイル: GarlicTest.cs プロジェクト: itfenom/i2p-cs
        public void TestGarlicCreate()
        {
            var ls = new I2PDate(DateTime.Now + TimeSpan.FromMinutes(5));

            var origmessage = new DeliveryStatusMessage(I2NPMessage.GenerateMessageId());
            var bigmessage  = new DataMessage(new BufLen(BufUtils.RandomBytes(14 * 1024)));

            var garlic = new Garlic(
                new GarlicClove(
                    new GarlicCloveDeliveryLocal(origmessage),
                    ls),
                new GarlicClove(
                    new GarlicCloveDeliveryLocal(bigmessage),
                    ls)
                );

            var egmsg = Garlic.EGEncryptGarlic(
                garlic,
                Public,
                new I2PSessionKey(),
                null);

            var origegdata  = I2NPMessage.Clone(egmsg);
            var origegdata2 = I2NPMessage.Clone(egmsg);

            // Decrypt

            var(aesblock, sessionkey1) = Garlic.EGDecryptGarlic(origegdata, Private);

            var newgarlic = new Garlic((BufRefLen)aesblock.Payload);

            var g1 = new BufLen(garlic.ToByteArray());
            var g2 = new BufLen(newgarlic.ToByteArray());

            Assert.IsTrue(g1 == g2);

            // Retrieve

            var(aesblock2, sessionkey2) = Garlic.RetrieveAESBlock(origegdata2, Private, null);

            newgarlic = new Garlic((BufRefLen)aesblock2.Payload);

            g1 = new BufLen(garlic.ToByteArray());
            g2 = new BufLen(newgarlic.ToByteArray());

            Assert.IsTrue(g1 == g2);
            Assert.IsTrue(sessionkey1 == sessionkey2);
        }
コード例 #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);
        }
コード例 #12
0
ファイル: I2NPHeader16.cs プロジェクト: kyapp69/i2p-cs
            public I2NPHeader16(I2NPMessage msg, uint messageid) : base(msg.Header16Buf)
            {
                MessageRef = msg;

                MessageType = msg.MessageType;
                Expiration  = I2PDate.DefaultI2NPExpiration();
                MessageId   = messageid;

                PayloadLength = (ushort)msg.Payload.Length;

                var s = I2PHashSHA256.GetHash(msg.Payload);

                PayloadChecksum = s[0];
#if DEBUG
                DebugCheckMessageCreation(MessageRef);
#endif
            }
コード例 #13
0
ファイル: RouterContext.cs プロジェクト: glasgowdev/i2p-cs
        private void NewIdentity(I2PCertificate cert)
        {
            Published   = new I2PDate(DateTime.UtcNow.AddMinutes(-1));
            Certificate = cert != null ? cert : new I2PCertificate(I2PSigningKey.SigningKeyTypes.EdDSA_SHA512_Ed25519);
            //Certificate = new I2PCertificate( I2PSigningKey.SigningKeyTypes.EdDSA_SHA512_Ed25519 );
            //Certificate = new I2PCertificate( I2PSigningKey.SigningKeyTypes.ECDSA_SHA256_P256 );
            //Certificate = new I2PCertificate( I2PSigningKey.SigningKeyTypes.ECDSA_SHA384_P384 );
            //Certificate = new I2PCertificate( I2PSigningKey.SigningKeyTypes.DSA_SHA1 );
            PrivateSigningKey = new I2PSigningPrivateKey(Certificate);
            PublicSigningKey  = new I2PSigningPublicKey(PrivateSigningKey);

            var keys = I2PPrivateKey.GetNewKeyPair();

            PrivateKey = keys.PrivateKey;
            PublicKey  = keys.PublicKey;

            MyRouterIdentity = new I2PRouterIdentity(PublicKey, PublicSigningKey);
            IntroKey.Randomize();
        }
コード例 #14
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));
        }
コード例 #15
0
ファイル: Garlic.cs プロジェクト: glasgowdev/i2p-cs
        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));
        }
コード例 #16
0
        private Garlic AddExplAck(GarlicCloveDelivery[] cloves, out DeliveryStatusMessage ackmsg)
        {
            var replytunnel = SelInboundTunnel();

            if (replytunnel == null)
            {
                throw new FailedToConnectException("No inbound tunnels available");
            }
            ackmsg = new DeliveryStatusMessage(I2NPHeader.GenerateMessageId());
            var ackclove = new GarlicCloveDeliveryTunnel(ackmsg, replytunnel);
            var exp      = new I2PDate(DateTime.UtcNow.AddMinutes(5));
            var msg      = new Garlic(cloves.Concat(new GarlicCloveDelivery[] { ackclove }).Select(d => new GarlicClove(d, exp)));

#if LOG_ALL_TUNNEL_TRANSFER
            var ackmsgid = ackmsg.MessageId;
            Logging.LogDebug(() => string.Format(
                                 "DestinationSession: Added ACK message with MessageId: {0} to {1} cloves. Dest: {2}: {3}",
                                 ackmsgid, cloves.Length, replytunnel.Destination.Id32Short, replytunnel.ReceiveTunnelId));
#endif

            return(msg);
        }
コード例 #17
0
        public DestinationStatistics(BufRef buf)
        {
            Id       = new I2PIdentHash(buf);
            LastSeen = new I2PDate(buf);
            buf.Seek(60);   // Reserved space

            var mapping = new I2PMapping(buf);

            SuccessfulConnects      = TryGet(mapping, "SuccessfulConnects");
            FailedConnects          = TryGet(mapping, "FailedConnects");
            InformationFaulty       = TryGet(mapping, "InformationFaulty");
            SuccessfulTunnelMember  = TryGet(mapping, "SuccessfulTunnelMember");
            DeclinedTunnelMember    = TryGet(mapping, "DeclinedTunnelMember");
            SlowHandshakeConnect    = TryGet(mapping, "SlowHandshakeConnect");
            MaxBandwidthSeen        = TryGetFloat(mapping, "MaxBandwidthSeen");
            TunnelBuildTimeout      = TryGet(mapping, "TunnelBuildTimeout");
            TunnelBuildTimeMsPerHop = TryGet(mapping, "TunnelBuildTimeMsPerHop", DefaultTunnelBuildTimeMsPerHop);
            FloodfillUpdateTimeout  = TryGet(mapping, "FloodfillUpdateTimeout");
            FloodfillUpdateSuccess  = TryGet(mapping, "FloodfillUpdateSuccess");
            SuccessfulTunnelTest    = TryGet(mapping, "SuccessfulTunnelTest");
            FailedTunnelTest        = TryGet(mapping, "FailedTunnelTest");
        }
コード例 #18
0
ファイル: SetDateMessage.cs プロジェクト: itfenom/i2p-cs
 public SetDateMessage(BufRef data)
     : base(ProtocolMessageType.SetDate)
 {
     Date    = new I2PDate(data);
     Version = new I2PString(data);
 }
コード例 #19
0
ファイル: SetDateMessage.cs プロジェクト: itfenom/i2p-cs
 public SetDateMessage(I2PDate date, I2PString ver)
     : base(ProtocolMessageType.SetDate)
 {
     Date    = date;
     Version = ver;
 }
コード例 #20
0
ファイル: Garlic.cs プロジェクト: glasgowdev/i2p-cs
 public Garlic(I2PDate expiration, params GarlicClove[] cloves)
     : this(expiration, cloves.AsEnumerable())
 {
 }
コード例 #21
0
 public DestinationStatistics(I2PIdentHash id)
 {
     Id       = id;
     LastSeen = new I2PDate(DateTime.UtcNow);
     UpdateScore();
 }