• Welcome to Valhalla Legends Archive.
 

[C++] CDKeyHashing

Started by Eric, March 07, 2004, 06:09 PM

Previous topic - Next topic

Eric

I'm somewhat new to the C++ world, but I've been trying to write a CDKeyHashing function, and I can't seem to get it to return the proper hashed value.


BOOL _stdcall CDKeyHash(char *OutBuf, DWORD dwServerHashKey, DWORD dwProductId, DWORD dwValue1, DWORD dwValue2, DWORD dwHashKey) {
   DWORD dwHashBuffer[5];
   dwHashBuffer[0] = dwHashKey;
   dwHashBuffer[1] = dwServerHashKey;
   dwHashBuffer[2] = dwProductId;
   dwHashBuffer[3] = dwValue1;
   dwHashBuffer[4] = dwValue2;
   CalcHashBuf(dwHashBuffer, dwHashBuffer, 20);
   memcpy(OutBuf, dwHashBuffer, 20);
   return TRUE;
}

void _stdcall CalcHashBuf(unsigned long *hash, void *inbuf, int len) {
   char *buf = (char*)inbuf;
   int pos;
   int sublen;
   unsigned long hashbuf[0x10 + 5];
   hashbuf[0] = 0x67452301;
   hashbuf[1] = 0xEFCDAB89;
   hashbuf[2] = 0x98BADCFE;
   hashbuf[3] = 0x10325476;
   hashbuf[4] = 0xC3D2E1F0;
   for(pos=0; pos<len; pos+=0x40) {
      sublen = len - pos;
      if(sublen > 0x40)
         sublen = 0x40;
      memcpy(hashbuf+5, buf+pos, sublen);
      if(sublen<0x40)
         ZeroMemory((char*)(hashbuf+5)+sublen, 0x40-sublen);
      DataHash(hashbuf);
   }
   memcpy(hash, hashbuf, 5*4);
}

void _stdcall DataHash(unsigned long*param) {
   unsigned long buf[0x50];
   unsigned long dw, a, b, c, d, e, *p;
   int i;
   memcpy(buf, param+5, 0x40);
   for(i=0x10; i<0x50; i++) {
      dw = buf[i-0x10]^buf[i-0x8]^buf[i-0xe]^buf[i-0x3];
      buf[i] = (1>>(0x20-(unsigned char)dw)) | (1<<(unsigned char)dw);      
   }
   a = param[0];
   b = param[1];
   c = param[2];
   d = param[3];
   e = param[4];
   p = buf;
   i = 0x14;
   do {
      dw = ((a<<5) | (a>>0x1b)) + ((~b & d) | (c & b)) + e + *p++ + 0x5A827999;
      e = d;
      d = c;
      c = (b>>2)  | (b<<0x1e);
      b = a;
      a = dw;
   } while(--i);
   i = 0x14;
   do {
      dw = (d ^ c ^ b) + e + ((a<<5) | (a>>0x1b)) + *p++ + 0x6ED9EBA1;
      e = d;
      d = c;
      c = (b>>2) | (b<<0x1e);
      b = a;
      a = dw;
   } while(--i);
   i = 0x14;
   do {
      dw = ((c & b) | (d & c) | (d & b)) + e + ((a<<5) | (a>>0x1b)) + *p++ - 0x70E44324;
      e = d;
      d = c;
      c = (b>>2) | (b<<0x1e);
      b = a;
      a = dw;
   } while(--i);

   i = 0x14;
   do {
      dw = ((a<<5) | (a>>0x1b)) + e + (d ^ c ^ b) + *p++ - 0x359D3E2A;
      e = d;
      d = c;
      c = (b>>2) | (b<<0x1e);
      b = a;
      a = dw;
   } while(--i);
   param[0] += a;
   param[1] += b;
   param[2] += c;
   param[3] += d;
   param[4] += e;
}

Any help would be appreciated.

UserLoser.

#1
Try:

  dwHashBuffer[0] = dwHashKey;
  dwHashBuffer[1] = dwServerHashKey;
  dwHashBuffer[2] = dwProductId;
  dwHashBuffer[3] = dwValue1;
  dwHashBuffer[4] = 0;
  dwHashBuffer[5] = dwValue2;
  CalcHashBuf(dwHashBuffer, dwHashBuffer, 24);

Eric