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"); } } }
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); }
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)); } }
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(); }
public I2PRouterAddress(BufRef buf) { Cost = buf.Read8(); Expiration = new I2PDate(buf); TransportStyle = new I2PString(buf); Options = new I2PMapping(buf); }
public I2PString(BufRef buf) { var len = buf.Read8(); Str = System.Text.Encoding.UTF8.GetString(buf.BaseArray, buf.BaseArrayOffset, len); buf.Seek(len); }
public SessionRequest(BufRef reader, I2PCertificate cert) { Certificate = cert; X = reader.ReadBufLen(Certificate.PublicKeyLength); var ipsize = reader.Read8(); Address = reader.ReadBufLen(ipsize); }
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 ) ); } }
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); }
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 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); }
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); }
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); }
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); }
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 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!"); } }
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 SessionStatusMessage(BufRef reader) : base(ProtocolMessageType.SessionStatus) { SessionId = reader.ReadFlip16(); SessionState = (SessionStates)reader.Read8(); }