DESKeyGenerator.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1package org.bouncycastle.crypto.generators;
2
3import org.bouncycastle.crypto.CipherKeyGenerator;
4import org.bouncycastle.crypto.KeyGenerationParameters;
5import org.bouncycastle.crypto.params.DESParameters;
6
7public class DESKeyGenerator
8    extends CipherKeyGenerator
9{
10    /**
11     * initialise the key generator - if strength is set to zero
12     * the key generated will be 64 bits in size, otherwise
13     * strength can be 64 or 56 bits (if you don't count the parity bits).
14     *
15     * @param param the parameters to be used for key generation
16     */
17    public void init(
18        KeyGenerationParameters param)
19    {
20        super.init(param);
21
22        if (strength == 0 || strength == (56 / 8))
23        {
24            strength = DESParameters.DES_KEY_LENGTH;
25        }
26        else if (strength != DESParameters.DES_KEY_LENGTH)
27        {
28            throw new IllegalArgumentException("DES key must be "
29                    + (DESParameters.DES_KEY_LENGTH * 8)
30                    + " bits long.");
31        }
32    }
33
34    public byte[] generateKey()
35    {
36        byte[]  newKey = new byte[DESParameters.DES_KEY_LENGTH];
37
38        do
39        {
40            random.nextBytes(newKey);
41
42            DESParameters.setOddParity(newKey);
43        }
44        while (DESParameters.isWeakKey(newKey, 0));
45
46        return newKey;
47    }
48}
49