mirror of https://github.com/dirtbags/moth.git
Add TEA back in.
This commit is contained in:
parent
40e7560b38
commit
d8a3e98803
|
@ -1,49 +0,0 @@
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sysexits.h>
|
|
||||||
#include "arc4.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
struct arc4_ctx ctx;
|
|
||||||
|
|
||||||
/* Read key and initialize context */
|
|
||||||
{
|
|
||||||
uint8_t key[256];
|
|
||||||
size_t keylen = 0;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
if (argc == 2) {
|
|
||||||
if (! (f = fopen(argv[1], "r"))) {
|
|
||||||
perror(argv[0]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
f = fdopen(3, "r");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f) {
|
|
||||||
keylen = fread(key, 1, sizeof(key), f);
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == keylen) {
|
|
||||||
fprintf(stderr, "Usage: %s [KEYFILE] <PLAINTEXT\n", argv[0]);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
fprintf(stderr, "You can also pass in the key on fd 3; omit\n");
|
|
||||||
fprintf(stderr, "KEYFILE in this case.\n");
|
|
||||||
return EX_IOERR;
|
|
||||||
}
|
|
||||||
arc4_init(&ctx, key, (size_t)keylen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Encrypt */
|
|
||||||
while (1) {
|
|
||||||
int c = getchar();
|
|
||||||
|
|
||||||
if (EOF == c) break;
|
|
||||||
putchar(c ^ arc4_pad(&ctx));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,60 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "token.h"
|
|
||||||
|
|
||||||
/* This hopefully requires an LD_PRELOAD */
|
|
||||||
|
|
||||||
uint8_t const key[] = {0x94, 0xf2, 0x92, 0x45,
|
|
||||||
0x12, 0x44, 0x80, 0xe1,
|
|
||||||
0x95, 0x64, 0xcd, 0xe4,
|
|
||||||
0xff, 0x0a, 0x00, 0x10};
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
char token[200];
|
|
||||||
size_t tokenlen;
|
|
||||||
|
|
||||||
/* Do some bullshit. Override with:
|
|
||||||
*
|
|
||||||
* void strcmp(char *a, char *b)
|
|
||||||
* {
|
|
||||||
* return 0;
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
FILE *f = fopen("/dev/urandom", "r");
|
|
||||||
unsigned int seed;
|
|
||||||
char seed_str[50];
|
|
||||||
|
|
||||||
printf("Checking credentials...\n");
|
|
||||||
fread(&seed, sizeof(seed), 1, f);
|
|
||||||
sprintf(seed_str, "%d", seed);
|
|
||||||
if ((argc != 2) || strcmp(seed_str, argv[1])) {
|
|
||||||
printf("Ah ah ah! You didn't say the magic word!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tokenlen = read_token("ltraceme",
|
|
||||||
key, sizeof(key),
|
|
||||||
token, sizeof(token) - 1);
|
|
||||||
if (-1 == tokenlen) {
|
|
||||||
write(1, "Something is broken\nI can't read my token.\n", 43);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
token[tokenlen++] = '\0';
|
|
||||||
|
|
||||||
/* You could override this with:
|
|
||||||
*
|
|
||||||
* void printf(char *fmt, size_t len, char *buf)
|
|
||||||
* {
|
|
||||||
* if (fmt[0] == 'T') write(1, buf, len);
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
printf("Token length %u at %p.\n", (unsigned int)tokenlen, token);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
../../../include/token.c
|
|
|
@ -1 +0,0 @@
|
||||||
../../../include/token.h
|
|
|
@ -4,5 +4,7 @@ all: $(TARGETS)
|
||||||
|
|
||||||
arc4: CFLAGS=-DARC4_MAIN
|
arc4: CFLAGS=-DARC4_MAIN
|
||||||
|
|
||||||
|
tea: tea.o xxtea.o
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o $(TARGETS)
|
rm -f *.o $(TARGETS)
|
|
@ -0,0 +1,93 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sysexits.h>
|
||||||
|
#include "xxtea.h"
|
||||||
|
|
||||||
|
#define DUMPf(fmt, args...) fprintf(stderr, "%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args)
|
||||||
|
#define DUMP() DUMPf("")
|
||||||
|
#define DUMP_d(v) DUMPf("%s = %d", #v, v)
|
||||||
|
#define DUMP_x(v) DUMPf("%s = 0x%x", #v, v)
|
||||||
|
#define DUMP_s(v) DUMPf("%s = %s", #v, v)
|
||||||
|
#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v)
|
||||||
|
#define DUMP_p(v) DUMPf("%s = %p", #v, v)
|
||||||
|
|
||||||
|
#define min(a,b) (((a)<(b))?(a):(b))
|
||||||
|
|
||||||
|
int
|
||||||
|
usage(const char *prog)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: %s [-e] <PLAINTEXT\n", prog);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
fprintf(stderr, "You must pass in a key on fd 3 or in the environment variable KEY.\n");
|
||||||
|
return EX_USAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
uint8_t *buf = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
uint32_t key[4] = {0};
|
||||||
|
|
||||||
|
{
|
||||||
|
char *ekey = getenv("KEY");
|
||||||
|
|
||||||
|
if (ekey) {
|
||||||
|
memcpy(key, ekey, min(strlen(ekey), sizeof(key)));
|
||||||
|
} else {
|
||||||
|
read(3, key, sizeof(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
size_t pos = len;
|
||||||
|
ssize_t nret;
|
||||||
|
|
||||||
|
buf = realloc(buf, len + 4096);
|
||||||
|
if (! buf) {
|
||||||
|
perror("realloc");
|
||||||
|
return EX_OSERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
nret = read(0, buf + pos, 4096);
|
||||||
|
if (0 == nret) break;
|
||||||
|
if (-1 == nret) {
|
||||||
|
perror("read");
|
||||||
|
return EX_OSERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = pos + nret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argv[1] && (0 == strcmp(argv[1], "-e"))) {
|
||||||
|
if (0 == buf[len-1]) {
|
||||||
|
fprintf(stderr, "I can't cope with trailing NULs.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pad out with NUL */
|
||||||
|
while (len % 4 > 0) {
|
||||||
|
buf[len++] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tea_encode(key, (uint32_t *)buf, len/4);
|
||||||
|
} else {
|
||||||
|
if (len % 4) {
|
||||||
|
fprintf(stderr, "Incorrect padding.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
tea_decode(key, (uint32_t *)buf, len/4);
|
||||||
|
|
||||||
|
/* Remove padding. If your input had trailing NULs, you shouldn't
|
||||||
|
use this. */
|
||||||
|
while (0 == buf[len-1]) {
|
||||||
|
len -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
write(1, buf, len);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "xxtea.h"
|
||||||
|
|
||||||
|
#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<n-1; p++)
|
||||||
|
y = v[p+1], z = v[p] += MX;
|
||||||
|
y = v[0];
|
||||||
|
z = v[n-1] += MX;
|
||||||
|
} while (--rounds);
|
||||||
|
} else if (n < -1) { /* Decoding Part */
|
||||||
|
n = -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tea_encode(uint32_t const key[4], uint32_t *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
btea(buf, buflen, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tea_decode(uint32_t const key[4], uint32_t *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
btea(buf, -buflen, key);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef __XXTEA_H__
|
||||||
|
#define __XXTEA_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void tea_encode(uint32_t const key[4], uint32_t *buf, size_t buflen);
|
||||||
|
void tea_decode(uint32_t const key[4], uint32_t *buf, size_t buflen);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue