5 /****************************************************************************/
12 moveml %d2-%d7/%a2-%fp, (%sp)
15 move.l (%a3),%d5 /* l = data[0] */
16 move.l 4(%a3),%d4 /* r = data[1] */
18 move.l %d4,%d0 /* tt = ((r>>4)^l)&0x0f0f0f0fL, */
23 eor.l %d0,%d5 /* l ^= tt, */
25 lsl.l #4,%d0 /* r ^= (tt<<4); */
29 move.l %d5,%d0 /* tt = ((l>>16)^r)&0x0000ffffL, */
35 eor.l %d0,%d4 /* r ^= tt, */
39 eor.l %d0,%d5 /* l ^= (tt<<16); */
42 move.l %d4,%d0 /* tt = ((r>>2)^l)&0x33333333L, */
47 eor.l %d0,%d5 /* l ^= tt, */
49 lsl.l #2,%d0 /* r ^= (tt<<2); */
53 move.l %d5,%d0 /* tt = ((l>>8)^r)&0x00ff00ff, */
58 eor.l %d0,%d4 /* r ^= tt, */
60 lsl.l #8,%d0 /* l ^= (tt<<8); */
64 move.l %d4,%d0 /* tt = ((r>>1)^l)&0x55555555, */
69 eor.l %d0,%d5 /* l ^= tt, */
71 add.l %d0,%d0 /* r ^= (tt<<1); */
74 /* ----------------------------------- */
75 /* ASSUME: r=data[0]=%d5, l=data[1]=%d4 */
78 move.l %d5,%d0 /* r=ROTATE(r,29)&0xffffffffL; */
83 move.l %d4,%d0 /* l=ROTATE(l,29)&0xffffffffL; */
88 lea des_SPtrans,%a3 /* Constants extracted from loop */
89 lea des_SPtrans+256,%a4
90 lea des_SPtrans+768,%a6
91 lea des_SPtrans+1280,%a5
92 move.l #252,%d1 /* mask constant */
95 move.l 60(%sp),%a0 /* load key pointer */
96 move.l #8,%a1 /* key incrementer */
99 move.l 64(%sp),%a0 /* load key pointer */
100 lea (120,%a0),%a0 /* start at end of key */
101 move.l #-8,%a1 /* key incrementer */
102 jbsr des_fastencrypt2
104 move.l 68(%sp),%a0 /* load key pointer */
105 move.l #8,%a1 /* key incrementer */
106 jbsr des_fastencrypt2
109 /* ASSUME: d5=data[0], d4=data[1] */
111 move.l %d5,%d0 /* data[0]=ROTATE(l,3)&0xffffffffL; */
116 move.l %d4,%d1 /* data[1]=ROTATE(r,3)&0xffffffffL; */
121 /* ----------------------------------- */
123 move.l %d4,%d0 /* tt =(((r>>1)^l)&0x55555555L), */
126 and.l #1431655765,%d0
128 eor.l %d0,%d5 /* l ^= tt, */
130 add.l %d0,%d0 /* r ^= (tt<<1); */
134 move.l %d5,%d0 /* tt =(((l>>8)^r)&0x00ff00ffL), */
139 eor.l %d0,%d4 /* r ^= tt, */
141 lsl.l #8,%d0 /* l ^= (tt<<8); */
145 move.l %d4,%d0 /* tt =(((r>>2)^l)&0x33333333L), */
150 eor.l %d0,%d5 /* l ^= tt, */
152 lsl.l #2,%d0 /* r ^= (tt<<2); */
156 move.l %d5,%d0 /* tt =(((l>>16)^r)&0x0000ffffL), */
162 eor.l %d0,%d4 /* r ^=tt, */
164 swap %d0 /* l ^= (tt<<16); */
168 move.l %d4,%d0 /* tt =(((r>>4)^l)&0x0f0f0f0fL), */
174 eor.l %d0,%d5 /* l ^= tt, */
177 lsl.l #4,%d0 /* r ^= (tt<<4); */
181 moveml (%sp), %d2-%d7/%a2-%fp
185 /****************************************************************************/
192 moveml %d2-%d7/%a2-%fp, (%sp)
195 move.l (%a3),%d5 /* l = data[0] */
196 move.l 4(%a3),%d4 /* r = data[1] */
198 move.l %d4,%d0 /* tt = ((r>>4)^l)&0x0f0f0f0fL, */
203 eor.l %d0,%d5 /* l ^= tt, */
205 lsl.l #4,%d0 /* r ^= (tt<<4); */
209 move.l %d5,%d0 /* tt = ((l>>16)^r)&0x0000ffffL, */
215 eor.l %d0,%d4 /* r ^= tt, */
219 eor.l %d0,%d5 /* l ^= (tt<<16); */
222 move.l %d4,%d0 /* tt = ((r>>2)^l)&0x33333333L, */
227 eor.l %d0,%d5 /* l ^= tt, */
229 lsl.l #2,%d0 /* r ^= (tt<<2); */
233 move.l %d5,%d0 /* tt = ((l>>8)^r)&0x00ff00ff, */
238 eor.l %d0,%d4 /* r ^= tt, */
240 lsl.l #8,%d0 /* l ^= (tt<<8); */
244 move.l %d4,%d0 /* tt = ((r>>1)^l)&0x55555555, */
247 and.l #1431655765,%d0
249 eor.l %d0,%d5 /* l ^= tt, */
251 add.l %d0,%d0 /* r ^= (tt<<1); */
254 /* ----------------------------------- */
255 /* ASSUME: r=data[0]=%d5, l=data[1]=%d4 */
258 move.l %d5,%d0 /* r=ROTATE(r,29)&0xffffffffL; */
263 move.l %d4,%d0 /* l=ROTATE(l,29)&0xffffffffL; */
268 lea des_SPtrans,%a3 /* Constants extracted from loop */
269 lea des_SPtrans+256,%a4
270 lea des_SPtrans+768,%a6
271 lea des_SPtrans+1280,%a5
272 move.l #252,%d1 /* mask constant */
275 move.l 68(%sp),%a0 /* load key pointer */
276 lea (120,%a0),%a0 /* start at end of key */
277 move.l #-8,%a1 /* key incrementer */
278 jbsr des_fastencrypt2
280 move.l 64(%sp),%a0 /* load key pointer */
281 move.l #8,%a1 /* key incrementer */
282 jbsr des_fastencrypt2
284 move.l 60(%sp),%a0 /* load key pointer */
285 lea (120,%a0),%a0 /* start at end of key */
286 move.l #-8,%a1 /* key incrementer */
287 jbsr des_fastencrypt2
290 /* ASSUME: d5=data[0], d4=data[1] */
292 move.l %d5,%d0 /* data[0]=ROTATE(l,3)&0xffffffffL; */
297 move.l %d4,%d1 /* data[1]=ROTATE(r,3)&0xffffffffL; */
302 /* ----------------------------------- */
304 move.l %d4,%d0 /* tt =(((r>>1)^l)&0x55555555L), */
307 and.l #1431655765,%d0
309 eor.l %d0,%d5 /* l ^= tt, */
311 add.l %d0,%d0 /* r ^= (tt<<1); */
315 move.l %d5,%d0 /* tt =(((l>>8)^r)&0x00ff00ffL), */
320 eor.l %d0,%d4 /* r ^= tt, */
322 lsl.l #8,%d0 /* l ^= (tt<<8); */
326 move.l %d4,%d0 /* tt =(((r>>2)^l)&0x33333333L), */
331 eor.l %d0,%d5 /* l ^= tt, */
333 lsl.l #2,%d0 /* r ^= (tt<<2); */
337 move.l %d5,%d0 /* tt =(((l>>16)^r)&0x0000ffffL), */
343 eor.l %d0,%d4 /* r ^=tt, */
345 swap %d0 /* l ^= (tt<<16); */
349 move.l %d4,%d0 /* tt =(((r>>4)^l)&0x0f0f0f0fL), */
355 eor.l %d0,%d5 /* l ^= tt, */
358 lsl.l #4,%d0 /* r ^= (tt<<4); */
362 moveml (%sp), %d2-%d7/%a2-%fp
366 /****************************************************************************/
369 .globl des_fastencrypt2
372 /* ASSUME: a0=key, a1=incrementer, d5=r=data[0], d4=l=data[1] */
374 move.l #7, %d6 /* for (i = 0; (i<32); i += 4) */
377 move.l (%a0),%d2 /* u = r ^ s[i+0]; */
380 move.l 4(%a0),%d3 /* t = r ^ s[i+0+1]; */
383 move.l %d3,%d0 /* t = ((t >> 4) + (t << (32-4)); */
390 move.l %d2,%d0 /* des_SPtrans[0][(u>>2L)&0x3f] */
392 move.l (%a3,%d0.l),%d0
395 move.l %d2,%d0 /* des_SPtrans[2][(u>>10L)&0x3f] */
398 lea des_SPtrans+512,%a2
399 move.l (%a2,%d0.l),%d0
402 clr.w %d2 /* des_SPtrans[4][(u>>18L)&0x3f] */
406 lea des_SPtrans+1024,%a2
407 move.l (%a2,%d0.l),%d0
410 moveq.l #10,%d7 /* des_SPtrans[6][(u>>26L)&0x3f] */
412 lea des_SPtrans+1536,%a2
413 move.l (%a2,%d2.l*4),%d2
416 move.l %d3,%d0 /* des_SPtrans[1][(t>>2L)&0x3f] */
418 move.l (%a4,%d0.l),%d0
421 move.l %d3,%d0 /* des_SPtrans[3][(t>>10L)&0x3f] */
424 move.l (%a6,%d0.l),%d0
427 clr.w %d3 /* des_SPtrans[5][(t>>18L)&0x3f] */
431 move.l (%a5,%d0.l),%d0
434 lsr.l %d7,%d3 /* des_SPtrans[7][(t>>26L)&0x3f] */
435 lea des_SPtrans+1792,%a2
436 move.l (%a2,%d3.l*4),%d3
441 add.l %a1,%a0 /* s += 2 */
443 move.l (%a0),%d2 /* u = l ^ s[i+0]; */
446 move.l 4(%a0),%d3 /* t = l ^ s[i+0+1]; */
449 move.l %d3,%d0 /* t = ((t >> 4) + (t << (32-4)); */
456 move.l %d2,%d0 /* des_SPtrans[0][(u>>2L)&0x3f] */
458 move.l (%a3,%d0.l),%d0
461 move.l %d2,%d0 /* des_SPtrans[2][(u>>10L)&0x3f] */
464 lea des_SPtrans+512,%a2
465 move.l (%a2,%d0.l),%d0
468 clr.w %d2 /* des_SPtrans[4][(u>>18L)&0x3f] */
472 lea des_SPtrans+1024,%a2
473 move.l (%a2,%d0.l),%d0
476 moveq.l #10,%d7 /* des_SPtrans[6][(u>>26L)&0x3f] */
478 lea des_SPtrans+1536,%a2
479 move.l (%a2,%d2.l*4),%d2
482 move.l %d3,%d0 /* des_SPtrans[1][(t>>2L)&0x3f] */
484 move.l (%a4,%d0.l),%d0
487 move.l %d3,%d0 /* des_SPtrans[3][(t>>10L)&0x3f] */
490 move.l (%a6,%d0.l),%d0
493 clr.w %d3 /* des_SPtrans[5][(t>>18L)&0x3f] */
497 move.l (%a5,%d0.l),%d0
500 lsr.l %d7,%d3 /* des_SPtrans[7][(t>>26L)&0x3f] */
501 lea des_SPtrans+1792,%a2
502 move.l (%a2,%d3.l*4),%d3
507 add.l %a1,%a0 /* s += 2 */
508 subq.l #1, %d6 /* i-- */
515 /* ASSUME: d5=r=data[0], d4=l=data[1] */
518 /****************************************************************************/