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); } } }
public GarlicClove(GarlicCloveDelivery delivery) { Delivery = delivery; Message = delivery.Message; CloveId = BufUtils.RandomUint(); Expiration = new I2PDate(DateTime.UtcNow + TimeSpan.FromSeconds(8)); }
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); }
public GarlicClove(GarlicCloveDelivery delivery, I2PDate exp) { Delivery = delivery; Message = delivery.Message; CloveId = BufUtils.RandomUint(); Expiration = exp; }
public GarlicClove(BufRef reader) { Delivery = GarlicCloveDelivery.CreateGarlicCloveDelivery(reader); Message = I2NPMessage.ReadHeader16(reader).Message; CloveId = reader.Read32(); Expiration = new I2PDate(reader); reader.Seek(3); // Cert }
public DeliveryStatusMessage(uint msgid) { AllocateBuffer(12); var writer = new BufRefLen(Payload); Timestamp = new I2PDate(DateTime.UtcNow); StatusMessageId = msgid; }
public DeliveryStatusMessage() { AllocateBuffer(12); var writer = new BufRefLen(Payload); Timestamp = new I2PDate(DateTime.UtcNow); StatusMessageId = I2NPMessage.GenerateMessageId(); }
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)); }
public I2NPHeader5(I2NPMessage msg) : base(msg.Header5Buf) { MessageRef = msg; MessageType = msg.MessageType; Expiration = I2PDate.DefaultI2NPExpiration(); #if DEBUG DebugCheckMessageCreation(MessageRef); #endif }
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); }
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); }
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 }
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(); }
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)); }
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)); }
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); }
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"); }
public SetDateMessage(BufRef data) : base(ProtocolMessageType.SetDate) { Date = new I2PDate(data); Version = new I2PString(data); }
public SetDateMessage(I2PDate date, I2PString ver) : base(ProtocolMessageType.SetDate) { Date = date; Version = ver; }
public Garlic(I2PDate expiration, params GarlicClove[] cloves) : this(expiration, cloves.AsEnumerable()) { }
public DestinationStatistics(I2PIdentHash id) { Id = id; LastSeen = new I2PDate(DateTime.UtcNow); UpdateScore(); }