Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. #include <stdint.h>
  3.  
  4. void TEA_encrypt (uint32_t block[2], uint32_t key[4])
  5. {
  6.     /* set up */
  7.     uint32_t v0 = block[0];
  8.     uint32_t v1 = block[1];
  9.     uint32_t sum = 0;
  10.     uint32_t i;
  11.  
  12.     /* a key schedule constant */
  13.     uint32_t delta = 0x9e3779b9;
  14.  
  15.     /* cache key */
  16.     uint32_t k0 = key[0];
  17.     uint32_t k1 = key[1];
  18.     uint32_t k2 = key[2];
  19.     uint32_t k3 = key[3];
  20.  
  21.     /* basic cycle start */
  22.     for (i = 0; i < 32; i++)
  23.     {
  24.         sum += delta;
  25.         v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
  26.         v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
  27.     }
  28.     /* end cycle */
  29.  
  30.     block[0] = v0;
  31.     block[1] = v1;
  32. }
  33.  
  34. void TEA_decrypt (uint32_t* block, uint32_t* key)
  35. {
  36.     /* set up */
  37.     uint32_t v0 = block[0];
  38.     uint32_t v1 = block[1];
  39.     uint32_t sum = 0xC6EF3720;
  40.     uint32_t i;
  41.  
  42.     /* a key schedule constant */
  43.     uint32_t delta = 0x9e3779b9;
  44.  
  45.     /* cache key */
  46.     uint32_t k0 = key[0];
  47.     uint32_t k1 = key[1];
  48.     uint32_t k2 = key[2];
  49.     uint32_t k3 = key[3];        
  50.  
  51.     /* basic cycle start */
  52.     for (i = 0; i < 32; i++)
  53.     {                              
  54.         v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
  55.         v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
  56.         sum -= delta;                                  
  57.     }
  58.     /* end cycle */
  59.  
  60.     block[0] = v0;
  61.     block[1] = v1;
  62. }
  63.