/libnpk/external/xxtea/xxtea.c

http://npk.googlecode.com/ · C · 82 lines · 75 code · 7 blank · 0 comment · 13 complexity · 5f38bbda31d8abd511469ff7e9c7b7cd MD5 · raw file

  1. #include <stddef.h>
  2. #define DELTA 0x9e3779b9
  3. #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (k[(p&3)^e] ^ z)))
  4. #ifdef NPK_DEV
  5. void xxtea_encode(int* v, int* k)
  6. {
  7. unsigned int n = 2;
  8. unsigned int y, z, sum;
  9. unsigned int p, rounds, e;
  10. rounds = 6 + 52/n;
  11. sum = 0;
  12. z = v[n-1];
  13. do {
  14. sum += DELTA;
  15. e = (sum >> 2) & 3;
  16. for (p=0; p<n-1; p++) {
  17. y = v[p+1];
  18. z = v[p] += MX;
  19. }
  20. y = v[0];
  21. z = v[n-1] += MX;
  22. } while (--rounds);
  23. }
  24. void xxtea_encode_byte(char* v, int* k, int p)
  25. {
  26. char y[] = "XtEaNpK";
  27. *v = *v^y[p]^(char)(k[p%4]%0xFF);
  28. }
  29. void xxtea_encode_buffer(char* in_buffer, unsigned int in_size, int* key, int cipherRemains)
  30. {
  31. char *p;
  32. unsigned int remain = in_size % 8;
  33. unsigned int align_size = in_size - remain;
  34. for (p = in_buffer; p < in_buffer + align_size; p += 8)
  35. xxtea_encode( (int*)p, key);
  36. if( remain > 0 && cipherRemains )
  37. for (p = in_buffer + align_size; p < in_buffer + in_size; p += 1)
  38. xxtea_encode_byte( p, key, --remain );
  39. }
  40. #endif
  41. void xxtea_decode(int* v,int* k)
  42. {
  43. unsigned int n = 2;
  44. unsigned int y, z, sum;
  45. unsigned int p, rounds, e;
  46. rounds = 6 + 52/n;
  47. sum = rounds*DELTA;
  48. y = v[0];
  49. while (sum != 0) {
  50. e = (sum >> 2) & 3;
  51. for (p=n-1; p>0; p--) {
  52. z = v[p-1];
  53. y = v[p] -= MX;
  54. }
  55. z = v[n-1];
  56. y = v[0] -= MX;
  57. sum -= DELTA;
  58. }
  59. }
  60. void xxtea_decode_byte(char* v, int* k, int p)
  61. {
  62. char y[] = "XtEaNpK";
  63. *v = *v^(char)(k[p%4]%0xFF)^y[p];
  64. }
  65. void xxtea_decode_buffer(char* in_buffer, unsigned int in_size, int* key, int cipherRemains)
  66. {
  67. char *p;
  68. unsigned int remain = in_size % 8;
  69. unsigned int align_size = in_size - remain;
  70. for (p = in_buffer; p < in_buffer + align_size; p += 8)
  71. xxtea_decode( (int*)p, key);
  72. if( remain > 0 && cipherRemains )
  73. for (p = in_buffer + align_size; p < in_buffer + in_size; p += 1)
  74. xxtea_decode_byte( p, key, --remain );
  75. }