Changeset 0d330ca


Ignore:
Timestamp:
Jan 10, 2019 1:39:18 PM (3 years 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

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java

    r8cd7e7d r0d330ca  
    104104            } catch (NumberFormatException nfe) {
    105105              session.propogateError("Bad LS2 type", nfe);
     106              session.destroySession();
    106107              return true;
    107108            }
     
    125126            } else {
    126127              session.propogateError("Unsupported LS2 type", new Exception());
     128              session.destroySession();
    127129              return;
    128130            }
     
    285287            if (!ok) {
    286288                session.propogateError("Bad offline signature", new Exception());
    287                 // TODO just let the router handle it for now
     289                session.destroySession();
    288290            }
    289291        }
     
    307309        } catch (DataFormatException dfe) {
    308310            session.propogateError("Error signing the leaseSet", dfe);
     311            session.destroySession();
    309312        } catch (I2PSessionException ise) {
    310313            if (session.isClosed()) {
  • core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java

    r8cd7e7d r0d330ca  
    5151            } else {
    5252              session.propogateError("Unsupported LS2 type", new Exception());
     53              session.destroySession();
    5354              return;
    5455            }
  • core/java/src/net/i2p/data/LeaseSet2.java

    r8cd7e7d r0d330ca  
    4040    // only used if more than one key, otherwise null
    4141    private List<PublicKey> _encryptionKeys;
     42    // If this leaseset was formerly blinded, the blinded hash, so we can find it again
     43    private Hash _blindedHash;
    4244
    4345    private static final int FLAG_OFFLINE_KEYS = 1;
     
    181183        byte[] data = baos.toByteArray();
    182184        return ctx.dsa().verifySignature(_offlineSignature, data, 0, data.length, getSigningPublicKey());
     185    }
     186
     187    /**
     188     * Set this on creation if known
     189     */
     190    public void setBlindedHash(Hash bh) {
     191        _blindedHash = bh;
     192    }
     193
     194    /**
     195     * The orignal blinded hash, where this came from.
     196     * @return null if unknown or not previously blinded
     197     */
     198    public Hash getBlindedHash() {
     199        return _blindedHash;
    183200    }
    184201
  • 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.