1
/* preset-passphrase.c - A tool to preset a passphrase.
2
* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
4
* This file is part of GnuPG.
6
* GnuPG is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* GnuPG is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
35
#ifdef HAVE_LANGINFO_CODESET
38
#ifdef HAVE_DOSISH_SYSTEM
39
#include <fcntl.h> /* for setmode() */
42
#define JNLIB_NEED_LOG_LOGV
45
#include "simple-pwquery.h"
50
enum cmd_and_opt_values
64
struct rsa_secret_key_s
66
gcry_mpi_t n; /* public modulus */
67
gcry_mpi_t e; /* public exponent */
68
gcry_mpi_t d; /* exponent */
69
gcry_mpi_t p; /* prime p. */
70
gcry_mpi_t q; /* prime q. */
71
gcry_mpi_t u; /* inverse of p mod q. */
75
static char *opt_homedir;
76
static const char *opt_passphrase;
78
static ARGPARSE_OPTS opts[] = {
80
{ 301, NULL, 0, N_("@Options:\n ") },
82
{ oVerbose, "verbose", 0, "verbose" },
83
{ oPassphrase, "passphrase", 2, "|STRING|use passphrase STRING" },
84
{ oPreset, "preset", 256, "preset passphrase"},
85
{ oForget, "forget", 256, "forget passphrase"},
87
{ oHomedir, "homedir", 2, "@" },
92
my_strusage (int level)
97
case 11: p = "gpg-preset-passphrase (GnuPG)";
99
case 13: p = VERSION; break;
100
case 17: p = PRINTABLE_OS_NAME; break;
101
case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n");
104
case 40: p = _("Usage: gpg-preset-passphrase [options] KEYID (-h for help)\n");
106
case 41: p = _("Syntax: gpg-preset-passphrase [options] KEYID\n"
107
"Password cache maintenance\n");
120
#ifdef USE_SIMPLE_GETTEXT
121
set_gettext_file( PACKAGE_GT );
124
setlocale (LC_ALL, "");
125
bindtextdomain (PACKAGE_GT, LOCALEDIR);
126
textdomain (PACKAGE_GT);
133
map_spwq_error (int err)
139
case SPWQ_OUT_OF_CORE:
140
return gpg_error_from_errno (ENOMEM);
142
return gpg_error_from_errno (EIO);
143
case SPWQ_PROTOCOL_ERROR:
144
return gpg_error (GPG_ERR_PROTOCOL_VIOLATION);
145
case SPWQ_ERR_RESPONSE:
146
return gpg_error (GPG_ERR_INV_RESPONSE);
148
return gpg_error (GPG_ERR_NO_AGENT);
150
return gpg_error_from_errno (errno);
151
case SPWQ_GENERAL_ERROR:
153
return gpg_error (GPG_ERR_GENERAL);
159
preset_passphrase (const char *keygrip)
163
/* FIXME: Use secure memory. */
164
char passphrase[500];
166
rc = read (0, passphrase, sizeof (passphrase) - 1);
169
log_error ("reading passphrase failed %s\n",
170
gpg_strerror (gpg_error_from_errno (errno)));
173
passphrase[rc] = '\0';
174
line = strchr (passphrase, '\n');
178
if (line > passphrase && line[-1] == '\r')
183
/* FIXME: How to handle empty passwords? */
185
rc = asprintf (&line, "PRESET_PASSPHRASE %s -1 %s\n", keygrip, passphrase);
188
log_error ("caching passphrase failed %s\n",
189
gpg_strerror (gpg_error_from_errno (errno)));
192
wipememory (passphrase, sizeof (passphrase));
194
rc = map_spwq_error (simple_query (line));
197
log_error ("caching passphrase failed %s\n", gpg_strerror (rc));
201
wipememory (line, strlen (line));
207
forget_passphrase (const char *keygrip)
212
rc = asprintf (&line, "CLEAR_PASSPHRASE %s\n", keygrip);
215
log_error ("clearing passphrase failed %s\n",
216
gpg_strerror (gpg_error_from_errno (errno)));
224
main (int argc, char **argv)
228
const char *keygrip = NULL;
230
set_strusage (my_strusage);
231
log_set_prefix ("gpg-preset-passphrase", 1);
233
/* Try to auto set the character set. */
234
set_native_charset (NULL);
238
opt_homedir = getenv ("GNUPGHOME");
239
#ifdef HAVE_W32_SYSTEM
240
if (!opt_homedir || !*opt_homedir)
241
opt_homedir = read_w32_registry_string (NULL,
242
"Software\\GNU\\GnuPG", "HomeDir");
243
#endif /*HAVE_W32_SYSTEM*/
244
if (!opt_homedir || !*opt_homedir)
245
opt_homedir = GNUPG_DEFAULT_HOMEDIR;
250
pargs.flags= 1; /* (do not remove the args) */
251
while (arg_parse (&pargs, opts) )
255
case oVerbose: opt.verbose++; break;
256
case oHomedir: opt_homedir = pargs.r.ret_str; break;
258
case oPreset: cmd = oPreset; break;
259
case oForget: cmd = oForget; break;
260
case oPassphrase: opt_passphrase = pargs.r.ret_str; break;
262
default : pargs.err = 2; break;
265
if (log_get_errorcount(0))
274
preset_passphrase (keygrip);
275
else if (cmd == oForget)
276
forget_passphrase (keygrip);
281
return 8; /*NOTREACHED*/
288
rc = rc? rc : log_get_errorcount(0)? 2 : 0;