35 lines
1001 B
C
35 lines
1001 B
C
|
#include "xtea.h"
|
||
|
#include<string.h>
|
||
|
#define TOUR 32
|
||
|
|
||
|
void encrypt_xtea(uint32_t v[2], uint32_t const key[4]) {
|
||
|
unsigned int i;
|
||
|
uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
|
||
|
for (i=0; i < TOUR; i++) {
|
||
|
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
|
||
|
sum += delta;
|
||
|
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
|
||
|
}
|
||
|
v[0]=v0; v[1]=v1;
|
||
|
}
|
||
|
void decrypt_xtea(uint32_t v[2], uint32_t const key[4]) {
|
||
|
unsigned int i;
|
||
|
uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*TOUR;
|
||
|
for (i=0; i < TOUR; i++) {
|
||
|
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
|
||
|
sum -= delta;
|
||
|
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
|
||
|
}
|
||
|
v[0]=v0; v[1]=v1;
|
||
|
}
|
||
|
uint64_t hash_block_xtea(char b[24])
|
||
|
{
|
||
|
uint32_t v[2];
|
||
|
uint32_t k[4];
|
||
|
memcpy(v,b,2*sizeof(uint32_t));
|
||
|
memcpy(k,b+2*sizeof(uint32_t),4*sizeof(uint32_t));
|
||
|
encrypt_xtea(v,k);
|
||
|
return ((uint64_t)v[0])<<32 | v[1];
|
||
|
|
||
|
}
|