Changeset 0d330ca for router


Ignore:
Timestamp:
Jan 10, 2019 1:39:18 PM (17 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
e02a0df
Parents:
8cd7e7d
Message:

I2CP: Basic router-side handling of meta LS2
Improve error handling of LS2 params client-side
Methods to remember blinded key in LS2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/client/ClientMessageEventListener.java

    r8cd7e7d r0d330ca  
    1414import net.i2p.CoreVersion;
    1515import net.i2p.crypto.SigType;
     16import net.i2p.data.DatabaseEntry;
    1617import net.i2p.data.DataHelper;
    1718import net.i2p.data.Destination;
    1819import net.i2p.data.Hash;
     20import net.i2p.data.LeaseSet;
    1921import net.i2p.data.Payload;
    2022import net.i2p.data.PublicKey;
     
    267269        }
    268270        props.putAll(inProps);
     271        if ("7".equals(props.getProperty("i2cp.leaseSetType"))) {
     272            // Prevent tunnel builds for Meta LS
     273            // more TODO
     274            props.setProperty("inbound.length", "0");
     275            props.setProperty("outbound.length", "0");
     276            props.setProperty("inbound.lengthVariance", "0");
     277            props.setProperty("outbound.lengthVariance", "0");
     278        }
    269279        cfg.setOptions(props);
    270280        // this sets the session id
     
    470480    /** override for testing */
    471481    protected void handleCreateLeaseSet(CreateLeaseSetMessage message) {
    472         if ( (message.getLeaseSet() == null) || (message.getPrivateKey() == null) || (message.getSigningPrivateKey() == null) ) {
     482        LeaseSet ls = message.getLeaseSet();
     483        if (ls == null) {
    473484            if (_log.shouldLog(Log.ERROR))
    474485                _log.error("Null lease set granted: " + message);
    475             _runner.disconnectClient("Invalid CreateLeaseSetMessage");
     486            _runner.disconnectClient("Invalid CreateLeaseSetMessage - null LS");
     487            return;
     488        }
     489        int type = ls.getType();
     490        if (type != DatabaseEntry.KEY_TYPE_META_LS2 &&
     491            (message.getPrivateKey() == null || message.getSigningPrivateKey() == null)) {
     492            if (_log.shouldLog(Log.ERROR))
     493                _log.error("Null private keys: " + message);
     494            _runner.disconnectClient("Invalid CreateLeaseSetMessage - null private keys");
    476495            return;
    477496        }
     
    487506        }
    488507        Destination dest = cfg.getDestination();
    489         Destination ndest = message.getLeaseSet().getDestination();
     508        Destination ndest = ls.getDestination();
    490509        if (!dest.equals(ndest)) {
    491510            if (_log.shouldLog(Log.ERROR))
     
    494513            return;
    495514        }
    496         LeaseSetKeys keys = _context.keyManager().getKeys(dest);
    497         if (keys == null ||
    498             !message.getPrivateKey().equals(keys.getDecryptionKey())) {
    499             // Verify and register crypto keys if new or if changed
    500             // Private crypto key should never change, and if it does,
    501             // one of the checks below will fail
    502             PublicKey pk;
    503             try {
    504                 pk = message.getPrivateKey().toPublic();
    505             } catch (IllegalArgumentException iae) {
    506                 if (_log.shouldLog(Log.ERROR))
    507                     _log.error("Bad private key in LS");
    508                 _runner.disconnectClient("Bad private key in LS");
    509                 return;
    510             }
    511             if (!pk.equals(message.getLeaseSet().getEncryptionKey())) {
    512                 if (_log.shouldLog(Log.ERROR))
    513                     _log.error("Private/public crypto key mismatch in LS");
    514                 _runner.disconnectClient("Private/public crypto key mismatch in LS");
    515                 return;
    516             }
    517             // just register new SPK, don't verify, unused
    518             _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
    519         } else if (!message.getSigningPrivateKey().equals(keys.getRevocationKey())) {
    520             // just register new SPK, don't verify, unused
    521             _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
     515        if (type != DatabaseEntry.KEY_TYPE_META_LS2) {
     516            LeaseSetKeys keys = _context.keyManager().getKeys(dest);
     517            if (keys == null ||
     518                !message.getPrivateKey().equals(keys.getDecryptionKey())) {
     519                // Verify and register crypto keys if new or if changed
     520                // Private crypto key should never change, and if it does,
     521                // one of the checks below will fail
     522                PublicKey pk;
     523                try {
     524                    pk = message.getPrivateKey().toPublic();
     525                } catch (IllegalArgumentException iae) {
     526                    if (_log.shouldLog(Log.ERROR))
     527                        _log.error("Bad private key in LS");
     528                    _runner.disconnectClient("Bad private key in LS");
     529                    return;
     530                }
     531                if (!pk.equals(ls.getEncryptionKey())) {
     532                    if (_log.shouldLog(Log.ERROR))
     533                        _log.error("Private/public crypto key mismatch in LS");
     534                    _runner.disconnectClient("Private/public crypto key mismatch in LS");
     535                    return;
     536                }
     537                // just register new SPK, don't verify, unused
     538                _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
     539            } else if (!message.getSigningPrivateKey().equals(keys.getRevocationKey())) {
     540                // just register new SPK, don't verify, unused
     541                _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
     542            }
    522543        }
    523544        try {
    524             _context.netDb().publish(message.getLeaseSet());
     545            _context.netDb().publish(ls);
    525546        } catch (IllegalArgumentException iae) {
    526547            if (_log.shouldLog(Log.ERROR))
     
    533554
    534555        // leaseSetCreated takes care of all the LeaseRequestState stuff (including firing any jobs)
    535         _runner.leaseSetCreated(message.getLeaseSet());
     556        _runner.leaseSetCreated(ls);
    536557    }
    537558
Note: See TracChangeset for help on using the changeset viewer.