diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | README.rst | 15 | ||||
-rw-r--r-- | main.c | 53 |
3 files changed, 72 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0d33524 --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +CCOPTS = --std=c99 -Wall -Werror -O2 + +all: + cc $(CCOPTS) -o kcpasswd main.c diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6122cb7 --- /dev/null +++ b/README.rst @@ -0,0 +1,15 @@ +README +====== + +The MacOS ``/etc/kcpassword`` file controls logins + +Usage +----- + +To encrypt a password:: + + kcpasswd <password> + +To decrypt a kcpassword file:: + + kcpasswd /path/to/file @@ -0,0 +1,53 @@ +#include <stdio.h> +#include <string.h> + +#define MAXLEN 256 + +int readfile(char* path, char* buf) { + FILE* fd; + fd = fopen(path, "r"); + if(!fd) + return -1; + fgets(buf, MAXLEN, fd); + fclose(fd); + return 0; +} + +void applexor(char* msg, char* out) { + int keys[] = {125, 137, 82, 35, 210, 188, 221, 234, 163, 185, 31}; + int i = 0; + + // Encrypt/decrypt (xor) + for(i=0; msg[i] != '\0'; i++) + out[i] = msg[i] ^ keys[i % 11]; + + // If the previous char wasn't a null byte, we are likely encrypting not + // decrypting, so add a null byte. + if(out[i-1] != '\0') { + out[i] = '\0' ^ keys[i % 11]; + i++; + } + + // Append until we hit a multiple of 12 + for(; i%12 != 0; i++) + out[i] = msg[i%strlen(msg)] ^ keys[i % 11]; + out[i] = '\0' ; +} + +int main(int argc, char* argv[]) { + char in[MAXLEN]; + char out[MAXLEN]; + if(argc == 1) { + printf("Must provide path to file or a password to encrypt\n"); + return 1; + } + + // If the file can't be opened, try to use the "path" as a password + if(readfile(argv[1], in) == -1) + strcpy(in, argv[1]); + + applexor(in, out); + + printf("%s\n", out); + return 0; +} |