Changeset 7cbb43a for router


Ignore:
Timestamp:
Mar 2, 2019 7:53:16 PM (17 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
54d9a29
Parents:
335736b
Message:

I2CP: Encrypted LS2 handling fixes, log tweaks (WIP)
Add number of privkeys field to CreateLeaseSet2 message
Check all privkeys, not just the first, on router side

File:
1 edited

Legend:

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

    r335736b r7cbb43a  
    2020import net.i2p.data.Hash;
    2121import net.i2p.data.LeaseSet;
     22import net.i2p.data.LeaseSet2;
    2223import net.i2p.data.Payload;
     24import net.i2p.data.PrivateKey;
    2325import net.i2p.data.PublicKey;
    2426import net.i2p.data.i2cp.BandwidthLimitsMessage;
     
    291293        }
    292294        String lsType = props.getProperty("i2cp.leaseSetType");
    293         if ("7".equals(lsType)) {
     295        if ("5".equals(lsType)) {
     296            SigType stype = dest.getSigningPublicKey().getType();
     297            if (stype != SigType.EdDSA_SHA512_Ed25519 &&
     298                stype != SigType.RedDSA_SHA512_Ed25519) {
     299                _runner.disconnectClient("Invalid sig type for encrypted LS");
     300                return;
     301            }
     302        } else if ("7".equals(lsType)) {
    294303            // Prevent tunnel builds for Meta LS
    295304            // more TODO
     
    513522        }
    514523        int type = ls.getType();
    515         if (type != DatabaseEntry.KEY_TYPE_META_LS2 && message.getPrivateKey() == null) {
     524        if (type != DatabaseEntry.KEY_TYPE_META_LS2 &&
     525            type != DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2 &&
     526            message.getPrivateKey() == null) {
    516527            if (_log.shouldLog(Log.ERROR))
    517528                _log.error("Null private keys: " + message);
     
    537548        }
    538549        Destination dest = cfg.getDestination();
    539         Destination ndest = ls.getDestination();
    540         if (!dest.equals(ndest)) {
    541             if (_log.shouldLog(Log.ERROR))
    542                 _log.error("Different destination in LS");
    543             _runner.disconnectClient("Different destination in LS");
    544             return;
     550        if (type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2) {
     551            // so we can decrypt it
     552            try {
     553                ls.setDestination(dest);
     554            } catch (RuntimeException re) {
     555                if (_log.shouldError())
     556                    _log.error("Error decrypting leaseset from client", re);
     557                _runner.disconnectClient(re.toString());
     558                return;
     559            }
     560            // we have to do this before checking encryption keys below
     561            if (!ls.verifySignature()) {
     562                if (_log.shouldError())
     563                    _log.error("Error decrypting leaseset from client");
     564                _runner.disconnectClient("Error decrypting leaseset from client");
     565                return;
     566            }
     567        } else {
     568            Destination ndest = ls.getDestination();
     569            if (!dest.equals(ndest)) {
     570                if (_log.shouldLog(Log.ERROR))
     571                    _log.error("Different destination in LS");
     572                _runner.disconnectClient("Different destination in LS");
     573                return;
     574            }
    545575        }
    546576        if (type != DatabaseEntry.KEY_TYPE_META_LS2) {
     
    551581                // Private crypto key should never change, and if it does,
    552582                // one of the checks below will fail
    553                 PublicKey pk;
    554                 try {
    555                     pk = message.getPrivateKey().toPublic();
    556                 } catch (IllegalArgumentException iae) {
    557                     if (_log.shouldLog(Log.ERROR))
    558                         _log.error("Bad private key in LS");
    559                     _runner.disconnectClient("Bad private key in LS");
    560                     return;
    561                 }
    562                 if (!pk.equals(ls.getEncryptionKey())) {
    563                     if (_log.shouldLog(Log.ERROR))
    564                         _log.error("Private/public crypto key mismatch in LS");
    565                     _runner.disconnectClient("Private/public crypto key mismatch in LS");
    566                     return;
     583                if (type == DatabaseEntry.KEY_TYPE_LEASESET) {
     584                    // LS1
     585                    PublicKey pk;
     586                    try {
     587                        pk = message.getPrivateKey().toPublic();
     588                    } catch (IllegalArgumentException iae) {
     589                        if (_log.shouldLog(Log.ERROR))
     590                            _log.error("Bad private key in LS");
     591                        _runner.disconnectClient("Bad private key in LS");
     592                        return;
     593                    }
     594                    if (!pk.equals(ls.getEncryptionKey())) {
     595                        if (_log.shouldLog(Log.ERROR))
     596                            _log.error("Private/public crypto key mismatch in LS");
     597                        _runner.disconnectClient("Private/public crypto key mismatch in LS");
     598                        return;
     599                    }
     600                } else {
     601                    // LS2
     602                    LeaseSet2 ls2 = (LeaseSet2) ls;
     603                    CreateLeaseSet2Message msg2 = (CreateLeaseSet2Message) message;
     604                    List<PublicKey> eks = ls2.getEncryptionKeys();
     605                    List<PrivateKey> pks = msg2.getPrivateKeys();
     606                    for (int i = 0; i < eks.size(); i++) {
     607                        PublicKey ek = eks.get(i);
     608                        PublicKey pk;
     609                        try {
     610                            pk = pks.get(i).toPublic();
     611                        } catch (IllegalArgumentException iae) {
     612                            if (_log.shouldLog(Log.ERROR))
     613                                _log.error("Bad private key in LS: " + i);
     614                            _runner.disconnectClient("Bad private key in LS: " + i);
     615                            return;
     616                        }
     617                        if (!pk.equals(ek)) {
     618                            if (_log.shouldLog(Log.ERROR))
     619                                _log.error("Private/public crypto key mismatch in LS for key: " + i);
     620                            _runner.disconnectClient("Private/public crypto key mismatch in LS for key: " + i);
     621                            return;
     622                        }
     623                    }
    567624                }
    568625                // just register new SPK, don't verify, unused
Note: See TracChangeset for help on using the changeset viewer.