From 284802bfa5901a6e5d84e674acc10e0be4e4bbf4 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 4 May 2014 14:09:02 +0000 Subject: [PATCH] add caching of EdDSA keys --- core/java/src/net/i2p/crypto/SigUtil.java | 70 +++++++++++++++++------ 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/core/java/src/net/i2p/crypto/SigUtil.java b/core/java/src/net/i2p/crypto/SigUtil.java index 443c6b0fa..3d423c662 100644 --- a/core/java/src/net/i2p/crypto/SigUtil.java +++ b/core/java/src/net/i2p/crypto/SigUtil.java @@ -51,8 +51,10 @@ import net.i2p.util.NativeBigInteger; */ public class SigUtil { - private static final Map _pubkeyCache = new LHMCache(64); - private static final Map _privkeyCache = new LHMCache(16); + private static final Map _ECPubkeyCache = new LHMCache(64); + private static final Map _ECPrivkeyCache = new LHMCache(16); + private static final Map _EdPubkeyCache = new LHMCache(64); + private static final Map _EdPrivkeyCache = new LHMCache(16); private SigUtil() {} @@ -138,14 +140,14 @@ public class SigUtil { public static ECPublicKey toJavaECKey(SigningPublicKey pk) throws GeneralSecurityException { ECPublicKey rv; - synchronized (_pubkeyCache) { - rv = _pubkeyCache.get(pk); + synchronized (_ECPubkeyCache) { + rv = _ECPubkeyCache.get(pk); } if (rv != null) return rv; rv = cvtToJavaECKey(pk); - synchronized (_pubkeyCache) { - _pubkeyCache.put(pk, rv); + synchronized (_ECPubkeyCache) { + _ECPubkeyCache.put(pk, rv); } return rv; } @@ -156,14 +158,14 @@ public class SigUtil { public static ECPrivateKey toJavaECKey(SigningPrivateKey pk) throws GeneralSecurityException { ECPrivateKey rv; - synchronized (_privkeyCache) { - rv = _privkeyCache.get(pk); + synchronized (_ECPrivkeyCache) { + rv = _ECPrivkeyCache.get(pk); } if (rv != null) return rv; rv = cvtToJavaECKey(pk); - synchronized (_privkeyCache) { - _privkeyCache.put(pk, rv); + synchronized (_ECPrivkeyCache) { + _ECPrivkeyCache.put(pk, rv); } return rv; } @@ -213,8 +215,17 @@ public class SigUtil { */ public static EdDSAPublicKey toJavaEdDSAKey(SigningPublicKey pk) throws GeneralSecurityException { - return new EdDSAPublicKey(new EdDSAPublicKeySpec( - pk.getData(), (EdDSAParameterSpec) pk.getType().getParams())); + EdDSAPublicKey rv; + synchronized (_EdPubkeyCache) { + rv = _EdPubkeyCache.get(pk); + } + if (rv != null) + return rv; + rv = cvtToJavaEdDSAKey(pk); + synchronized (_EdPubkeyCache) { + _EdPubkeyCache.put(pk, rv); + } + return rv; } /** @@ -222,6 +233,27 @@ public class SigUtil { */ public static EdDSAPrivateKey toJavaEdDSAKey(SigningPrivateKey pk) throws GeneralSecurityException { + EdDSAPrivateKey rv; + synchronized (_EdPrivkeyCache) { + rv = _EdPrivkeyCache.get(pk); + } + if (rv != null) + return rv; + rv = cvtToJavaEdDSAKey(pk); + synchronized (_EdPrivkeyCache) { + _EdPrivkeyCache.put(pk, rv); + } + return rv; + } + + private static EdDSAPublicKey cvtToJavaEdDSAKey(SigningPublicKey pk) + throws GeneralSecurityException { + return new EdDSAPublicKey(new EdDSAPublicKeySpec( + pk.getData(), (EdDSAParameterSpec) pk.getType().getParams())); + } + + private static EdDSAPrivateKey cvtToJavaEdDSAKey(SigningPrivateKey pk) + throws GeneralSecurityException { return new EdDSAPrivateKey(new EdDSAPrivateKeySpec( pk.getData(), (EdDSAParameterSpec) pk.getType().getParams())); } @@ -570,11 +602,17 @@ public class SigUtil { } public static void clearCaches() { - synchronized(_pubkeyCache) { - _pubkeyCache.clear(); + synchronized(_ECPubkeyCache) { + _ECPubkeyCache.clear(); } - synchronized(_privkeyCache) { - _privkeyCache.clear(); + synchronized(_ECPrivkeyCache) { + _ECPrivkeyCache.clear(); + } + synchronized(_EdPubkeyCache) { + _EdPubkeyCache.clear(); + } + synchronized(_EdPrivkeyCache) { + _EdPrivkeyCache.clear(); } } }