1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.crypto.generators;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.KeyGenerationParameters;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.params.DESedeParameters;
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DESedeKeyGenerator
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    extends DESKeyGenerator
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * initialise the key generator - if strength is set to zero
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * the key generated will be 192 bits in size, otherwise
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * strength can be 128 or 192 (or 112 or 168 if you don't count
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * parity bits), depending on whether you wish to do 2-key or 3-key
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * triple DES.
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param param the parameters to be used for key generation
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public void init(
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        KeyGenerationParameters param)
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
21c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        this.random = param.getRandom();
22c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        this.strength = (param.getStrength() + 7) / 8;
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (strength == 0 || strength == (168 / 8))
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            strength = DESedeParameters.DES_EDE_KEY_LENGTH;
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else if (strength == (112 / 8))
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            strength = 2 * DESedeParameters.DES_KEY_LENGTH;
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else if (strength != DESedeParameters.DES_EDE_KEY_LENGTH
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                && strength != (2 * DESedeParameters.DES_KEY_LENGTH))
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IllegalArgumentException("DESede key must be "
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                + (DESedeParameters.DES_EDE_KEY_LENGTH * 8) + " or "
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                + (2 * 8 * DESedeParameters.DES_KEY_LENGTH)
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                + " bits long.");
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public byte[] generateKey()
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]  newKey = new byte[strength];
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        do
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            random.nextBytes(newKey);
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            DESedeParameters.setOddParity(newKey);
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        while (DESedeParameters.isWeakKey(newKey, 0, newKey.length));
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return newKey;
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
57