예제 #1
0
        public I2PRouterInfo(BufRef reader, bool verifysig)
        {
            var startview = new BufRef(reader);

            Identity      = new I2PRouterIdentity(reader);
            PublishedDate = new I2PDate(reader);

            int addrcount = reader.Read8();
            var addresses = new List <I2PRouterAddress>();

            for (int i = 0; i < addrcount; ++i)
            {
                addresses.Add(new I2PRouterAddress(reader));
            }
            Adresses = addresses.ToArray();

            reader.Seek(reader.Read8() * 32);   // peer_size. Unused.

            Options = new I2PMapping(reader);
            var payloadend = new BufRef(reader);

            Data      = new BufLen(startview, 0, reader - startview);
            Signature = new I2PSignature(reader, Identity.Certificate);

            if (verifysig)
            {
                var versig = VerifySignature();
                if (!versig)
                {
                    throw new InvalidOperationException("I2PRouterInfo signature check failed");
                }
            }
        }
예제 #2
0
        public void Read(BufRef reader)
        {
            // magic number and zero byte 6
            var magic = reader.ReadBufLen(6);

            _ = reader.Read8();
            var magicstr = magic.ToEncoding(Encoding.UTF8);

            if (magicstr != SU3_MAGIC_NUMBER)
            {
                throw new ArgumentException("Not SU3 data.");
            }

            // su3 file format version
            FileVersion = reader.Read8();

            SignatureType   = reader.ReadFlip16();
            SignatureLength = reader.ReadFlip16();
            _              = reader.Read8();
            VersionLength  = reader.Read8();
            _              = reader.Read8();
            SignerIdLength = reader.Read8();
            ContentLength  = reader.ReadFlip64();
            _              = reader.Read8();
            FileType       = (SU3FileTypes)reader.Read8();
            _              = reader.Read8();
            ContentType    = (SU3ContentTypes)reader.Read8();
            reader.Seek(12);
            Version  = reader.ReadBufLen(VersionLength);
            SignerID = reader.ReadBufLen(SignerIdLength)
                       .ToEncoding(Encoding.UTF8);
        }
예제 #3
0
        void UpdateCachedFields(BufRef reader)
        {
            CachedKey        = new I2PIdentHash(reader);
            CachedFrom       = new I2PIdentHash(reader);
            CachedLookupType = (LookupTypes)reader.Read8();
            if (((byte)CachedLookupType & 0x01) != 0)
            {
                CachedTunnelId = new I2PTunnelId(reader);
            }

            var excludecount = reader.ReadFlip16();

            for (int i = 0; i < excludecount; ++i)
            {
                CachedExcludeList.Add(new DatabaseSearchReplyMessage(reader));
            }

            if (((byte)CachedLookupType & 0x02) != 0)
            {
                CachedReplyKey = new I2PSessionKey(reader);

                var tagcount = reader.Read8();
                CachedTags.Add(new I2PSessionTag(reader));
            }
        }
예제 #4
0
 public SessionStatusMessage(BufRef reader)
     : base(ProtocolMessageType.SessionStatus)
 {
     reader.Seek(4);
     if ((ProtocolMessageType)reader.Read8() != MessageType)
     {
         throw new ArgumentException("SessionStatusMessage( reader ) Wrong message type.");
     }
     SessionId    = reader.Read16();
     SessionState = (SessionStates)reader.Read8();
 }
예제 #5
0
 public I2PRouterAddress(BufRef buf)
 {
     Cost           = buf.Read8();
     Expiration     = new I2PDate(buf);
     TransportStyle = new I2PString(buf);
     Options        = new I2PMapping(buf);
 }
예제 #6
0
파일: I2PString.cs 프로젝트: itfenom/i2p-cs
        public I2PString(BufRef buf)
        {
            var len = buf.Read8();

            Str = System.Text.Encoding.UTF8.GetString(buf.BaseArray, buf.BaseArrayOffset, len);
            buf.Seek(len);
        }
예제 #7
0
        public SessionRequest(BufRef reader, I2PCertificate cert)
        {
            Certificate = cert;

            X = reader.ReadBufLen(Certificate.PublicKeyLength);
            var ipsize = reader.Read8();

            Address = reader.ReadBufLen(ipsize);
        }
예제 #8
0
 public RequestLeaseSetMessage( BufRef reader )
     : base(ProtocolMessageType.RequestLS)
 {
     SessionId = reader.ReadFlip16();
     var leases = reader.Read8();
     for ( int i = 0; i < leases; ++i )
     {
         Leases.Add( new I2PLease( reader ) );
     }
 }
예제 #9
0
 public GetDateMessage(BufRef reader)
     : base(ProtocolMessageType.GetDate)
 {
     reader.Seek(4);
     if ((ProtocolMessageType)reader.Read8() != MessageType)
     {
         throw new ArgumentException("GetDateMessage( reader ) Wrong message type.");
     }
     Version = new I2PString(reader);
     Mapping = new I2PMapping(reader);
 }
예제 #10
0
        void UpdateCachedFields(BufRef reader)
        {
            CachedKey        = new I2PIdentHash(reader);
            CachedContent    = reader.Read8() == 0 ? MessageContent.RouterInfo : MessageContent.LeaseSet;
            CachedReplyToken = reader.Read32();
            if (CachedReplyToken != 0)
            {
                CachedReplyTunnelId = reader.Read32();
                CachedReplyGateway  = new I2PIdentHash(reader);
            }

            switch (CachedContent)
            {
            case MessageContent.RouterInfo:
                var length = reader.ReadFlip16();

#if USE_BC_GZIP
                CachedRouterInfo = new I2PRouterInfo(
                    new BufRefLen(LZUtils.BCGZipDecompressNew(new BufLen(reader, 0, length))), true);
#else
                using (var ms = new MemoryStream())
                {
                    ms.Write(reader.BaseArray, reader.BaseArrayOffset, length);
                    ms.Position = 0;

                    using (var gzs = new GZipStream(ms, CompressionMode.Decompress))
                    {
                        var gzdata = StreamUtils.Read(gzs);
                        CachedRouterInfo = new I2PRouterInfo(new BufRefLen(gzdata), true);
                    }
                }
#endif

                reader.Seek(length);
                break;

            case MessageContent.LeaseSet:
                CachedLeaseSet = new I2PLeaseSet(reader);
                break;

            /*
             * case MessageContent.LeaseSet2:
             * break;
             *
             * case MessageContent.EncryptedLeaseSet:
             * break;
             *
             * case MessageContent.MetaLeaseSet:
             * break;
             */
            default:
                throw new InvalidDataException($"DatabaseStoreMessage: {CachedContent} not supported");
            }
        }
예제 #11
0
        public VariableTunnelBuildMessage(BufRef reader)
        {
            var start   = new BufRef(reader);
            var records = reader.Read8();

            for (int i = 0; i < records; ++i)
            {
                var r = new AesEGBuildRequestRecord(reader);
                Records.Add(r);
            }
            SetBuffer(start, reader);
        }
        public VariableTunnelBuildReplyMessage(BufRef reader)
        {
            var start = new BufRef(reader);

            ResponseRecords = new List <BuildResponseRecord>();

            byte count = reader.Read8();

            for (int i = 0; i < count; ++i)
            {
                ResponseRecords.Add(new BuildResponseRecord(reader));
            }
            SetBuffer(start, reader);
        }
예제 #13
0
        public I2PLeaseSet(BufRef reader)
        {
            Destination      = new I2PDestination(reader);
            PublicKey        = new I2PPublicKey(reader, I2PKeyType.DefaultAsymetricKeyCert);
            PublicSigningKey = new I2PSigningPublicKey(reader, Destination.Certificate);

            var leases     = new List <I2PLease>();
            int leasecount = reader.Read8();

            for (int i = 0; i < leasecount; ++i)
            {
                leases.Add(new I2PLease(reader));
            }
            Leases    = leases;
            Signature = new I2PSignature(reader, Destination.Certificate);
        }
예제 #14
0
        public SessionCreated(BufRef reader, I2PCertificate cert)
        {
            Certificate = cert;

            Y = reader.ReadBufLen(Certificate.PublicKeyLength);
            var ipsize = reader.Read8();

            Address    = reader.ReadBufLen(ipsize);
            Port       = reader.ReadBufLen(2);
            RelayTag   = reader.ReadBufLen(4);
            SignOnTime = reader.ReadBufLen(4);
            var paddedsignlen = cert.SignatureLength + BufUtils.Get16BytePadding(cert.SignatureLength);

            SignatureEncrBuf = reader.ReadBufLen(paddedsignlen);
            Signature        = new BufLen(SignatureEncrBuf, 0, cert.SignatureLength);
        }
예제 #15
0
        public DatabaseSearchReplyMessage(BufRef reader)
        {
            var start = new BufRef(reader);

            Key = new I2PIdentHash(reader);

            var peercount = reader.Read8();

            for (int i = 0; i < peercount; ++i)
            {
                Peers.Add(new I2PIdentHash(reader));
            }

            From = new I2PIdentHash(reader);

            SetBuffer(start, reader);
        }
예제 #16
0
        void UpdateCachedFields(BufRef reader)
        {
            CachedKey        = new I2PIdentHash(reader);
            CachedContent    = reader.Read8() == 0 ? MessageContent.RouterInfo : MessageContent.LeaseSet;
            CachedReplyToken = reader.Read32();
            if (CachedReplyToken != 0)
            {
                CachedReplyTunnelId = reader.Read32();
                CachedReplyGateway  = new I2PIdentHash(reader);
            }

            if (CachedContent == MessageContent.RouterInfo)
            {
                var length = reader.ReadFlip16();

#if USE_BC_GZIP
                CachedRouterInfo = new I2PRouterInfo(
                    new BufRefLen(LZUtils.BCGZipDecompressNew(new BufLen(reader, 0, length))), true);
#else
                using (var ms = new MemoryStream())
                {
                    ms.Write(reader.BaseArray, reader.BaseArrayOffset, length);
                    ms.Position = 0;

                    using (var gzs = new GZipStream(ms, CompressionMode.Decompress))
                    {
                        var gzdata = StreamUtils.Read(gzs);
                        CachedRouterInfo = new I2PRouterInfo(new BufRefLen(gzdata), true);
                    }
                }
#endif

                reader.Seek(length);
            }
            else
            {
                CachedLeaseSet = new I2PLeaseSet(reader);
            }
        }
예제 #17
0
        public static GarlicCloveDelivery CreateGarlicCloveDelivery(BufRef reader)
        {
            var flag  = reader.Read8();
            var deliv = (DeliveryMethod)(flag & (0x03 << 5));

            switch (deliv)
            {
            case DeliveryMethod.Local:
                return(new GarlicCloveDeliveryLocal(reader, flag));

            case DeliveryMethod.Destination:
                return(new GarlicCloveDeliveryDestination(reader, flag));

            case DeliveryMethod.Router:
                return(new GarlicCloveDeliveryRouter(reader, flag));

            case DeliveryMethod.Tunnel:
                return(new GarlicCloveDeliveryTunnel(reader, flag));

            default:
                throw new NotImplementedException("Unknown delivery method in Garlic clove!");
            }
        }
예제 #18
0
        public SSUDataMessage(BufRef reader, DataDefragmenter fragments)
        {
            var dataflags = (DataMessageFlags)reader.Read8();

#if LOG_ALL_TRANSPORT
            Logging.LogTransport("SSU DataMessage rececived flag: " + dataflags.ToString());
#endif
            var explicitacks  = (dataflags & DataMessageFlags.ExplicitAcks) != 0;
            var acksbitfields = (dataflags & DataMessageFlags.BitfieldAcks) != 0;
            ECN = (dataflags & DataMessageFlags.ECN) != 0;
            var extdata = (dataflags & DataMessageFlags.ExtendedDataIncluded) != 0;
            if (explicitacks)
            {
                ExplicitAcks = new List <uint>();
                var acks = reader.Read8();
                for (int i = 0; i < acks; ++i)
                {
                    ExplicitAcks.Add(reader.Read32());
                }
            }
            if (acksbitfields)
            {
                var bitfields = reader.Read8();
                AckBitfields = new List <KeyValuePair <uint, List <byte> > >(bitfields);
                for (int i = 0; i < bitfields; ++i)
                {
                    var  msgid = reader.Read32();
                    var  bfs   = new List <byte>(10);
                    byte bf;
                    while (true)
                    {
                        bf = reader.Read8();
                        bfs.Add((byte)(bf & 0x7f));
                        if ((bf & 0x80) == 0)
                        {
                            break;
                        }
                    }
                    AckBitfields.Add(new KeyValuePair <uint, List <byte> >(msgid, bfs));
                }
            }
            if (extdata)
            {
                var datasize = reader.Read8();
                ExtData = reader.ReadBufLen(datasize);
            }

            var fragcount = reader.Read8();
            for (int i = 0; i < fragcount; ++i)
            {
                var frag       = new DataFragment(reader);
                var newmessage = fragments.Add(frag);

                if (newmessage != null)
                {
                    if (NewMessages == null)
                    {
                        NewMessages = new List <RebuildI2NPMessage>();
                    }
                    NewMessages.Add(newmessage);
                }
            }
        }
예제 #19
0
 public SessionStatusMessage(BufRef reader)
     : base(ProtocolMessageType.SessionStatus)
 {
     SessionId    = reader.ReadFlip16();
     SessionState = (SessionStates)reader.Read8();
 }