diff --git a/packages/playfair/playfair.mk b/packages/playfair/playfair.mk new file mode 100644 index 0000000..8604ea8 --- /dev/null +++ b/packages/playfair/playfair.mk @@ -0,0 +1,19 @@ +PLAYFAIR_PKGDIR = $(TARGET)/playfair +PLAYFAIR_BUILDDIR = $(BUILD)/playfair + +playfair-install: playfair-build + mkdir -p $(PLAYFAIR_PKGDIR)/bin/ + + $(call COPYTREE, packages/playfair/service, $(PLAYFAIR_PKGDIR)/service) + + cp packages/playfair/tokens.txt $(PLAYFAIR_PKGDIR)/ + cp packages/playfair/src/playfair $(PLAYFAIR_PKGDIR)/bin/ + +playfair-clean: + rm -rf $(PLAYFAIR_PKGDIR) $(PLAYFAIR_BUILDDIR) + $(MAKE) -C packages/playfair/src clean + +playfair-build: + $(MAKE) -C packages/playfair/src build + +PACKAGES += playfair diff --git a/packages/playfair/service/playfair/ip.txt b/packages/playfair/service/playfair/ip.txt new file mode 100644 index 0000000..f4f0fdd --- /dev/null +++ b/packages/playfair/service/playfair/ip.txt @@ -0,0 +1 @@ +fd84:b410:3441::529/64 diff --git a/packages/playfair/service/playfair/log/run b/packages/playfair/service/playfair/log/run new file mode 100755 index 0000000..1e7bd9d --- /dev/null +++ b/packages/playfair/service/playfair/log/run @@ -0,0 +1,3 @@ +#! /bin/sh + +exec svlogd -tt $PWD diff --git a/packages/playfair/service/playfair/run b/packages/playfair/service/playfair/run new file mode 100755 index 0000000..ced4843 --- /dev/null +++ b/packages/playfair/service/playfair/run @@ -0,0 +1,9 @@ +#! /bin/sh -e + +exec 2>&1 + +IP=$(cat ip.txt) +ip addr add $IP dev eth0 || true + +exec tcpsvd -u nobody ${IP%/*} 1013 /opt/playfair/bin/playfair + diff --git a/packages/playfair/src/Makefile b/packages/playfair/src/Makefile new file mode 100644 index 0000000..66489f7 --- /dev/null +++ b/packages/playfair/src/Makefile @@ -0,0 +1,4 @@ +build: playfair + +clean: + rm -f playfair \ No newline at end of file diff --git a/packages/playfair/src/playfair.c b/packages/playfair/src/playfair.c new file mode 100644 index 0000000..abd1667 --- /dev/null +++ b/packages/playfair/src/playfair.c @@ -0,0 +1,196 @@ +#include +#include +#include +#include + +#define TRUE 1 +#define FALSE 0 + +// finds the index of a character in the index +// returns index or -1 +int +indexkey(char* key, char c) { + int i; + + for(i=0; i < 25; i++) { + if (key[i] == c) { + //printf("'%d' -> %d\n", c, i); + return i; + } + } + return -1; +} + +// makes sure everything is lowercase or a space +void +strtolower(char* s, int len) { + int i; + + for(i = 0; i < len; i++) { + s[i] = tolower(s[i]); + if (s[i] < 'a' || s[i] > 'z') { + s[i] = ' '; + } + } +} + +// +// makes a key +char * +make_key(char* s, int len) { + strtolower(s, len); + char alph[] = "abcdefghijklmnopqrstuvwxyz"; + char* key = (char *) malloc(26 * sizeof(char)); + key[26] = '\0'; + int keylen = 0; + int i; + + // initial dump + for(i=0; i< len; i++) { + if( s[i] != ' ' && alph[s[i]-97] != ' ' && s[i] != 'q') { + key[keylen] = s[i]; + keylen++; + alph[s[i]-97] = ' '; + } + } + + // add extra chars + for (i=0; i < 27; i++) { + if (alph[i] != ' ' && alph[i] != 'q') { + key[keylen] = alph[i]; + keylen++; + alph[i] = ' '; + } + } + + return key; +} + + +// double checks for duplicate chars in string +int +isdup(char* s, int len) { + int i, j; + + for(i = 0; i < len; i++) { + for(j = i+1; j < len; j++ ) { + if (s[i] == s[j]) { + return 1; + } + } + } + return 0; +} + +// does the swapping of two characters +// assuming input is already sanitized +void +swapchar(char* key, char* plain) { + int i0, i1; + i0 = indexkey(key, plain[0]); + i1 = indexkey(key, plain[1]); + + // will hit this with double null, or double x + if (i0 == i1){ + // so pass + // vertical case + } else if (i0%5 == i1%5) { + plain[0] = key[(i0+5)%25]; + plain[1] = key[(i1+5)%25]; + // horizontal case + } else if (i0/5 == i1/5) { + plain[0] = key[(i0/5)*5 + (i0+1)%5]; + plain[1] = key[(i1/5)*5 + (i1+1)%5]; + // diagonal case + } else { + int b0 = i0%5; + int b1 = i1%5; + int diff; + if (b0 > b1) { + diff = b0 - b1; + plain[0] = key[i0-diff]; + plain[1] = key[i1+diff]; + } else { + diff = b1 - b0; + plain[0] = key[i0+diff]; + plain[1] = key[i1-diff]; + } + } + return; +} + +void +printcrap(char* buf){ + printf("%c%c ", buf[0]-32, buf[1]-32); +} + +void +run(char* key) { + char buf[3]; + char tmp; + int existing = FALSE; + + buf[2] = 0; + + while (TRUE) { + // read some crap in + tmp = getchar(); + if (tmp == 'q') { + tmp = 'x'; + } + if (tmp == EOF) { + if(existing) { + buf[1] = 'x'; + swapchar(key, buf); + printcrap(buf); + existing = FALSE; + } else { + return; + } + } else if (tmp == '\n') { + if(existing) { + buf[1] = 'x'; + swapchar(key, buf); + printcrap(buf); + printf("\n"); + fflush(stdout); + existing = FALSE; + } + } else if (91 <= tmp && tmp <= 122) { + if (existing) { + if (tmp == buf[0]) { + buf[1] = 'x'; + swapchar(key, buf); + printcrap(buf); + buf[0] = tmp; + } else { + buf[1] = tmp; + swapchar(key, buf); + printcrap(buf); + existing = FALSE; + } + } else { + buf[0] = tmp; + existing = TRUE; + } + } else { + //printf("\nOnly [a-z\\n]\n"); + //fflush(stdout); + } + } +} + + +int +main() { + // Unusual token, since it has to satisfy some strict requirements. + char key[] = "netkutalbcdfgrisox"; + int len = strlen(key); + char * ckey = make_key(key, len); + + // All I know about trigraphs is that the gcc manual says I don't want + // to know about trigraphs. + printf("The key is the token. ???:????\?-???\?-????\n"); + fflush(stdout); + run(ckey); +} diff --git a/packages/playfair/tokens.txt b/packages/playfair/tokens.txt new file mode 100644 index 0000000..c92cbfc --- /dev/null +++ b/packages/playfair/tokens.txt @@ -0,0 +1 @@ +net:kutal-bcdfg-risox