diff options
Diffstat (limited to 'src/proone-mask.c')
-rw-r--r-- | src/proone-mask.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/proone-mask.c b/src/proone-mask.c new file mode 100644 index 0000000..cd2bad7 --- /dev/null +++ b/src/proone-mask.c @@ -0,0 +1,108 @@ +#include <stdio.h> +#include <stddef.h> +#include <stdint.h> +#include <stdbool.h> + +#include <unistd.h> +#include <fcntl.h> + +#include "proone_dvault.h" + + +static const char *RND_DEV_PATH = "/dev/random"; + +int main (const int argc, const char **args) { + int exit_code = 0; + int rnd_fd = -1; + ssize_t fd_read_size; + uint8_t salt; + size_t read_size = 0; + proone_dvault_mask_result_t mask_result; + proone_data_type_t type; + + proone_init_dvault_mask_result(&mask_result); + + if (argc <= 1) { + fprintf(stderr, + "Usage: %s <type>\n" + "<type>: 'cstr'\n" + "\n" + "using random device: %s\n", + args[0], RND_DEV_PATH); + exit_code = 2; + goto END; + } + + rnd_fd = open(RND_DEV_PATH, O_RDONLY); + if (rnd_fd < 0) { + perror("Error opening random device"); + exit_code = 1; + goto END; + } + + fd_read_size = read(rnd_fd, &salt, 1); + if (fd_read_size < 0) { + perror("Error reading random device"); + exit_code = 1; + goto END; + } + if (fd_read_size == 0) { + fprintf(stderr, "Nothing read from random device. Low entropy?\n"); + exit_code = 1; + goto END; + } + close(rnd_fd); + rnd_fd = -1; + + type = proone_str2data_type(args[1]); + switch (type) { + case PROONE_DATA_TYPE_CSTR: { + static const size_t buf_size = 0x0000FFFF + 1; + uint8_t buf[buf_size]; + + do { + fd_read_size = read(STDIN_FILENO, buf + read_size, buf_size - read_size); + if (fd_read_size < 0) { + perror("Error reading stdin"); + exit_code = 1; + goto END; + } + if (fd_read_size > 0) { + read_size += fd_read_size; + if (read_size >= buf_size) { + fprintf(stderr, "Error: data too large\n"); + exit_code = 1; + goto END; + } + } + } while (fd_read_size > 0); + + if (read_size == 0) { + fprintf(stderr, "Error: no data read\n"); + exit_code = 1; + goto END; + } + + mask_result = proone_dvault_mask(type, salt, read_size, buf); + if (mask_result.result == PROONE_DVAULT_MASK_OK) { + printf("(uint8_t*)\"%s\"\n", mask_result.str); + } + else { + fprintf(stderr, "Error: proone_dvault_mask() returned %d\n", (int)mask_result.result); + exit_code = 1; + goto END; + } + break; + } + default: + fprintf(stderr, "Error: unknown data type '%s'\n", args[1]); + exit_code = 2; + goto END; + } + +END: + close(rnd_fd); + proone_free_dvault_mask_result(&mask_result); + + return exit_code; +} |