forked from I2P_Developers/i2p.i2p
Data: Fix LS2 support for unknown enc. types (proposal 123)
This commit is contained in:
@ -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<PublicKey> _encryptionKeys;
|
||||
|
||||
@ -236,18 +234,21 @@ public class LeaseSet2 extends LeaseSet {
|
||||
if (numKeys > 1)
|
||||
_encryptionKeys = new ArrayList<PublicKey>(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
|
||||
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;
|
||||
|
@ -32,6 +32,7 @@ public class PublicKey extends SimpleDataStructure {
|
||||
private static final SDSCache<PublicKey> _cache = new SDSCache<PublicKey>(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 {
|
||||
|
Reference in New Issue
Block a user