change argon to apm
This commit is contained in:
parent
66bb56ad19
commit
e762f76c0b
6 changed files with 133 additions and 119 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,3 +1,3 @@
|
||||||
argon
|
apm
|
||||||
*.o
|
*.o
|
||||||
*.tar.gz
|
*.tar.gz
|
||||||
|
|
61
Makefile
61
Makefile
|
@ -2,39 +2,44 @@
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|
||||||
CC = cc
|
CC = cc
|
||||||
|
VERSION = 1.0
|
||||||
|
TARGET = apm
|
||||||
|
MANPAGE = $(TARGET).1
|
||||||
|
PREFIX ?= /usr/local
|
||||||
|
BINDIR = $(PREFIX)/bin
|
||||||
|
MANDIR = $(PREFIX)/share/man/man1
|
||||||
|
|
||||||
VERSION=1.0.0
|
# Flags
|
||||||
PREFIX = /usr/local
|
LDFLAGS = $(shell pkg-config --libs libsodium)
|
||||||
MANPREFIX = ${PREFIX}/share/man
|
CFLAGS = -O3 -march=native -mtune=native -pipe -s -std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600
|
||||||
|
|
||||||
CFLAGS = -O3 -march=native -mtune=native -pipe -s -std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -lsodium
|
SRC = apm.c
|
||||||
|
|
||||||
SRC = argon.c
|
$(TARGET): $(SRC)
|
||||||
|
$(CC) $(SRC) -o $@ $(CFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
argon: argon.c
|
dist:
|
||||||
${CC} ${SRC} -o $@ ${CFLAGS}
|
mkdir -p $(TARGET)-$(VERSION)
|
||||||
|
cp -R README.md $(MANPAGE) $(TARGET) $(TARGET)-$(VERSION)
|
||||||
|
tar -cf $(TARGET)-$(VERSION).tar $(TARGET)-$(VERSION)
|
||||||
|
gzip $(TARGET)-$(VERSION).tar
|
||||||
|
rm -rf $(TARGET)-$(VERSION)
|
||||||
|
|
||||||
clean:
|
install: $(TARGET)
|
||||||
rm -rf argon
|
mkdir -p $(DESTDIR)$(BINDIR)
|
||||||
|
mkdir -p $(DESTDIR)$(MANDIR)
|
||||||
dist: version argon
|
cp -p $(TARGET) $(DESTDIR)$(BINDIR)/$(TARGET)
|
||||||
mkdir -p argon-${VERSION}
|
chmod 755 $(DESTDIR)$(BINDIR)/$(TARGET)
|
||||||
cp -R LICENSE README.md argon.1 argon argon-${VERSION}
|
cp -p $(MANPAGE) $(DESTDIR)$(MANDIR)/$(MANPAGE)
|
||||||
tar -cf argon-${VERSION}.tar argon-${VERSION}
|
chmod 644 $(DESTDIR)$(MANDIR)/$(MANPAGE)
|
||||||
gzip argon-${VERSION}.tar
|
|
||||||
rm -rf argon-${VERSION}
|
|
||||||
|
|
||||||
install: all
|
|
||||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
|
||||||
cp -f argon ${DESTDIR}${PREFIX}/bin
|
|
||||||
chmod 755 ${DESTDIR}${PREFIX}/bin/argon
|
|
||||||
mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
|
||||||
cp argon.1 ${DESTDIR}${MANPREFIX}/man1/argon.1
|
|
||||||
chmod 644 ${DESTDIR}${MANPREFIX}/man1/argon.1
|
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
rm -f ${DESTDIR}${PREFIX}/bin/argon\
|
$(RM) $(DESTDIR)$(BINDIR)/$(TARGET)
|
||||||
${DESTDIR}${MANPREFIX}/man1/argon.1
|
$(RM) $(DESTDIR)$(MANDIR)/$(MANPAGE)
|
||||||
all: argon
|
|
||||||
|
|
||||||
.PHONY: all clean dist install uninstall argon
|
clean:
|
||||||
|
$(RM) $(TARGET)
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
.PHONY: all dist install uninstall clean
|
||||||
|
|
20
README.md
20
README.md
|
@ -1,22 +1,26 @@
|
||||||
# argon
|
# apm
|
||||||
|
|
||||||
A minimalistic command line password manager and a rewrite of [pass](https://www.passwordstore.org/) in C. It uses a unique key to encrypt every password, it provides functionality to edit, add, generate, show, list, remove passwords. It uses argon2 to create hash of master password and uses XSalsa20 to encrypt the password.
|
apm, argon password manager; a minimalistic command line password manager and a rewrite of [pass](https://www.passwordstore.org/) in C. It uses a unique key to encrypt every password, it provides functionality to edit, add, generate, show, list, remove passwords. It uses argon2 to create hash of master password and uses XSalsa20 to encrypt the password.
|
||||||
|
|
||||||
> The name "argon" is chosen as it uses argon2 algorithm and sodium(library) is stored with argon.
|
> The name "argon" is chosen as it uses argon2 algorithm and sodium(library) is stored with argon.
|
||||||
|
|
||||||
Before using argon, you must export 2 environment variables in order to make it work
|
Before using apm, you must export 2 environment variables in order to make it work
|
||||||
```sh
|
```sh
|
||||||
export ARGON_DIR=~/secret/argon
|
export APM_DIR=~/secret/apm
|
||||||
export ARGON_KEY=~/secret/argon_key
|
export APM_KEY=~/secret/apm_key
|
||||||
```
|
```
|
||||||
|
|
||||||
`ARGON_DIR` is the directory where passwords are stored and `ARGON_KEY` is the path to the master key file.
|
`APM_DIR` is the directory where passwords are stored and `APM_KEY` is the path to the master key file.
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
|
|
||||||
- libsodium
|
- libsodium
|
||||||
- gcc
|
- gcc
|
||||||
|
|
||||||
# Building
|
# Building
|
||||||
|
|
||||||
|
You will need to run these with elevated privilages.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ make
|
$ make
|
||||||
# make install
|
# make install
|
||||||
|
@ -24,11 +28,11 @@ $ make
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
```
|
```
|
||||||
Usage: argon [-vhL] [[-e | -R | -I | -Q] <password>] [-M <file>] [-G <password> <length>]
|
Usage: apm [-vhL] [[-e | -R | -I | -Q] <password>] [-M <file>] [-G <password> <length>]
|
||||||
```
|
```
|
||||||
|
|
||||||
# Contributions
|
# Contributions
|
||||||
Contributions are welcomed, feel free to open a pull request.
|
Contributions are welcomed, feel free to open a pull request.
|
||||||
|
|
||||||
# License
|
# License
|
||||||
This project is licensed under the GNU Public License v3.0. See [LICENSE](https://github.com/night0721/argon/blob/master/LICENSE) for more information.
|
This project is licensed under the GNU Public License v3.0. See [LICENSE](https://github.com/night0721/apm/blob/master/LICENSE) for more information.
|
||||||
|
|
58
apm.1
Normal file
58
apm.1
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
.TH apm 1 apm\-1.0.0
|
||||||
|
.SH NAME
|
||||||
|
apm \- Minimalistic password manager
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B apm
|
||||||
|
.RB [ \-v ]
|
||||||
|
.RB [ \-h ]
|
||||||
|
.RB [ \-e ]
|
||||||
|
.RB [ \-R ]
|
||||||
|
.RB [ \-I ]
|
||||||
|
.RB [ \-Q ]
|
||||||
|
.RB [ \-L ]
|
||||||
|
.RB [ \-M ]
|
||||||
|
.RB [ \-G ]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
apm is a minimalistic command line password manager and a rewrite of pass in C. It uses a unique key to encrypt every password, it provides functionality to edit, add, generate, show, list, remove passwords. It uses argon2 to create hash of master password and uses XSalsa20 to encrypt the password.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.B \-v
|
||||||
|
Prints the version of the program.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-h
|
||||||
|
Shows the help message.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-e <filename>
|
||||||
|
Edits the password using EDITOR.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-R <filename>
|
||||||
|
Removes password from APM_DIR.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-I <filename>
|
||||||
|
Insert password to APM_DIR.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-Q <filename>
|
||||||
|
Show password from APM_DIR.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-L
|
||||||
|
Lists the passwords in APM_DIR in a tree format.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-M
|
||||||
|
Insert password from a file, in order to fix -I can't take multi line input.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-G <filename> <length>
|
||||||
|
Generate a password with specific length to add to APM_DIR.
|
||||||
|
|
||||||
|
.SH AUTHOR
|
||||||
|
Made by Night Kaly
|
||||||
|
.B <night@night0721.xyz>
|
|
@ -23,7 +23,7 @@ void *memalloc(size_t size)
|
||||||
{
|
{
|
||||||
void *ptr = malloc(size);
|
void *ptr = malloc(size);
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
perror("argon");
|
perror("apm");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
return ptr;
|
return ptr;
|
||||||
|
@ -87,17 +87,17 @@ void tree(const char *basepath, int depth)
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *get_argon()
|
char *get_apm()
|
||||||
{
|
{
|
||||||
char dirname[] = "argon";
|
char dirname[] = "apm";
|
||||||
const char *argon_dir = getenv("ARGON_DIR");
|
const char *apm_dir = getenv("APM_DIR");
|
||||||
/* for / and null */
|
/* for / and null */
|
||||||
size_t len = 2;
|
size_t len = 2;
|
||||||
if (argon_dir == NULL) {
|
if (apm_dir == NULL) {
|
||||||
argon_dir = getenv("XDG_DATA_HOME");
|
apm_dir = getenv("XDG_DATA_HOME");
|
||||||
if (argon_dir == NULL) {
|
if (apm_dir == NULL) {
|
||||||
argon_dir = getenv("HOME");
|
apm_dir = getenv("HOME");
|
||||||
if (argon_dir == NULL) {
|
if (apm_dir == NULL) {
|
||||||
die("HOME not defined");
|
die("HOME not defined");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,15 +106,15 @@ char *get_argon()
|
||||||
/* no / */
|
/* no / */
|
||||||
len -= 1;
|
len -= 1;
|
||||||
}
|
}
|
||||||
size_t dir_len = strlen(argon_dir);
|
size_t dir_len = strlen(apm_dir);
|
||||||
len += dir_len;
|
len += dir_len;
|
||||||
char *dir = memalloc(len * sizeof(char));
|
char *dir = memalloc(len * sizeof(char));
|
||||||
|
|
||||||
/* check if it is ARGON_DIR or other */
|
/* check if it is apm_DIR or other */
|
||||||
if (len > dir_len) {
|
if (len > dir_len) {
|
||||||
snprintf(dir, len, "%s/%s", argon_dir, dirname);
|
snprintf(dir, len, "%s/%s", apm_dir, dirname);
|
||||||
} else {
|
} else {
|
||||||
strncpy(dir, argon_dir, len);
|
strncpy(dir, apm_dir, len);
|
||||||
}
|
}
|
||||||
struct stat stats;
|
struct stat stats;
|
||||||
/* check defined path is directory */
|
/* check defined path is directory */
|
||||||
|
@ -128,7 +128,7 @@ char *get_argon()
|
||||||
|
|
||||||
char *get_passfile(const char *key)
|
char *get_passfile(const char *key)
|
||||||
{
|
{
|
||||||
char *dir = get_argon();
|
char *dir = get_apm();
|
||||||
/* concat file name */
|
/* concat file name */
|
||||||
/* / and null */
|
/* / and null */
|
||||||
size_t len = strlen(dir) + strlen(key) + 2;
|
size_t len = strlen(dir) + strlen(key) + 2;
|
||||||
|
@ -165,7 +165,7 @@ void encrypt_password(const char *name, char *password)
|
||||||
crypto_pwhash_MEMLIMIT_INTERACTIVE,
|
crypto_pwhash_MEMLIMIT_INTERACTIVE,
|
||||||
crypto_pwhash_ALG_DEFAULT) != 0) {
|
crypto_pwhash_ALG_DEFAULT) != 0) {
|
||||||
sodium_free(m_key);
|
sodium_free(m_key);
|
||||||
perror("argon");
|
perror("apm");
|
||||||
die("Cannot create key");
|
die("Cannot create key");
|
||||||
}
|
}
|
||||||
size_t pw_len = strlen(password);
|
size_t pw_len = strlen(password);
|
||||||
|
@ -229,7 +229,7 @@ void decrypt_password(const char *name, int open)
|
||||||
crypto_pwhash_ALG_DEFAULT) != 0) {
|
crypto_pwhash_ALG_DEFAULT) != 0) {
|
||||||
sodium_free(m_key);
|
sodium_free(m_key);
|
||||||
free(filepath);
|
free(filepath);
|
||||||
perror("argon");
|
perror("apm");
|
||||||
die("Cannot create key");
|
die("Cannot create key");
|
||||||
}
|
}
|
||||||
/* take authentication bytes away */
|
/* take authentication bytes away */
|
||||||
|
@ -249,7 +249,7 @@ void decrypt_password(const char *name, int open)
|
||||||
if (editor == NULL) {
|
if (editor == NULL) {
|
||||||
die("EDITOR not defined");
|
die("EDITOR not defined");
|
||||||
}
|
}
|
||||||
char tmp_f[] = "/tmp/argon";
|
char tmp_f[] = "/tmp/apm";
|
||||||
FILE *tmp = fopen(tmp_f, "w+");
|
FILE *tmp = fopen(tmp_f, "w+");
|
||||||
fprintf(tmp, "%s\n", deciphered);
|
fprintf(tmp, "%s\n", deciphered);
|
||||||
fclose(tmp);
|
fclose(tmp);
|
||||||
|
@ -275,12 +275,12 @@ void decrypt_password(const char *name, int open)
|
||||||
|
|
||||||
char *get_master_key()
|
char *get_master_key()
|
||||||
{
|
{
|
||||||
char *key_path = getenv("ARGON_KEY");
|
char *key_path = getenv("APM_KEY");
|
||||||
char *m_key = NULL;
|
char *m_key = NULL;
|
||||||
if (key_path != NULL) {
|
if (key_path != NULL) {
|
||||||
FILE *key_file = fopen(key_path, "r");
|
FILE *key_file = fopen(key_path, "r");
|
||||||
if (key_file == NULL) {
|
if (key_file == NULL) {
|
||||||
perror("argon");
|
perror("apm");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
@ -288,16 +288,16 @@ char *get_master_key()
|
||||||
size_t pass_size = st.st_size;
|
size_t pass_size = st.st_size;
|
||||||
m_key = (char *) sodium_malloc(pass_size * sizeof(char));
|
m_key = (char *) sodium_malloc(pass_size * sizeof(char));
|
||||||
if (m_key == NULL) {
|
if (m_key == NULL) {
|
||||||
perror("argon");
|
perror("apm");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
if (fgets(m_key, pass_size, key_file) == NULL) {
|
if (fgets(m_key, pass_size, key_file) == NULL) {
|
||||||
perror("argon");
|
perror("apm");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "argon: You are required to set ARGON_KEY to pass file\n");
|
fprintf(stderr, "apm: You are required to set APM_KEY to pass file\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
return m_key;
|
return m_key;
|
||||||
|
@ -320,7 +320,7 @@ void generate_password(char*name, int length)
|
||||||
|
|
||||||
void die(char *str)
|
void die(char *str)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "argon: %s\n", str);
|
fprintf(stderr, "apm: %s\n", str);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +338,7 @@ int main(int argc, char *argv[])
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
printf("argon 1.0.0\n");
|
printf("apm 1.0.0\n");
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
|
@ -348,7 +348,7 @@ int main(int argc, char *argv[])
|
||||||
case 'R':;
|
case 'R':;
|
||||||
char *pass_file = get_passfile(EARGF(usage()));
|
char *pass_file = get_passfile(EARGF(usage()));
|
||||||
if (remove(pass_file)) {
|
if (remove(pass_file)) {
|
||||||
perror("argon");
|
perror("apm");
|
||||||
} else {
|
} else {
|
||||||
printf("Removed %s\n", basename(pass_file));
|
printf("Removed %s\n", basename(pass_file));
|
||||||
}
|
}
|
||||||
|
@ -366,9 +366,9 @@ int main(int argc, char *argv[])
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
case 'L':;
|
case 'L':;
|
||||||
char *argon = get_argon();
|
char *apm = get_apm();
|
||||||
tree(argon, 0);
|
tree(apm, 0);
|
||||||
free(argon);
|
free(apm);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
case 'M':;
|
case 'M':;
|
53
argon.1
53
argon.1
|
@ -1,53 +0,0 @@
|
||||||
.TH argon 1 argon\-1.0.0
|
|
||||||
.SH NAME
|
|
||||||
argon \- Minimalistic password manager
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B argon
|
|
||||||
.RB [ \-v ]
|
|
||||||
.RB [ \-h ]
|
|
||||||
.RB [ \-e ]
|
|
||||||
.RB [ \-R ]
|
|
||||||
.RB [ \-I ]
|
|
||||||
.RB [ \-Q ]
|
|
||||||
.RB [ \-L ]
|
|
||||||
.RB [ \-G ]
|
|
||||||
|
|
||||||
.SH DESCRIPTION
|
|
||||||
argon is a minimalistic command line password manager and a rewrite of pass in C. It uses a unique key to encrypt every password, it provides functionality to edit, add, generate, show, list, remove passwords. It uses argon2 to create hash of master password and uses XSalsa20 to encrypt the password.
|
|
||||||
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.B \-v
|
|
||||||
Prints the version of the program.
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-h
|
|
||||||
Shows the help message.
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-e <filename>
|
|
||||||
Edits the password using EDITOR.
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-R <filename>
|
|
||||||
Removes password from ARGON_DIR.
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-I <filename>
|
|
||||||
Insert password to ARGON_DIR.
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-Q <filename>
|
|
||||||
Show password from ARGON_DIR.
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-L
|
|
||||||
Lists the passwords in ARGON_DIR in a tree format.
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-G <filename> <length>
|
|
||||||
Generate a password with specific length to add to ARGON_DIR.
|
|
||||||
|
|
||||||
.SH AUTHOR
|
|
||||||
Made by Night Kaly
|
|
||||||
.B <night@night0721.xyz>
|
|
Loading…
Reference in a new issue