internal void HandleTunnelBuildRecords(
            II2NPHeader msg,
            TunnelBuildRequestDecrypt decrypt)
        {
            if (decrypt.Decrypted.ToAnyone)
            {
                // Im outbound endpoint
                Logging.LogDebug($"HandleTunnelBuildRecords: Outbound endpoint request {decrypt}");
                HandleEndpointTunnelRequest(msg, decrypt);
                return;
            }

            if (decrypt.Decrypted.FromAnyone)
            {
                // Im inbound gateway
                Logging.LogDebug($"HandleTunnelBuildRecords: Inbound gateway request {decrypt}");
                HandleGatewayTunnelRequest(msg, decrypt);
                return;
            }

            if (decrypt.Decrypted.NextIdent != RouterContext.Inst.MyRouterIdentity.IdentHash)
            {
                // Im transit tunnel
                Logging.LogDebug($"HandleTunnelBuildRecords: Transit tunnel request {decrypt}");
                HandleTransitTunnelRequest(msg, decrypt);
                return;
            }

            throw new NotSupportedException();
        }
Beispiel #2
0
        public IEnumerable <AesEGBuildRequestRecord> CreateTunnelBuildReplyRecords(
            BuildResponseRecord.RequestResponse response)
        {
            var newrecords = new List <AesEGBuildRequestRecord>(
                Records.Select(r => r.Clone())
                );

            var tmp = new TunnelBuildRequestDecrypt(newrecords, Me, Key);

            tmp.ToMeField.Data.Randomize();
            var responserec = new BuildResponseRecord(tmp.ToMeField.Data)
            {
                Reply = response
            };

            responserec.UpdateHash();

            var cipher = new CbcBlockCipher(new AesEngine());

            cipher.Init(true, Decrypted.ReplyKeyBuf.ToParametersWithIV(Decrypted.ReplyIV));

            foreach (var one in newrecords)
            {
                cipher.Reset();
                one.Process(cipher);
            }

            return(newrecords);
        }
        private static I2NPMessage CreateReplyMessage(
            II2NPHeader msg,
            TunnelBuildRequestDecrypt decrypt,
            BuildResponseRecord.RequestResponse response)
        {
            var newrecords = decrypt.CreateTunnelBuildReplyRecords(response);

            if (msg.MessageType == I2NPMessage.MessageTypes.VariableTunnelBuild)
            {
                return(new VariableTunnelBuildMessage(newrecords));
            }
            else
            {
                return(new TunnelBuildMessage(newrecords));
            }
        }
        private void HandleEndpointTunnelRequest(
            II2NPHeader msg,
            TunnelBuildRequestDecrypt decrypt)
        {
            var config = new TunnelConfig(
                TunnelConfig.TunnelDirection.Inbound,
                TunnelConfig.TunnelPool.External,
                new TunnelInfo(new List <HopInfo>
            {
                new HopInfo(
                    RouterContext.Inst.MyRouterIdentity,
                    new I2PTunnelId())
            }
                               ));

            var tunnel = new EndpointTunnel(this, config, decrypt.Decrypted);

            tunnel.EstablishedTime.SetNow();

            var doaccept = AcceptingTunnels(decrypt.Decrypted);

            var response = doaccept
                    ? BuildResponseRecord.RequestResponse.Accept
                    : BuildResponseRecord.DefaultErrorReply;

            Logging.LogDebug($"HandleEndpointTunnelRequest {tunnel.TunnelDebugTrace}: " +
                             $"{tunnel.Destination.Id32Short} Endpoint tunnel request: {response} " +
                             $"for tunnel id {tunnel.ReceiveTunnelId}.");

            var newrecords = decrypt.CreateTunnelBuildReplyRecords(response);

            var responsemessage = new VariableTunnelBuildReplyMessage(
                newrecords.Select(r => new BuildResponseRecord(r)),
                tunnel.ResponseMessageId);

            var buildreplymsg = new TunnelGatewayMessage(
                responsemessage,
                tunnel.ResponseTunnelId);

            if (response == BuildResponseRecord.RequestResponse.Accept)
            {
                RunningEndpointTunnels[tunnel] = 1;
                TunnelMgr.AddTunnel(tunnel);
                AcceptedTunnelBuildRequest(decrypt.Decrypted);
            }
            TransportProvider.Send(tunnel.Destination, buildreplymsg);
        }