⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufc.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifdef _UFC_32_	  inx = ((j1 << 6)  | j2) << 1;	  sb[sg][inx  ]  = eperm32tab[0][(to_permute >> 24) & 0xff][0];	  sb[sg][inx+1]  = eperm32tab[0][(to_permute >> 24) & 0xff][1];	  sb[sg][inx  ] |= eperm32tab[1][(to_permute >> 16) & 0xff][0];	  sb[sg][inx+1] |= eperm32tab[1][(to_permute >> 16) & 0xff][1];  	  sb[sg][inx  ] |= eperm32tab[2][(to_permute >>  8) & 0xff][0];	  sb[sg][inx+1] |= eperm32tab[2][(to_permute >>  8) & 0xff][1];	  sb[sg][inx  ] |= eperm32tab[3][(to_permute)       & 0xff][0];	  sb[sg][inx+1] |= eperm32tab[3][(to_permute)       & 0xff][1];#endif#ifdef _UFC_64_	  inx = ((j1 << 6)  | j2);	  sb[sg][inx]  = 	    ((long64)eperm32tab[0][(to_permute >> 24) & 0xff][0] << 32) |	     (long64)eperm32tab[0][(to_permute >> 24) & 0xff][1];	  sb[sg][inx] |=	    ((long64)eperm32tab[1][(to_permute >> 16) & 0xff][0] << 32) |	     (long64)eperm32tab[1][(to_permute >> 16) & 0xff][1];  	  sb[sg][inx] |= 	    ((long64)eperm32tab[2][(to_permute >>  8) & 0xff][0] << 32) |	     (long64)eperm32tab[2][(to_permute >>  8) & 0xff][1];	  sb[sg][inx] |=	    ((long64)eperm32tab[3][(to_permute)       & 0xff][0] << 32) |	     (long64)eperm32tab[3][(to_permute)       & 0xff][1];#endif	}      }    }      /*      * Create an inverse matrix for esel telling     * where to plug out bits if undoing it     */    for(bit=48; bit--;) {      e_inverse[esel[bit] - 1     ] = bit;      e_inverse[esel[bit] - 1 + 32] = bit + 48;    }    /*      * create efp: the matrix used to     * undo the E expansion and effect final permutation     */    clearmem((char*)efp, sizeof efp);    for(bit = 0; bit < 64; bit++) {      int o_bit, o_long;      ufc_long word_value, inner_mask1, inner_mask2;      int comes_from_f_bit, comes_from_e_bit;      int comes_from_word, bit_within_word;      /* See where bit i belongs in the two 32 bit long's */      o_long = bit / 32; /* 0..1  */      o_bit  = bit % 32; /* 0..31 */      /*        * And find a bit in the e permutated value setting this bit.       *       * Note: the e selection may have selected the same bit several       * times. By the initialization of e_inverse, we only look       * for one specific instance.       */      comes_from_f_bit = final_perm[bit] - 1;         /* 0..63 */      comes_from_e_bit = e_inverse[comes_from_f_bit]; /* 0..95 */      comes_from_word  = comes_from_e_bit / 6;        /* 0..15 */      bit_within_word  = comes_from_e_bit % 6;        /* 0..5  */      inner_mask1 = longmask[bit_within_word + 26];      inner_mask2 = longmask[o_bit];      for(word_value = 64; word_value--;) {	if(word_value & inner_mask1)	  efp[comes_from_word][word_value][o_long] |= inner_mask2;      }    }    initialized++;  }/*  * Process the elements of the sb table permuting the * bits swapped in the expansion by the current salt. */#ifdef _UFC_32_static void shuffle_sb(long32 *k, ufc_long saltbits)  { ufc_long j;    long32 x;    for(j=4096; j--;) {      x = (k[0] ^ k[1]) & (long32)saltbits;      *k++ ^= x;      *k++ ^= x;    }  }#endif#ifdef _UFC_64_static void shuffle_sb(long64 *k, ufc_long saltbits)  { ufc_long j;    long64 x;    for(j=4096; j--;) {      x = ((*k >> 32) ^ *k) & (long64)saltbits;      *k++ ^= (x << 32) | x;    }  }#endif/*  * Setup the unit for a new salt * Hopefully we'll not see a new salt in each crypt call. */static unsigned char current_salt[3] = "&&"; /* invalid value */static ufc_long current_saltbits = 0;static int direction = 0;static void setup_salt(const char *s1)  { ufc_long i, j, saltbits;    const unsigned char *s2 = (const unsigned char *)s1;    if(!initialized)      ufc_init_des();    if(s2[0] == current_salt[0] && s2[1] == current_salt[1])      return;    current_salt[0] = s2[0]; current_salt[1] = s2[1];    /*      * This is the only crypt change to DES:     * entries are swapped in the expansion table     * according to the bits set in the salt.     */    saltbits = 0;    for(i = 0; i < 2; i++) {      long c=ascii_to_bin(s2[i]);      if(c < 0 || c > 63)	c = 0;      for(j = 0; j < 6; j++) {	if((c >> j) & 0x1)	  saltbits |= BITMASK(6 * i + j);      }    }    /*     * Permute the sb table values     * to reflect the changed e     * selection table     */    shuffle_sb(_ufc_sb0, current_saltbits ^ saltbits);     shuffle_sb(_ufc_sb1, current_saltbits ^ saltbits);    shuffle_sb(_ufc_sb2, current_saltbits ^ saltbits);    shuffle_sb(_ufc_sb3, current_saltbits ^ saltbits);    current_saltbits = saltbits;  }static void ufc_mk_keytab(char *key)  { ufc_long v1, v2, *k1;    int i;#ifdef _UFC_32_    long32 v, *k2 = &_ufc_keytab[0][0];#endif#ifdef _UFC_64_    long64 v, *k2 = &_ufc_keytab[0];#endif    v1 = v2 = 0; k1 = &do_pc1[0][0][0];    for(i = 8; i--;) {      v1 |= k1[*key   & 0x7f]; k1 += 128;      v2 |= k1[*key++ & 0x7f]; k1 += 128;    }    for(i = 0; i < 16; i++) {      k1 = &do_pc2[0][0];      v1 = (v1 << rots[i]) | (v1 >> (28 - rots[i]));      v  = k1[(v1 >> 21) & 0x7f]; k1 += 128;      v |= k1[(v1 >> 14) & 0x7f]; k1 += 128;      v |= k1[(v1 >>  7) & 0x7f]; k1 += 128;      v |= k1[(v1      ) & 0x7f]; k1 += 128;#ifdef _UFC_32_      *k2++ = v;      v = 0;#endif#ifdef _UFC_64_      v <<= 32;#endif      v2 = (v2 << rots[i]) | (v2 >> (28 - rots[i]));      v |= k1[(v2 >> 21) & 0x7f]; k1 += 128;      v |= k1[(v2 >> 14) & 0x7f]; k1 += 128;      v |= k1[(v2 >>  7) & 0x7f]; k1 += 128;      v |= k1[(v2      ) & 0x7f];      *k2++ = v;    }    direction = 0;  }/*  * Undo an extra E selection and do final permutations */ufc_long *_ufc_dofinalperm(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2)  { ufc_long v1, v2, x;    static ufc_long ary[2];    x = (l1 ^ l2) & current_saltbits; l1 ^= x; l2 ^= x;    x = (r1 ^ r2) & current_saltbits; r1 ^= x; r2 ^= x;    v1=v2=0; l1 >>= 3; l2 >>= 3; r1 >>= 3; r2 >>= 3;    v1 |= efp[15][ r2         & 0x3f][0]; v2 |= efp[15][ r2 & 0x3f][1];    v1 |= efp[14][(r2 >>= 6)  & 0x3f][0]; v2 |= efp[14][ r2 & 0x3f][1];    v1 |= efp[13][(r2 >>= 10) & 0x3f][0]; v2 |= efp[13][ r2 & 0x3f][1];    v1 |= efp[12][(r2 >>= 6)  & 0x3f][0]; v2 |= efp[12][ r2 & 0x3f][1];    v1 |= efp[11][ r1         & 0x3f][0]; v2 |= efp[11][ r1 & 0x3f][1];    v1 |= efp[10][(r1 >>= 6)  & 0x3f][0]; v2 |= efp[10][ r1 & 0x3f][1];    v1 |= efp[ 9][(r1 >>= 10) & 0x3f][0]; v2 |= efp[ 9][ r1 & 0x3f][1];    v1 |= efp[ 8][(r1 >>= 6)  & 0x3f][0]; v2 |= efp[ 8][ r1 & 0x3f][1];    v1 |= efp[ 7][ l2         & 0x3f][0]; v2 |= efp[ 7][ l2 & 0x3f][1];    v1 |= efp[ 6][(l2 >>= 6)  & 0x3f][0]; v2 |= efp[ 6][ l2 & 0x3f][1];    v1 |= efp[ 5][(l2 >>= 10) & 0x3f][0]; v2 |= efp[ 5][ l2 & 0x3f][1];    v1 |= efp[ 4][(l2 >>= 6)  & 0x3f][0]; v2 |= efp[ 4][ l2 & 0x3f][1];    v1 |= efp[ 3][ l1         & 0x3f][0]; v2 |= efp[ 3][ l1 & 0x3f][1];    v1 |= efp[ 2][(l1 >>= 6)  & 0x3f][0]; v2 |= efp[ 2][ l1 & 0x3f][1];    v1 |= efp[ 1][(l1 >>= 10) & 0x3f][0]; v2 |= efp[ 1][ l1 & 0x3f][1];    v1 |= efp[ 0][(l1 >>= 6)  & 0x3f][0]; v2 |= efp[ 0][ l1 & 0x3f][1];    ary[0] = v1; ary[1] = v2;    return ary;  }/*  * crypt only: convert from 64 bit to 11 bit ASCII  * prefixing with the salt */static char *output_conversion(ufc_long v1, ufc_long v2, const char *salt)  { static char outbuf[14];    int i, s;    outbuf[0] = salt[0];    outbuf[1] = salt[1] ? salt[1] : salt[0];    for(i = 0; i < 5; i++)      outbuf[i + 2] = bin_to_ascii((v1 >> (26 - 6 * i)) & 0x3f);    s  = (v2 & 0xf) << 2;    v2 = (v2 >> 2) | ((v1 & 0x3) << 30);    for(i = 5; i < 10; i++)      outbuf[i + 2] = bin_to_ascii((v2 >> (56 - 6 * i)) & 0x3f);    outbuf[12] = bin_to_ascii(s);    outbuf[13] = 0;    return outbuf;  }/*  * UNIX crypt function */static ufc_long *_ufc_doit(ufc_long , ufc_long, ufc_long, ufc_long, ufc_long);   char *ufc_crypt(const char *key,const char *salt)  { ufc_long *s;    char ktab[9];    /*     * Hack DES tables according to salt     */    setup_salt(salt);    /*     * Setup key schedule     */    clearmem(ktab, sizeof ktab);    StrnCpy(ktab, key, 8);    ufc_mk_keytab(ktab);    /*     * Go for the 25 DES encryptions     */    s = _ufc_doit((ufc_long)0, (ufc_long)0, 		  (ufc_long)0, (ufc_long)0, (ufc_long)25);    /*     * And convert back to 6 bit ASCII     */    return output_conversion(s[0], s[1], salt);  }#ifdef _UFC_32_/* * 32 bit version */extern long32 _ufc_keytab[16][2];extern long32 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];#define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))static ufc_long *_ufc_doit(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2, ufc_long itr)  { int i;    long32 s, *k;    while(itr--) {      k = &_ufc_keytab[0][0];      for(i=8; i--; ) {	s = *k++ ^ r1;	l1 ^= SBA(_ufc_sb1, s & 0xffff); l2 ^= SBA(_ufc_sb1, (s & 0xffff)+4);          l1 ^= SBA(_ufc_sb0, s >>= 16);   l2 ^= SBA(_ufc_sb0, (s)         +4);         s = *k++ ^ r2;         l1 ^= SBA(_ufc_sb3, s & 0xffff); l2 ^= SBA(_ufc_sb3, (s & 0xffff)+4);        l1 ^= SBA(_ufc_sb2, s >>= 16);   l2 ^= SBA(_ufc_sb2, (s)         +4);        s = *k++ ^ l1;         r1 ^= SBA(_ufc_sb1, s & 0xffff); r2 ^= SBA(_ufc_sb1, (s & 0xffff)+4);          r1 ^= SBA(_ufc_sb0, s >>= 16);   r2 ^= SBA(_ufc_sb0, (s)         +4);         s = *k++ ^ l2;         r1 ^= SBA(_ufc_sb3, s & 0xffff); r2 ^= SBA(_ufc_sb3, (s & 0xffff)+4);          r1 ^= SBA(_ufc_sb2, s >>= 16);   r2 ^= SBA(_ufc_sb2, (s)         +4);      }       s=l1; l1=r1; r1=s; s=l2; l2=r2; r2=s;    }    return _ufc_dofinalperm(l1, l2, r1, r2);  }#endif#ifdef _UFC_64_/* * 64 bit version */extern long64 _ufc_keytab[16];extern long64 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];#define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))static ufc_long *_ufc_doit(ufc_long l1, ufc_long l2, ufc_long r1, ufc_long r2, ufc_long itr)  { int i;    long64 l, r, s, *k;    l = (((long64)l1) << 32) | ((long64)l2);    r = (((long64)r1) << 32) | ((long64)r2);    while(itr--) {      k = &_ufc_keytab[0];      for(i=8; i--; ) {	s = *k++ ^ r;	l ^= SBA(_ufc_sb3, (s >>  0) & 0xffff);        l ^= SBA(_ufc_sb2, (s >> 16) & 0xffff);        l ^= SBA(_ufc_sb1, (s >> 32) & 0xffff);        l ^= SBA(_ufc_sb0, (s >> 48) & 0xffff);	s = *k++ ^ l;	r ^= SBA(_ufc_sb3, (s >>  0) & 0xffff);        r ^= SBA(_ufc_sb2, (s >> 16) & 0xffff);        r ^= SBA(_ufc_sb1, (s >> 32) & 0xffff);        r ^= SBA(_ufc_sb0, (s >> 48) & 0xffff);      }       s=l; l=r; r=s;    }    l1 = l >> 32; l2 = l & 0xffffffff;    r1 = r >> 32; r2 = r & 0xffffffff;    return _ufc_dofinalperm(l1, l2, r1, r2);  }#endif#else int ufc_dummy_procedure(void); int ufc_dummy_procedure(void) {return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -