1 package org.bouncycastle.crypto.params;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public class DESParameters
26 extends KeyParameter
27 {
28 public DESParameters(
29 byte[] key)
30 {
31 super(key);
32
33 if (isWeakKey(key, 0))
34 {
35 throw new IllegalArgumentException("attempt to create weak DES key");
36 }
37 }
38
39
40
41
42 static public final int DES_KEY_LENGTH = 8;
43
44
45
46
47 static private final int N_DES_WEAK_KEYS = 16;
48
49 static private byte[] DES_weak_keys =
50 {
51
52 (byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01, (byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,
53 (byte)0x1f,(byte)0x1f,(byte)0x1f,(byte)0x1f, (byte)0x0e,(byte)0x0e,(byte)0x0e,(byte)0x0e,
54 (byte)0xe0,(byte)0xe0,(byte)0xe0,(byte)0xe0, (byte)0xf1,(byte)0xf1,(byte)0xf1,(byte)0xf1,
55 (byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe, (byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,
56
57
58 (byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xfe, (byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xfe,
59 (byte)0x1f,(byte)0xe0,(byte)0x1f,(byte)0xe0, (byte)0x0e,(byte)0xf1,(byte)0x0e,(byte)0xf1,
60 (byte)0x01,(byte)0xe0,(byte)0x01,(byte)0xe0, (byte)0x01,(byte)0xf1,(byte)0x01,(byte)0xf1,
61 (byte)0x1f,(byte)0xfe,(byte)0x1f,(byte)0xfe, (byte)0x0e,(byte)0xfe,(byte)0x0e,(byte)0xfe,
62 (byte)0x01,(byte)0x1f,(byte)0x01,(byte)0x1f, (byte)0x01,(byte)0x0e,(byte)0x01,(byte)0x0e,
63 (byte)0xe0,(byte)0xfe,(byte)0xe0,(byte)0xfe, (byte)0xf1,(byte)0xfe,(byte)0xf1,(byte)0xfe,
64 (byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x01, (byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x01,
65 (byte)0xe0,(byte)0x1f,(byte)0xe0,(byte)0x1f, (byte)0xf1,(byte)0x0e,(byte)0xf1,(byte)0x0e,
66 (byte)0xe0,(byte)0x01,(byte)0xe0,(byte)0x01, (byte)0xf1,(byte)0x01,(byte)0xf1,(byte)0x01,
67 (byte)0xfe,(byte)0x1f,(byte)0xfe,(byte)0x1f, (byte)0xfe,(byte)0x0e,(byte)0xfe,(byte)0x0e,
68 (byte)0x1f,(byte)0x01,(byte)0x1f,(byte)0x01, (byte)0x0e,(byte)0x01,(byte)0x0e,(byte)0x01,
69 (byte)0xfe,(byte)0xe0,(byte)0xfe,(byte)0xe0, (byte)0xfe,(byte)0xf1,(byte)0xfe,(byte)0xf1
70 };
71
72
73
74
75
76
77
78
79
80
81
82
83 public static boolean isWeakKey(
84 byte[] key,
85 int offset)
86 {
87 if (key.length - offset < DES_KEY_LENGTH)
88 {
89 throw new IllegalArgumentException("key material too short.");
90 }
91
92 nextkey: for (int i = 0; i < N_DES_WEAK_KEYS; i++)
93 {
94 for (int j = 0; j < DES_KEY_LENGTH; j++)
95 {
96 if (key[j + offset] != DES_weak_keys[i * DES_KEY_LENGTH + j])
97 {
98 continue nextkey;
99 }
100 }
101
102 return true;
103 }
104 return false;
105 }
106
107
108
109
110
111
112
113 public static void setOddParity(
114 byte[] bytes)
115 {
116 for (int i = 0; i < bytes.length; i++)
117 {
118 int b = bytes[i];
119 bytes[i] = (byte)((b & 0xfe) |
120 ((((b >> 1) ^
121 (b >> 2) ^
122 (b >> 3) ^
123 (b >> 4) ^
124 (b >> 5) ^
125 (b >> 6) ^
126 (b >> 7)) ^ 0x01) & 0x01));
127 }
128 }
129 }