From 4eb93688309f8aea4a314c86f25a41073cd78ba6 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Wed, 30 Jan 2019 20:23:09 +0000
Subject: [PATCH] I2CP: Fixes for CreateLeaseset2 message with multiple keys

---
 .../net/i2p/client/impl/I2CPMessageProducer.java | 16 +++++++++++-----
 .../impl/RequestLeaseSetMessageHandler.java      |  2 +-
 .../i2p/data/i2cp/CreateLeaseSet2Message.java    |  9 ++++++---
 3 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
index 5692b6df2e..4448122d01 100644
--- a/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
+++ b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
@@ -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) {
diff --git a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
index 9755d7f314..f0b9d9e3bc 100644
--- a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
@@ -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);
diff --git a/core/java/src/net/i2p/data/i2cp/CreateLeaseSet2Message.java b/core/java/src/net/i2p/data/i2cp/CreateLeaseSet2Message.java
index ae1fb0be9c..0149b06bc1 100644
--- a/core/java/src/net/i2p/data/i2cp/CreateLeaseSet2Message.java
+++ b/core/java/src/net/i2p/data/i2cp/CreateLeaseSet2Message.java
@@ -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);
-- 
GitLab