aboutsummaryrefslogtreecommitdiffstats
path: root/sm/gpgsm.c
diff options
context:
space:
mode:
authorJustus Winter <[email protected]>2016-03-07 17:09:41 +0000
committerJustus Winter <[email protected]>2016-03-07 17:16:37 +0000
commiteea139c56ef55081d8cd8df2a35ce507386e0f17 (patch)
tree1cda1181beca082d53b439311b84b7639e940a8c /sm/gpgsm.c
parentsm: Remove unused argument '--fixed-passphrase'. (diff)
downloadgnupg-eea139c56ef55081d8cd8df2a35ce507386e0f17.tar.gz
gnupg-eea139c56ef55081d8cd8df2a35ce507386e0f17.zip
sm: Implement pinentry loopback and reading passphrases from fd.
* doc/gpgsm.texi: Document '--pinentry-mode' and '--passphrase-fd'. * sm/Makefile.am (gpgsm_SOURCES): Add new files * sm/call-agent.c (struct default_inq_parm_s): New definition. (start_agent): Pass in the pinentry mode. (default_inq_cb): Handle 'PASSPHRASE' and 'NEW_PASSPHRASE' inquiries. Adapt all call sites to the new callback cookie. * sm/gpgsm.c (cmd_and_opt_values): Add new values. (opts): Add new options. (main): Handle new options. * sm/gpgsm.h (struct opt): Add field 'pinentry_mode'. * sm/passphrase.c: New file. * sm/passphrase.h: Likewise. GnuPG-bug-id: 1970 Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'sm/gpgsm.c')
-rw-r--r--sm/gpgsm.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/sm/gpgsm.c b/sm/gpgsm.c
index 364dd43ff..fc6d1c75a 100644
--- a/sm/gpgsm.c
+++ b/sm/gpgsm.c
@@ -32,6 +32,8 @@
#include <gcrypt.h>
#include <assuan.h> /* malloc hooks */
+#include "passphrase.h"
+#include "../common/shareddefs.h"
#include "../kbx/keybox.h" /* malloc hooks */
#include "i18n.h"
#include "keydb.h"
@@ -120,6 +122,8 @@ enum cmd_and_opt_values {
oProtectToolProgram,
oFakedSystemTime,
+ oPassphraseFD,
+ oPinentryMode,
oAssumeArmor,
oAssumeBase64,
@@ -243,6 +247,9 @@ static ARGPARSE_OPTS opts[] = {
ARGPARSE_s_s (oP12Charset, "p12-charset", "@"),
+ ARGPARSE_s_i (oPassphraseFD, "passphrase-fd", "@"),
+ ARGPARSE_s_s (oPinentryMode, "pinentry-mode", "@"),
+
ARGPARSE_s_n (oAssumeArmor, "assume-armor",
N_("assume input is in PEM format")),
ARGPARSE_s_n (oAssumeBase64, "assume-base64",
@@ -910,7 +917,7 @@ main ( int argc, char **argv)
estream_t auditfp = NULL;
estream_t htmlauditfp = NULL;
struct assuan_malloc_hooks malloc_hooks;
-
+ int pwfd = -1;
/*mtrace();*/
early_system_init ();
@@ -1150,6 +1157,16 @@ main ( int argc, char **argv)
opt.p12_charset = pargs.r.ret_str;
break;
+ case oPassphraseFD:
+ pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
+ break;
+
+ case oPinentryMode:
+ opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
+ if (opt.pinentry_mode == -1)
+ log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
+ break;
+
/* Input encoding selection. */
case oAssumeArmor:
ctrl.autodetect_encoding = 0;
@@ -1458,6 +1475,9 @@ main ( int argc, char **argv)
if (log_get_errorcount(0))
gpgsm_exit(2);
+ if (pwfd != -1) /* Read the passphrase now. */
+ read_passphrase_from_fd (pwfd);
+
/* Now that we have the options parsed we need to update the default
control structure. */
gpgsm_init_default_ctrl (&ctrl);