From ae5fe7e64292a8dc70c70dd8ba9c59a89debbcc4 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Thu, 29 Nov 2012 22:21:50 -0500 Subject: [PATCH] Fix the "passphrase_file" and "passphrase" configuration parameters. --- src/crypto.c | 52 +++++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index be600e6f..eb82b34c 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -1194,10 +1194,14 @@ decrypt_common (assuan_context_t ctx, int inquire, struct crypto_s *crypto, key = config_get_string (filename, "passphrase_file"); if (key) { - int fd = open ((char *) key, O_RDONLY); + char *tmp = expand_homedir (key); + int fd; struct stat st; + xfree (key); + key = tmp; log_write (_("Trying the passphrase using file '%s' ..."), key); + fd = open (key, O_RDONLY); if (fd == -1) { log_write ("%s: %s", key, @@ -1230,6 +1234,14 @@ decrypt_common (assuan_context_t ctx, int inquire, struct crypto_s *crypto, } keylen = st.st_size; + if (!keylen) + { + tmp = xmalloc (1); + *tmp = 0; + xfree (key); + key = tmp; + keylen++; + } } } @@ -1243,16 +1255,8 @@ decrypt_common (assuan_context_t ctx, int inquire, struct crypto_s *crypto, return rc; } - rc = hash_key (algo, crypto->hdr.salt, sizeof(crypto->hdr.salt), key, - keylen, &salted_key, &keysize); - xfree (key); - key = (char *)salted_key; - keylen = keysize; - if (rc) - { - xfree (salted_key); - return rc; - } + if (!keylen) + keylen++; } else if (!key && !IS_PKCS (crypto)) { @@ -1269,18 +1273,6 @@ decrypt_common (assuan_context_t ctx, int inquire, struct crypto_s *crypto, keylen = strlen (key); if (!keylen) keylen++; - - rc = hash_key (algo, crypto->hdr.salt, sizeof(crypto->hdr.salt), key, - keylen, &salted_key, &keysize); - - xfree (key); - key = (char *)salted_key; - keylen = keysize; - if (rc) - { - xfree (salted_key); - return rc; - } } #ifdef WITH_AGENT else if (key && IS_PKCS (crypto)) @@ -1295,6 +1287,20 @@ decrypt_common (assuan_context_t ctx, int inquire, struct crypto_s *crypto, } #endif + if (key && !IS_PKCS (crypto)) + { + rc = hash_key (algo, crypto->hdr.salt, sizeof(crypto->hdr.salt), key, + keylen, &salted_key, &keysize); + xfree (key); + key = (char *)salted_key; + keylen = keysize; + if (rc) + { + xfree (salted_key); + return rc; + } + } + xfree (crypto->filename); crypto->filename = str_dup (filename); rc = decrypt_data (NULL, crypto, (unsigned char *)key, keylen); -- 2.11.4.GIT