1package org.bouncycastle.jcajce.provider.symmetric.util; 2 3import java.security.InvalidAlgorithmParameterException; 4import java.security.InvalidParameterException; 5import java.security.SecureRandom; 6import java.security.spec.AlgorithmParameterSpec; 7 8import javax.crypto.KeyGeneratorSpi; 9import javax.crypto.SecretKey; 10import javax.crypto.spec.SecretKeySpec; 11 12import org.bouncycastle.crypto.CipherKeyGenerator; 13import org.bouncycastle.crypto.KeyGenerationParameters; 14 15public class BaseKeyGenerator 16 extends KeyGeneratorSpi 17{ 18 protected String algName; 19 protected int keySize; 20 protected int defaultKeySize; 21 protected CipherKeyGenerator engine; 22 23 protected boolean uninitialised = true; 24 25 protected BaseKeyGenerator( 26 String algName, 27 int defaultKeySize, 28 CipherKeyGenerator engine) 29 { 30 this.algName = algName; 31 this.keySize = this.defaultKeySize = defaultKeySize; 32 this.engine = engine; 33 } 34 35 protected void engineInit( 36 AlgorithmParameterSpec params, 37 SecureRandom random) 38 throws InvalidAlgorithmParameterException 39 { 40 throw new InvalidAlgorithmParameterException("Not Implemented"); 41 } 42 43 protected void engineInit( 44 SecureRandom random) 45 { 46 if (random != null) 47 { 48 engine.init(new KeyGenerationParameters(random, defaultKeySize)); 49 uninitialised = false; 50 } 51 } 52 53 protected void engineInit( 54 int keySize, 55 SecureRandom random) 56 { 57 try 58 { 59 // BEGIN android-added 60 if (random == null) { 61 random = new SecureRandom(); 62 } 63 // END android-added 64 engine.init(new KeyGenerationParameters(random, keySize)); 65 uninitialised = false; 66 } 67 catch (IllegalArgumentException e) 68 { 69 throw new InvalidParameterException(e.getMessage()); 70 } 71 } 72 73 protected SecretKey engineGenerateKey() 74 { 75 if (uninitialised) 76 { 77 engine.init(new KeyGenerationParameters(new SecureRandom(), defaultKeySize)); 78 uninitialised = false; 79 } 80 81 return new SecretKeySpec(engine.generateKey(), algName); 82 } 83} 84