diff options
Diffstat (limited to 'onetimebluh.c')
-rw-r--r-- | onetimebluh.c | 199 |
1 files changed, 187 insertions, 12 deletions
diff --git a/onetimebluh.c b/onetimebluh.c index f838db3..2aafbd6 100644 --- a/onetimebluh.c +++ b/onetimebluh.c @@ -1,22 +1,197 @@ -#include<stdio.h> -#include<stdlib.h> +#include <stdio.h> +#include <stdlib.h> +#include <getopt.h> +#include <openssl/rand.h> +#include <unistd.h> +#include <errno.h> +#include <error.h> + +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[]) { - FILE* uno = fopen(argv[1], "r"); - FILE* due = fopen(argv[2], "r"); - FILE* tre = fopen(argv[3], "w"); + 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(uno, "%c", &a); - fscanf(due, "%c", &b); + i = fscanf(mex, "%c", &a); + fscanf(keyx, "%c", &b); if(i != EOF) { - fprintf(tre, "%c", a^b); + fprintf(critt, "%c", a^b); } } - fclose(uno); - fclose(due); - fclose(tre); - return 0; + 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; } |