I2CP: Fix issues with persisted leaseset private keys

- Don't generate revocation key for LS2
- Fix generation of persistent revocation key for LS1
- Fix persistent private keys without persistent revocation key
- Don't put unconfigured private keys in leaseset
- Don't strip i2cp.leaseSetPrivateKey from config before it's used
This commit is contained in:
zzz
2020-06-06 14:36:01 +00:00
parent 326178ad47
commit cd77461fba
4 changed files with 171 additions and 108 deletions

View File

@ -841,18 +841,33 @@ public class TunnelConfig {
_context.random().nextBytes(rk);
config.setProperty(p, Base64.encode(rk));
}
// As of 0.9.18, add persistent leaseset keys if not present
// but only if we know the sigtype
p = OPT + "i2cp.leaseSetSigningPrivateKey";
if (_dest != null && !config.containsKey(p)) {
try {
SigType type = _dest.getSigType();
SimpleDataStructure keys[] = KeyGenerator.getInstance().generateSigningKeys(type);
config.setProperty(p, type.name() + ':' + keys[1].toBase64());
} catch (GeneralSecurityException gse) {
// so much for that
String senc = config.getProperty(OPT + "i2cp.leaseSetEncType", "0");
String slstyp = config.getProperty(OPT + "i2cp.leaseSetType", "0");
if (senc.equals("0") && slstyp.equals("0")) {
// only for LS1
p = OPT + "i2cp.leaseSetSigningPrivateKey";
if (!config.containsKey(p)) {
SigType type;
if (_dest != null) {
type = _dest.getSigType();
} else {
String ssigtyp = config.getProperty(OPT + "i2cp.destination.sigType", "0");
type = SigType.parseSigType(ssigtyp);
}
if (type != null) {
try {
SimpleDataStructure keys[] = KeyGenerator.getInstance().generateSigningKeys(type);
config.setProperty(p, type.name() + ':' + keys[1].toBase64());
} catch (GeneralSecurityException gse) {
// so much for that
}
}
}
}
// persistent LS encryption keys
// multiple types as of 0.9.46, add missing ones
p = OPT + "i2cp.leaseSetPrivateKey";
@ -860,7 +875,6 @@ public class TunnelConfig {
// normalize it first to make the code below easier
if (skeys != null && skeys.length() > 0 && !skeys.contains(":"))
config.setProperty(p, "ELGAMAL_2048:" + skeys);
String senc = config.getProperty(OPT + "i2cp.leaseSetEncType", "0");
String[] senca = DataHelper.split(senc, ",");
// for each configured enc type, generate a key if we don't have it
for (int i = 0; i < senca.length; i++) {