URI: 
       tInitialize aflag and add master password option for encryption - safe - password protected secret keeper
  HTML git clone git://git.z3bra.org/safe.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 0c20eb573f7fa48a2ee8727efc736210b193ac80
   DIR parent f6e9536793455014d50e02a8a90eddb186cdfee8
  HTML Author: z3bra <contactatz3bradotorg>
       Date:   Fri,  8 Mar 2019 23:57:12 +0100
       
       Initialize aflag and add master password option for encryption
       
       Diffstat:
         M mkfile                              |       4 ++--
         M safe.c                              |      68 +++++++++++++++++++++++++------
       
       2 files changed, 57 insertions(+), 15 deletions(-)
       ---
   DIR diff --git a/mkfile b/mkfile
       t@@ -4,10 +4,10 @@ LD = ${CC}
        PREFIX = /usr/local
        MANPREFIX = ${PREFIX}/man
        
       -CPPFLAGS =
       +CPPFLAGS = -D_XOPEN_SOURCE
        CFLAGS = -g -Wall -Wextra -pedantic
        LDFLAGS =
       -LDLIBS = -lcrypto
       +LDLIBS = -lcrypto -lcrypt
        
        BIN = safe
        SRC = ${BIN}.c
   DIR diff --git a/safe.c b/safe.c
       t@@ -80,7 +80,7 @@ xwrite(int fd, const void *buf, size_t nbytes)
        void
        usage(void)
        {
       -        fprintf(stderr, "usage: %s [-h] [-s safe] [[-a] entry]\n", argv0);
       +        fprintf(stderr, "usage: %s [-h] [-s safe] [-p pass] [[-a] entry]\n", argv0);
                exit(1);
        }
        
       t@@ -94,13 +94,49 @@ hash(uint8_t *buf, size_t size, uint8_t *md)
                SHA256_Final(md, &ctx);
        }
        
       +void
       +hash_key(char *pass)
       +{
       +        size_t i;
       +        uint8_t md[MDSIZE];
       +        char key[MDSIZE * 2];
       +
       +        hash((uint8_t *)pass, strlen(pass), md);
       +        bin2str(md, key, MDSIZE);
       +
       +        for (i = 0; i < sizeof(key); i++)
       +                key[i] &= 1;
       +
       +        setkey(key);
       +}
       +
       +void
       +xencrypt(char *s, size_t size, int edflag)
       +{
       +        size_t i, j;
       +        char buf[64];
       +
       +        if (size > 8)
       +                xencrypt(s+8, size - 8, edflag);
       +
       +        for (i = 0; i < 8; i ++)
       +                for (j = 0; j < 8; j++)
       +                        buf[i * 8 + j] = s[i] >> j & 1;
       +
       +        encrypt(buf, edflag);
       +        for (i = 0; i < 8; i++)
       +                for (j = 0; j < 8; j++)
       +                        s[i] |= buf[i * 8 + j] << j;
       +
       +}
       +
        int
        store_secret(int fd, char *name)
        {
                int sfd;
                ssize_t n;
                uint8_t md[MDSIZE];
       -        char buf[4096], fn[MDSIZE*2 + 1];
       +        char buf[64], fn[MDSIZE*2 + 1];
        
                hash((uint8_t *)name, strlen(name), md);
                bin2str(md, fn, MDSIZE);
       t@@ -109,8 +145,10 @@ store_secret(int fd, char *name)
                if (sfd < 0)
                        err(1, "open %s", fn);
        
       -        while((n = xread(fd, buf, sizeof(buf))) > 0)
       +        while((n = xread(fd, buf, sizeof(buf))) > 0) {
       +                /* xencrypt(buf, sizeof(buf), 0); */
                        xwrite(sfd, buf, n);
       +        }
        
                close(sfd);
                return 0;
       t@@ -122,7 +160,7 @@ show_secret(int fd, char *name)
                int sfd;
                ssize_t n;
                uint8_t md[MDSIZE];
       -        char buf[4096], fn[MDSIZE*2 + 1];
       +        char buf[64], fn[MDSIZE*2 + 1];
        
                hash((uint8_t *)name, strlen(name), md);
                bin2str(md, fn, MDSIZE);
       t@@ -131,24 +169,28 @@ show_secret(int fd, char *name)
                if (sfd < 0)
                        err(1, "open %s", fn);
        
       -        while((n = xread(sfd, buf, sizeof(buf))) > 0)
       +        while((n = xread(sfd, buf, sizeof(buf))) > 0) {
       +                /* xencrypt(buf, sizeof(buf), 1); */
                        xwrite(fd, buf, n);
       +        }
        
                close(sfd);
                return 0;
       -        return 0;
        }
        
        int
        main(int argc, char *argv[])
        {
       -        int aflag;
       -        char *secret = NULL, *safe = SAFE;
       +        int aflag = 0;
       +        char *secret = NULL, *pass = NULL, *safe = SAFE;
        
                ARGBEGIN {
                case 'a':
                        aflag = 1;
                        break;
       +        case 'p':
       +                pass = EARGF(usage());
       +                break;
                case 's':
                        safe = EARGF(usage());
                        break;
       t@@ -156,18 +198,18 @@ main(int argc, char *argv[])
                        usage();
                } ARGEND
        
       -        if (argc > 1)
       +        if (argc != 1)
                        usage();
        
       -        if (safe != NULL) {
       +
       +        if (safe) {
                        mkdir(safe, 0700);
                        if (chdir(safe) < 0)
                                err(1, "chdir: %s", safe);
                }
        
       -        if (!argc)
       -                /* list all secrets and exit */
       -                return 0;
       +        if (pass)
       +                hash_key(pass);
        
                secret = argv[0];