#include #include #include #include #include #include #include void xor(int ed, char* mess, char* keyf, char* outp); void keyrand(int nb, char* outp); void help(char* av[]); int main(int argc, char* argv[]) { int opt = 1; int command = 0; int comm = 0; char* message = NULL; char* keyfile = NULL; char* output = NULL; int nbytes = -1; // must be resolved temporary workaround (ho sonno) while (opt) { int option_index = 0; static struct option options[] = { {"decrypt", required_argument, 0, 'd'}, {"encrypt", required_argument, 0, 'e'}, {"key-file", required_argument, 0, 'k'}, {"key-gen", no_argument, 0, 'g'}, {"help", no_argument, 0, 'h'}, {"nbytes", required_argument, 0, 'b'}, {"output", required_argument, 0, 'o'}, {0, 0, 0, 0}, }; if ((opt = getopt_long(argc, argv, "b:d:e:ghk:o:", options, &option_index)) == -1) break; switch (opt) { case 'b': nbytes = atoi(argv[optind-1]); break; case 'd': message = argv[optind-1]; command++; comm = 'd'; break; case 'e': message = argv[optind-1]; command++; comm = 'e'; break; case 'g': command++; comm = 'g'; break; case 'h': help(argv); command++; break; case 'k': keyfile = argv[optind-1]; break; case 'o': output = argv[optind-1]; break; case '?': break; default: printf("carachter code returned 0%o \n", opt); } } if (command == 0) { printf("No command called \n"); exit(EXIT_FAILURE); } else if (command > 1) { printf("Multiple commands called (print usage)\n"); exit(EXIT_FAILURE); } if (optind < argc) { printf("Too many arguments \n"); exit(EXIT_FAILURE); } if (comm == 'e' || comm == 'd') { if (keyfile == NULL) { printf("No key specified: exit! \n"); exit(EXIT_FAILURE); } xor(comm, message, keyfile, output); } else if (comm == 'g') { keyrand(nbytes, output); } exit(EXIT_SUCCESS); } void xor(int ed, char* mess, char* keyf, char* outp) { char* defenoutp = "critt"; char* defdeoutp = "decritt"; if (access(mess, F_OK) == -1) { error(errno, errno, mess); } else if (access(keyf, F_OK) == -1) { error(errno, errno, keyf); } if (outp == NULL) { if (ed == 'e') { printf("WARNING no output name specified using default value 'critt' \n"); outp = defenoutp; } else if (ed == 'd') { printf("WARNING no output name specified usign default value 'decritt' \n"); outp = defdeoutp; } } FILE* mex = fopen(mess, "r"); FILE* keyx = fopen(keyf, "r"); FILE* critt = fopen(outp, "w"); int i = 1; char a, b; while(i != EOF) { i = fscanf(mex, "%c", &a); fscanf(keyx, "%c", &b); if(i != EOF) { fprintf(critt, "%c", a^b); } } fclose(mex); fclose(keyx); fclose(critt); if (ed == 'e') { printf("Message successfully encrypted \n"); } else if (ed == 'd') { printf("Message successfully decrypted \n"); } return; } void keyrand(int nb, char* outp) { char* defoutp = "default.key"; if((nb == -1) && (outp == NULL)) { printf("WARNING no option specified usign default values... \n"); nb = 256; outp = defoutp; } if (nb < -1) { // orribile printf("Negative byte value inserted! \n"); printf("Exiting... \n"); exit(EXIT_FAILURE); } else if (nb != 0) { if(nb == -1) { printf("No byte number specified... using default value: 256 \n"); nb = 256; } unsigned char key[nb]; RAND_bytes(key, nb); if (outp == NULL) { outp = defoutp; printf("No output name specified... using default value: default.key \n"); } FILE* file = fopen(outp, "w"); fwrite(key, nb, 1, file); fclose(file); printf("Created key file %s of %d bytes \n", outp, nb); } else { printf("Byte number specified is 0. \n"); printf("Doing nothing! \n"); } return; } void help(char* av[]) { printf("ONETIMEBLUH USAGE: \n"); printf("%s [COMMAND] [OPTIONS] \n \n", av[0]); printf("COMMANDS: \n"); printf("-d, --decrypt=FILE decrypt message (input) same ad --encrypt, just for the feeling \n"); printf("-e, --encrypt=FILE encrypt message (input) \n"); printf("-h, --help print this help \n"); printf("-g, --key-gen create key file \n \n"); printf("OPTIONS \n"); printf("-k, --key-file=KEY_FILE use key (input) \n"); printf("-b, --nbytes=NUM number of bytes \n"); printf("-o, --output=FILE output name \n \n"); printf("Onetimebluh project repository at http://git.eigenlab.org/Seppia/onetimebluh \n"); return; }