37 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
44 #if (DES_SUPPORT == ENABLED || DES3_SUPPORT == ENABLED)
47 #define ROL28(a, n) ((((a) << (n)) | ((a) >> (28 - (n)))) & 0x0FFFFFFF)
50 #define SWAPMOVE(a, b, n, m) \
52 t = ((a >> n) ^ b) & m; \
60 SWAPMOVE(l, r, 4, 0x0F0F0F0F); \
61 SWAPMOVE(l, r, 16, 0x0000FFFF); \
62 SWAPMOVE(r, l, 2, 0x33333333); \
63 SWAPMOVE(r, l, 8, 0x00FF00FF); \
64 SWAPMOVE(l, r, 1, 0x55555555); \
70 #define IP_INV(l, r) \
74 SWAPMOVE(l, r, 1, 0x55555555); \
75 SWAPMOVE(r, l, 8, 0x00FF00FF); \
76 SWAPMOVE(r, l, 2, 0x33333333); \
77 SWAPMOVE(l, r, 16, 0x0000FFFF); \
78 SWAPMOVE(l, r, 4, 0x0F0F0F0F); \
84 SWAPMOVE(c, d, 4, 0x0F0F0F0F); \
85 SWAPMOVE(c, d, 16, 0x0000FFFF); \
86 SWAPMOVE(d, c, 2, 0x33333333); \
87 SWAPMOVE(d, c, 8, 0x00FF00FF); \
88 SWAPMOVE(c, d, 1, 0x55555555); \
89 SWAPMOVE(d, c, 8, 0x00FF00FF); \
90 SWAPMOVE(c, d, 16, 0x0000FFFF); \
91 t = (c << 4) & 0x0FFFFFF0; \
92 t |= (d >> 24) & 0x0000000F; \
93 c = (d << 20) & 0x0FF00000; \
94 c |= (d << 4) & 0x000FF000; \
95 c |= (d >> 12) & 0x00000FF0; \
96 c |= (d >> 28) & 0x0000000F; \
101 #define PC2_L(c, d) \
102 (((c << 4) & 0x24000000) | \
103 ((c << 28) & 0x10000000) | \
104 ((c << 14) & 0x08000000) | \
105 ((c << 18) & 0x02080000) | \
106 ((c << 6) & 0x01000000) | \
107 ((c << 9) & 0x00200000) | \
108 ((c >> 1) & 0x00100000) | \
109 ((c << 10) & 0x00040000) | \
110 ((c << 2) & 0x00020000) | \
111 ((c >> 10) & 0x00010000) | \
112 ((d >> 13) & 0x00002000) | \
113 ((d >> 4) & 0x00001000) | \
114 ((d << 6) & 0x00000800) | \
115 ((d >> 1) & 0x00000400) | \
116 ((d >> 14) & 0x00000200) | \
117 ((d >> 0) & 0x00000100) | \
118 ((d >> 5) & 0x00000020) | \
119 ((d >> 10) & 0x00000010) | \
120 ((d >> 3) & 0x00000008) | \
121 ((d >> 18) & 0x00000004) | \
122 ((d >> 26) & 0x00000002) | \
123 ((d >> 24) & 0x00000001))
126 #define PC2_R(c, d) \
127 (((c << 15) & 0x20000000) | \
128 ((c << 17) & 0x10000000) | \
129 ((c << 10) & 0x08000000) | \
130 ((c << 22) & 0x04000000) | \
131 ((c >> 2) & 0x02000000) | \
132 ((c << 1) & 0x01000000) | \
133 ((c << 16) & 0x00200000) | \
134 ((c << 11) & 0x00100000) | \
135 ((c << 3) & 0x00080000) | \
136 ((c >> 6) & 0x00040000) | \
137 ((c << 15) & 0x00020000) | \
138 ((c >> 4) & 0x00010000) | \
139 ((d >> 2) & 0x00002000) | \
140 ((d << 8) & 0x00001000) | \
141 ((d >> 14) & 0x00000808) | \
142 ((d >> 9) & 0x00000400) | \
143 ((d >> 0) & 0x00000200) | \
144 ((d << 7) & 0x00000100) | \
145 ((d >> 7) & 0x00000020) | \
146 ((d >> 3) & 0x00000011) | \
147 ((d << 2) & 0x00000004) | \
148 ((d >> 21) & 0x00000002))
151 #define ROUND(l, r, k1, k2) \
154 l ^= sp2[(t >> 24) & 0x3F]; \
155 l ^= sp4[(t >> 16) & 0x3F]; \
156 l ^= sp6[(t >> 8) & 0x3F]; \
157 l ^= sp8[t & 0x3F]; \
158 t = ROR32(r, 4) ^ k2; \
159 l ^= sp1[(t >> 24) & 0x3F]; \
160 l ^= sp3[(t >> 16) & 0x3F]; \
161 l ^= sp5[(t >> 8) & 0x3F]; \
162 l ^= sp7[t & 0x3F]; \
166 static const uint32_t sp1[64] =
168 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000,
169 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004,
170 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
171 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000,
172 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400,
173 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
174 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400,
175 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004
179 static const uint32_t sp2[64] =
181 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020,
182 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020,
183 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
184 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020,
185 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000,
186 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
187 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020,
188 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000
192 static const uint32_t sp3[64] =
194 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200,
195 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208,
196 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
197 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000,
198 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000,
199 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
200 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008,
201 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200
205 static const uint32_t sp4[64] =
207 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001,
208 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001,
209 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
210 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081,
211 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000,
212 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
213 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081,
214 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080
218 static const uint32_t sp5[64] =
220 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000,
221 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000,
222 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
223 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100,
224 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100,
225 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
226 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000,
227 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100
231 static const uint32_t sp6[64] =
233 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000,
234 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010,
235 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
236 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000,
237 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010,
238 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
239 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010,
240 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010
244 static const uint32_t sp7[64] =
246 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800,
247 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802,
248 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
249 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800,
250 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002,
251 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
252 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802,
253 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002
257 static const uint32_t sp8[64] =
259 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000,
260 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040,
261 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
262 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000,
263 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040,
264 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
265 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000,
266 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000
305 if(context == NULL || key == NULL)
320 for(i = 0; i < 16; i++)
323 if(i == 0 || i == 1 || i == 8 || i == 15)
336 context->
ks[2 * i + 1] =
PC2_R(
c, d);
367 for(i = 0; i < 32; i += 4)
372 ROUND(
r,
l, context->
ks[i + 2], context->
ks[i + 3]);
407 for(i = 32; i > 0; i -= 4)
410 ROUND(
r,
l, context->
ks[i - 2], context->
ks[i - 1]);
412 ROUND(
l,
r, context->
ks[i - 4], context->
ks[i - 3]);