diff --git a/core/java/src/net/i2p/data/LeaseSet2.java b/core/java/src/net/i2p/data/LeaseSet2.java index 6daec7ff1..e62b2ebad 100644 --- a/core/java/src/net/i2p/data/LeaseSet2.java +++ b/core/java/src/net/i2p/data/LeaseSet2.java @@ -37,8 +37,6 @@ public class LeaseSet2 extends LeaseSet { protected Signature _offlineSignature; // may be null protected Properties _options; - // only used for unknown types; else use _encryptionKey.getType() - private int _encType; // only used if more than one key, otherwise null private List _encryptionKeys; @@ -236,18 +234,21 @@ public class LeaseSet2 extends LeaseSet { if (numKeys > 1) _encryptionKeys = new ArrayList(numKeys); for (int i = 0; i < numKeys; i++) { - _encType = (int) DataHelper.readLong(in, 2); + int encType = (int) DataHelper.readLong(in, 2); int encLen = (int) DataHelper.readLong(in, 2); // TODO - if (_encType == 0) { + if (encType == 0) { _encryptionKey = PublicKey.create(in); } else { - EncType type = EncType.getByCode(_encType); + EncType type = EncType.getByCode(encType); // type will be null if unknown byte[] encKey = new byte[encLen]; DataHelper.read(in, encKey); // this will throw IAE if type is non-null and length is wrong - _encryptionKey = new PublicKey(type, encKey); + if (type != null) + _encryptionKey = new PublicKey(type, encKey); + else + _encryptionKey = new PublicKey(encType, encKey); } if (numKeys > 1) _encryptionKeys.add(_encryptionKey); @@ -299,7 +300,7 @@ public class LeaseSet2 extends LeaseSet { if (type != null) { DataHelper.writeLong(out, 2, type.getCode()); } else { - DataHelper.writeLong(out, 2, _encType); + DataHelper.writeLong(out, 2, key.getUnknownTypeCode()); } DataHelper.writeLong(out, 2, key.length()); key.writeBytes(out); @@ -560,6 +561,14 @@ public class LeaseSet2 extends LeaseSet { net.i2p.crypto.KeyPair encKeys2 = net.i2p.crypto.KeyGenerator.getInstance().generatePKIKeys(net.i2p.crypto.EncType.ECIES_X25519); pubKey = encKeys2.getPublic(); ls2.addEncryptionKey(pubKey); + byte[] b = new byte[99]; + rand.nextBytes(b); + pubKey = new PublicKey(77, b); + ls2.addEncryptionKey(pubKey); + b = new byte[55]; + rand.nextBytes(b); + pubKey = new PublicKey(177, b); + ls2.addEncryptionKey(pubKey); SigningPrivateKey spk = pkf.getSigningPrivKey(); if (offline) { now += 365*24*60*60*1000L; diff --git a/core/java/src/net/i2p/data/PublicKey.java b/core/java/src/net/i2p/data/PublicKey.java index ea459c454..d6156d5a6 100644 --- a/core/java/src/net/i2p/data/PublicKey.java +++ b/core/java/src/net/i2p/data/PublicKey.java @@ -32,6 +32,7 @@ public class PublicKey extends SimpleDataStructure { private static final SDSCache _cache = new SDSCache(PublicKey.class, KEYSIZE_BYTES, CACHE_SIZE); private final EncType _type; + private final int _unknownTypeCode; /** * Pull from cache or return new. @@ -63,6 +64,7 @@ public class PublicKey extends SimpleDataStructure { public PublicKey(EncType type) { super(); _type = type; + _unknownTypeCode = (type != null) ? type.getCode() : -1; } /** @param data must be non-null */ @@ -82,7 +84,24 @@ public class PublicKey extends SimpleDataStructure { setData(data); } - /** constructs from base64 + /** + * Unknown type only. + * @param typeCode must not match a known type. 1-255 + * @param data must be non-null + * @since 0.9.38 + */ + public PublicKey(int typeCode, byte data[]) { + _type = null; + if (data == null) + throw new IllegalArgumentException("Data must be specified"); + _data = data; + if (typeCode <= 0 || typeCode > 255) + throw new IllegalArgumentException(); + _unknownTypeCode = typeCode; + } + + /** + * Constructs from base64. ElGamal only. * @param base64Data a string of base64 data (the output of .toBase64() called * on a prior instance of PublicKey */ @@ -107,6 +126,14 @@ public class PublicKey extends SimpleDataStructure { return _type; } + /** + * Only valid if getType() returns null + * @since 0.9.38 + */ + public int getUnknownTypeCode() { + return _unknownTypeCode; + } + /** * @since 0.9.17 */ @@ -120,7 +147,7 @@ public class PublicKey extends SimpleDataStructure { @Override public String toString() { StringBuilder buf = new StringBuilder(64); - buf.append("[PublicKey ").append((_type != null) ? _type.toString() : "unknown type").append(' '); + buf.append("[PublicKey ").append((_type != null) ? _type.toString() : "unknown type: " + _unknownTypeCode).append(' '); if (_data == null) { buf.append("null"); } else {