xtea.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis
  2. *
  3. * LibTomCrypt is a library that provides various cryptographic
  4. * algorithms in a highly modular and flexible manner.
  5. *
  6. * The library is free for all purposes without any express
  7. * guarantee it works.
  8. *
  9. * Tom St Denis, [email protected], http://libtomcrypt.org
  10. */
  11. #include "mycrypt.h"
  12. #ifdef XTEA
  13. const struct _cipher_descriptor xtea_desc =
  14. {
  15. "xtea",
  16. 1,
  17. 16, 16, 8, 32,
  18. &xtea_setup,
  19. &xtea_ecb_encrypt,
  20. &xtea_ecb_decrypt,
  21. &xtea_test,
  22. &xtea_keysize
  23. };
  24. int xtea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
  25. {
  26. unsigned long x, sum, K[4];
  27. _ARGCHK(key != NULL);
  28. _ARGCHK(skey != NULL);
  29. /* check arguments */
  30. if (keylen != 16) {
  31. return CRYPT_INVALID_KEYSIZE;
  32. }
  33. if (num_rounds != 0 && num_rounds != 32) {
  34. return CRYPT_INVALID_ROUNDS;
  35. }
  36. /* load key */
  37. LOAD32L(K[0], key+0);
  38. LOAD32L(K[1], key+4);
  39. LOAD32L(K[2], key+8);
  40. LOAD32L(K[3], key+12);
  41. for (x = sum = 0; x < 32; x++) {
  42. skey->xtea.A[x] = (sum + K[sum&3]) & 0xFFFFFFFFUL;
  43. sum = (sum + 0x9E3779B9UL) & 0xFFFFFFFFUL;
  44. skey->xtea.B[x] = (sum + K[(sum>>11)&3]) & 0xFFFFFFFFUL;
  45. }
  46. #ifdef CLEAN_STACK
  47. zeromem(&K, sizeof(K));
  48. #endif
  49. return CRYPT_OK;
  50. }
  51. void xtea_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key)
  52. {
  53. unsigned long y, z;
  54. int r;
  55. _ARGCHK(pt != NULL);
  56. _ARGCHK(ct != NULL);
  57. _ARGCHK(key != NULL);
  58. LOAD32L(y, &pt[0]);
  59. LOAD32L(z, &pt[4]);
  60. for (r = 0; r < 32; r += 4) {
  61. y = (y + ((((z<<4)^(z>>5)) + z) ^ key->xtea.A[r])) & 0xFFFFFFFFUL;
  62. z = (z + ((((y<<4)^(y>>5)) + y) ^ key->xtea.B[r])) & 0xFFFFFFFFUL;
  63. y = (y + ((((z<<4)^(z>>5)) + z) ^ key->xtea.A[r+1])) & 0xFFFFFFFFUL;
  64. z = (z + ((((y<<4)^(y>>5)) + y) ^ key->xtea.B[r+1])) & 0xFFFFFFFFUL;
  65. y = (y + ((((z<<4)^(z>>5)) + z) ^ key->xtea.A[r+2])) & 0xFFFFFFFFUL;
  66. z = (z + ((((y<<4)^(y>>5)) + y) ^ key->xtea.B[r+2])) & 0xFFFFFFFFUL;
  67. y = (y + ((((z<<4)^(z>>5)) + z) ^ key->xtea.A[r+3])) & 0xFFFFFFFFUL;
  68. z = (z + ((((y<<4)^(y>>5)) + y) ^ key->xtea.B[r+3])) & 0xFFFFFFFFUL;
  69. }
  70. STORE32L(y, &ct[0]);
  71. STORE32L(z, &ct[4]);
  72. }
  73. void xtea_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key)
  74. {
  75. unsigned long y, z;
  76. int r;
  77. _ARGCHK(pt != NULL);
  78. _ARGCHK(ct != NULL);
  79. _ARGCHK(key != NULL);
  80. LOAD32L(y, &ct[0]);
  81. LOAD32L(z, &ct[4]);
  82. for (r = 31; r >= 0; r -= 4) {
  83. z = (z - ((((y<<4)^(y>>5)) + y) ^ key->xtea.B[r])) & 0xFFFFFFFFUL;
  84. y = (y - ((((z<<4)^(z>>5)) + z) ^ key->xtea.A[r])) & 0xFFFFFFFFUL;
  85. z = (z - ((((y<<4)^(y>>5)) + y) ^ key->xtea.B[r-1])) & 0xFFFFFFFFUL;
  86. y = (y - ((((z<<4)^(z>>5)) + z) ^ key->xtea.A[r-1])) & 0xFFFFFFFFUL;
  87. z = (z - ((((y<<4)^(y>>5)) + y) ^ key->xtea.B[r-2])) & 0xFFFFFFFFUL;
  88. y = (y - ((((z<<4)^(z>>5)) + z) ^ key->xtea.A[r-2])) & 0xFFFFFFFFUL;
  89. z = (z - ((((y<<4)^(y>>5)) + y) ^ key->xtea.B[r-3])) & 0xFFFFFFFFUL;
  90. y = (y - ((((z<<4)^(z>>5)) + z) ^ key->xtea.A[r-3])) & 0xFFFFFFFFUL;
  91. }
  92. STORE32L(y, &pt[0]);
  93. STORE32L(z, &pt[4]);
  94. }
  95. int xtea_test(void)
  96. {
  97. #ifndef LTC_TEST
  98. return CRYPT_NOP;
  99. #else
  100. static const unsigned char key[16] =
  101. { 0x78, 0x56, 0x34, 0x12, 0xf0, 0xcd, 0xcb, 0x9a,
  102. 0x48, 0x37, 0x26, 0x15, 0xc0, 0xbf, 0xae, 0x9d };
  103. static const unsigned char pt[8] =
  104. { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  105. static const unsigned char ct[8] =
  106. { 0x75, 0xd7, 0xc5, 0xbf, 0xcf, 0x58, 0xc9, 0x3f };
  107. unsigned char tmp[2][8];
  108. symmetric_key skey;
  109. int err, y;
  110. if ((err = xtea_setup(key, 16, 0, &skey)) != CRYPT_OK) {
  111. return err;
  112. }
  113. xtea_ecb_encrypt(pt, tmp[0], &skey);
  114. xtea_ecb_decrypt(tmp[0], tmp[1], &skey);
  115. if (memcmp(tmp[0], ct, 8) != 0 || memcmp(tmp[1], pt, 8) != 0) {
  116. return CRYPT_FAIL_TESTVECTOR;
  117. }
  118. /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */
  119. for (y = 0; y < 8; y++) tmp[0][y] = 0;
  120. for (y = 0; y < 1000; y++) xtea_ecb_encrypt(tmp[0], tmp[0], &skey);
  121. for (y = 0; y < 1000; y++) xtea_ecb_decrypt(tmp[0], tmp[0], &skey);
  122. for (y = 0; y < 8; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
  123. return CRYPT_OK;
  124. #endif
  125. }
  126. int xtea_keysize(int *desired_keysize)
  127. {
  128. _ARGCHK(desired_keysize != NULL);
  129. if (*desired_keysize < 16) {
  130. return CRYPT_INVALID_KEYSIZE;
  131. }
  132. *desired_keysize = 16;
  133. return CRYPT_OK;
  134. }
  135. #endif