/* * Adapted from the block TEA reference code in the "Tea Extensions" paper by * Roger M. Needham and David J. Wheeler, which is available at: * http://www.cl.cam.ac.uk/ftp/users/djw3/xtea.ps */ #include "arch.h" #include "util.h" #include "btea.h" void btea(u32 *v, u32 *k, u32 len, int decode, int swap) { u32 e, p, sum = 0, z, diff; s32 q; q = 6 + 52 / len; if(decode) { sum = q * DELTA; if(swap) { while(sum != 0) { e = sum >> 2 & 3; for(p = len - 1; p > 0; p--) { z = swapu32(v[p - 1]); diff = ((z << 4 ^ z >> 5) + z) ^ (k[(p & 3) ^ e] + sum); v[p] = swapu32(swapu32(v[p]) - diff); } z = swapu32(v[len - 1]); diff = ((z << 4 ^ z >> 5) + z) ^ (k[(p & 3) ^ e] + sum); v[0] = swapu32(swapu32(v[0]) - diff); sum -= DELTA; } } else { while(sum != 0) { e = sum >> 2 & 3; for(p = len - 1; p > 0; p--) { z = v[p - 1]; v[p] -= ((z << 4 ^ z >> 5) + z) ^ (k[(p & 3) ^ e] + sum); } z = v[len - 1]; v[0] -= ((z << 4 ^ z >> 5) + z) ^ (k[(p & 3) ^ e] + sum); sum -= DELTA; } } } else { if(swap) { z = swapu32(v[len - 1]); while(q-- > 0) { sum += DELTA; e = sum >> 2 & 3; for(p = 0; p < len; p++) { diff = ((z << 4 ^ z >> 5) + z) ^ (k[(p & 3) ^ e] + sum); z = swapu32(v[p]) + diff; v[p] = swapu32(z); } } } else { z = v[len - 1]; while(q-- > 0) { sum += DELTA; e = sum >> 2 & 3; for(p = 0; p < len; p++) { z = v[p] += ((z << 4 ^ z >> 5) + z) ^ (k[(p & 3) ^ e] + sum); } } } } }