/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.generator; import java.security.InvalidAlgorithmParameterException; import java.security.KeyPair; import java.security.SecureRandom; import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec; /** * Static factory that generates various types of asymmetric key pairs. * * @author Middleware Services */ public final class KeyPairGenerator { /** Private constructor of static factory. */ private KeyPairGenerator() {} /** * Generates a DSA key pair. * * @param random Random source required for key generation. * @param bitLength Desired key size in bits. * * @return DSA key pair of desired size. */ public static KeyPair generateDSA(final SecureRandom random, final int bitLength) { final org.bouncycastle.jcajce.provider.asymmetric.dsa.KeyPairGeneratorSpi generator = new org.bouncycastle.jcajce.provider.asymmetric.dsa.KeyPairGeneratorSpi(); generator.initialize(bitLength, random); return generator.generateKeyPair(); } /** * Generates a RSA key pair. * * @param random Random source required for key generation. * @param bitLength Desired key size in bits. * * @return RSA key pair of desired size. */ public static KeyPair generateRSA(final SecureRandom random, final int bitLength) { final org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyPairGeneratorSpi generator = new org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyPairGeneratorSpi(); generator.initialize(bitLength, random); return generator.generateKeyPair(); } /** * Generates a EC key pair. * * @param random Random source required for key generation. * @param bitLength Desired key size in bits. * * @return EC key pair of desired size. */ public static KeyPair generateEC(final SecureRandom random, final int bitLength) { final org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi.EC generator = new org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi.EC(); generator.initialize(bitLength, random); return generator.generateKeyPair(); } /** * Generates a EC key pair. * * @param random Random source required for key generation. * @param namedCurve Well-known elliptic curve name that includes domain parameters including key size. * * @return EC key pair according to named curve. */ public static KeyPair generateEC(final SecureRandom random, final String namedCurve) { final org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi.EC generator = new org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi.EC(); try { generator.initialize(new ECNamedCurveGenParameterSpec(namedCurve), random); } catch (InvalidAlgorithmParameterException e) { throw new IllegalArgumentException("Invalid EC curve " + namedCurve, e); } return generator.generateKeyPair(); } }