public void WriteTo(BufRef writer) { writer.Write(TestNonce); writer.Write(AliceIPAddrSize); writer.Write(AliceIPAddr); writer.Write(AlicePort); writer.Write(IntroKey); }
public void WriteTo(BufRef dest) { LastSent.SetNow(); ++SendCount; if (BufBase.SameBuffer(Buf, Data)) { dest.Write(Buf); } else { dest.Write(Buf); dest.Write(Data); } }
public override void Append(BufRef writer) { writer.Write8((byte)(0x80 | (FragmentNumber << 1) | (LastFragment ? 0x01 : 0x00))); writer.Write32(SourceMessage.Header.MessageId); writer.WriteFlip16((ushort)SourceMessageData.Length); writer.Write(SourceMessageData); }
public virtual void Append(BufRef writer) { switch (SourceMessage.Delivery) { case TunnelMessage.DeliveryTypes.Local: writer.Write8((byte)((byte)TunnelMessage.DeliveryTypes.Local | (Fragmented ? 0x08 : 0))); if (Fragmented) { writer.Write32(SourceMessage.Header.MessageId); } writer.WriteFlip16((ushort)SourceMessageData.Length); writer.Write(SourceMessageData); break; case TunnelMessage.DeliveryTypes.Router: writer.Write8((byte)((byte)TunnelMessage.DeliveryTypes.Router | (Fragmented ? 0x08 : 0))); writer.Write(((TunnelMessageRouter)SourceMessage).Destination.Hash); if (Fragmented) { writer.Write32(SourceMessage.Header.MessageId); } writer.WriteFlip16((ushort)SourceMessageData.Length); writer.Write(SourceMessageData); break; case TunnelMessage.DeliveryTypes.Tunnel: writer.Write8((byte)((byte)TunnelMessage.DeliveryTypes.Tunnel | (Fragmented ? 0x08 : 0))); writer.Write32(((TunnelMessageTunnel)SourceMessage).Tunnel); writer.Write(((TunnelMessageTunnel)SourceMessage).Destination.Hash); if (Fragmented) { writer.Write32(SourceMessage.Header.MessageId); } writer.WriteFlip16((ushort)SourceMessageData.Length); writer.Write(SourceMessageData); break; default: throw new NotImplementedException(); } }
internal static void Receive(DHHandshakeContext context, BufLen datastart) { var origbuf = new BufRefLen(datastart); var reader = new BufRefLen(datastart); context.Dectryptor.ProcessBytes(datastart); var rilen = reader.ReadFlip16(); var ribuf = reader.ReadBufRefLen(rilen); context.TimestampA = reader.ReadFlip32(); #if LOG_ALL_TRANSPORT DebugUtils.Log("SessionConfirmA recv TimestampA: " + (I2PDate.RefDate.AddSeconds(context.TimestampA).ToString())); DebugUtils.Log("SessionConfirmA recv TimestampB: " + (I2PDate.RefDate.AddSeconds(context.TimestampB).ToString())); #endif context.RemoteRI = new I2PRouterIdentity(ribuf); context.RunContext.RemoteRouterIdentity = context.RemoteRI; var sizeofpayload = 2 + rilen + 4 + context.RemoteRI.Certificate.SignatureLength; var paddingsize = BufUtils.Get16BytePadding(sizeofpayload); reader.Seek(paddingsize); var sigstart = new BufLen(reader, 0, context.RemoteRI.Certificate.SignatureLength); var needbytes = 2 + context.RemoteRI.Certificate.RouterIdentitySize + 4 + context.RemoteRI.Certificate.SignatureLength; needbytes += BufUtils.Get16BytePadding(needbytes); var writer = new BufRef(origbuf, origbuf.Length); var gotbytes = writer - origbuf; if (gotbytes < needbytes) { #if LOG_ALL_TRANSPORT DebugUtils.Log("SessionConfirmA recv not enough data: " + datastart.Length.ToString() + ". I want " + needbytes.ToString() + " bytes."); #endif var buf = context.Client.BlockReceive(needbytes - gotbytes); writer.Write(buf); } if (needbytes - datastart.Length > 0) { context.Dectryptor.ProcessBytes(new BufLen(datastart, datastart.Length, needbytes - datastart.Length)); } var signature = new I2PSignature(new BufRefLen(sigstart), context.RemoteRI.Certificate); if (!I2PSignature.SupportedSignatureType(context.RemoteRI.Certificate.SignatureType)) { throw new SignatureCheckFailureException("NTCP SessionConfirmA recv not supported signature type: " + context.RemoteRI.Certificate.SignatureType.ToString()); } var sigok = I2PSignature.DoVerify( context.RemoteRI.SigningPublicKey, signature, context.XBuf, context.YBuf, RouterContext.Inst.MyRouterIdentity.IdentHash.Hash, new BufLen(BufUtils.Flip32B(context.TimestampA)), new BufLen(BufUtils.Flip32B(context.TimestampB)) ); #if LOG_ALL_TRANSPORT DebugUtils.Log("SessionConfirmA recv: " + context.RemoteRI.Certificate.SignatureType.ToString() + " signature check: " + sigok.ToString() + "."); #endif if (!sigok) { throw new SignatureCheckFailureException("NTCP SessionConfirmA recv signature check fail"); } }