From b19b529afe7bb382be72423654f53ae1f7d53a0d Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sun, 29 Mar 2020 17:53:28 +0000
Subject: [PATCH] Ratchet: Expire tags too far behind current one

---
 .../router/crypto/ratchet/RatchetTagSet.java  | 23 ++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/router/java/src/net/i2p/router/crypto/ratchet/RatchetTagSet.java b/router/java/src/net/i2p/router/crypto/ratchet/RatchetTagSet.java
index 5a5c24e1b4..e3be95308f 100644
--- a/router/java/src/net/i2p/router/crypto/ratchet/RatchetTagSet.java
+++ b/router/java/src/net/i2p/router/crypto/ratchet/RatchetTagSet.java
@@ -368,6 +368,23 @@ class RatchetTagSet implements TagSetHandle {
             }
         }
 
+        // trim any too far behind
+        {
+            int tooOld = usedTagNumber - _maxSize;
+            int toTrim = 0;
+            int tagnum;
+            while ((tagnum = _sessionTags.keyAt(toTrim)) < tooOld) {
+                int kidx = _sessionKeys.indexOfKey(tagnum);
+                if (kidx >= 0)
+                    _sessionKeys.removeAt(kidx);
+                if (_lsnr != null)
+                    _lsnr.expireTag(_sessionTags.valueAt(toTrim), this);
+                toTrim++;
+            }
+            if (toTrim > 0)
+                _sessionTags.removeAtRange(0, toTrim);
+        }
+
         // trim if too big
         int toTrim = _sessionTags.size() - _maxSize;
         if (toTrim > 0) {
@@ -394,7 +411,7 @@ class RatchetTagSet implements TagSetHandle {
     }
 
     /**
-     *  For outbound only.
+     *  Public for outbound only. Used internally for inbound.
      *  Call before consumeNextKey();
      *
      *  @return a tag or null if we ran out
@@ -504,7 +521,7 @@ class RatchetTagSet implements TagSetHandle {
         System.out.println("Size now: " + rts.size());
         System.out.println("");
         System.out.println("Receive test in-order");
-        rts = new RatchetTagSet(hkdf, null, k1, k2, 0, 0, 10, 50);
+        rts = new RatchetTagSet(hkdf, null, (PublicKey) null, k1, k2, 0, 0, 10, 50);
         System.out.println("Size now: " + rts.size());
         List<RatchetSessionTag> tags = rts.getTags();
         int j = 0;
@@ -527,7 +544,7 @@ class RatchetTagSet implements TagSetHandle {
         System.out.println("Size now: " + rts.size());
         System.out.println("");
         System.out.println("Receive test out of order");
-        rts = new RatchetTagSet(hkdf, null, k1, k2, 0, 0, 10, 50);
+        rts = new RatchetTagSet(hkdf, null, (PublicKey) null, k1, k2, 0, 0, 10, 50);
         System.out.println("Size now: " + rts.size());
         tags = rts.getTags();
         List<RatchetSessionTag> origtags = new ArrayList<RatchetSessionTag>(tags);
-- 
GitLab