home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 7662 / gttool_src_bin.7z / gttool / src / crypt.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2014-08-15  |  3.1 KB  |  120 lines

  1. #include "crypt.h"
  2. #include "hash.h"
  3. #include "util.h"
  4.  
  5. void key_schedule(uint64_t* const k, const uint32_t initial_key, const int n)
  6. {
  7.     uint8_t* const kbuf = reinterpret_cast<uint8_t*>(k);
  8.  
  9.     uint32_t key = initial_key;
  10.     for (int i = 0; i < n; ++i) {
  11.         const uint8_t x = key & 0xFF;
  12.         key = (x << (n - 8)) | (key >> 8);
  13.         kbuf[i] = x;
  14.     }
  15.  
  16.     memcpy(kbuf + n, kbuf, n);
  17.     memcpy(kbuf + (n << 1), kbuf, (n << 1) & ~0x1);
  18.     memcpy(kbuf + (n << 2), kbuf, (n << 2) & ~0x3);
  19. }
  20.  
  21. uint32_t checksum(const void* const data, const size_t size)
  22. {
  23.     const uint32_t result = ~crc32_0x04c11db7(0, data, size);
  24.     return result;
  25. }
  26.  
  27. uint32_t shuffle_bits(const uint32_t data)
  28. {
  29.     uint32_t x = data;
  30.     uint32_t crc = 0;
  31.     for (int i = 0; i < 4; ++i) {
  32.         crc = (crc << 8) ^ kCRC32_TAB_0x04C11DB7[(rotl(x ^ crc, 10) & 0x3FC) >> 2];
  33.         x <<= 8;
  34.     }
  35.     return ~crc;
  36. }
  37.  
  38. uint32_t crypt_block(const uint32_t x, const uint32_t y)
  39. {
  40.     const uint32_t result = x ^ shuffle_bits(y);
  41.     return result;
  42. }
  43.  
  44. uint32_t xor_shift_loop(const uint32_t x, const uint32_t y)
  45. {
  46.     uint32_t result = x;
  47.     for (int i = 0; i < 32; ++i) {
  48.         const uint32_t upper_bit = result & 0x80000000u;
  49.         result <<= 1;
  50.         if (upper_bit)
  51.             result ^= y;
  52.     }
  53.     return result;
  54. }
  55.  
  56. uint32_t inversed_xor_shift_loop(const uint32_t x, const uint32_t y)
  57. {
  58.     const uint32_t result = ~xor_shift_loop(x, y);
  59.     return result;
  60. }
  61.  
  62. bool block_crypt(const void* const src, void* const dst, const size_t size)
  63. {
  64.     const uint32_t* src_block = static_cast<const uint32_t*>(src);
  65.     const uint32_t* const src_block_end = src_block + size / sizeof(uint32_t);
  66.     if (src_block + 1 >= src_block_end)
  67.         return false;
  68.     uint32_t* dst_block = static_cast<uint32_t*>(dst);
  69.  
  70.     uint32_t prev = host_to_big(*src_block++);
  71.     *dst_block++ = big_to_host(prev);
  72.  
  73.     while (src_block < src_block_end) {
  74.         const uint32_t cur = host_to_big(*src_block++);
  75.         *dst_block++ = big_to_host(crypt_block(cur, prev));
  76.         prev = cur;
  77.     }
  78.  
  79.     return true;
  80. }
  81.  
  82. void data_keygen(const char* seed, const uint32_t* const key, const uint32_t x, uint32_t* const out_key)
  83. {
  84.     uint32_t c0 = checksum(seed, strlen(seed)) ^ x;
  85.     uint32_t c1 = inversed_xor_shift_loop(c0, key[0]);
  86.     uint32_t c2 = inversed_xor_shift_loop(c1, key[1]);
  87.     uint32_t c3 = inversed_xor_shift_loop(c2, key[2]);
  88.     uint32_t c4 = inversed_xor_shift_loop(c3, key[3]);
  89.  
  90.     c1 &= 0x1FFFFu;
  91.     c2 &= 0x7FFFFu;
  92.     c3 &= 0x7FFFFFu;
  93.     c4 &= 0x1FFFFFFFu;
  94.  
  95.     out_key[0] = c1;
  96.     out_key[1] = c2;
  97.     out_key[2] = c3;
  98.     out_key[3] = c4;
  99. }
  100.  
  101. void data_crypt(const uint32_t* const key, const void* const src, void* const dst, const size_t size)
  102. {
  103.     uint32_t c1 = key[0];
  104.     uint32_t c2 = key[1];
  105.     uint32_t c3 = key[2];
  106.     uint32_t c4 = key[3];
  107.  
  108.     const uint8_t* src_byte = static_cast<const uint8_t*>(src);
  109.     const uint8_t* const src_byte_end = src_byte + size;
  110.     uint8_t* dst_byte = static_cast<uint8_t*>(dst);
  111.  
  112.     while (src_byte < src_byte_end) {
  113.         *dst_byte++ = (((c1 ^ c2) ^ *src_byte++) ^ (c3 ^ c4)) & 0xFF;
  114.         c1 = ((rotl(c1, 9) & 0x1FE00u) | (c1 >> 8));
  115.         c2 = ((rotl(c2, 11) & 0x7F800u) | (c2 >> 8));
  116.         c3 = ((rotl(c3, 15) & 0x7F8000u) | (c3 >> 8));
  117.         c4 = ((rotl(c4, 21) & 0x1FE00000u) | (c4 >> 8));
  118.     }
  119. }
  120.