diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/onetimebluh.c | 126 |
1 files changed, 116 insertions, 10 deletions
diff --git a/src/onetimebluh.c b/src/onetimebluh.c index 0823f4d..0d3d324 100644 --- a/src/onetimebluh.c +++ b/src/onetimebluh.c @@ -1,5 +1,6 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <getopt.h> #include <openssl/rand.h> #include <unistd.h> @@ -8,6 +9,7 @@ void xor(int ed, char* mess, char* keyf, char* outp); /* operates the bitwise XOR between mess and keyf and puts the output to outp */ void keyrand(int nb, char* outp); /* generates random numbers using RAND_bytes from openssl and puts them into outp */ +void bluh(int c, char* mess, char* outp); /* performs the binary dump of the input file and prints that to outp */ void help(char* av[]); /* prints the help message */ int main(int argc, char* argv[]) { @@ -27,6 +29,7 @@ int main(int argc, char* argv[]) { while (opt) { int option_index = 0; static struct option options[] = { + {"bluh", required_argument, 0, 'b'}, {"decrypt", required_argument, 0, 'd'}, {"encrypt", required_argument, 0, 'e'}, {"key-file", required_argument, 0, 'k'}, @@ -35,24 +38,33 @@ int main(int argc, char* argv[]) { {"nbytes", required_argument, 0, 'n'}, {"output", required_argument, 0, 'o'}, {"tear-page", no_argument, 0, 't'}, + {"uhbl", required_argument, 0, 'u'}, {0, 0, 0, 0}, }; - if ((opt = getopt_long(argc, argv, "d:e:ghk:n:o:t", options, &option_index)) == -1) + if ((opt = getopt_long(argc, argv, "b:d:e:ghk:n:o:tu:", options, &option_index)) == -1) break; switch (opt) { + case 'b': + message = argv[optind-1]; + if (access(message, F_OK) == -1) { /* look at next comment */ + error(errno, errno, message); + } + command ++; + comm = 'b'; + break; case 'd': message = argv[optind-1]; - command++; - comm = 'u'; + command ++; + comm = 'r'; break; case 'e': message = argv[optind-1]; if (access(message, F_OK) == -1) { /* checks the existence of the file and eventually exits */ error(errno, errno, message); } - command++; + command ++; comm = 'e'; break; case 'g': @@ -61,11 +73,11 @@ int main(int argc, char* argv[]) { break; case 'h': help(argv); - command++; + command ++; break; case 'k': keyfile = argv[optind-1]; - if (access(keyfile, F_OK) == -1) { /* look at the comment before */ + if (access(keyfile, F_OK) == -1) { /* look at the previous comment */ error(errno, errno, keyfile); } break; @@ -78,6 +90,14 @@ int main(int argc, char* argv[]) { case 't': tear = 1; break; + case 'u': + message = argv[optind-1]; + if (access(message, F_OK) == -1) { /* just guess */ + error(errno, errno, message); + } + command ++; + comm = 'u'; + break; case '?': break; default: @@ -103,7 +123,7 @@ int main(int argc, char* argv[]) { /* Next section detects the functions to call */ - if (comm == 'e' || comm == 'u') { + if (comm == 'e' || comm == 'r') { if (keyfile == NULL) { printf("No key specified: exit! \n"); exit(EXIT_FAILURE); @@ -114,6 +134,8 @@ int main(int argc, char* argv[]) { xor(comm, message, keyfile, output); } else if (comm == 'g') { keyrand(nbytes, output); + } else if (comm == 'b' || comm == 'u') { + bluh(comm, message, output); } exit(EXIT_SUCCESS); @@ -124,13 +146,13 @@ void xor(int ed, char* mess, char* keyf, char* outp) { char* defenoutp = "critt"; char* defdeoutp = "decritt"; - /* In absence of input by users nex block sets the default values */ + /* In absence of input by users next block sets the default values */ if (outp == NULL) { if (ed == 'e' || ed == 'f') { printf("WARNING no output name specified using default value 'critt' \n"); outp = defenoutp; - } else if (ed == 'u' || ed == 'v') { + } else if (ed == 'r' || ed == 's') { printf("WARNING no output name specified usign default value 'decritt' \n"); outp = defdeoutp; } @@ -163,7 +185,7 @@ void xor(int ed, char* mess, char* keyf, char* outp) { fwrite(bytes, sizeof(char), mess_size, critt); - if (ed == 'f' || ed == 'v') { + if (ed == 'f' || ed == 's') { ftruncate(fileno(keyx), (pad_size - mess_size)); fseek(keyx, 0L, SEEK_END); long new_pad_size = ftell(keyx); @@ -228,6 +250,90 @@ void keyrand(int nb, char* outp) { return; } +void bluh(int c, char* mess, char* outp) { + + char* defbluh = "bluhed"; + char* defunbluh = "unbluhed"; + + /* In absence of input by users next block sets the default values */ + + if (outp == NULL) { + if (c == 'b') { + printf("WARNING no output name specified using default value 'bluhed' \n"); + outp = defbluh; + } else if (c == 'u') { + printf("WARNING no output name specified usign default value 'unbluhed' \n"); + outp = defunbluh; + } + } + + FILE* mex = fopen(mess, "r"); + FILE* bluh = fopen(outp, "w"); + + long len; + + fseek(mex, 0L, SEEK_END); + len = ftell(mex); + rewind(mex); + + if (c == 'b') { + char* bytes = malloc(len); + char* bits = malloc(8 * len); + + fread(bytes, sizeof(char), len, mex); + + int i,j; + + for (i = 0; i < len; i ++) { + for (j = 0; j < 8; j ++) { + bits[8 * i + j] = (bytes[i] & (1 << (7 -j))) ? '1' : '0'; + printf("%c", bits[8 * i + j]); + } + + /* printf(" "); + if ((i + 1) % 8 == 0) { + printf("\n"); + }*/ + } + + fwrite(bits, sizeof(char), (8 * len), bluh); + free(bytes); + free(bits); + + printf("Message successfully bluhed!\n"); + + } else if (c == 'u') { + char* comp = malloc(len + 1); + char* bits = malloc(8 * len); + + fread(bits, sizeof(char), 8 * len, mex); + memset(comp, 0, (len + 1)); + + int i, j; + + for (i = 0; i < len; i ++) { + for (j = 0; j < 8; j ++) { + if (bits[8 * i + j] == '1') { + comp[i] |= 1 << (7 - j); + } + } + } + + printf("\nOriginal text:\n'%s'\n", comp); + + fwrite(comp, sizeof(char), (len / 8), bluh); + free(comp); + free(bits); + + printf("Message successfully unbluhed!\n"); + } + + fclose(mex); + fclose(bluh); + + return; +} + void help(char* av[]) { fprintf(stdout,"ONETIMEBLUH USAGE: \n" "%s [COMMAND] [OPTIONS] \n \n" |