You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

562 lines
18 KiB

  1. /*
  2. * UFC-crypt: ultra fast crypt(3) implementation
  3. *
  4. * Copyright (C) 1991, Michael Glad, email: glad@daimi.aau.dk
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Library General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Library General Public License for more details.
  15. * You should have received a copy of the GNU Library General Public
  16. * License along with this library; if not, write to the Free
  17. * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. *
  19. * @(#)crypt.c 2.2 10/04/91
  20. *
  21. * Semiportable C version
  22. *
  23. */
  24. #include <string.h>
  25. #define bzero(addr, cnt) memset(addr, 0, cnt)
  26. #define bcopy(from, to, len) memcpy(to, from, len)
  27. /* Permutation done once on the 56 bit
  28. key derived from the original 8 byte ASCII key.
  29. */
  30. static unsigned long pc1[56] =
  31. { 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
  32. 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
  33. 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
  34. 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
  35. };
  36. /* How much to rotate each 28 bit half of the pc1 permutated
  37. 56 bit key before using pc2 to give the i' key
  38. */
  39. static unsigned long totrot[16] =
  40. { 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 };
  41. /* Permutation giving the key of the i' DES round */
  42. static unsigned long pc2[48] =
  43. { 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
  44. 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
  45. 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
  46. 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
  47. };
  48. /* Reference copy of the expansion table which selects
  49. bits from the 32 bit intermediate result.
  50. */
  51. static unsigned long eref[48] =
  52. { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
  53. 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
  54. 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
  55. 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1
  56. };
  57. static unsigned long disturbed_e[48];
  58. static unsigned long e_inverse[64];
  59. /* Permutation done on the result of sbox lookups */
  60. static unsigned long perm32[32] =
  61. { 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
  62. 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
  63. };
  64. /* The sboxes */
  65. static unsigned long sbox[8][4][16]=
  66. { { { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 },
  67. { 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 },
  68. { 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 },
  69. { 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 }
  70. },
  71. { { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
  72. { 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },
  73. { 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },
  74. { 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 }
  75. },
  76. { { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
  77. { 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },
  78. { 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },
  79. { 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 }
  80. },
  81. { { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
  82. { 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },
  83. { 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 },
  84. { 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 }
  85. },
  86. { { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
  87. { 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 },
  88. { 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 },
  89. { 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 }
  90. },
  91. { { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },
  92. { 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 },
  93. { 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 },
  94. { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 }
  95. },
  96. { { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },
  97. { 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 },
  98. { 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 },
  99. { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 }
  100. },
  101. { { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },
  102. { 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 },
  103. { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 },
  104. { 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 }
  105. }
  106. };
  107. #ifdef notdef
  108. /* This is the initial permutation matrix -- we have no
  109. use for it, but it is needed if you will develop
  110. this module into a general DES package.
  111. */
  112. static unsigned char inital_perm[64] =
  113. { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
  114. 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
  115. 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
  116. 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
  117. };
  118. #endif
  119. /* Final permutation matrix -- not used directly */
  120. static unsigned char final_perm[64] =
  121. { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
  122. 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
  123. 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
  124. 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
  125. };
  126. /* The 16 DES keys in BITMASK format */
  127. unsigned long keytab[16][2];
  128. #define ascii_to_bin(c) ((c)>='a'?(c-59):(c)>='A'?((c)-53):(c)-'.')
  129. #define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
  130. /* Macro to set a bit (0..23) */
  131. #define BITMASK(i) ( (1<<(11-(i)%12+3)) << ((i)<12?16:0) )
  132. /* sb arrays:
  133. Workhorses of the inner loop of the DES implementation.
  134. They do sbox lookup, shifting of this value, 32 bit
  135. permutation and E permutation for the next round.
  136. Kept in 'BITMASK' format.
  137. */
  138. unsigned long sb0[8192],sb1[8192],sb2[8192],sb3[8192];
  139. static unsigned long *sb[4] = {sb0,sb1,sb2,sb3};
  140. /* eperm32tab: do 32 bit permutation and E selection
  141. The first index is the byte number in the 32 bit value to be permuted
  142. - second - is the value of this byte
  143. - third - selects the two 32 bit values
  144. The table is used and generated internally in init_des to speed it up
  145. */
  146. static unsigned long eperm32tab[4][256][2];
  147. /* mk_keytab_table: fast way of generating keytab from ASCII key
  148. The first index is the byte number in the 8 byte ASCII key
  149. - second - - - current DES round i.e. the key number
  150. - third - distinguishes between the two 24 bit halfs of
  151. the selected key
  152. - fourth - selects the 7 bits actually used of each byte
  153. The table is kept in the format generated by the BITMASK macro
  154. */
  155. static unsigned long mk_keytab_table[8][16][2][128];
  156. /* efp: undo an extra e selection and do final
  157. permutation giving the DES result.
  158. Invoked 6 bit a time on two 48 bit values
  159. giving two 32 bit longs.
  160. */
  161. static unsigned long efp[16][64][2];
  162. static unsigned char bytemask[8] =
  163. { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
  164. static unsigned long longmask[32] =
  165. { 0x80000000, 0x40000000, 0x20000000, 0x10000000,
  166. 0x08000000, 0x04000000, 0x02000000, 0x01000000,
  167. 0x00800000, 0x00400000, 0x00200000, 0x00100000,
  168. 0x00080000, 0x00040000, 0x00020000, 0x00010000,
  169. 0x00008000, 0x00004000, 0x00002000, 0x00001000,
  170. 0x00000800, 0x00000400, 0x00000200, 0x00000100,
  171. 0x00000080, 0x00000040, 0x00000020, 0x00000010,
  172. 0x00000008, 0x00000004, 0x00000002, 0x00000001
  173. };
  174. static unsigned long initialized = 0;
  175. /* lookup a 6 bit value in sbox */
  176. #define s_lookup(i,s) sbox[(i)][(((s)>>4) & 0x2)|((s) & 0x1)][((s)>>1) & 0xf];
  177. /* Generate the mk_keytab_table once in a program execution */
  178. void init_des()
  179. { unsigned long tbl_long,bit_within_long,comes_from_bit;
  180. unsigned long bit,sg,j;
  181. unsigned long bit_within_byte,key_byte,byte_value;
  182. unsigned long round,mask;
  183. bzero((char*)mk_keytab_table,sizeof mk_keytab_table);
  184. for(round=0; round<16; round++)
  185. for(bit=0; bit<48; bit++)
  186. { tbl_long = bit / 24;
  187. bit_within_long = bit % 24;
  188. /* from which bit in the key halves does it origin? */
  189. comes_from_bit = pc2[bit] - 1;
  190. /* undo the rotation done before pc2 */
  191. if(comes_from_bit>=28)
  192. comes_from_bit = 28 + (comes_from_bit + totrot[round]) % 28;
  193. else
  194. comes_from_bit = (comes_from_bit + totrot[round]) % 28;
  195. /* undo the initial key half forming permutation */
  196. comes_from_bit = pc1[comes_from_bit] - 1;
  197. /* Now 'comes_from_bit' is the correct number (0..55)
  198. of the keybit from which the bit being traced
  199. in key 'round' comes from
  200. */
  201. key_byte = comes_from_bit / 8;
  202. bit_within_byte = (comes_from_bit % 8)+1;
  203. mask = bytemask[bit_within_byte];
  204. for(byte_value=0; byte_value<128; byte_value++)
  205. if(byte_value & mask)
  206. mk_keytab_table[key_byte][round][tbl_long][byte_value] |=
  207. BITMASK(bit_within_long);
  208. }
  209. /* Now generate the table used to do an combined
  210. 32 bit permutation and e expansion
  211. We use it because we have to permute 16384 32 bit
  212. longs into 48 bit in order to initialize sb.
  213. Looping 48 rounds per permutation becomes
  214. just too slow...
  215. */
  216. bzero((char*)eperm32tab,sizeof eperm32tab);
  217. for(bit=0; bit<48; bit++)
  218. { unsigned long mask1,comes_from;
  219. comes_from = perm32[eref[bit]-1]-1;
  220. mask1 = bytemask[comes_from % 8];
  221. for(j=256; j--;)
  222. if(j & mask1)
  223. eperm32tab[comes_from/8][j][bit/24] |= BITMASK(bit % 24);
  224. }
  225. /* Create the sb tables:
  226. For each 12 bit segment of an 48 bit intermediate
  227. result, the sb table precomputes the two 4 bit
  228. values of the sbox lookups done with the two 6
  229. bit halves, shifts them to their proper place,
  230. sends them through perm32 and finally E expands
  231. them so that they are ready for the next
  232. DES round.
  233. The value looked up is to be xored onto the
  234. two 48 bit right halves.
  235. */
  236. for(sg=0; sg<4; sg++)
  237. { unsigned long j1,j2;
  238. unsigned long s1,s2;
  239. for(j1=0; j1<64; j1++)
  240. { s1 = s_lookup(2*sg,j1);
  241. for(j2=0; j2<64; j2++)
  242. { unsigned long to_permute,inx;
  243. s2 = s_lookup(2*sg+1,j2);
  244. to_permute = ((s1<<4) | s2) << (24-8*sg);
  245. inx = ((j1<<6) | j2) << 1;
  246. sb[sg][inx ] = eperm32tab[0][(to_permute >> 24) & 0xff][0];
  247. sb[sg][inx+1] = eperm32tab[0][(to_permute >> 24) & 0xff][1];
  248. sb[sg][inx ] |= eperm32tab[1][(to_permute >> 16) & 0xff][0];
  249. sb[sg][inx+1] |= eperm32tab[1][(to_permute >> 16) & 0xff][1];
  250. sb[sg][inx ] |= eperm32tab[2][(to_permute >> 8) & 0xff][0];
  251. sb[sg][inx+1] |= eperm32tab[2][(to_permute >> 8) & 0xff][1];
  252. sb[sg][inx ] |= eperm32tab[3][(to_permute) & 0xff][0];
  253. sb[sg][inx+1] |= eperm32tab[3][(to_permute) & 0xff][1];
  254. }
  255. }
  256. }
  257. initialized++;
  258. }
  259. /* Process the elements of the sb table permuting the
  260. bits swapped in the expansion by the current salt.
  261. */
  262. void shuffle_sb(k, saltbits)
  263. unsigned long *k, saltbits;
  264. { int j, x;
  265. for(j=4096; j--;) {
  266. x = (k[0] ^ k[1]) & saltbits;
  267. *k++ ^= x;
  268. *k++ ^= x;
  269. }
  270. }
  271. /* Setup the unit for a new salt
  272. Hopefully we'll not see a new salt in each crypt call.
  273. */
  274. static unsigned char current_salt[3]="&&"; /* invalid value */
  275. static unsigned long oldsaltbits = 0;
  276. void setup_salt(s)
  277. char *s;
  278. { unsigned long i,j,saltbits;
  279. if(!initialized)
  280. init_des();
  281. if(s[0]==current_salt[0] && s[1]==current_salt[1])
  282. return;
  283. current_salt[0]=s[0]; current_salt[1]=s[1];
  284. /* This is the only crypt change to DES:
  285. entries are swapped in the expansion table
  286. according to the bits set in the salt.
  287. */
  288. saltbits=0;
  289. bcopy((char*)eref,(char*)disturbed_e,sizeof eref);
  290. for(i=0; i<2; i++)
  291. { long c=ascii_to_bin(s[i]);
  292. if(c<0 || c>63)
  293. c=0;
  294. for(j=0; j<6; j++)
  295. if((c>>j) & 0x1)
  296. { disturbed_e[6*i+j ]=eref[6*i+j+24];
  297. disturbed_e[6*i+j+24]=eref[6*i+j ];
  298. saltbits |= BITMASK(6*i+j);
  299. }
  300. }
  301. /* Permute the sb table values
  302. to reflect the changed e
  303. selection table
  304. */
  305. shuffle_sb(sb0, oldsaltbits ^ saltbits);
  306. shuffle_sb(sb1, oldsaltbits ^ saltbits);
  307. shuffle_sb(sb2, oldsaltbits ^ saltbits);
  308. shuffle_sb(sb3, oldsaltbits ^ saltbits);
  309. oldsaltbits = saltbits;
  310. /* Create an inverse matrix for disturbed_e telling
  311. where to plug out bits if undoing disturbed_e
  312. */
  313. for(i=48; i--;)
  314. { e_inverse[disturbed_e[i]-1 ] = i;
  315. e_inverse[disturbed_e[i]-1+32] = i+48;
  316. }
  317. /* create efp: the matrix used to
  318. undo the E expansion and effect final permutation
  319. */
  320. bzero((char*)efp,sizeof efp);
  321. for(i=0; i<64; i++)
  322. { unsigned long o_bit,o_long;
  323. unsigned long word_value,mask1,mask2,comes_from_f_bit,comes_from_e_bit;
  324. unsigned long comes_from_word,bit_within_word;
  325. /* See where bit i belongs in the two 32 bit long's */
  326. o_long = i / 32; /* 0..1 */
  327. o_bit = i % 32; /* 0..31 */
  328. /* And find a bit in the e permutated value setting this bit.
  329. Note: the e selection may have selected the same bit several
  330. times. By the initialization of e_inverse, we only look
  331. for one specific instance.
  332. */
  333. comes_from_f_bit = final_perm[i]-1; /* 0..63 */
  334. comes_from_e_bit = e_inverse[comes_from_f_bit]; /* 0..95 */
  335. comes_from_word = comes_from_e_bit / 6; /* 0..15 */
  336. bit_within_word = comes_from_e_bit % 6; /* 0..5 */
  337. mask1 = longmask[bit_within_word+26];
  338. mask2 = longmask[o_bit];
  339. for(word_value=64; word_value--;)
  340. if(word_value & mask1)
  341. efp[comes_from_word][word_value][o_long] |= mask2;
  342. }
  343. }
  344. /* Generate the key table before running the 25 DES rounds */
  345. void mk_keytab(key)
  346. char *key;
  347. { unsigned long i,j;
  348. unsigned long *k,*mkt;
  349. char t;
  350. bzero((char*)keytab, sizeof keytab);
  351. mkt = &mk_keytab_table[0][0][0][0];
  352. for(i=0; (t=(*key++) & 0x7f) && i<8; i++)
  353. for(j=0,k = &keytab[0][0]; j<16; j++)
  354. { *k++ |= mkt[t]; mkt += 128;
  355. *k++ |= mkt[t]; mkt += 128;
  356. }
  357. for(; i<8; i++)
  358. for(j=0,k = &keytab[0][0]; j<16; j++)
  359. { *k++ |= mkt[0]; mkt += 128;
  360. *k++ |= mkt[0]; mkt += 128;
  361. }
  362. }
  363. /* Do final permutations and convert to ASCII */
  364. char *output_conversion(l1,l2,r1,r2,salt)
  365. unsigned long l1,l2,r1,r2;
  366. char *salt;
  367. { static char outbuf[14];
  368. unsigned long i;
  369. unsigned long s,v1,v2;
  370. /* Unfortunately we've done an extra E
  371. expansion -- undo it at the same time.
  372. */
  373. v1=v2=0; l1 >>= 3; l2 >>= 3; r1 >>= 3; r2 >>= 3;
  374. v1 |= efp[ 3][ l1 & 0x3f][0]; v2 |= efp[ 3][ l1 & 0x3f][1];
  375. v1 |= efp[ 2][(l1>>=6) & 0x3f][0]; v2 |= efp[ 2][ l1 & 0x3f][1];
  376. v1 |= efp[ 1][(l1>>=10) & 0x3f][0]; v2 |= efp[ 1][ l1 & 0x3f][1];
  377. v1 |= efp[ 0][(l1>>=6) & 0x3f][0]; v2 |= efp[ 0][ l1 & 0x3f][1];
  378. v1 |= efp[ 7][ l2 & 0x3f][0]; v2 |= efp[ 7][ l2 & 0x3f][1];
  379. v1 |= efp[ 6][(l2>>=6) & 0x3f][0]; v2 |= efp[ 6][ l2 & 0x3f][1];
  380. v1 |= efp[ 5][(l2>>=10) & 0x3f][0]; v2 |= efp[ 5][ l2 & 0x3f][1];
  381. v1 |= efp[ 4][(l2>>=6) & 0x3f][0]; v2 |= efp[ 4][ l2 & 0x3f][1];
  382. v1 |= efp[11][ r1 & 0x3f][0]; v2 |= efp[11][ r1 & 0x3f][1];
  383. v1 |= efp[10][(r1>>=6) & 0x3f][0]; v2 |= efp[10][ r1 & 0x3f][1];
  384. v1 |= efp[ 9][(r1>>=10) & 0x3f][0]; v2 |= efp[ 9][ r1 & 0x3f][1];
  385. v1 |= efp[ 8][(r1>>=6) & 0x3f][0]; v2 |= efp[ 8][ r1 & 0x3f][1];
  386. v1 |= efp[15][ r2 & 0x3f][0]; v2 |= efp[15][ r2 & 0x3f][1];
  387. v1 |= efp[14][(r2>>=6) & 0x3f][0]; v2 |= efp[14][ r2 & 0x3f][1];
  388. v1 |= efp[13][(r2>>=10) & 0x3f][0]; v2 |= efp[13][ r2 & 0x3f][1];
  389. v1 |= efp[12][(r2>>=6) & 0x3f][0]; v2 |= efp[12][ r2 & 0x3f][1];
  390. outbuf[0] = salt[0];
  391. outbuf[1] = salt[1] ? salt[1] : salt[0];
  392. for(i=0; i<5; i++)
  393. outbuf[i+2] = bin_to_ascii((v1>>(26-6*i)) & 0x3f);
  394. s = (v2 & 0xf) << 2; /* Save the rightmost 4 bit a moment */
  395. v2 = (v2>>2) | ((v1 & 0x3)<<30); /* Shift two bits of v1 onto v2 */
  396. for(i=5; i<10; i++)
  397. outbuf[i+2] = bin_to_ascii((v2>>(56-6*i)) & 0x3f);
  398. outbuf[12] = bin_to_ascii(s);
  399. outbuf[13] = 0;
  400. return outbuf;
  401. }
  402. #define SBA(sb, v) (*(unsigned long*)((char*)(sb)+(v)))
  403. #define F(I, O1, O2, SBX, SBY) \
  404. s = *k++ ^ I; \
  405. O1 ^= SBA(SBX, (s & 0xffff)); O2 ^= SBA(SBX, ((s & 0xffff) + 4)); \
  406. O1 ^= SBA(SBY, (s >>= 16)); O2 ^= SBA(SBY, ((s) + 4));
  407. #define G(I1, I2, O1, O2) \
  408. F(I1, O1, O2, sb1, sb0) F(I2, O1, O2, sb3, sb2)
  409. #define H G(r1, r2, l1, l2) ; G(l1, l2, r1, r2)
  410. char *des_crypt(key, salt)
  411. char *key;
  412. char *salt;
  413. { unsigned long l1, l2, r1, r2, i, j, s, *k;
  414. setup_salt(salt);
  415. mk_keytab(key);
  416. l1=l2=r1=r2=0;
  417. for(j=0; j<25; j++) {
  418. k = &keytab[0][0];
  419. for(i=8; i--; ) {
  420. H;
  421. }
  422. s=l1; l1=r1; r1=s; s=l2; l2=r2; r2=s;
  423. }
  424. return output_conversion(l1, l2, r1, r2, salt);
  425. }
  426. #include "php.h"
  427. #include "md5crypt.h"
  428. PHPAPI char *
  429. crypt (const char *pw, const char *salt)
  430. {
  431. if (strlen(salt)>MD5_MAGIC_LEN && strncmp(salt, MD5_MAGIC, MD5_MAGIC_LEN)==0) {
  432. return md5_crypt(pw, salt);
  433. } else {
  434. return des_crypt(pw, salt);
  435. }
  436. }