Test Vectors for TEA and XTEA

tean values
These are made by starting with a vector of 6 zeroes,
data followed by key, and coding with one cycle then 
moving the six cyclically so that n becomes n-1 modulo 6. 

We repeat with 2-64 cycles printing at powers of 2 in 
hexadecimal.  The process is reversed decoding back 
to the original zeroes which are printed.

  1        0 9e3779b9        0        0         0        0
  2 ec01a1de aaa0256d        0        0         0        0
  4 bc3a7de2 4e238eb9        0        0  ec01a1de 114f6d74
  8 31c5fa6c 241756d6 bc3a7de2 845846cf  2794a127 6b8ea8b8
 16 1d8e6992 9a478905 6a1d78c8  8c86d67  2a65bfbe b4bd6e46
 32 d26428af  a202283 27f917b1 c1da8993  60e2acaa a6eb923d
 64 7a01cbc9 b03d6068 62ee209f  69b7afc  376a8936 cdc9e923
  1        0        0        0        0         0        0

tea does the same but the number of iterations
is constant at 32

  1 41ea3a0a 94baa940        0        0         0        0
  2 4e8e7829 7d8236d8        0        0         0 41ea3a0a
  4 b84e28af b6b62088        0 41ea3a0a  4e8e7829 c88ba95e
  8 5ddf75d9 7a4ce68f b84e28af a0a47295  ed650698 1024eea0
 16 4ec5d2e2 5ada1d89 a9c3801a 32a1e654   8b63bb9 21410574
 32 7d2c6c57 7a6adb4d 69c53e0f 60388ada  df70a1f5 d9cb4e09
 64 2bb0f1b3 c023ed11 5c60bff2 7072d01c  4513c5eb 8f3a38ab
  1        0        0        0        0         0        0


The program used follows.

................................................................

/* make test vectors for tea, xtea */

void code(long *v, long *k);

void decode(long *v, long *k);

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

main(long argc, long *argv[])
{   static long pz[1024], n, m;

    repeat:

    for (n = 1; n < 65; n++)
    {   if (m)
        {   code(pz + n, pz + n + 2);
        }
        else
        {   tean(pz + n, pz + n + 2, n);
        }

        if (n == (n & -n))                         /* if n power of 2 */
        {   printf("\n%3d %8x %8x %8x %8x  %8x %8x",
                    n, pz[n], pz[n + 1], pz[n + 2], 
                    pz[n + 3], pz[n + 4], pz[n + 5]);
        }

        pz[n + 6] = pz[n];
    }

    for (n = 64; n > 0; n--)
    {   pz[n] = pz[n + 6];

        if (m == 0)
        {   tean(pz + n, pz + n + 2, -n);
        }
        else
        {   decode(pz + n, pz + n + 2);
        }
    }

    n = 1;

    printf("\n%3d %8x %8x %8x %8x  %8x %8x\n",
            n, pz[n], pz[n + 1], pz[n + 2], 
            pz[n + 3], pz[n + 4], pz[n + 5]);

    if (m++ == 0) 
    {   goto repeat;
    }

    exit(0);
}


/* TEA code and decode given below */

void code(long *v, long *k)
{   unsigned long y = v[0],
                  z = v[1],
                  sum = 0,		/* set up */
                  delta = 0x9e3779b9,
                  n = 32,
                  a = k[0],
                  b = k[1],
                  c = k[2],
                  d = k[3];

    while (n-- > 0)			/* basic cycle start */
    {   sum += delta;
        y   += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
        z   += (y << 4) + c ^ y + sum ^ (y >> 5) + d;		/* end cycle */
    }

    v[0] = y;
    v[1] = z;
}


void decode(long *v, long *k)
{   unsigned long n = 32,
                  sum,
                  y = v[0],
                  z = v[1],
                  delta = 0x9e3779b9,
                  a = k[0],
                  b = k[1],
                  c = k[2],
                  d = k[3];

    sum = delta << 5;
						/* start cycle */
    while (n-- > 0)
    {   z   -= (y << 4) + c ^ y + sum ^ (y >> 5) + d; 
        y   -= (z << 4) + a ^ z + sum ^ (z >> 5) + b;
        sum -= delta;
    }
						/* end cycle */
    v[0] = y;
    v[1] = z;
}



/* XTEA is a version of slightly improved tea.
   The plain or cypher text is in v[0], v[1].
   The key is in k[n], where n = 0 - 3,
   The number of coding cycles is given by N and
   the number of decoding cycles given by -N     */

tean(long *v, long *k, long N)      /* replaces TEA's code and decode */
{   unsigned long y = v[0],
                  z = v[1],
                  DELTA = 0x9e3779b9,
                  limit,
                  sum;

    if (N > 0)                  /* coding */
    {   limit = DELTA * N;
        sum = 0;

        while (sum != limit)
        {   y   += (z << 4 ^ z >> 5) + z ^ sum + k[sum & 3];
            sum += DELTA;
            z   += (y << 4 ^ y >> 5) + y ^ sum + k[sum >> 11 & 3];
        }
    }
    else                          /* decoding */
    {    sum = DELTA * (-N);

         while (sum)
         {   z   -= (y << 4 ^ y >> 5) + y ^ sum + k[sum >> 11 & 3];
             sum -= DELTA;
             y   -= (z << 4 ^ z >> 5) + z ^ sum + k[sum & 3];
         }
    }

    v[0] = y;
    v[1] = z;

    return;
}


© April 2002,  Keith Lockstone

© March 2011,  Keith Lockstone
With thanks to James Muir for his suggestions and corrections.

Comments welcome:  Keith

Back to home page block,cipher,block cipher,crypto,cryptography,cipher design,encryption,TEA,David Wheeler,czczcz,DJ Wheeler,David J Wheeler