diff --git a/core/java/src/net/i2p/crypto/SKMType.java b/core/java/src/net/i2p/crypto/SKMType.java new file mode 100644 index 000000000..e4787da41 --- /dev/null +++ b/core/java/src/net/i2p/crypto/SKMType.java @@ -0,0 +1,31 @@ +package net.i2p.crypto; + +/** + * Enums for the various SessionKeyManagers, returned by getSKMType(), + * to avoid instanceof() + * + * @since 0.9.71 + */ +public enum SKMType { + + /** + * SessionKeyManager, app context + */ + DUMMY, + /** + * TransientSessionKeyManager + */ + ELGAMAL, + /** + * Single type, RATCHET or PQ-RATCHET + */ + RATCHET, + /** + * ELGAMAL and RATCHET + */ + MUXED, + /** + * RATCHET and PQ-RATCHET + */ + MUXEDPQ +} diff --git a/core/java/src/net/i2p/crypto/SessionKeyManager.java b/core/java/src/net/i2p/crypto/SessionKeyManager.java index c8da3537a..5d8a9c562 100644 --- a/core/java/src/net/i2p/crypto/SessionKeyManager.java +++ b/core/java/src/net/i2p/crypto/SessionKeyManager.java @@ -27,13 +27,17 @@ import net.i2p.data.SessionTag; */ public class SessionKeyManager { + private final SKMType _type; + /** * A dummy SessionKeyManager for testing or for passing to * ElGamalAESEngine.decrypt() * * @since 0.9.14 */ - public SessionKeyManager() {} + public SessionKeyManager() { + this(SKMType.DUMMY); + } /** * A dummy SessionKeyManager for testing or for passing to @@ -42,8 +46,36 @@ public class SessionKeyManager { * @param context unused * @since public since 0.9.14; protected before that */ - public SessionKeyManager(I2PAppContext context) {} - + public SessionKeyManager(I2PAppContext context) { + this(context, SKMType.DUMMY); + } + + /** + * For subclasses + * + * @since 0.9.71 + */ + protected SessionKeyManager(SKMType type) { + _type = type; + } + + /** + * For subclasses + * + * @param context unused + * @since 0.9.71 + */ + protected SessionKeyManager(I2PAppContext context, SKMType type) { + _type = type; + } + + /** + * @since 0.9.71 + */ + public SKMType getSKMType() { + return _type; + } + /** * Retrieve the session key currently associated with encryption to the target, * or null if a new session key should be generated. diff --git a/router/java/src/net/i2p/router/crypto/TransientSessionKeyManager.java b/router/java/src/net/i2p/router/crypto/TransientSessionKeyManager.java index 7e24febad..0d6819d32 100644 --- a/router/java/src/net/i2p/router/crypto/TransientSessionKeyManager.java +++ b/router/java/src/net/i2p/router/crypto/TransientSessionKeyManager.java @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger; import net.i2p.I2PAppContext; import net.i2p.crypto.EncType; import net.i2p.crypto.SessionKeyManager; +import net.i2p.crypto.SKMType; import net.i2p.crypto.TagSetHandle; import net.i2p.data.DataHelper; import net.i2p.data.PublicKey; @@ -173,7 +174,7 @@ public class TransientSessionKeyManager extends SessionKeyManager { * @since 0.9.2 */ public TransientSessionKeyManager(I2PAppContext context, int tagsToSend, int lowThreshold) { - super(context); + super(context, SKMType.ELGAMAL); if (tagsToSend <= 0 || tagsToSend > 128 || lowThreshold <= 0 || lowThreshold > 128) throw new IllegalArgumentException(); _tagsToSend = tagsToSend; diff --git a/router/java/src/net/i2p/router/crypto/ratchet/MuxedPQSKM.java b/router/java/src/net/i2p/router/crypto/ratchet/MuxedPQSKM.java index dfb4ee7d7..2fe119c2f 100644 --- a/router/java/src/net/i2p/router/crypto/ratchet/MuxedPQSKM.java +++ b/router/java/src/net/i2p/router/crypto/ratchet/MuxedPQSKM.java @@ -9,6 +9,7 @@ import net.i2p.I2PAppContext; import net.i2p.crypto.EncType; import net.i2p.crypto.TagSetHandle; import net.i2p.crypto.SessionKeyManager; +import net.i2p.crypto.SKMType; import net.i2p.data.PublicKey; import net.i2p.data.SessionKey; import net.i2p.data.SessionTag; @@ -29,6 +30,7 @@ public class MuxedPQSKM extends SessionKeyManager { private static final int RESTART_COUNTERS = 500; public MuxedPQSKM(RatchetSKM ec, RatchetSKM pq) { + super(SKMType.MUXEDPQ); _ec = ec; _pq = pq; } diff --git a/router/java/src/net/i2p/router/crypto/ratchet/MuxedSKM.java b/router/java/src/net/i2p/router/crypto/ratchet/MuxedSKM.java index 26277b58c..392bebfb6 100644 --- a/router/java/src/net/i2p/router/crypto/ratchet/MuxedSKM.java +++ b/router/java/src/net/i2p/router/crypto/ratchet/MuxedSKM.java @@ -9,6 +9,7 @@ import net.i2p.I2PAppContext; import net.i2p.crypto.EncType; import net.i2p.crypto.TagSetHandle; import net.i2p.crypto.SessionKeyManager; +import net.i2p.crypto.SKMType; import net.i2p.data.PublicKey; import net.i2p.data.SessionKey; import net.i2p.data.SessionTag; @@ -30,6 +31,7 @@ public class MuxedSKM extends SessionKeyManager { private static final int RESTART_COUNTERS = 500; public MuxedSKM(TransientSessionKeyManager elg, RatchetSKM ec) { + super(SKMType.MUXED); _elg = elg; _ec = ec; } diff --git a/router/java/src/net/i2p/router/crypto/ratchet/RatchetSKM.java b/router/java/src/net/i2p/router/crypto/ratchet/RatchetSKM.java index 04188714e..5b62ebc67 100644 --- a/router/java/src/net/i2p/router/crypto/ratchet/RatchetSKM.java +++ b/router/java/src/net/i2p/router/crypto/ratchet/RatchetSKM.java @@ -24,6 +24,7 @@ import net.i2p.crypto.EncType; import net.i2p.crypto.HKDF; import net.i2p.crypto.KeyPair; import net.i2p.crypto.SessionKeyManager; +import net.i2p.crypto.SKMType; import net.i2p.crypto.TagSetHandle; import net.i2p.data.Base64; import net.i2p.data.DataHelper; @@ -107,7 +108,7 @@ public class RatchetSKM extends SessionKeyManager implements SessionTagListener * @since 0.9.67 */ public RatchetSKM(RouterContext context, Destination dest, EncType type) { - super(context); + super(context, SKMType.RATCHET); _log = context.logManager().getLog(RatchetSKM.class); _context = context; _destination = dest;