BaseKeyGenerator.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
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