add caching of EdDSA keys

This commit is contained in:
zzz
2014-05-04 14:09:02 +00:00
parent 48b6e0693e
commit 284802bfa5

View File

@@ -51,8 +51,10 @@ import net.i2p.util.NativeBigInteger;
*/ */
public class SigUtil { public class SigUtil {
private static final Map<SigningPublicKey, ECPublicKey> _pubkeyCache = new LHMCache<SigningPublicKey, ECPublicKey>(64); private static final Map<SigningPublicKey, ECPublicKey> _ECPubkeyCache = new LHMCache<SigningPublicKey, ECPublicKey>(64);
private static final Map<SigningPrivateKey, ECPrivateKey> _privkeyCache = new LHMCache<SigningPrivateKey, ECPrivateKey>(16); private static final Map<SigningPrivateKey, ECPrivateKey> _ECPrivkeyCache = new LHMCache<SigningPrivateKey, ECPrivateKey>(16);
private static final Map<SigningPublicKey, EdDSAPublicKey> _EdPubkeyCache = new LHMCache<SigningPublicKey, EdDSAPublicKey>(64);
private static final Map<SigningPrivateKey, EdDSAPrivateKey> _EdPrivkeyCache = new LHMCache<SigningPrivateKey, EdDSAPrivateKey>(16);
private SigUtil() {} private SigUtil() {}
@@ -138,14 +140,14 @@ public class SigUtil {
public static ECPublicKey toJavaECKey(SigningPublicKey pk) public static ECPublicKey toJavaECKey(SigningPublicKey pk)
throws GeneralSecurityException { throws GeneralSecurityException {
ECPublicKey rv; ECPublicKey rv;
synchronized (_pubkeyCache) { synchronized (_ECPubkeyCache) {
rv = _pubkeyCache.get(pk); rv = _ECPubkeyCache.get(pk);
} }
if (rv != null) if (rv != null)
return rv; return rv;
rv = cvtToJavaECKey(pk); rv = cvtToJavaECKey(pk);
synchronized (_pubkeyCache) { synchronized (_ECPubkeyCache) {
_pubkeyCache.put(pk, rv); _ECPubkeyCache.put(pk, rv);
} }
return rv; return rv;
} }
@@ -156,14 +158,14 @@ public class SigUtil {
public static ECPrivateKey toJavaECKey(SigningPrivateKey pk) public static ECPrivateKey toJavaECKey(SigningPrivateKey pk)
throws GeneralSecurityException { throws GeneralSecurityException {
ECPrivateKey rv; ECPrivateKey rv;
synchronized (_privkeyCache) { synchronized (_ECPrivkeyCache) {
rv = _privkeyCache.get(pk); rv = _ECPrivkeyCache.get(pk);
} }
if (rv != null) if (rv != null)
return rv; return rv;
rv = cvtToJavaECKey(pk); rv = cvtToJavaECKey(pk);
synchronized (_privkeyCache) { synchronized (_ECPrivkeyCache) {
_privkeyCache.put(pk, rv); _ECPrivkeyCache.put(pk, rv);
} }
return rv; return rv;
} }
@@ -213,8 +215,17 @@ public class SigUtil {
*/ */
public static EdDSAPublicKey toJavaEdDSAKey(SigningPublicKey pk) public static EdDSAPublicKey toJavaEdDSAKey(SigningPublicKey pk)
throws GeneralSecurityException { throws GeneralSecurityException {
return new EdDSAPublicKey(new EdDSAPublicKeySpec( EdDSAPublicKey rv;
pk.getData(), (EdDSAParameterSpec) pk.getType().getParams())); 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) public static EdDSAPrivateKey toJavaEdDSAKey(SigningPrivateKey pk)
throws GeneralSecurityException { 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( return new EdDSAPrivateKey(new EdDSAPrivateKeySpec(
pk.getData(), (EdDSAParameterSpec) pk.getType().getParams())); pk.getData(), (EdDSAParameterSpec) pk.getType().getParams()));
} }
@@ -570,11 +602,17 @@ public class SigUtil {
} }
public static void clearCaches() { public static void clearCaches() {
synchronized(_pubkeyCache) { synchronized(_ECPubkeyCache) {
_pubkeyCache.clear(); _ECPubkeyCache.clear();
} }
synchronized(_privkeyCache) { synchronized(_ECPrivkeyCache) {
_privkeyCache.clear(); _ECPrivkeyCache.clear();
}
synchronized(_EdPubkeyCache) {
_EdPubkeyCache.clear();
}
synchronized(_EdPrivkeyCache) {
_EdPrivkeyCache.clear();
} }
} }
} }