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"); } }
public GarlicClove(BufRef reader) { Delivery = GarlicCloveDelivery.CreateGarlicCloveDelivery(reader); Message = I2NPMessage.ReadHeader16(reader).Message; CloveId = reader.Read32(); Expiration = new I2PDate(reader); reader.Seek(3); // Cert }
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); } }
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); } } }
public I2PTunnelId(BufRef buf) { Id = buf.Read32(); }