package net.i2p.crypto.elgamal; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyFactorySpi; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.spec.DHParameterSpec; import static net.i2p.crypto.CryptoConstants.I2P_ELGAMAL_2048_SPEC; import net.i2p.crypto.elgamal.impl.ElGamalPrivateKeyImpl; import net.i2p.crypto.elgamal.impl.ElGamalPrivateKeyImpl; import net.i2p.crypto.elgamal.impl.ElGamalPublicKeyImpl; import net.i2p.crypto.elgamal.spec.ElGamalParameterSpec; import net.i2p.crypto.elgamal.spec.ElGamalPrivateKeySpec; import net.i2p.crypto.elgamal.spec.ElGamalPublicKeySpec; /** * Modified from eddsa * * @since 0.9.25 */ public final class KeyFactory extends KeyFactorySpi { /** * Supports PKCS8EncodedKeySpec */ protected PrivateKey engineGeneratePrivate(KeySpec keySpec) throws InvalidKeySpecException { if (keySpec instanceof ElGamalPrivateKeySpec) { return new ElGamalPrivateKeyImpl((ElGamalPrivateKeySpec) keySpec); } if (keySpec instanceof PKCS8EncodedKeySpec) { return new ElGamalPrivateKeyImpl((PKCS8EncodedKeySpec) keySpec); } throw new InvalidKeySpecException("key spec not recognised"); } /** * Supports X509EncodedKeySpec */ protected PublicKey engineGeneratePublic(KeySpec keySpec) throws InvalidKeySpecException { if (keySpec instanceof ElGamalPublicKeySpec) { return new ElGamalPublicKeyImpl((ElGamalPublicKeySpec) keySpec); } if (keySpec instanceof X509EncodedKeySpec) { return new ElGamalPublicKeyImpl((X509EncodedKeySpec) keySpec); } throw new InvalidKeySpecException("key spec not recognised"); } @SuppressWarnings("unchecked") protected <T extends KeySpec> T engineGetKeySpec(Key key, Class<T> keySpec) throws InvalidKeySpecException { if (keySpec.isAssignableFrom(ElGamalPublicKeySpec.class) && key instanceof ElGamalPublicKey) { ElGamalPublicKey k = (ElGamalPublicKey) key; ElGamalParameterSpec egp = k.getParameters(); if (egp != null) { return (T) new ElGamalPrivateKeySpec(k.getY(), egp); } } else if (keySpec.isAssignableFrom(ElGamalPrivateKeySpec.class) && key instanceof ElGamalPrivateKey) { ElGamalPrivateKey k = (ElGamalPrivateKey) key; ElGamalParameterSpec egp = k.getParameters(); if (egp != null) { return (T) new ElGamalPrivateKeySpec(k.getX(), egp); } } throw new InvalidKeySpecException("not implemented yet " + key + " " + keySpec); } protected Key engineTranslateKey(Key key) throws InvalidKeyException { throw new InvalidKeyException("No other ElGamal key providers known"); } }