crashtest-r0ket/tools/crypto/xxtea.c

86 lines
1.8 KiB
C
Raw Permalink Normal View History

/* simple XXTEA en/decrypt utility
*
* BSD Licence
*
* btea function is from
2011-08-02 22:57:09 +00:00
* <https://secure.wikim
* edia.org/wikipedia/en/wiki/XXTEA#Reference_code>
*
* (c) by Sec <sec@42.org> 6/2011
*/
#include <stdint.h>
2011-08-01 17:32:32 +00:00
#include "xxtea.h"
2011-08-02 22:57:09 +00:00
#include <arpa/inet.h>
2011-08-01 17:32:32 +00:00
void htonlp(uint32_t *v, uint8_t n)
{
while(n--){
v[n] = htonl(v[n]);
}
}
2011-08-01 17:32:32 +00:00
void xxtea_cbcmac(uint32_t mac[4], uint32_t *data,
uint32_t len, uint32_t const key[4])
{
if( len & 0x03 )
return;
mac[0]=0;mac[1]=0;mac[2]=0;mac[3]=0;
for(int i=0; i<len;){
mac[0] ^= data[i++];
mac[1] ^= data[i++];
mac[2] ^= data[i++];
mac[3] ^= data[i++];
xxtea_encode_words(mac, 4, key);
}
}
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (k[(p&3)^e] ^ z)))
2011-08-01 17:32:32 +00:00
void xxtea_encode_words(uint32_t *v, int n, uint32_t const k[4])
{
2011-08-03 06:58:27 +00:00
//if(k[0] == 0 && k[1] == 0 && k[2] == 0 && k[3] == 0) return;
uint32_t y, z, sum;
unsigned p, rounds, e;
2011-08-01 17:32:32 +00:00
htonlp(v ,n);
rounds = 6 + 52/n;
sum = 0;
z = v[n-1];
do {
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++) {
y = v[p+1];
z = v[p] += MX;
}
y = v[0];
2011-08-01 17:32:32 +00:00
z = v[n-1] += MX;
} while (--rounds);
htonlp(v ,n);
}
2011-06-26 12:09:32 +00:00
2011-08-01 17:32:32 +00:00
void xxtea_decode_words(uint32_t *v, int n, uint32_t const k[4])
{
2011-08-03 06:58:27 +00:00
//if(k[0] == 0 && k[1] == 0 && k[2] == 0 && k[3] == 0) return;
2011-08-01 17:32:32 +00:00
uint32_t y, z, sum;
unsigned p, rounds, e;
htonlp(v ,n);
rounds = 6 + 52/n;
sum = rounds*DELTA;
y = v[0];
do {
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--) {
z = v[p-1];
y = v[p] -= MX;
}
z = v[n-1];
y = v[0] -= MX;
} while ((sum -= DELTA) != 0);
htonlp(v ,n);
2011-06-26 12:09:32 +00:00
}
2011-08-01 17:32:32 +00:00