rmd128.c
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:7k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #include "rmd128.h"
  2. #define ROL(x, n) (((x) << (n)) | ((x) >> (32-(n))))
  3. #define F(x, y, z) ((x) ^ (y) ^ (z))
  4. #define G(x, y, z) (((x) & (y)) | (~(x) & (z)))
  5. #define H(x, y, z)  (((x) | ~(y)) ^ (z))
  6. #define I(x, y, z) (((x) & (z)) | ((y) & ~(z)))
  7. /* the eight basic operations FF() through III() */
  8. #define FF(a, b, c, d, x, s)        {
  9.       (a) += F((b), (c), (d)) + (x);
  10.       (a) = ROL((a), (s));
  11.    }
  12. #define GG(a, b, c, d, x, s)        {
  13.       (a) += G((b), (c), (d)) + (x) + 0x5a827999UL;
  14.       (a) = ROL((a), (s));
  15.    }
  16. #define HH(a, b, c, d, x, s)        {
  17.       (a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;
  18.       (a) = ROL((a), (s));
  19.    }
  20. #define II(a, b, c, d, x, s)        {
  21.       (a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;
  22.       (a) = ROL((a), (s));
  23.    }
  24. #define FFF(a, b, c, d, x, s)        {
  25.       (a) += F((b), (c), (d)) + (x);
  26.       (a) = ROL((a), (s));
  27.    }
  28. #define GGG(a, b, c, d, x, s)        {
  29.       (a) += G((b), (c), (d)) + (x) + 0x6d703ef3UL;
  30.       (a) = ROL((a), (s));
  31.    }
  32. #define HHH(a, b, c, d, x, s)        {
  33.       (a) += H((b), (c), (d)) + (x) + 0x5c4dd124UL;
  34.       (a) = ROL((a), (s));
  35.    }
  36. #define III(a, b, c, d, x, s)        {
  37.       (a) += I((b), (c), (d)) + (x) + 0x50a28be6UL;
  38.       (a) = ROL((a), (s));
  39.    }
  40. void MDcompress(dword *MDbuf, dword *X)
  41. {
  42.    dword aa = MDbuf[0],  bb = MDbuf[1],  cc = MDbuf[2],  dd = MDbuf[3];
  43.    dword aaa = MDbuf[0], bbb = MDbuf[1], ccc = MDbuf[2], ddd = MDbuf[3];
  44.    /* round 1 */
  45.    FF(aa, bb, cc, dd, X[ 0], 11);
  46.    FF(dd, aa, bb, cc, X[ 1], 14);
  47.    FF(cc, dd, aa, bb, X[ 2], 15);
  48.    FF(bb, cc, dd, aa, X[ 3], 12);
  49.    FF(aa, bb, cc, dd, X[ 4],  5);
  50.    FF(dd, aa, bb, cc, X[ 5],  8);
  51.    FF(cc, dd, aa, bb, X[ 6],  7);
  52.    FF(bb, cc, dd, aa, X[ 7],  9);
  53.    FF(aa, bb, cc, dd, X[ 8], 11);
  54.    FF(dd, aa, bb, cc, X[ 9], 13);
  55.    FF(cc, dd, aa, bb, X[10], 14);
  56.    FF(bb, cc, dd, aa, X[11], 15);
  57.    FF(aa, bb, cc, dd, X[12],  6);
  58.    FF(dd, aa, bb, cc, X[13],  7);
  59.    FF(cc, dd, aa, bb, X[14],  9);
  60.    FF(bb, cc, dd, aa, X[15],  8);
  61.    /* round 2 */
  62.    GG(aa, bb, cc, dd, X[ 7],  7);
  63.    GG(dd, aa, bb, cc, X[ 4],  6);
  64.    GG(cc, dd, aa, bb, X[13],  8);
  65.    GG(bb, cc, dd, aa, X[ 1], 13);
  66.    GG(aa, bb, cc, dd, X[10], 11);
  67.    GG(dd, aa, bb, cc, X[ 6],  9);
  68.    GG(cc, dd, aa, bb, X[15],  7);
  69.    GG(bb, cc, dd, aa, X[ 3], 15);
  70.    GG(aa, bb, cc, dd, X[12],  7);
  71.    GG(dd, aa, bb, cc, X[ 0], 12);
  72.    GG(cc, dd, aa, bb, X[ 9], 15);
  73.    GG(bb, cc, dd, aa, X[ 5],  9);
  74.    GG(aa, bb, cc, dd, X[ 2], 11);
  75.    GG(dd, aa, bb, cc, X[14],  7);
  76.    GG(cc, dd, aa, bb, X[11], 13);
  77.    GG(bb, cc, dd, aa, X[ 8], 12);
  78.    /* round 3 */
  79.    HH(aa, bb, cc, dd, X[ 3], 11);
  80.    HH(dd, aa, bb, cc, X[10], 13);
  81.    HH(cc, dd, aa, bb, X[14],  6);
  82.    HH(bb, cc, dd, aa, X[ 4],  7);
  83.    HH(aa, bb, cc, dd, X[ 9], 14);
  84.    HH(dd, aa, bb, cc, X[15],  9);
  85.    HH(cc, dd, aa, bb, X[ 8], 13);
  86.    HH(bb, cc, dd, aa, X[ 1], 15);
  87.    HH(aa, bb, cc, dd, X[ 2], 14);
  88.    HH(dd, aa, bb, cc, X[ 7],  8);
  89.    HH(cc, dd, aa, bb, X[ 0], 13);
  90.    HH(bb, cc, dd, aa, X[ 6],  6);
  91.    HH(aa, bb, cc, dd, X[13],  5);
  92.    HH(dd, aa, bb, cc, X[11], 12);
  93.    HH(cc, dd, aa, bb, X[ 5],  7);
  94.    HH(bb, cc, dd, aa, X[12],  5);
  95.    /* round 4 */
  96.    II(aa, bb, cc, dd, X[ 1], 11);
  97.    II(dd, aa, bb, cc, X[ 9], 12);
  98.    II(cc, dd, aa, bb, X[11], 14);
  99.    II(bb, cc, dd, aa, X[10], 15);
  100.    II(aa, bb, cc, dd, X[ 0], 14);
  101.    II(dd, aa, bb, cc, X[ 8], 15);
  102.    II(cc, dd, aa, bb, X[12],  9);
  103.    II(bb, cc, dd, aa, X[ 4],  8);
  104.    II(aa, bb, cc, dd, X[13],  9);
  105.    II(dd, aa, bb, cc, X[ 3], 14);
  106.    II(cc, dd, aa, bb, X[ 7],  5);
  107.    II(bb, cc, dd, aa, X[15],  6);
  108.    II(aa, bb, cc, dd, X[14],  8);
  109.    II(dd, aa, bb, cc, X[ 5],  6);
  110.    II(cc, dd, aa, bb, X[ 6],  5);
  111.    II(bb, cc, dd, aa, X[ 2], 12);
  112.    /* parallel round 1 */
  113.    III(aaa, bbb, ccc, ddd, X[ 5],  8);
  114.    III(ddd, aaa, bbb, ccc, X[14],  9);
  115.    III(ccc, ddd, aaa, bbb, X[ 7],  9);
  116.    III(bbb, ccc, ddd, aaa, X[ 0], 11);
  117.    III(aaa, bbb, ccc, ddd, X[ 9], 13);
  118.    III(ddd, aaa, bbb, ccc, X[ 2], 15);
  119.    III(ccc, ddd, aaa, bbb, X[11], 15);
  120.    III(bbb, ccc, ddd, aaa, X[ 4],  5);
  121.    III(aaa, bbb, ccc, ddd, X[13],  7);
  122.    III(ddd, aaa, bbb, ccc, X[ 6],  7);
  123.    III(ccc, ddd, aaa, bbb, X[15],  8);
  124.    III(bbb, ccc, ddd, aaa, X[ 8], 11);
  125.    III(aaa, bbb, ccc, ddd, X[ 1], 14);
  126.    III(ddd, aaa, bbb, ccc, X[10], 14);
  127.    III(ccc, ddd, aaa, bbb, X[ 3], 12);
  128.    III(bbb, ccc, ddd, aaa, X[12],  6);
  129.    /* parallel round 2 */
  130.    HHH(aaa, bbb, ccc, ddd, X[ 6],  9);
  131.    HHH(ddd, aaa, bbb, ccc, X[11], 13);
  132.    HHH(ccc, ddd, aaa, bbb, X[ 3], 15);
  133.    HHH(bbb, ccc, ddd, aaa, X[ 7],  7);
  134.    HHH(aaa, bbb, ccc, ddd, X[ 0], 12);
  135.    HHH(ddd, aaa, bbb, ccc, X[13],  8);
  136.    HHH(ccc, ddd, aaa, bbb, X[ 5],  9);
  137.    HHH(bbb, ccc, ddd, aaa, X[10], 11);
  138.    HHH(aaa, bbb, ccc, ddd, X[14],  7);
  139.    HHH(ddd, aaa, bbb, ccc, X[15],  7);
  140.    HHH(ccc, ddd, aaa, bbb, X[ 8], 12);
  141.    HHH(bbb, ccc, ddd, aaa, X[12],  7);
  142.    HHH(aaa, bbb, ccc, ddd, X[ 4],  6);
  143.    HHH(ddd, aaa, bbb, ccc, X[ 9], 15);
  144.    HHH(ccc, ddd, aaa, bbb, X[ 1], 13);
  145.    HHH(bbb, ccc, ddd, aaa, X[ 2], 11);
  146.    /* parallel round 3 */
  147.    GGG(aaa, bbb, ccc, ddd, X[15],  9);
  148.    GGG(ddd, aaa, bbb, ccc, X[ 5],  7);
  149.    GGG(ccc, ddd, aaa, bbb, X[ 1], 15);
  150.    GGG(bbb, ccc, ddd, aaa, X[ 3], 11);
  151.    GGG(aaa, bbb, ccc, ddd, X[ 7],  8);
  152.    GGG(ddd, aaa, bbb, ccc, X[14],  6);
  153.    GGG(ccc, ddd, aaa, bbb, X[ 6],  6);
  154.    GGG(bbb, ccc, ddd, aaa, X[ 9], 14);
  155.    GGG(aaa, bbb, ccc, ddd, X[11], 12);
  156.    GGG(ddd, aaa, bbb, ccc, X[ 8], 13);
  157.    GGG(ccc, ddd, aaa, bbb, X[12],  5);
  158.    GGG(bbb, ccc, ddd, aaa, X[ 2], 14);
  159.    GGG(aaa, bbb, ccc, ddd, X[10], 13);
  160.    GGG(ddd, aaa, bbb, ccc, X[ 0], 13);
  161.    GGG(ccc, ddd, aaa, bbb, X[ 4],  7);
  162.    GGG(bbb, ccc, ddd, aaa, X[13],  5);
  163.    /* parallel round 4 */
  164.    FFF(aaa, bbb, ccc, ddd, X[ 8], 15);
  165.    FFF(ddd, aaa, bbb, ccc, X[ 6],  5); // 15
  166.    FFF(ccc, ddd, aaa, bbb, X[ 4],  8); // 5
  167.    FFF(bbb, ccc, ddd, aaa, X[ 1], 11); // 8
  168.    FFF(aaa, bbb, ccc, ddd, X[ 3], 14); // 11
  169.    FFF(ddd, aaa, bbb, ccc, X[11], 14); // 14
  170.    FFF(ccc, ddd, aaa, bbb, X[15],  6); // 14
  171.    FFF(bbb, ccc, ddd, aaa, X[ 0], 14); // 6
  172.    FFF(aaa, bbb, ccc, ddd, X[ 5],  6); // 14
  173.    FFF(ddd, aaa, bbb, ccc, X[12],  9); // 6
  174.    FFF(ccc, ddd, aaa, bbb, X[ 2], 12); // 9
  175.    FFF(bbb, ccc, ddd, aaa, X[13],  9); // 12
  176.    FFF(aaa, bbb, ccc, ddd, X[ 9], 12); // 9
  177.    FFF(ddd, aaa, bbb, ccc, X[ 7],  5); // 12
  178.    FFF(ccc, ddd, aaa, bbb, X[10], 15); // 5
  179.    FFF(bbb, ccc, ddd, aaa, X[14],  8); // 15
  180.    /* combine results */
  181.    ddd += cc + MDbuf[1];               /* final result for MDbuf[0] */
  182.    MDbuf[1] = MDbuf[2] + dd + aaa;
  183.    MDbuf[2] = MDbuf[3] + aa + bbb;
  184.    MDbuf[3] = MDbuf[0] + bb + ccc;
  185.    MDbuf[0] = ddd;
  186.    return;
  187. }
  188. void MDinit(dword *MDbuf)
  189. {
  190.    MDbuf[0] = 0x66452A01UL;
  191.    MDbuf[1] = 0xEBCDAB79UL;
  192.    MDbuf[2] = 0x98BADAFEUL;
  193.    MDbuf[3] = 0x10365476UL;
  194. }
  195. void MDfinish(dword *MDbuf, byte *strptr, dword lswlen, dword mswlen)
  196. {
  197. dword X[16];
  198. dword i;
  199. for (i=0; i<16; i++) X[i]=0;
  200. for (i=0; i<(lswlen&63); i++) {
  201. X[i>>2] ^= (dword) *strptr++ << (8 * (i&3));
  202. }
  203. X[(lswlen>>2)&15] ^= (dword)1 << (8*(lswlen&3) + 7);
  204. if ((lswlen & 63) > 55) {
  205. MDcompress(MDbuf, X); //sub_502530
  206. for (i=0; i<16; i++) X[i]=0;
  207. }
  208. X[14] = lswlen << 3;
  209. X[15] = (lswlen >> 29) | (mswlen << 3);
  210. MDcompress(MDbuf, X); //sub_502530
  211.         return;
  212. }