aboutsummaryrefslogtreecommitdiff
path: root/src/libnpass/gpg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnpass/gpg.c')
-rw-r--r--src/libnpass/gpg.c95
1 files changed, 64 insertions, 31 deletions
diff --git a/src/libnpass/gpg.c b/src/libnpass/gpg.c
index 0b47f42..c7cf328 100644
--- a/src/libnpass/gpg.c
+++ b/src/libnpass/gpg.c
@@ -2,6 +2,7 @@
#include <gpgme.h>
#include <locale.h>
#include <stdio.h>
+#include <string.h>
#include "libnpass/gpg.h"
#include "libnpass/util.h"
@@ -9,11 +10,13 @@
#define gpg_err_ret(err) \
do { \
- if (err) { \
- gpg_cleanup(); \
- err_ret(1, "%s: %s", gpgme_strsource(err), \
- gpgme_strerror(err)); \
- } \
+ int __gpg_err_ret = gpgme_err_code_to_errno(err); \
+ if (err != 0) \
+ __gpg_err_ret = 1; \
+ \
+ gpg_cleanup(); \
+ err_ret(-__gpg_err_ret, "%s: %s", gpgme_strsource(err), \
+ gpgme_strerror(err)); \
} while (0)
static gpgme_ctx_t ctx = NULL;
@@ -34,9 +37,12 @@ static int gpg_init(void)
#endif
err = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
+
err = gpgme_new(&ctx);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
return 0;
}
@@ -51,49 +57,62 @@ static void gpg_cleanup(void)
int gpg_key_validate(const char *fpr)
{
- int r;
gpgme_error_t err;
+ int r;
r = gpg_init();
- if (r)
+ if (r < 0)
return r;
err = gpgme_get_key(ctx, fpr, key, 1);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
- gpg_cleanup();
return 0;
}
int gpg_decrypt(FILE *pass_out, const char *pass_path)
{
- int r;
- char buf[BUFSIZ];
gpgme_data_t in, out;
gpgme_error_t err;
+ char buf[BUFSIZ];
+ int r;
r = gpg_init();
- if (r)
+ if (r < 0)
return r;
err = gpgme_data_new_from_file(&in, pass_path, 1);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
+
err = gpgme_data_new(&out);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
+
err = gpgme_op_decrypt(ctx, in, out);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
r = gpgme_data_seek(out, 0, SEEK_SET);
- if (r)
- gpg_err_ret(gpgme_err_code_from_errno(errno));
+ if (r < 0)
+ goto out_gpg_cleanup;
while ((r = gpgme_data_read(out, buf, sizeof(buf))))
fwrite(buf, r, 1, pass_out);
if (r < 0)
- gpg_err_ret(gpgme_err_code_from_errno(errno));
+ goto out_gpg_cleanup;
+out_gpg_cleanup:
gpg_cleanup();
- return 0;
+
+ /*
+ * refactor err_ret for -errno
+ */
+ if (r < 0)
+ err_ret(-errno, "%s", strerror(errno));
+ else
+ return 0;
}
int gpg_encrypt(FILE *stream, const char *fpr, const char *pass, size_t n)
@@ -104,28 +123,42 @@ int gpg_encrypt(FILE *stream, const char *fpr, const char *pass, size_t n)
gpgme_error_t err;
r = gpg_init();
- if (r)
+ if (r < 0)
return r;
err = gpgme_get_key(ctx, fpr, key, 1);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
err = gpgme_data_new_from_mem(&in, pass, n, 0);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
+
err = gpgme_data_new(&out);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
+
err = gpgme_op_encrypt(ctx, key, GPGME_ENCRYPT_ALWAYS_TRUST, in, out);
- gpg_err_ret(err);
+ if (err != GPG_ERR_NO_ERROR)
+ gpg_err_ret(err);
r = gpgme_data_seek(out, 0, SEEK_SET);
- if (r)
- gpg_err_ret(gpgme_err_code_from_errno(errno));
+ if (r < 0)
+ goto out_gpg_cleanup;
while ((r = gpgme_data_read(out, buf, sizeof(buf))))
fwrite(buf, r, 1, stream);
- gpg_cleanup();
if (r < 0)
- gpg_err_ret(gpgme_err_code_from_errno(errno));
+ goto out_gpg_cleanup;
- return 0;
+out_gpg_cleanup:
+ gpg_cleanup();
+
+ /*
+ * refactor err_ret for -errno
+ */
+ if (r < 0)
+ err_ret(-errno, "%s", strerror(errno));
+ else
+ return 0;
}