Merge branch 'master' of ssh://git.samba.org/data/git/samba into selftest
[sfrench/samba-autobuild/.git] / lib / replace / crypt.c
1 /*
2    This bit of code was derived from the UFC-crypt package which
3    carries the following copyright 
4    
5    Modified for use by Samba by Andrew Tridgell, October 1994
6
7    Note that this routine is only faster on some machines. Under Linux 1.1.51 
8    libc 4.5.26 I actually found this routine to be slightly slower.
9
10    Under SunOS I found a huge speedup by using these routines 
11    (a factor of 20 or so)
12
13    Warning: I've had a report from Steve Kennedy <steve@gbnet.org>
14    that this crypt routine may sometimes get the wrong answer. Only
15    use UFC_CRYT if you really need it.
16
17 */
18
19 #include "replace.h"
20
21 #ifndef HAVE_CRYPT
22
23 /*
24  * UFC-crypt: ultra fast crypt(3) implementation
25  *
26  * Copyright (C) 1991-1998, Free Software Foundation, Inc.
27  *
28  * This library is free software; you can redistribute it and/or
29  * modify it under the terms of the GNU Lesser General Public
30  * License as published by the Free Software Foundation; either
31  * version 3 of the License, or (at your option) any later version.
32  *
33  * This library is distributed in the hope that it will be useful,
34  * but WITHOUT ANY WARRANTY; without even the implied warranty of
35  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
36  * Library General Public License for more details.
37  *
38  * You should have received a copy of the GNU Lesser General Public
39  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
40  *
41  * @(#)crypt_util.c     2.31 02/08/92
42  *
43  * Support routines
44  *
45  */
46
47
48 #ifndef long32
49 #define long32 int32
50 #endif
51
52 #ifndef long64
53 #define long64 int64
54 #endif
55
56 #ifndef ufc_long
57 #define ufc_long unsigned
58 #endif
59
60 #ifndef _UFC_64_
61 #define _UFC_32_
62 #endif
63
64 /* 
65  * Permutation done once on the 56 bit 
66  *  key derived from the original 8 byte ASCII key.
67  */
68 static int pc1[56] = { 
69   57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,
70   10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
71   63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
72   14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4
73 };
74
75 /*
76  * How much to rotate each 28 bit half of the pc1 permutated
77  *  56 bit key before using pc2 to give the i' key
78  */
79 static int rots[16] = { 
80   1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 
81 };
82
83 /* 
84  * Permutation giving the key 
85  * of the i' DES round 
86  */
87 static int pc2[48] = { 
88   14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,
89   23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,
90   41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
91   44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
92 };
93
94 /*
95  * The E expansion table which selects
96  * bits from the 32 bit intermediate result.
97  */
98 static int esel[48] = { 
99   32,  1,  2,  3,  4,  5,  4,  5,  6,  7,  8,  9,
100    8,  9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
101   16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
102   24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32,  1
103 };
104 static int e_inverse[64];
105
106 /* 
107  * Permutation done on the 
108  * result of sbox lookups 
109  */
110 static int perm32[32] = {
111   16,  7, 20, 21, 29, 12, 28, 17,  1, 15, 23, 26,  5, 18, 31, 10,
112   2,   8, 24, 14, 32, 27,  3,  9, 19, 13, 30,  6, 22, 11,  4, 25
113 };
114
115 /* 
116  * The sboxes
117  */
118 static int sbox[8][4][16]= {
119         { { 14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7 },
120           {  0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8 },
121           {  4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0 },
122           { 15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13 }
123         },
124
125         { { 15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10 },
126           {  3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5 },
127           {  0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15 },
128           { 13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9 }
129         },
130
131         { { 10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8 },
132           { 13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1 },
133           { 13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7 },
134           {  1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12 }
135         },
136
137         { {  7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15 },
138           { 13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9 },
139           { 10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4 },
140           {  3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14 }
141         },
142
143         { {  2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9 },
144           { 14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6 },
145           {  4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14 },
146           { 11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3 }
147         },
148
149         { { 12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11 },
150           { 10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8 },
151           {  9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6 },
152           {  4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13 }
153         },
154
155         { {  4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1 },
156           { 13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6 },
157           {  1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2 },
158           {  6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12 }
159         },
160
161         { { 13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7 },
162           {  1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2 },
163           {  7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8 },
164           {  2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11 }
165         }
166 };
167
168 /* 
169  * This is the final 
170  * permutation matrix
171  */
172 static int final_perm[64] = {
173   40,  8, 48, 16, 56, 24, 64, 32, 39,  7, 47, 15, 55, 23, 63, 31,
174   38,  6, 46, 14, 54, 22, 62, 30, 37,  5, 45, 13, 53, 21, 61, 29,
175   36,  4, 44, 12, 52, 20, 60, 28, 35,  3, 43, 11, 51, 19, 59, 27,
176   34,  2, 42, 10, 50, 18, 58, 26, 33,  1, 41,  9, 49, 17, 57, 25
177 };
178
179 /* 
180  * The 16 DES keys in BITMASK format 
181  */
182 #ifdef _UFC_32_
183 long32 _ufc_keytab[16][2];
184 #endif
185
186 #ifdef _UFC_64_
187 long64 _ufc_keytab[16];
188 #endif
189
190
191 #define ascii_to_bin(c) ((c)>='a'?(c-59):(c)>='A'?((c)-53):(c)-'.')
192 #define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
193
194 /* Macro to set a bit (0..23) */
195 #define BITMASK(i) ( (1<<(11-(i)%12+3)) << ((i)<12?16:0) )
196
197 /*
198  * sb arrays:
199  *
200  * Workhorses of the inner loop of the DES implementation.
201  * They do sbox lookup, shifting of this  value, 32 bit
202  * permutation and E permutation for the next round.
203  *
204  * Kept in 'BITMASK' format.
205  */
206
207 #ifdef _UFC_32_
208 long32 _ufc_sb0[8192], _ufc_sb1[8192], _ufc_sb2[8192], _ufc_sb3[8192];
209 static long32 *sb[4] = {_ufc_sb0, _ufc_sb1, _ufc_sb2, _ufc_sb3}; 
210 #endif
211
212 #ifdef _UFC_64_
213 long64 _ufc_sb0[4096], _ufc_sb1[4096], _ufc_sb2[4096], _ufc_sb3[4096];
214 static long64 *sb[4] = {_ufc_sb0, _ufc_sb1, _ufc_sb2, _ufc_sb3}; 
215 #endif
216
217 /* 
218  * eperm32tab: do 32 bit permutation and E selection
219  *
220  * The first index is the byte number in the 32 bit value to be permuted
221  *  -  second  -   is the value of this byte
222  *  -  third   -   selects the two 32 bit values
223  *
224  * The table is used and generated internally in init_des to speed it up
225  */
226 static ufc_long eperm32tab[4][256][2];
227
228 /* 
229  * do_pc1: permform pc1 permutation in the key schedule generation.
230  *
231  * The first   index is the byte number in the 8 byte ASCII key
232  *  -  second    -      -    the two 28 bits halfs of the result
233  *  -  third     -   selects the 7 bits actually used of each byte
234  *
235  * The result is kept with 28 bit per 32 bit with the 4 most significant
236  * bits zero.
237  */
238 static ufc_long do_pc1[8][2][128];
239
240 /*
241  * do_pc2: permform pc2 permutation in the key schedule generation.
242  *
243  * The first   index is the septet number in the two 28 bit intermediate values
244  *  -  second    -    -  -  septet values
245  *
246  * Knowledge of the structure of the pc2 permutation is used.
247  *
248  * The result is kept with 28 bit per 32 bit with the 4 most significant
249  * bits zero.
250  */
251 static ufc_long do_pc2[8][128];
252
253 /*
254  * efp: undo an extra e selection and do final
255  *      permutation giving the DES result.
256  * 
257  *      Invoked 6 bit a time on two 48 bit values
258  *      giving two 32 bit longs.
259  */
260 static ufc_long efp[16][64][2];
261
262 static unsigned char bytemask[8]  = {
263   0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
264 };
265
266 static ufc_long longmask[32] = {
267   0x80000000, 0x40000000, 0x20000000, 0x10000000,
268   0x08000000, 0x04000000, 0x02000000, 0x01000000,
269   0x00800000, 0x00400000, 0x00200000, 0x00100000,
270   0x00080000, 0x00040000, 0x00020000, 0x00010000,
271   0x00008000, 0x00004000, 0x00002000, 0x00001000,
272   0x00000800, 0x00000400, 0x00000200, 0x00000100,
273   0x00000080, 0x00000040, 0x00000020, 0x00000010,
274   0x00000008, 0x00000004, 0x00000002, 0x00000001
275 };
276
277
278 /*
279  * Silly rewrite of 'bzero'. I do so
280  * because some machines don't have
281  * bzero and some don't have memset.
282  */
283
284 static void clearmem(char *start, int cnt)
285   { while(cnt--)
286       *start++ = '\0';
287   }
288
289 static int initialized = 0;
290
291 /* lookup a 6 bit value in sbox */
292
293 #define s_lookup(i,s) sbox[(i)][(((s)>>4) & 0x2)|((s) & 0x1)][((s)>>1) & 0xf];
294
295 /*
296  * Initialize unit - may be invoked directly
297  * by fcrypt users.
298  */
299
300 static void ufc_init_des(void)
301   { int comes_from_bit;
302     int bit, sg;
303     ufc_long j;
304     ufc_long mask1, mask2;
305
306     /*
307      * Create the do_pc1 table used
308      * to affect pc1 permutation
309      * when generating keys
310      */
311     for(bit = 0; bit < 56; bit++) {
312       comes_from_bit  = pc1[bit] - 1;
313       mask1 = bytemask[comes_from_bit % 8 + 1];
314       mask2 = longmask[bit % 28 + 4];
315       for(j = 0; j < 128; j++) {
316         if(j & mask1) 
317           do_pc1[comes_from_bit / 8][bit / 28][j] |= mask2;
318       }
319     }
320
321     /*
322      * Create the do_pc2 table used
323      * to affect pc2 permutation when
324      * generating keys
325      */
326     for(bit = 0; bit < 48; bit++) {
327       comes_from_bit  = pc2[bit] - 1;
328       mask1 = bytemask[comes_from_bit % 7 + 1];
329       mask2 = BITMASK(bit % 24);
330       for(j = 0; j < 128; j++) {
331         if(j & mask1)
332           do_pc2[comes_from_bit / 7][j] |= mask2;
333       }
334     }
335
336     /* 
337      * Now generate the table used to do combined
338      * 32 bit permutation and e expansion
339      *
340      * We use it because we have to permute 16384 32 bit
341      * longs into 48 bit in order to initialize sb.
342      *
343      * Looping 48 rounds per permutation becomes 
344      * just too slow...
345      *
346      */
347
348     clearmem((char*)eperm32tab, sizeof(eperm32tab));
349
350     for(bit = 0; bit < 48; bit++) {
351       ufc_long inner_mask1,comes_from;
352         
353       comes_from = perm32[esel[bit]-1]-1;
354       inner_mask1      = bytemask[comes_from % 8];
355         
356       for(j = 256; j--;) {
357         if(j & inner_mask1)
358           eperm32tab[comes_from / 8][j][bit / 24] |= BITMASK(bit % 24);
359       }
360     }
361     
362     /* 
363      * Create the sb tables:
364      *
365      * For each 12 bit segment of an 48 bit intermediate
366      * result, the sb table precomputes the two 4 bit
367      * values of the sbox lookups done with the two 6
368      * bit halves, shifts them to their proper place,
369      * sends them through perm32 and finally E expands
370      * them so that they are ready for the next
371      * DES round.
372      *
373      */
374     for(sg = 0; sg < 4; sg++) {
375       int j1, j2;
376       int s1, s2;
377     
378       for(j1 = 0; j1 < 64; j1++) {
379         s1 = s_lookup(2 * sg, j1);
380         for(j2 = 0; j2 < 64; j2++) {
381           ufc_long to_permute, inx;
382     
383           s2         = s_lookup(2 * sg + 1, j2);
384           to_permute = ((s1 << 4)  | s2) << (24 - 8 * sg);
385
386 #ifdef _UFC_32_
387           inx = ((j1 << 6)  | j2) << 1;
388           sb[sg][inx  ]  = eperm32tab[0][(to_permute >> 24) & 0xff][0];
389           sb[sg][inx+1]  = eperm32tab[0][(to_permute >> 24) & 0xff][1];
390           sb[sg][inx  ] |= eperm32tab[1][(to_permute >> 16) & 0xff][0];
391           sb[sg][inx+1] |= eperm32tab[1][(to_permute >> 16) & 0xff][1];
392           sb[sg][inx  ] |= eperm32tab[2][(to_permute >>  8) & 0xff][0];
393           sb[sg][inx+1] |= eperm32tab[2][(to_permute >>  8) & 0xff][1];
394           sb[sg][inx  ] |= eperm32tab[3][(to_permute)       & 0xff][0];
395           sb[sg][inx+1] |= eperm32tab[3][(to_permute)       & 0xff][1];
396 #endif
397 #ifdef _UFC_64_
398           inx = ((j1 << 6)  | j2);
399           sb[sg][inx]  = 
400             ((long64)eperm32tab[0][(to_permute >> 24) & 0xff][0] << 32) |
401              (long64)eperm32tab[0][(to_permute >> 24) & 0xff][1];
402           sb[sg][inx] |=
403             ((long64)eperm32tab[1][(to_permute >> 16) & 0xff][0] << 32) |
404              (long64)eperm32tab[1][(to_permute >> 16) & 0xff][1];
405           sb[sg][inx] |= 
406             ((long64)eperm32tab[2][(to_permute >>  8) & 0xff][0] << 32) |
407              (long64)eperm32tab[2][(to_permute >>  8) & 0xff][1];
408           sb[sg][inx] |=
409             ((long64)eperm32tab[3][(to_permute)       & 0xff][0] << 32) |
410              (long64)eperm32tab[3][(to_permute)       & 0xff][1];
411 #endif
412         }
413       }
414     }  
415
416     /* 
417      * Create an inverse matrix for esel telling
418      * where to plug out bits if undoing it
419      */
420     for(bit=48; bit--;) {
421       e_inverse[esel[bit] - 1     ] = bit;
422       e_inverse[esel[bit] - 1 + 32] = bit + 48;
423     }
424
425     /* 
426      * create efp: the matrix used to
427      * undo the E expansion and effect final permutation
428      */
429     clearmem((char*)efp, sizeof efp);
430     for(bit = 0; bit < 64; bit++) {
431       int o_bit, o_long;
432       ufc_long word_value, inner_mask1, inner_mask2;
433       int comes_from_f_bit, comes_from_e_bit;
434       int comes_from_word, bit_within_word;
435
436       /* See where bit i belongs in the two 32 bit long's */
437       o_long = bit / 32; /* 0..1  */
438       o_bit  = bit % 32; /* 0..31 */
439
440       /* 
441        * And find a bit in the e permutated value setting this bit.
442        *
443        * Note: the e selection may have selected the same bit several
444        * times. By the initialization of e_inverse, we only look
445        * for one specific instance.
446        */
447       comes_from_f_bit = final_perm[bit] - 1;         /* 0..63 */
448       comes_from_e_bit = e_inverse[comes_from_f_bit]; /* 0..95 */
449       comes_from_word  = comes_from_e_bit / 6;        /* 0..15 */
450       bit_within_word  = comes_from_e_bit % 6;        /* 0..5  */
451
452       inner_mask1 = longmask[bit_within_word + 26];
453       inner_mask2 = longmask[o_bit];
454
455       for(word_value = 64; word_value--;) {
456         if(word_value & inner_mask1)
457           efp[comes_from_word][word_value][o_long] |= inner_mask2;
458       }
459     }
460     initialized++;
461   }
462
463 /* 
464  * Process the elements of the sb table permuting the
465  * bits swapped in the expansion by the current salt.
466  */
467
468 #ifdef _UFC_32_
469 static void shuffle_sb(long32 *k, ufc_long saltbits)
470   { ufc_long j;
471     long32 x;
472     for(j=4096; j--;) {
473       x = (k[0] ^ k[1]) & (long32)saltbits;
474       *k++ ^= x;
475       *k++ ^= x;
476     }
477   }
478 #endif
479
480 #ifdef _UFC_64_
481 static void shuffle_sb(long64 *k, ufc_long saltbits)
482   { ufc_long j;
483     long64 x;
484     for(j=4096; j--;) {
485       x = ((*k >> 32) ^ *k) & (long64)saltbits;
486       *k++ ^= (x << 32) | x;
487     }
488   }
489 #endif
490
491 /* 
492  * Setup the unit for a new salt
493  * Hopefully we'll not see a new salt in each crypt call.
494  */
495
496 static unsigned char current_salt[3] = "&&"; /* invalid value */
497 static ufc_long current_saltbits = 0;
498 static int direction = 0;
499
500 static void setup_salt(const char *s1)
501   { ufc_long i, j, saltbits;
502     const unsigned char *s2 = (const unsigned char *)s1;
503
504     if(!initialized)
505       ufc_init_des();
506
507     if(s2[0] == current_salt[0] && s2[1] == current_salt[1])
508       return;
509     current_salt[0] = s2[0]; current_salt[1] = s2[1];
510
511     /* 
512      * This is the only crypt change to DES:
513      * entries are swapped in the expansion table
514      * according to the bits set in the salt.
515      */
516     saltbits = 0;
517     for(i = 0; i < 2; i++) {
518       long c=ascii_to_bin(s2[i]);
519       if(c < 0 || c > 63)
520         c = 0;
521       for(j = 0; j < 6; j++) {
522         if((c >> j) & 0x1)
523           saltbits |= BITMASK(6 * i + j);
524       }
525     }
526
527     /*
528      * Permute the sb table values
529      * to reflect the changed e
530      * selection table
531      */
532     shuffle_sb(_ufc_sb0, current_saltbits ^ saltbits); 
533     shuffle_sb(_ufc_sb1, current_saltbits ^ saltbits);
534     shuffle_sb(_ufc_sb2, current_saltbits ^ saltbits);
535     shuffle_sb(_ufc_sb3, current_saltbits ^ saltbits);
536
537     current_saltbits = saltbits;
538   }
539
540 static void ufc_mk_keytab(char *key)
541   { ufc_long v1, v2, *k1;
542     int i;
543 #ifdef _UFC_32_
544     long32 v, *k2 = &_ufc_keytab[0][0];
545 #endif
546 #ifdef _UFC_64_
547     long64 v, *k2 = &_ufc_keytab[0];
548 #endif
549
550     v1 = v2 = 0; k1 = &do_pc1[0][0][0];
551     for(i = 8; i--;) {
552       v1 |= k1[*key   & 0x7f]; k1 += 128;
553       v2 |= k1[*key++ & 0x7f]; k1 += 128;
554     }
555
556     for(i = 0; i < 16; i++) {
557       k1 = &do_pc2[0][0];
558
559       v1 = (v1 << rots[i]) | (v1 >> (28 - rots[i]));
560       v  = k1[(v1 >> 21) & 0x7f]; k1 += 128;
561       v |= k1[(v1 >> 14) & 0x7f]; k1 += 128;
562       v |= k1[(v1 >>  7) & 0x7f]; k1 += 128;
563       v |= k1[(v1      ) & 0x7f]; k1 += 128;
564
565 #ifdef _UFC_32_
566       *k2++ = v;
567       v = 0;
568 #endif
569 #ifdef _UFC_64_
570       v <<= 32;
571 #endif
572
573       v2 = (v2 << rots[i]) | (v2 >> (28 - rots[i]));
574       v |= k1[(v2 >> 21) & 0x7f]; k1 += 128;
575       v |= k1[(v2 >> 14) & 0x7f]; k1 += 128;
576       v |= k1[(v2 >>  7) & 0x7f]; k1 += 128;
577       v |= k1[(v2      ) & 0x7f];
578
579       *k2++ = v;
580     }
581
582     direction = 0;
583   }
584
585 /* 
586  * Undo an extra E selection and do final permutations
587  */
588
589 ufc_long *_ufc_dofinalperm(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2)
590   { ufc_long v1, v2, x;
591     static ufc_long ary[2];
592
593     x = (l1 ^ l2) & current_saltbits; l1 ^= x; l2 ^= x;
594     x = (r1 ^ r2) & current_saltbits; r1 ^= x; r2 ^= x;
595
596     v1=v2=0; l1 >>= 3; l2 >>= 3; r1 >>= 3; r2 >>= 3;
597
598     v1 |= efp[15][ r2         & 0x3f][0]; v2 |= efp[15][ r2 & 0x3f][1];
599     v1 |= efp[14][(r2 >>= 6)  & 0x3f][0]; v2 |= efp[14][ r2 & 0x3f][1];
600     v1 |= efp[13][(r2 >>= 10) & 0x3f][0]; v2 |= efp[13][ r2 & 0x3f][1];
601     v1 |= efp[12][(r2 >>= 6)  & 0x3f][0]; v2 |= efp[12][ r2 & 0x3f][1];
602
603     v1 |= efp[11][ r1         & 0x3f][0]; v2 |= efp[11][ r1 & 0x3f][1];
604     v1 |= efp[10][(r1 >>= 6)  & 0x3f][0]; v2 |= efp[10][ r1 & 0x3f][1];
605     v1 |= efp[ 9][(r1 >>= 10) & 0x3f][0]; v2 |= efp[ 9][ r1 & 0x3f][1];
606     v1 |= efp[ 8][(r1 >>= 6)  & 0x3f][0]; v2 |= efp[ 8][ r1 & 0x3f][1];
607
608     v1 |= efp[ 7][ l2         & 0x3f][0]; v2 |= efp[ 7][ l2 & 0x3f][1];
609     v1 |= efp[ 6][(l2 >>= 6)  & 0x3f][0]; v2 |= efp[ 6][ l2 & 0x3f][1];
610     v1 |= efp[ 5][(l2 >>= 10) & 0x3f][0]; v2 |= efp[ 5][ l2 & 0x3f][1];
611     v1 |= efp[ 4][(l2 >>= 6)  & 0x3f][0]; v2 |= efp[ 4][ l2 & 0x3f][1];
612
613     v1 |= efp[ 3][ l1         & 0x3f][0]; v2 |= efp[ 3][ l1 & 0x3f][1];
614     v1 |= efp[ 2][(l1 >>= 6)  & 0x3f][0]; v2 |= efp[ 2][ l1 & 0x3f][1];
615     v1 |= efp[ 1][(l1 >>= 10) & 0x3f][0]; v2 |= efp[ 1][ l1 & 0x3f][1];
616     v1 |= efp[ 0][(l1 >>= 6)  & 0x3f][0]; v2 |= efp[ 0][ l1 & 0x3f][1];
617
618     ary[0] = v1; ary[1] = v2;
619     return ary;
620   }
621
622 /* 
623  * crypt only: convert from 64 bit to 11 bit ASCII 
624  * prefixing with the salt
625  */
626
627 static char *output_conversion(ufc_long v1, ufc_long v2, const char *salt)
628   { static char outbuf[14];
629     int i, s;
630
631     outbuf[0] = salt[0];
632     outbuf[1] = salt[1] ? salt[1] : salt[0];
633
634     for(i = 0; i < 5; i++)
635       outbuf[i + 2] = bin_to_ascii((v1 >> (26 - 6 * i)) & 0x3f);
636
637     s  = (v2 & 0xf) << 2;
638     v2 = (v2 >> 2) | ((v1 & 0x3) << 30);
639
640     for(i = 5; i < 10; i++)
641       outbuf[i + 2] = bin_to_ascii((v2 >> (56 - 6 * i)) & 0x3f);
642
643     outbuf[12] = bin_to_ascii(s);
644     outbuf[13] = 0;
645
646     return outbuf;
647   }
648
649 /* 
650  * UNIX crypt function
651  */
652
653 static ufc_long *_ufc_doit(ufc_long , ufc_long, ufc_long, ufc_long, ufc_long);
654    
655 char *ufc_crypt(const char *key,const char *salt)
656   { ufc_long *s;
657     char ktab[9];
658
659     /*
660      * Hack DES tables according to salt
661      */
662     setup_salt(salt);
663
664     /*
665      * Setup key schedule
666      */
667     clearmem(ktab, sizeof ktab);
668     StrnCpy(ktab, key, 8);
669     ufc_mk_keytab(ktab);
670
671     /*
672      * Go for the 25 DES encryptions
673      */
674     s = _ufc_doit((ufc_long)0, (ufc_long)0, 
675                   (ufc_long)0, (ufc_long)0, (ufc_long)25);
676
677     /*
678      * And convert back to 6 bit ASCII
679      */
680     return output_conversion(s[0], s[1], salt);
681   }
682
683
684 #ifdef _UFC_32_
685
686 /*
687  * 32 bit version
688  */
689
690 extern long32 _ufc_keytab[16][2];
691 extern long32 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];
692
693 #define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))
694
695 static ufc_long *_ufc_doit(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2, ufc_long itr)
696   { int i;
697     long32 s, *k;
698
699     while(itr--) {
700       k = &_ufc_keytab[0][0];
701       for(i=8; i--; ) {
702         s = *k++ ^ r1;
703         l1 ^= SBA(_ufc_sb1, s & 0xffff); l2 ^= SBA(_ufc_sb1, (s & 0xffff)+4);  
704         l1 ^= SBA(_ufc_sb0, s >>= 16);   l2 ^= SBA(_ufc_sb0, (s)         +4); 
705         s = *k++ ^ r2; 
706         l1 ^= SBA(_ufc_sb3, s & 0xffff); l2 ^= SBA(_ufc_sb3, (s & 0xffff)+4);
707         l1 ^= SBA(_ufc_sb2, s >>= 16);   l2 ^= SBA(_ufc_sb2, (s)         +4);
708
709         s = *k++ ^ l1; 
710         r1 ^= SBA(_ufc_sb1, s & 0xffff); r2 ^= SBA(_ufc_sb1, (s & 0xffff)+4);  
711         r1 ^= SBA(_ufc_sb0, s >>= 16);   r2 ^= SBA(_ufc_sb0, (s)         +4); 
712         s = *k++ ^ l2; 
713         r1 ^= SBA(_ufc_sb3, s & 0xffff); r2 ^= SBA(_ufc_sb3, (s & 0xffff)+4);  
714         r1 ^= SBA(_ufc_sb2, s >>= 16);   r2 ^= SBA(_ufc_sb2, (s)         +4);
715       } 
716       s=l1; l1=r1; r1=s; s=l2; l2=r2; r2=s;
717     }
718     return _ufc_dofinalperm(l1, l2, r1, r2);
719   }
720
721 #endif
722
723 #ifdef _UFC_64_
724
725 /*
726  * 64 bit version
727  */
728
729 extern long64 _ufc_keytab[16];
730 extern long64 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];
731
732 #define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))
733
734 static ufc_long *_ufc_doit(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2, ufc_long itr)
735   { int i;
736     long64 l, r, s, *k;
737
738     l = (((long64)l1) << 32) | ((long64)l2);
739     r = (((long64)r1) << 32) | ((long64)r2);
740
741     while(itr--) {
742       k = &_ufc_keytab[0];
743       for(i=8; i--; ) {
744         s = *k++ ^ r;
745         l ^= SBA(_ufc_sb3, (s >>  0) & 0xffff);
746         l ^= SBA(_ufc_sb2, (s >> 16) & 0xffff);
747         l ^= SBA(_ufc_sb1, (s >> 32) & 0xffff);
748         l ^= SBA(_ufc_sb0, (s >> 48) & 0xffff);
749
750         s = *k++ ^ l;
751         r ^= SBA(_ufc_sb3, (s >>  0) & 0xffff);
752         r ^= SBA(_ufc_sb2, (s >> 16) & 0xffff);
753         r ^= SBA(_ufc_sb1, (s >> 32) & 0xffff);
754         r ^= SBA(_ufc_sb0, (s >> 48) & 0xffff);
755       } 
756       s=l; l=r; r=s;
757     }
758
759     l1 = l >> 32; l2 = l & 0xffffffff;
760     r1 = r >> 32; r2 = r & 0xffffffff;
761     return _ufc_dofinalperm(l1, l2, r1, r2);
762   }
763
764 #endif
765
766
767 #else
768  int ufc_dummy_procedure(void);
769  int ufc_dummy_procedure(void) {return 0;}
770 #endif