Esempio n. 1
0
 public void WriteTo(BufRef writer)
 {
     writer.Write(TestNonce);
     writer.Write(AliceIPAddrSize);
     writer.Write(AliceIPAddr);
     writer.Write(AlicePort);
     writer.Write(IntroKey);
 }
Esempio n. 2
0
 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();
            }
        }
Esempio n. 5
0
        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");
            }
        }