tRe-prompt passphrase when creating a new encrypted save - ratox - FIFO based tox client
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 4442bdc756ca32e3721add20e0828142d466462a
 (DIR) parent fca4ab0f64822046b25f9b944b0f1d43b4aad683
 (HTM) Author: FRIGN <dev@frign.de>
       Date:   Sun,  7 Dec 2014 13:00:03 +0100
       
       Re-prompt passphrase when creating a new encrypted save
       
       This is more consistent with the de-facto behaviour of password-setting
       prompts.
       
       Diffstat:
         M ratox.c                             |      40 ++++++++++++++++++++++---------
       
       1 file changed, 29 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/ratox.c b/ratox.c
       t@@ -241,7 +241,7 @@ static void cancelrxtransfer(struct friend *);
        static void sendfriendfile(struct friend *);
        static void sendfriendtext(struct friend *);
        static void removefriend(struct friend *);
       -static int readpass(const char *);
       +static int readpass(const char *, uint8_t **, uint32_t *);
        static void dataload(void);
        static void datasave(void);
        static int localinit(void);
       t@@ -1013,7 +1013,7 @@ removefriend(struct friend *f)
        }
        
        static int
       -readpass(const char *prompt)
       +readpass(const char *prompt, uint8_t **target, uint32_t *len)
        {
                char pass[BUFSIZ], *p;
        
       t@@ -1024,11 +1024,11 @@ readpass(const char *prompt)
                }
                if (p[0] == '\0')
                        return -1;
       -        passphrase = realloc(passphrase, strlen(p)); /* not null-terminated */
       -        if (!passphrase)
       +        *target = realloc(*target, strlen(p)); /* not null-terminated */
       +        if (!*target)
                        eprintf("malloc:");
       -        memcpy(passphrase, p, strlen(p));
       -        pplen = strlen(p);
       +        memcpy(*target, p, strlen(p));
       +        *len = strlen(p);
                return 0;
        }
        
       t@@ -1036,13 +1036,23 @@ static void
        dataload(void)
        {
                off_t sz;
       -        uint8_t *data;
       +        uint8_t *data, *passphrase2 = NULL;
       +        uint32_t pp2len = 0;
                int fd;
        
                fd = open(DATAFILE, O_RDONLY);
                if (fd < 0) {
       -                if (encryptdatafile == 1)
       -                        while (readpass("Data : New passphrase > ") < 0);
       +                if (encryptdatafile == 1) {
       +reprompt1:
       +                        while (readpass("Data : New passphrase > ", &passphrase, &pplen) < 0);
       +                        while (readpass("Data : Re-enter passphrase > ", &passphrase2, &pp2len) < 0);
       +
       +                        if (pplen != pp2len || memcmp(passphrase, passphrase2, pplen)) {
       +                                weprintf("Data : Passphrase mismatch\n");
       +                                goto reprompt1;
       +                        }
       +                        free(passphrase2);
       +                }
                        return;
                }
        
       t@@ -1064,14 +1074,22 @@ dataload(void)
                if (tox_is_save_encrypted(data) == 1) {
                        if (encryptdatafile == 0)
                                logmsg("Data : %s > Encrypted, but saving unencrypted\n", DATAFILE);
       -                while (readpass("Data : Passphrase > ") < 0 ||
       +                while (readpass("Data : Passphrase > ", &passphrase, &pplen) < 0 ||
                               tox_encrypted_load(tox, data, sz, passphrase, pplen) < 0);
                } else {
                        if (tox_load(tox, data, sz) < 0)
                                eprintf("Data : %s > Failed to load\n", DATAFILE);
                        if (encryptdatafile == 1) {
                                logmsg("Data : %s > Not encrypted, but saving encrypted\n", DATAFILE);
       -                        while (readpass("Data : New passphrase > ") < 0);
       +reprompt2:
       +                        while (readpass("Data : New passphrase > ", &passphrase, &pplen) < 0);
       +                        while (readpass("Data : Re-enter passphrase > ", &passphrase2, &pp2len) < 0);
       +
       +                        if (pplen != pp2len || memcmp(passphrase, passphrase2, pplen)) {
       +                                weprintf("Data : Passphrase mismatch\n");
       +                                goto reprompt2;
       +                        }
       +                        free(passphrase2);
                        }
                }