1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.crypto.params;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DESedeParameters
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    extends DESParameters
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /*
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * DES-EDE Key length in bytes.
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    static public final int DES_EDE_KEY_LENGTH = 24;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DESedeParameters(
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]  key)
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(key);
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
16c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        if (isWeakKey(key, 0, key.length))
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IllegalArgumentException("attempt to create weak DESede key");
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * return true if the passed in key is a DES-EDE weak key.
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param key bytes making up the key
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param offset offset into the byte array the key starts at
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param length number of bytes making up the key
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static boolean isWeakKey(
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]  key,
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int     offset,
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int     length)
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        for (int i = offset; i < length; i += DES_KEY_LENGTH)
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            if (DESParameters.isWeakKey(key, i))
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                return true;
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return false;
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * return true if the passed in key is a DES-EDE weak key.
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param key bytes making up the key
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param offset offset into the byte array the key starts at
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static boolean isWeakKey(
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]  key,
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int     offset)
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return isWeakKey(key, offset, key.length - offset);
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
58