diff options
| author | Chloe M <chloe@faracom.org> | 2026-08-15 17:03:19 -0500 |
|---|---|---|
| committer | Chloe M <chloe@faracom.org> | 2026-08-15 17:03:19 -0500 |
| commit | bbc81042481e8e32a7e5cc1d90d53d585a548d23 (patch) | |
| tree | dfee9ba01a4a5c7c90a1d09472c19859f9e5e650 /newpass/core | |
initial commit
Signed-off-by: Chloe M <chloe@faracom.org>
Diffstat (limited to 'newpass/core')
| -rw-r--r-- | newpass/core/newpass.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/newpass/core/newpass.c b/newpass/core/newpass.c new file mode 100644 index 0000000..93b481f --- /dev/null +++ b/newpass/core/newpass.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2026, Chloe M., et al. + * Provided under the BSD-3 clause. + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <fcntl.h> +#include <assert.h> +#include <unistd.h> + +static const char chrtab[] = { + "ab123cde987654321=0fghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWZYZ" + "!@#$%^&*()[]><?" +}; + +static void +help(void) +{ + printf("usage: ./newpass [flags]\n"); + printf("[-h] Display this help menu\n"); + printf("[-l] Length of password to create\n"); + printf("[-c] Number of passwords to generate\n"); +} + +static void * +xmalloc(size_t sz) +{ + void *buf; + +#ifdef __OpenBSD__ + buf = malloc_conceal(sz); +#else + buf = malloc(sz); +#endif + + assert(buf != NULL && "allocation failure"); + return buf; +} + +static uint8_t * +randbytes(size_t count) +{ + int fd; + uint8_t *buf; + ssize_t nbyte; + + buf = xmalloc(count); + fd = open("/dev/urandom", O_RDONLY); + + if (fd < 0) { + perror("open"); + free(buf); + return NULL; + } + + if ((nbyte = read(fd, buf, count)) < 0) { + perror("read"); + free(buf); + close(fd); + return NULL; + } + + return buf; +} + +static void +genpass(size_t passlen) +{ + uint8_t ind, *bytes; + size_t i; + + if ((bytes = randbytes(passlen)) == NULL) { + printf("fatal: unable to generate random bytes\n"); + return; + } + + for (i = 0; i < passlen; ++i) { + ind = bytes[i] % sizeof(chrtab); + printf("%c", chrtab[ind]); + } + + printf("\n"); + free(bytes); +} + +int +main(int argc, char **argv) +{ + int opt; + size_t passlen = 0; + size_t i, passcount = 0; + + while ((opt = getopt(argc, argv, "hl:c:")) != -1) { + switch (opt) { + case 'h': + help(); + return -1; + case 'l': + if ((passlen = atoi(optarg)) == 0) { + printf("fatal: bad length given\n"); + return -1; + } + + break; + case 'c': + if ((passcount = atoi(optarg)) == 0) { + printf("fatal: bad count given\n"); + return -1; + } + + break; + } + } + + if (passcount == 0) { + ++passcount; + } + + if (passlen == 0) { + printf("fatal: please specify a length with '-l'\n"); + help(); + return -1; + } + + for (i = 0; i < passcount; ++i) { + genpass(passlen); + } + + return 0; +} |
