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