From 6341b7a33b322ffb7413152393060c015316b27d Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Sun, 26 Jun 2011 13:52:02 +0200 Subject: [PATCH] First attempt at a simple xxtea en/de-crypter. --- tools/crypto/Makefile | 18 ++++ tools/crypto/test/in.1 | Bin 0 -> 64 bytes tools/crypto/test/out.1 | 1 + tools/crypto/xxtea.c | 194 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 213 insertions(+) create mode 100644 tools/crypto/Makefile create mode 100644 tools/crypto/test/in.1 create mode 100644 tools/crypto/test/out.1 create mode 100644 tools/crypto/xxtea.c diff --git a/tools/crypto/Makefile b/tools/crypto/Makefile new file mode 100644 index 0000000..3424b97 --- /dev/null +++ b/tools/crypto/Makefile @@ -0,0 +1,18 @@ +CC = gcc +LD = gcc +LDFLAGS = -Wall -O2 -std=c99 +EXES = xxtea +TESTFILE= test.out + +all: $(EXES) + +% : %.c + $(LD) $(LDFLAGS) -o $@ $< + +clean: + rm -f $(EXES) $(TESTFILE) + +tests: all + ./xxtea -o $(TESTFILE) test/in.1 + cmp $(TESTFILE) test/out.1 + $(RM) $(TESTFILE) diff --git a/tools/crypto/test/in.1 b/tools/crypto/test/in.1 new file mode 100644 index 0000000000000000000000000000000000000000..9017fd98b5f67d928cc64c59b2c025472ce74f8c GIT binary patch literal 64 LcmZQzpbP*206+i% literal 0 HcmV?d00001 diff --git a/tools/crypto/test/out.1 b/tools/crypto/test/out.1 new file mode 100644 index 0000000..3f9a7f9 --- /dev/null +++ b/tools/crypto/test/out.1 @@ -0,0 +1 @@ +…ãcÖŸº&ÃÁòÓ¬˜Âs›Ç)F(’†îôàû ŒCµÕû‡å•È–ÒtMTšÄ‹<×9 ÜSrE¥ëé&¹ \ No newline at end of file diff --git a/tools/crypto/xxtea.c b/tools/crypto/xxtea.c new file mode 100644 index 0000000..0c166e4 --- /dev/null +++ b/tools/crypto/xxtea.c @@ -0,0 +1,194 @@ +/* simple XXTEA en/decrypt utility + * + * BSD Licence + * + * btea function is from + * + * + * (c) by Sec 6/2011 + */ + +#include +#include +#include +#include + +#include +#include + +// default block size + +void btea(uint32_t *v, int n, uint32_t const k[4]); + +int main(int argc, char *argv[]) { + FILE *fp; + FILE *ofp; + + char *prog; + char c; /* for getopt */ + uint32_t k[4]; /* key */ + uint32_t *buf; + + /* Default values */ + char verbose=0; // be silent + k[0]=0; k[1]=0; k[2]=0; k[3]=0; + char block=16; + char *outfile=NULL; // outfile == infile + + /* init section */ + prog=argv[0]; + if(!prog)prog="xxtea"; + if(strrchr(prog,'/')){ + prog=strrchr(argv[0],'/'); + prog++; + } + + /* The big getopt loop */ + while ((c = getopt(argc, argv, "vhk:b:o:")) != EOF) + switch (c) { + case 'v': + verbose++; + break; + + case 'k': + // XXX: get key + break; + + case 'b': + block=atoi(optarg); + break; + + case 'o': + outfile=optarg; + break; + + case 'h': + default: + fprintf(stderr, "Usage: %s [options] filename\n\n" +"This program en/decrypts a file with the XXTEA algorithm\n" +"\n\n" +"-v Be verbose (-v -v = even more)\n" +"-o file Output to . (Default: overwrite input file)\n" +"-k key 128bit hex key. [Not yet implemented]\n" +"-b block Set blocksize. (Default: file size)\n" +"-h This help\n\n" +"\n",prog); + exit(255); + + } + + argc -= optind; argv += optind; + + if (argc !=1){ + fprintf(stderr,"Error: No filename given!\n"); + exit(254); + }; + + if(outfile){ + if ((fp = fopen(argv[0],"rb")) == NULL){ + fprintf(stderr,"Error: Can't open file %s\n",argv[0]); + exit(253); + } + if ((ofp = fopen(outfile,"wb")) == NULL){ + fprintf(stderr,"Error: Can't open file %s\n",argv[0]); + exit(253); + } + }else{ + if ((fp = fopen(argv[0],"r+b")) == NULL){ + fprintf(stderr,"Error: Can't open file %s\n",argv[0]); + exit(253); + } + ofp=fp; + }; + + if(block==0){ + fseek(fp, 0L, SEEK_END); + block = ftell(fp)/sizeof(*buf); // XXX: padding! + fseek(fp, 0L, SEEK_SET); + }; + buf=malloc(sizeof(*buf)*block); + + if(!buf){ + fprintf(stderr,"Error: malloc() failed.\n"); + }; + + int cnt; + if (verbose) + fprintf(stderr,"Encrypting: "); + + do{ + cnt=fread(buf,sizeof(*buf),block,fp); // XXX: deal with non-block-sized? + + if(cnt<0){ + fprintf(stderr, "Error: read failed\n"); + exit(253); + }; + + if(verbose) + fprintf(stderr,"cnt=%d:",cnt); +/* if(cnt%sizeof(*buf)!=0){ + fprintf(stderr,"Whoops. needs padding: cnt=%d, mod=%d\n",cnt,cnt%sizeof(*buf)); + }; */ + + btea(buf, cnt, k); + + if(!outfile) // in-place crypting... + if (fseek(fp,-cnt*sizeof(*buf),SEEK_CUR) != 0){ + fprintf(stderr, "Error: Seek failed\n"); + exit(253); + } + + if (fwrite(buf,sizeof(*buf),cnt,ofp) != cnt){ + fprintf(stderr, "Error: CRC write failed\n"); + exit(253); + } + if(verbose) fprintf(stderr,".\n"); + }while(cnt==block); + + if(verbose) + fprintf(stderr,"done\n"); + + fclose(fp); + + if(outfile) + fclose(ofp); + + return 0; +} + +#define DELTA 0x9e3779b9 +#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (k[(p&3)^e] ^ z))) + +void btea(uint32_t *v, int n, uint32_t const k[4]) { + uint32_t y, z, sum; + unsigned p, rounds, e; + if (n > 1) { /* Coding Part */ + rounds = 6 + 52/n; + sum = 0; + z = v[n-1]; + do { + sum += DELTA; + e = (sum >> 2) & 3; + for (p=0; p> 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); + } +}