change argon to apm

This commit is contained in:
Night Kaly 2024-05-19 16:52:18 +01:00
parent 66bb56ad19
commit e762f76c0b
Signed by: night0721
GPG key ID: 957D67B8DB7A119B
6 changed files with 133 additions and 119 deletions

2
.gitignore vendored
View file

@ -1,3 +1,3 @@
argon apm
*.o *.o
*.tar.gz *.tar.gz

View file

@ -1,40 +1,45 @@
.POSIX: .POSIX:
.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

View file

@ -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
View 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>

View file

@ -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
View file

@ -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>