X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fcrypto%2Fxtea%2Fxtea.c;fp=ccan%2Fcrypto%2Fxtea%2Fxtea.c;h=28435d6a97c09588e8642ba3f29efdfb304599b2;hb=e5fb923ba3735c758ef795eb69d5ee1c6f0a94e9;hp=0000000000000000000000000000000000000000;hpb=c36444e062622d97e4368670f5c50f0c482a3a95;p=ccan diff --git a/ccan/crypto/xtea/xtea.c b/ccan/crypto/xtea/xtea.c new file mode 100644 index 00000000..28435d6a --- /dev/null +++ b/ccan/crypto/xtea/xtea.c @@ -0,0 +1,34 @@ +/* CC0 license (public domain) - see LICENSE file for details */ +#include "xtea.h" + +/* Based on http://www.cix.co.uk/~klockstone/xtea.pdf, and the modernized + * source at https://en.wikipedia.org/wiki/XTEA */ + +/* Each round below represents two rounds, so we usee 32 not 64 here */ +#define NUM_DOUBLE_ROUNDS 32 + +uint64_t xtea_encipher(const struct xtea_secret *secret, uint64_t v) +{ + const uint32_t delta=0x9E3779B9; + uint32_t v0=(v>>32), v1=v, sum=0; + + for (int i=0; i < NUM_DOUBLE_ROUNDS; i++) { + v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + secret->u.u32[sum & 3]); + sum += delta; + v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + secret->u.u32[(sum>>11) & 3]); + } + return ((uint64_t)v0 << 32) | v1; +} + +uint64_t xtea_decipher(const struct xtea_secret *secret, uint64_t e) +{ + const uint32_t delta=0x9E3779B9; + uint32_t v0=(e>>32), v1=e, sum=delta*NUM_DOUBLE_ROUNDS; + + for (int i=0; i < NUM_DOUBLE_ROUNDS; i++) { + v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + secret->u.u32[(sum>>11) & 3]); + sum -= delta; + v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + secret->u.u32[sum & 3]); + } + return ((uint64_t)v0 << 32) | v1; +}