use arg.h to parse options
This commit is contained in:
parent
1910c7aa99
commit
57ffcff2f1
3 changed files with 137 additions and 48 deletions
3
Makefile
3
Makefile
|
@ -11,13 +11,12 @@ CFLAGS = -O3 -march=native -mtune=native -pipe -s -std=c99 -pedantic -Wall -D_DE
|
||||||
|
|
||||||
SRC = argon.c
|
SRC = argon.c
|
||||||
|
|
||||||
argon:
|
argon: argon.c
|
||||||
${CC} ${SRC} -o $@ ${CFLAGS}
|
${CC} ${SRC} -o $@ ${CFLAGS}
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf argon
|
rm -rf argon
|
||||||
|
|
||||||
|
|
||||||
dist: version argon
|
dist: version argon
|
||||||
mkdir -p argon-${VERSION}
|
mkdir -p argon-${VERSION}
|
||||||
cp -R LICENSE README.md argon.1 argon argon-${VERSION}
|
cp -R LICENSE README.md argon.1 argon argon-${VERSION}
|
||||||
|
|
65
arg.h
Normal file
65
arg.h
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* Copy me if you can.
|
||||||
|
* by 20h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ARG_H__
|
||||||
|
#define ARG_H__
|
||||||
|
|
||||||
|
extern char *argv0;
|
||||||
|
|
||||||
|
/* use main(int argc, char *argv[]) */
|
||||||
|
#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
|
||||||
|
argv[0] && argv[0][0] == '-'\
|
||||||
|
&& argv[0][1];\
|
||||||
|
argc--, argv++) {\
|
||||||
|
char argc_;\
|
||||||
|
char **argv_;\
|
||||||
|
int brk_;\
|
||||||
|
if (argv[0][1] == '-' && argv[0][2] == '\0') {\
|
||||||
|
argv++;\
|
||||||
|
argc--;\
|
||||||
|
break;\
|
||||||
|
}\
|
||||||
|
for (brk_ = 0, argv[0]++, argv_ = argv;\
|
||||||
|
argv[0][0] && !brk_;\
|
||||||
|
argv[0]++) {\
|
||||||
|
if (argv_ != argv)\
|
||||||
|
break;\
|
||||||
|
argc_ = argv[0][0];\
|
||||||
|
switch (argc_)
|
||||||
|
|
||||||
|
/* Handles obsolete -NUM syntax */
|
||||||
|
#define ARGNUM case '0':\
|
||||||
|
case '1':\
|
||||||
|
case '2':\
|
||||||
|
case '3':\
|
||||||
|
case '4':\
|
||||||
|
case '5':\
|
||||||
|
case '6':\
|
||||||
|
case '7':\
|
||||||
|
case '8':\
|
||||||
|
case '9'
|
||||||
|
|
||||||
|
#define ARGEND }\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ARGC() argc_
|
||||||
|
|
||||||
|
#define ARGNUMF() (brk_ = 1, estrtonum(argv[0], 0, INT_MAX))
|
||||||
|
|
||||||
|
#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\
|
||||||
|
((x), abort(), (char *)0) :\
|
||||||
|
(brk_ = 1, (argv[0][1] != '\0')?\
|
||||||
|
(&argv[0][1]) :\
|
||||||
|
(argc--, argv++, argv[0])))
|
||||||
|
|
||||||
|
#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\
|
||||||
|
(char *)0 :\
|
||||||
|
(brk_ = 1, (argv[0][1] != '\0')?\
|
||||||
|
(&argv[0][1]) :\
|
||||||
|
(argc--, argv++, argv[0])))
|
||||||
|
|
||||||
|
#define LNGARG() &argv[0][0]
|
||||||
|
|
||||||
|
#endif
|
117
argon.c
117
argon.c
|
@ -9,10 +9,14 @@
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <sodium.h>
|
#include <sodium.h>
|
||||||
|
|
||||||
|
#include "arg.h"
|
||||||
|
|
||||||
#define KEY_SIZE crypto_secretbox_KEYBYTES
|
#define KEY_SIZE crypto_secretbox_KEYBYTES
|
||||||
#define NONCE_SIZE crypto_secretbox_NONCEBYTES
|
#define NONCE_SIZE crypto_secretbox_NONCEBYTES
|
||||||
#define SALT_SIZE crypto_pwhash_SALTBYTES
|
#define SALT_SIZE crypto_pwhash_SALTBYTES
|
||||||
|
|
||||||
|
char *argv0;
|
||||||
|
|
||||||
void die(char *str);
|
void die(char *str);
|
||||||
|
|
||||||
void *memalloc(size_t size)
|
void *memalloc(size_t size)
|
||||||
|
@ -27,16 +31,19 @@ void *memalloc(size_t size)
|
||||||
|
|
||||||
char *get_master_key();
|
char *get_master_key();
|
||||||
|
|
||||||
void usage(char **args)
|
void usage()
|
||||||
{
|
{
|
||||||
printf("Usage: %s [-vheRIQLG] [-v] [-h] [-e <password>] [-R <password>] [-I <password>] [-Q <password>] [-L] [-G <password> <length>]\n", args[0]);
|
printf("Usage: %s [-vhL] [[-e | -R | -I | -Q] <password>] [-G <password> <length>]\n", argv0);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare(const void *a, const void *b) {
|
int compare(const void *a, const void *b)
|
||||||
|
{
|
||||||
return strcmp(*(const char **)a, *(const char **)b);
|
return strcmp(*(const char **)a, *(const char **)b);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tree(const char *basepath, int depth) {
|
void tree(const char *basepath, int depth)
|
||||||
|
{
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
struct dirent *dp;
|
struct dirent *dp;
|
||||||
DIR *dir = opendir(basepath);
|
DIR *dir = opendir(basepath);
|
||||||
|
@ -140,7 +147,6 @@ char *get_password()
|
||||||
/* remove newline character */
|
/* remove newline character */
|
||||||
password[strcspn(password, "\n")] = '\0';
|
password[strcspn(password, "\n")] = '\0';
|
||||||
return password;
|
return password;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void encrypt_password(const char *name, char *password)
|
void encrypt_password(const char *name, char *password)
|
||||||
|
@ -297,7 +303,7 @@ char *get_master_key()
|
||||||
return m_key;
|
return m_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void generate_password(int length, char *name)
|
void generate_password(char*name, int length)
|
||||||
{
|
{
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
const char *characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890123456789~`!@#$%^&*()-_+=[]{}|/,.<>;:'";
|
const char *characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890123456789~`!@#$%^&*()-_+=[]{}|/,.<>;:'";
|
||||||
|
@ -307,7 +313,7 @@ void generate_password(int length, char *name)
|
||||||
random_string[i] = characters[rand() % (characters_len - 1)];
|
random_string[i] = characters[rand() % (characters_len - 1)];
|
||||||
}
|
}
|
||||||
random_string[length] = '\0';
|
random_string[length] = '\0';
|
||||||
printf("The geneated password for %s is: %s\n", name, random_string);
|
printf("The generated password for %s is: %s\n", name, random_string);
|
||||||
encrypt_password(name, random_string);
|
encrypt_password(name, random_string);
|
||||||
free(random_string);
|
free(random_string);
|
||||||
}
|
}
|
||||||
|
@ -318,7 +324,7 @@ void die(char *str)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
if (sodium_init() == -1) {
|
if (sodium_init() == -1) {
|
||||||
die("Error initializing sodium");
|
die("Error initializing sodium");
|
||||||
|
@ -327,45 +333,64 @@ int main(int argc, char **argv)
|
||||||
/* disable core dump for security */
|
/* disable core dump for security */
|
||||||
setrlimit(RLIMIT_CORE, &(struct rlimit) {0, 0});
|
setrlimit(RLIMIT_CORE, &(struct rlimit) {0, 0});
|
||||||
|
|
||||||
if (argc == 1) {
|
ARGBEGIN {
|
||||||
usage(argv);
|
case 'h':
|
||||||
return 0;
|
usage();
|
||||||
}
|
break;
|
||||||
if (strncmp(argv[1], "-v", 2) == 0 && argc == 2) {
|
case 'v':
|
||||||
printf("argon 1.0.0\n");
|
printf("argon 1.0.0\n");
|
||||||
} else if (strncmp(argv[1], "-h", 2) == 0 && argc == 2) {
|
exit(EXIT_SUCCESS);
|
||||||
usage(argv);
|
break;
|
||||||
} else if (strncmp(argv[1], "-e", 2) == 0 && argc == 3) {
|
case 'e':
|
||||||
decrypt_password(argv[2], 1);
|
decrypt_password(EARGF(usage()), 1);
|
||||||
} else if (strncmp(argv[1], "-R", 2) == 0 && argc == 3) {
|
exit(EXIT_SUCCESS);
|
||||||
char *pass_file = get_passfile(argv[2]);
|
break;
|
||||||
if (remove(pass_file)) {
|
case 'R':;
|
||||||
perror("argon");
|
char *pass_file = get_passfile(EARGF(usage()));
|
||||||
} else {
|
if (remove(pass_file)) {
|
||||||
printf("Removed %s\n", basename(pass_file));
|
perror("argon");
|
||||||
|
} else {
|
||||||
|
printf("Removed %s\n", basename(pass_file));
|
||||||
|
}
|
||||||
|
free(pass_file);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
case 'I':;
|
||||||
|
char *pw = get_password();
|
||||||
|
encrypt_password(EARGF(usage()), pw);
|
||||||
|
free(pw);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
case 'Q':
|
||||||
|
decrypt_password(EARGF(usage()), 0);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
case 'L':;
|
||||||
|
char *argon = get_argon();
|
||||||
|
tree(argon, 0);
|
||||||
|
free(argon);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
case 'G':;
|
||||||
|
if (argc > 0)
|
||||||
|
--argc, ++argv;
|
||||||
|
goto run;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
} ARGEND;
|
||||||
|
|
||||||
|
run:
|
||||||
|
switch (argc) {
|
||||||
|
case 0:
|
||||||
|
usage();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
decrypt_password(argv[0], 0);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
generate_password(argv[0], atoi(argv[1]));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
free(pass_file);
|
|
||||||
} else if (strncmp(argv[1], "-I", 2) == 0 && argc == 3) {
|
|
||||||
char *pw = get_password();
|
|
||||||
encrypt_password(argv[2], pw);
|
|
||||||
free(pw);
|
|
||||||
} else if (strncmp(argv[1], "-Q", 2) == 0 && argc == 3) {
|
|
||||||
decrypt_password(argv[2], 0);
|
|
||||||
} else if (strncmp(argv[1], "-L", 2) == 0 && argc == 2) {
|
|
||||||
char *argon = get_argon();
|
|
||||||
tree(argon, 0);
|
|
||||||
free(argon);
|
|
||||||
} else if (strncmp(argv[1], "-G", 2) == 0) {
|
|
||||||
if (argc < 4) {
|
|
||||||
die("Missing length or name to generate password");
|
|
||||||
}
|
|
||||||
int length = atoi(argv[3]);
|
|
||||||
generate_password(length, argv[2]);
|
|
||||||
} else if (argc == 2) {
|
|
||||||
decrypt_password(argv[1], 0);
|
|
||||||
} else {
|
|
||||||
usage(argv);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue