Пример #1
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);
        }
Пример #2
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));
            }
        }
Пример #3
0
        public RequestVariableLeaseSetMessage(BufRef reader)
            : base(ProtocolMessageType.RequestVarLS)
        {
            var leases = reader.ReadFlip16();

            for (int i = 0; i < leases; ++i)
            {
                Leases.Add(new I2PLease(reader));
            }
        }
Пример #4
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 ) );
     }
 }
Пример #5
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");
            }
        }
Пример #6
0
        public CreateLeaseSetMessage(BufRef reader, I2CPSession session)
            : base(ProtocolMessageType.CreateLS)
        {
            SessionId = reader.ReadFlip16();

            var cert = session.SessionIds[SessionId].Config.Destination.Certificate;

            DSAPrivateSigningKey = new I2PSigningPrivateKey(
                reader,
                new I2PCertificate(I2PSigningKey.SigningKeyTypes.DSA_SHA1));

            PrivateKey = new I2PPrivateKey(reader, cert);
            Leases     = new I2PLeaseSet(reader);
        }
Пример #7
0
        public I2PMapping(BufRef buf)
        {
            var bytes  = buf.ReadFlip16();
            var endpos = buf.BaseArrayOffset + bytes;

            while (buf.BaseArrayOffset < endpos)
            {
                var key = new I2PString(buf);
                if (buf.Peek8(0) == '=')
                {
                    buf.Seek(1);
                }
                var value = new I2PString(buf);
                if (buf.Peek8(0) == ';')
                {
                    buf.Seek(1);
                }
                Mappings[key] = value;
            }
        }
Пример #8
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);
            }
        }
Пример #9
0
 public ReconfigureSessionMessage(BufRef reader) : base(ProtocolMessageType.ReconfigSession)
 {
     SessionId = reader.ReadFlip16();
     Config    = new I2PSessionConfig(reader);
 }
Пример #10
0
 public SessionStatusMessage(BufRef reader)
     : base(ProtocolMessageType.SessionStatus)
 {
     SessionId    = reader.ReadFlip16();
     SessionState = (SessionStates)reader.Read8();
 }
Пример #11
0
 public DestroySessionMessage(BufRef reader)
     : base(ProtocolMessageType.DestroySession)
 {
     SessionId = reader.ReadFlip16();
 }