Changeset 90e6458 for core


Ignore:
Timestamp:
May 26, 2019 12:09:28 PM (18 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
73b00eb
Parents:
c2e2cc2
Message:

I2CP: Add per-client auth to generated leaseset
Set key on router side before verifying

File:
1 edited

Legend:

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

    rc2e2cc2 r90e6458  
    2626import net.i2p.crypto.KeyPair;
    2727import net.i2p.crypto.SigType;
     28import net.i2p.data.Base64;
     29import net.i2p.data.BlindData;
    2830import net.i2p.data.DatabaseEntry;
    2931import net.i2p.data.DataFormatException;
     
    6769    private static final String PROP_LS_ENCTYPE = "i2cp.leaseSetEncType";
    6870    private static final String PROP_SECRET = "i2cp.leaseSetSecret";
     71    private static final String PROP_AUTH_TYPE = "i2cp.leaseSetAuthType";
     72    private static final String PROP_PRIV_KEY = "i2cp.leaseSetPrivKey";
     73    private static final String PROP_DH = "i2cp.leaseSetClient.dh.";
     74    private static final String PROP_PSK = "i2cp.leaseSetClient.psk.";
    6975
    7076    public RequestLeaseSetMessageHandler(I2PAppContext context) {
     
    310316        }
    311317        try {
    312             leaseSet.sign(session.getPrivateKey());
     318            if (isLS2 && _ls2Type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2) {
     319                EncryptedLeaseSet els2 = (EncryptedLeaseSet) leaseSet;
     320                String at = opts.getProperty(PROP_AUTH_TYPE, "0");
     321                if (at.equals("1")) {
     322                    int authType = BlindData.AUTH_DH;
     323                    List<PublicKey> clientKeys = new ArrayList<PublicKey>(4);
     324                    String pfx = PROP_DH;
     325                    String p = opts.getProperty(PROP_PRIV_KEY);
     326                    if (p == null) {
     327                        _log.error("No " + PROP_PRIV_KEY + " for DH auth");
     328                    } else {
     329                        byte[] b = Base64.decode(p);
     330                        try {
     331                            PrivateKey pk = new PrivateKey(EncType.ECIES_X25519, b);
     332                            clientKeys.add(pk.toPublic());
     333                        } catch (IllegalArgumentException iae) {
     334                            _log.error("Bad priv key: " + p, iae);
     335                        }
     336                    }
     337                    int i = 0;
     338                    while ((p = opts.getProperty(pfx + i)) != null) {
     339                        int colon = p.indexOf(':');
     340                        if (colon >= 0)
     341                            p = p.substring(colon + 1);
     342                        byte[] b = Base64.decode(p);
     343                        try {
     344                            PublicKey pk = new PublicKey(EncType.ECIES_X25519, b);
     345                            clientKeys.add(pk);
     346                        } catch (IllegalArgumentException iae) {
     347                            _log.error("Bad client key: " + p, iae);
     348                        }
     349                        i++;
     350                    }
     351                    els2.sign(session.getPrivateKey(), authType, clientKeys);
     352                } else if (at.equals("2")) {
     353                    int authType = BlindData.AUTH_PSK;
     354                    List<PrivateKey> clientKeys = new ArrayList<PrivateKey>(4);
     355                    String pfx = PROP_PSK;
     356                    String p = opts.getProperty(PROP_PRIV_KEY);
     357                    if (p == null) {
     358                        _log.error("No " + PROP_PRIV_KEY + " for PSK auth");
     359                    } else {
     360                        byte[] b = Base64.decode(p);
     361                        try {
     362                            PrivateKey pk = new PrivateKey(EncType.ECIES_X25519, b);
     363                            clientKeys.add(pk);
     364                        } catch (IllegalArgumentException iae) {
     365                            _log.error("Bad priv key: " + p, iae);
     366                        }
     367                    }
     368                    int i = 0;
     369                    while ((p = opts.getProperty(pfx + i)) != null) {
     370                        int colon = p.indexOf(':');
     371                        if (colon >= 0)
     372                            p = p.substring(colon + 1);
     373                        byte[] b = Base64.decode(p);
     374                        try {
     375                            PrivateKey pk = new PrivateKey(EncType.ECIES_X25519, b);
     376                            clientKeys.add(pk);
     377                        } catch (IllegalArgumentException iae) {
     378                            _log.error("Bad client key: " + p, iae);
     379                        }
     380                        i++;
     381                    }
     382                    els2.sign(session.getPrivateKey(), authType, clientKeys);
     383                } else {
     384                    els2.sign(session.getPrivateKey());
     385                }
     386            } else {
     387                leaseSet.sign(session.getPrivateKey());
     388            }
    313389            SigningPrivateKey spk = li.getSigningPrivateKey();
    314390            if (isLS2) {
Note: See TracChangeset for help on using the changeset viewer.