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

AltStyle によって変換されたページ (->オリジナル) /