I2CP: Fixes for CreateLeaseset2 message with multiple keys

This commit is contained in:
zzz
2019-01-30 20:23:09 +00:00
parent c555bb6c93
commit 4eb9368830
3 changed files with 18 additions and 9 deletions

View File

@@ -9,6 +9,7 @@ package net.i2p.client.impl;
*
*/
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@@ -363,15 +364,20 @@ class I2CPMessageProducer {
*
*/
public void createLeaseSet(I2PSessionImpl session, LeaseSet leaseSet, SigningPrivateKey signingPriv,
PrivateKey priv) throws I2PSessionException {
List<PrivateKey> privs) throws I2PSessionException {
CreateLeaseSetMessage msg;
int type = leaseSet.getType();
if (type == DatabaseEntry.KEY_TYPE_LEASESET)
if (type == DatabaseEntry.KEY_TYPE_LEASESET) {
msg = new CreateLeaseSetMessage();
else
msg = new CreateLeaseSet2Message();
msg.setPrivateKey(privs.get(0));
} else {
CreateLeaseSet2Message msg2 = new CreateLeaseSet2Message();
for (PrivateKey priv : privs) {
msg2.addPrivateKey(priv);
}
msg = msg2;
}
msg.setLeaseSet(leaseSet);
msg.setPrivateKey(priv);
msg.setSigningPrivateKey(signingPriv);
SessionId sid = session.getSessionId();
if (sid == null) {

View File

@@ -315,7 +315,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl {
_context.random().nextBytes(dummy);
spk = new SigningPrivateKey(dummy);
}
session.getProducer().createLeaseSet(session, leaseSet, spk, li.getPrivateKey());
session.getProducer().createLeaseSet(session, leaseSet, spk, li.getPrivateKeys());
session.setLeaseSet(leaseSet);
if (_log.shouldDebug())
_log.debug("Created and signed LeaseSet: " + leaseSet);

View File

@@ -138,8 +138,9 @@ public class CreateLeaseSet2Message extends CreateLeaseSetMessage {
@Override
protected byte[] doWriteMessage() throws I2CPMessageException, IOException {
int type = _leaseSet.getType();
if (_sessionId == null || _leaseSet == null ||
(_leaseSet.getType() != DatabaseEntry.KEY_TYPE_META_LS2 && (_signingPrivateKey == null || _privateKey == null)))
(type != DatabaseEntry.KEY_TYPE_META_LS2 && (_signingPrivateKey == null || _privateKey == null)))
throw new I2CPMessageException("Unable to write out the message as there is not enough data");
int size = 4 // sessionId
+ 1 // type
@@ -151,9 +152,11 @@ public class CreateLeaseSet2Message extends CreateLeaseSetMessage {
_sessionId.writeBytes(os);
os.write(_leaseSet.getType());
_leaseSet.writeBytes(os);
if (_leaseSet.getType() != DatabaseEntry.KEY_TYPE_META_LS2) {
if (type != DatabaseEntry.KEY_TYPE_META_LS2) {
_signingPrivateKey.writeBytes(os);
_privateKey.writeBytes(os);
for (PrivateKey pk : getPrivateKeys()) {
pk.writeBytes(os);
}
}
} catch (DataFormatException dfe) {
throw new I2CPMessageException("Error writing out the message data", dfe);