Changeset 2852383


Ignore:
Timestamp:
Dec 11, 2015 3:10:08 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
2d1ac7b
Parents:
393b5937
Message:

Router: Fix family verification after testing, partially hook into netdb store()
Always use our pubkey to verify our family
Rework caching strategy

Location:
router/java/src/net/i2p/router
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/crypto/FamilyKeyCrypto.java

    r393b5937 r2852383  
    4242    private final Log _log;
    4343    private final Map<Hash, String> _verified;
    44     private final Set<String> _negativeCache;
     44    private final Set<Hash> _negativeCache;
    4545    // following for verification only, otherwise null
    4646    private final String _fname;
    4747    private final SigningPrivateKey _privkey;
     48    private final SigningPublicKey _pubkey;
    4849
    4950    private static final String PROP_KEYSTORE_PASSWORD = "netdb.family.keystorePassword";
    5051    public static final String PROP_FAMILY_NAME = "netdb.family.name";
    51     private static final String DEFAULT_KEYSTORE_PASSWORD = "changeit";
    5252    private static final String PROP_KEY_PASSWORD = "netdb.family.keyPassword";
    5353    private static final String CERT_SUFFIX = ".crt";
     
    5555    private static final String KEYSTORE_SUFFIX = ".ks";
    5656    private static final int DEFAULT_KEY_VALID_DAYS = 3652;  // 10 years
     57    // Note that we can't use RSA here, as the b64 sig would exceed the 256 char limit for a Mapping
     58    // Note that we can't use EdDSA here, as keystore doesn't know how, and encoding/decoding is unimplemented
    5759    private static final String DEFAULT_KEY_ALGORITHM = SigType.ECDSA_SHA256_P256.isAvailable() ? "EC" : "DSA";
    5860    private static final int DEFAULT_KEY_SIZE = SigType.ECDSA_SHA256_P256.isAvailable() ? 256 : 1024;
     
    7981        }
    8082        _privkey = (_fname != null) ? initialize() : null;
     83        _pubkey = (_privkey != null) ? _privkey.toPublic() : null;
    8184        _verified = new ConcurrentHashMap<Hash, String>(4);
    82         _negativeCache = new ConcurrentHashSet<String>(4);
     85        _negativeCache = new ConcurrentHashSet<Hash>(4);
    8386    }
    8487   
     
    136139        if (name == null)
    137140            return true;
    138         String ssig = ri.getOption("OPT_SIG");
    139         if (ssig == null)
     141        Hash h = ri.getHash();
     142        String ssig = ri.getOption(OPT_SIG);
     143        if (ssig == null) {
     144            if (_log.shouldInfo())
     145                _log.info("No sig for " + h + ' ' + name);
    140146            return false;
    141         Hash h = ri.getHash();
     147        }
    142148        String nameAndSig = _verified.get(h);
    143149        String riNameAndSig = name + ssig;
     
    148154            _verified.remove(h);
    149155        }
    150         if (_negativeCache.contains(name))
     156        SigningPublicKey spk;
     157        if (name.equals(_fname)) {
     158            // us
     159            spk = _pubkey;
     160        } else {
     161            if (_negativeCache.contains(h))
     162                return false;
     163            spk = loadCert(name);
     164            if (spk == null) {
     165                _negativeCache.add(h);
     166                if (_log.shouldInfo())
     167                    _log.info("No cert for " + h + ' ' + name);
     168                return false;
     169            }
     170        }
     171        byte[] bsig = Base64.decode(ssig);
     172        if (bsig == null) {
     173            _negativeCache.add(h);
     174            if (_log.shouldInfo())
     175                _log.info("Bad sig for " + h + ' ' + name + ' ' + ssig);
    151176            return false;
    152         SigningPublicKey spk = loadCert(name);
    153         if (spk == null) {
    154             _negativeCache.add(name);
    155             return false;
    156         }
    157         byte[] bsig = Base64.decode(ssig);
    158         if (bsig == null)
    159             return false;
     177        }
    160178        Signature sig;
    161179        try {
     
    163181        } catch (IllegalArgumentException iae) {
    164182            // wrong size (type mismatch)
     183            _negativeCache.add(h);
     184            if (_log.shouldInfo())
     185                _log.info("Bad sig for " + ri, iae);
    165186            return false;
    166187        }
    167         byte[] nb = DataHelper.getUTF8(_fname);
     188        byte[] nb = DataHelper.getUTF8(name);
    168189        byte[] b = new byte[nb.length + Hash.HASH_LENGTH];
    169190        System.arraycopy(nb, 0, b, 0, nb.length);
     
    172193        if (rv)
    173194            _verified.put(h, riNameAndSig);
     195        else
     196            _negativeCache.add(h);
     197        if (_log.shouldInfo())
     198            _log.info("Verified? " + rv + " for " + h + ' ' + name + ' ' + ssig);
    174199        return rv;
    175200    }
     
    221246        String cname = _fname + ".family.i2p.net";
    222247
    223         boolean success = KeyStoreUtil.createKeys(ks, DEFAULT_KEYSTORE_PASSWORD, _fname, cname, "family",
     248        boolean success = KeyStoreUtil.createKeys(ks, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD, _fname, cname, "family",
    224249                                                  DEFAULT_KEY_VALID_DAYS, DEFAULT_KEY_ALGORITHM,
    225250                                                  DEFAULT_KEY_SIZE, keyPassword);
     
    228253            if (success) {
    229254                Map<String, String> changes = new HashMap<String, String>();
    230                 changes.put(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD);
     255                changes.put(PROP_KEYSTORE_PASSWORD, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD);
    231256                changes.put(PROP_KEY_PASSWORD, keyPassword);
    232257                changes.put(PROP_FAMILY_NAME, _fname);
     
    240265                           "and add the following entries to their router.config file:\n" +
    241266                           PROP_FAMILY_NAME + '=' + _fname + '\n' +
    242                            PROP_KEYSTORE_PASSWORD + '=' + DEFAULT_KEYSTORE_PASSWORD + '\n' +
     267                           PROP_KEYSTORE_PASSWORD + '=' + KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD + '\n' +
    243268                           PROP_KEY_PASSWORD + '=' + keyPassword);
    244269
     
    260285        File sdir = new SecureDirectory(_context.getConfigDir(), CERT_DIR);
    261286        if (sdir.exists() || sdir.mkdirs()) {
    262             String ksPass = _context.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD);
     287            String ksPass = _context.getProperty(PROP_KEYSTORE_PASSWORD, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD);
    263288            String name = _fname.replace("@", "_at_") + CERT_SUFFIX;
    264289            File out = new File(sdir, name);
     
    308333     */
    309334    private SigningPrivateKey getPrivKey(File ks) throws GeneralSecurityException {
    310         String ksPass = _context.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD);
     335        String ksPass = _context.getProperty(PROP_KEYSTORE_PASSWORD, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD);
    311336        String keyPass = _context.getProperty(PROP_KEY_PASSWORD);
    312337        if (keyPass == null)
  • router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java

    r393b5937 r2852383  
    4141import net.i2p.router.Router;
    4242import net.i2p.router.RouterContext;
     43import net.i2p.router.crypto.FamilyKeyCrypto;
    4344import net.i2p.router.networkdb.PublishLocalRouterInfoJob;
    4445import net.i2p.router.networkdb.reseed.ReseedChecker;
     
    894895                _log.warn("Bad network: " + routerInfo);
    895896            return "Not in our network";
     897        }
     898        FamilyKeyCrypto fkc = _context.router().getFamilyKeyCrypto();
     899        if (fkc != null) {
     900            boolean validFamily = fkc.verify(routerInfo);
     901            if (!validFamily) {
     902                if (_log.shouldWarn())
     903                    _log.warn("Bad family sig: " + routerInfo);
     904            }
     905            // todo store in RI
    896906        }
    897907        return validate(routerInfo);
Note: See TracChangeset for help on using the changeset viewer.