/* From: https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm */ #include void encrypt (uint32_t* v, uint32_t* k) { uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */ uint32_t delta=0x9e3779b9; /* a key schedule constant */ uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */ for (i=0; i < 32; i++) { /* basic cycle start */ uint32_t tmp_a, tmp_b, tmp_c; sum += delta; tmp_a = (v1<<4) + k0; tmp_b = v1 + sum; tmp_c = (v1>>5) + k1; v0 += tmp_a ^ tmp_b ^ tmp_c; tmp_a = (v0<<4) + k2; tmp_b = v0 + sum; tmp_c = (v0>>5) + k3; v1 += tmp_a ^ tmp_b ^ tmp_c; } /* end cycle */ v[0]=v0; v[1]=v1; } void decrypt (uint32_t* v, uint32_t* k) { uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* set up */ uint32_t delta=0x9e3779b9; /* a key schedule constant */ uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */ for (i=0; i<32; i++) { /* basic cycle start */ uint32_t tmp_a, tmp_b, tmp_c; tmp_a = (v0<<4) + k2; tmp_b = v0 + sum; tmp_c = (v0>>5) + k3; v1 -= tmp_a ^ tmp_b ^ tmp_c; tmp_a = (v1<<4) + k0; tmp_b = v1 + sum; tmp_c = (v1>>5) + k1; v0 -= tmp_a ^ tmp_b ^ tmp_c; sum -= delta; } /* end cycle */ v[0]=v0; v[1]=v1; }