mirror of
git://git.gnupg.org/gnupg.git
synced 2025-03-11 22:52:47 +01:00
parent
5e208460a1
commit
002f51031a
@ -1,3 +1,22 @@
|
|||||||
|
2009-05-15 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
Fix bug #1053.
|
||||||
|
|
||||||
|
* agent.h (lookup_ttl_t): New.
|
||||||
|
* findkey.c (unprotect): Add arg LOOKUP_TTL.
|
||||||
|
(agent_key_from_file): Ditto.
|
||||||
|
* pksign.c (agent_pksign_do): Ditto.
|
||||||
|
* command-ssh.c (ttl_from_sshcontrol): New.
|
||||||
|
(data_sign): Pass new function to agent_pksign_do.
|
||||||
|
(search_control_file): Add new arg R_TTL.
|
||||||
|
|
||||||
|
2009-05-14 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
* command.c (cmd_get_passphrase): Add option --qualitybar.
|
||||||
|
* call-pinentry.c (agent_askpin): Factor some code out to ...
|
||||||
|
(setup_qualitybar): .. new.
|
||||||
|
(agent_get_passphrase): Add arg WITH_QUALITYBAR and implement it.
|
||||||
|
|
||||||
2009-04-14 Marcus Brinkmann <marcus@g10code.de>
|
2009-04-14 Marcus Brinkmann <marcus@g10code.de>
|
||||||
|
|
||||||
* call-pinentry.c (agent_get_confirmation): Try SETNOTOK command
|
* call-pinentry.c (agent_get_confirmation): Try SETNOTOK command
|
||||||
|
@ -201,6 +201,10 @@ typedef enum
|
|||||||
cache_mode_t;
|
cache_mode_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* The type of a function to lookup a TTL by a keygrip. */
|
||||||
|
typedef int (*lookup_ttl_t)(const char *hexgrip);
|
||||||
|
|
||||||
|
|
||||||
/*-- gpg-agent.c --*/
|
/*-- gpg-agent.c --*/
|
||||||
void agent_exit (int rc) JNLIB_GCC_A_NR; /* Also implemented in other tools */
|
void agent_exit (int rc) JNLIB_GCC_A_NR; /* Also implemented in other tools */
|
||||||
const char *get_agent_socket_name (void);
|
const char *get_agent_socket_name (void);
|
||||||
@ -229,6 +233,7 @@ gpg_error_t agent_key_from_file (ctrl_t ctrl,
|
|||||||
const unsigned char *grip,
|
const unsigned char *grip,
|
||||||
unsigned char **shadow_info,
|
unsigned char **shadow_info,
|
||||||
cache_mode_t cache_mode,
|
cache_mode_t cache_mode,
|
||||||
|
lookup_ttl_t lookup_ttl,
|
||||||
gcry_sexp_t *result);
|
gcry_sexp_t *result);
|
||||||
gpg_error_t agent_public_key_from_file (ctrl_t ctrl,
|
gpg_error_t agent_public_key_from_file (ctrl_t ctrl,
|
||||||
const unsigned char *grip,
|
const unsigned char *grip,
|
||||||
@ -249,7 +254,7 @@ int agent_askpin (ctrl_t ctrl,
|
|||||||
struct pin_entry_info_s *pininfo);
|
struct pin_entry_info_s *pininfo);
|
||||||
int agent_get_passphrase (ctrl_t ctrl, char **retpass,
|
int agent_get_passphrase (ctrl_t ctrl, char **retpass,
|
||||||
const char *desc, const char *prompt,
|
const char *desc, const char *prompt,
|
||||||
const char *errtext);
|
const char *errtext, int with_qualitybar);
|
||||||
int agent_get_confirmation (ctrl_t ctrl, const char *desc, const char *ok,
|
int agent_get_confirmation (ctrl_t ctrl, const char *desc, const char *ok,
|
||||||
const char *cancel);
|
const char *cancel);
|
||||||
int agent_show_message (ctrl_t ctrl, const char *desc, const char *ok_btn);
|
int agent_show_message (ctrl_t ctrl, const char *desc, const char *ok_btn);
|
||||||
@ -270,7 +275,7 @@ void agent_unlock_cache_entry (void **cache_id);
|
|||||||
/*-- pksign.c --*/
|
/*-- pksign.c --*/
|
||||||
int agent_pksign_do (ctrl_t ctrl, const char *desc_text,
|
int agent_pksign_do (ctrl_t ctrl, const char *desc_text,
|
||||||
gcry_sexp_t *signature_sexp,
|
gcry_sexp_t *signature_sexp,
|
||||||
cache_mode_t cache_mode);
|
cache_mode_t cache_mode, lookup_ttl_t lookup_ttl);
|
||||||
int agent_pksign (ctrl_t ctrl, const char *desc_text,
|
int agent_pksign (ctrl_t ctrl, const char *desc_text,
|
||||||
membuf_t *outbuf, cache_mode_t cache_mode);
|
membuf_t *outbuf, cache_mode_t cache_mode);
|
||||||
|
|
||||||
|
@ -194,8 +194,8 @@ agent_flush_cache (void)
|
|||||||
with a maximum lifetime of TTL seconds. If there is already data
|
with a maximum lifetime of TTL seconds. If there is already data
|
||||||
under this key, it will be replaced. Using a DATA of NULL deletes
|
under this key, it will be replaced. Using a DATA of NULL deletes
|
||||||
the entry. A TTL of 0 is replaced by the default TTL and a TTL of
|
the entry. A TTL of 0 is replaced by the default TTL and a TTL of
|
||||||
-1 set infinite timeout. CACHE_MODE is stored with the cache entry
|
-1 set infinite timeout. CACHE_MODE is stored with the cache entry
|
||||||
and used t select different timeouts. */
|
and used to select different timeouts. */
|
||||||
int
|
int
|
||||||
agent_put_cache (const char *key, cache_mode_t cache_mode,
|
agent_put_cache (const char *key, cache_mode_t cache_mode,
|
||||||
const char *data, int ttl)
|
const char *data, int ttl)
|
||||||
|
@ -570,6 +570,59 @@ inq_quality (void *opaque, const char *line)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Helper for agent_askpin and agent_get_passphrase. */
|
||||||
|
static int
|
||||||
|
setup_qualitybar (void)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
char line[ASSUAN_LINELENGTH];
|
||||||
|
char *tmpstr, *tmpstr2;
|
||||||
|
const char *tooltip;
|
||||||
|
|
||||||
|
/* TRANSLATORS: This string is displayed by Pinentry as the label
|
||||||
|
for the quality bar. */
|
||||||
|
tmpstr = try_percent_escape (_("Quality:"), "\t\r\n\f\v");
|
||||||
|
snprintf (line, DIM(line)-1, "SETQUALITYBAR %s", tmpstr? tmpstr:"");
|
||||||
|
line[DIM(line)-1] = 0;
|
||||||
|
xfree (tmpstr);
|
||||||
|
rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
if (rc == 103 /*(Old assuan error code)*/
|
||||||
|
|| gpg_err_code (rc) == GPG_ERR_ASS_UNKNOWN_CMD)
|
||||||
|
; /* Ignore Unknown Command from old Pinentry versions. */
|
||||||
|
else if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
tmpstr2 = gnupg_get_help_string ("pinentry.qualitybar.tooltip", 0);
|
||||||
|
if (tmpstr2)
|
||||||
|
tooltip = tmpstr2;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TRANSLATORS: This string is a tooltip, shown by pinentry when
|
||||||
|
hovering over the quality bar. Please use an appropriate
|
||||||
|
string to describe what this is about. The length of the
|
||||||
|
tooltip is limited to about 900 characters. If you do not
|
||||||
|
translate this entry, a default english text (see source)
|
||||||
|
will be used. */
|
||||||
|
tooltip = _("pinentry.qualitybar.tooltip");
|
||||||
|
if (!strcmp ("pinentry.qualitybar.tooltip", tooltip))
|
||||||
|
tooltip = ("The quality of the text entered above.\n"
|
||||||
|
"Please ask your administrator for "
|
||||||
|
"details about the criteria.");
|
||||||
|
}
|
||||||
|
tmpstr = try_percent_escape (tooltip, "\t\r\n\f\v");
|
||||||
|
xfree (tmpstr2);
|
||||||
|
snprintf (line, DIM(line)-1, "SETQUALITYBAR_TT %s", tmpstr? tmpstr:"");
|
||||||
|
line[DIM(line)-1] = 0;
|
||||||
|
xfree (tmpstr);
|
||||||
|
rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
if (rc == 103 /*(Old assuan error code)*/
|
||||||
|
|| gpg_err_code (rc) == GPG_ERR_ASS_UNKNOWN_CMD)
|
||||||
|
; /* Ignore Unknown Command from old pinentry versions. */
|
||||||
|
else if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -627,51 +680,8 @@ agent_askpin (ctrl_t ctrl,
|
|||||||
to the pinentry. */
|
to the pinentry. */
|
||||||
if (pininfo->with_qualitybar && opt.min_passphrase_len )
|
if (pininfo->with_qualitybar && opt.min_passphrase_len )
|
||||||
{
|
{
|
||||||
char *tmpstr, *tmpstr2;
|
rc = setup_qualitybar ();
|
||||||
const char *tooltip;
|
if (rc)
|
||||||
|
|
||||||
/* TRANSLATORS: This string is displayed by pinentry as the
|
|
||||||
label for the quality bar. */
|
|
||||||
tmpstr = try_percent_escape (_("Quality:"), "\t\r\n\f\v");
|
|
||||||
snprintf (line, DIM(line)-1, "SETQUALITYBAR %s", tmpstr? tmpstr:"");
|
|
||||||
line[DIM(line)-1] = 0;
|
|
||||||
xfree (tmpstr);
|
|
||||||
rc = assuan_transact (entry_ctx, line,
|
|
||||||
NULL, NULL, NULL, NULL, NULL, NULL);
|
|
||||||
if (rc == 103 /*(Old assuan error code)*/
|
|
||||||
|| gpg_err_code (rc) == GPG_ERR_ASS_UNKNOWN_CMD)
|
|
||||||
; /* Ignore Unknown Command from old pinentry versions. */
|
|
||||||
else if (rc)
|
|
||||||
return unlock_pinentry (rc);
|
|
||||||
|
|
||||||
tmpstr2 = gnupg_get_help_string ("pinentry.qualitybar.tooltip", 0);
|
|
||||||
if (tmpstr2)
|
|
||||||
tooltip = tmpstr2;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* TRANSLATORS: This string is a tooltip, shown by pinentry
|
|
||||||
when hovering over the quality bar. Please use an
|
|
||||||
appropriate string to describe what this is about. The
|
|
||||||
length of the tooltip is limited to about 900 characters.
|
|
||||||
If you do not translate this entry, a default english
|
|
||||||
text (see source) will be used. */
|
|
||||||
tooltip = _("pinentry.qualitybar.tooltip");
|
|
||||||
if (!strcmp ("pinentry.qualitybar.tooltip", tooltip))
|
|
||||||
tooltip = ("The quality of the text entered above.\n"
|
|
||||||
"Please ask your administrator for "
|
|
||||||
"details about the criteria.");
|
|
||||||
}
|
|
||||||
tmpstr = try_percent_escape (tooltip, "\t\r\n\f\v");
|
|
||||||
xfree (tmpstr2);
|
|
||||||
snprintf (line, DIM(line)-1, "SETQUALITYBAR_TT %s", tmpstr? tmpstr:"");
|
|
||||||
line[DIM(line)-1] = 0;
|
|
||||||
xfree (tmpstr);
|
|
||||||
rc = assuan_transact (entry_ctx, line,
|
|
||||||
NULL, NULL, NULL, NULL, NULL, NULL);
|
|
||||||
if (rc == 103 /*(Old assuan error code)*/
|
|
||||||
|| gpg_err_code (rc) == GPG_ERR_ASS_UNKNOWN_CMD)
|
|
||||||
; /* Ignore Unknown Command from old pinentry versions. */
|
|
||||||
else if (rc)
|
|
||||||
return unlock_pinentry (rc);
|
return unlock_pinentry (rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -764,7 +774,7 @@ agent_askpin (ctrl_t ctrl,
|
|||||||
int
|
int
|
||||||
agent_get_passphrase (ctrl_t ctrl,
|
agent_get_passphrase (ctrl_t ctrl,
|
||||||
char **retpass, const char *desc, const char *prompt,
|
char **retpass, const char *desc, const char *prompt,
|
||||||
const char *errtext)
|
const char *errtext, int with_qualitybar)
|
||||||
{
|
{
|
||||||
|
|
||||||
int rc;
|
int rc;
|
||||||
@ -798,6 +808,13 @@ agent_get_passphrase (ctrl_t ctrl,
|
|||||||
if (rc)
|
if (rc)
|
||||||
return unlock_pinentry (rc);
|
return unlock_pinentry (rc);
|
||||||
|
|
||||||
|
if (with_qualitybar && opt.min_passphrase_len)
|
||||||
|
{
|
||||||
|
rc = setup_qualitybar ();
|
||||||
|
if (rc)
|
||||||
|
return unlock_pinentry (rc);
|
||||||
|
}
|
||||||
|
|
||||||
if (errtext)
|
if (errtext)
|
||||||
{
|
{
|
||||||
snprintf (line, DIM(line)-1, "SETERROR %s", errtext);
|
snprintf (line, DIM(line)-1, "SETERROR %s", errtext);
|
||||||
@ -815,7 +832,7 @@ agent_get_passphrase (ctrl_t ctrl,
|
|||||||
|
|
||||||
assuan_begin_confidential (entry_ctx);
|
assuan_begin_confidential (entry_ctx);
|
||||||
rc = assuan_transact (entry_ctx, "GETPIN", getpin_cb, &parm,
|
rc = assuan_transact (entry_ctx, "GETPIN", getpin_cb, &parm,
|
||||||
NULL, NULL, NULL, NULL);
|
inq_quality, entry_ctx, NULL, NULL);
|
||||||
/* Most pinentries out in the wild return the old Assuan error code
|
/* Most pinentries out in the wild return the old Assuan error code
|
||||||
for canceled which gets translated to an assuan Cancel error and
|
for canceled which gets translated to an assuan Cancel error and
|
||||||
not to the code for a user cancel. Fix this here. */
|
not to the code for a user cancel. Fix this here. */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* command-ssh.c - gpg-agent's ssh-agent emulation layer
|
/* command-ssh.c - gpg-agent's ssh-agent emulation layer
|
||||||
* Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
|
* Copyright (C) 2004, 2005, 2006, 2009 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GnuPG.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -710,17 +710,20 @@ open_control_file (FILE **r_fp, int append)
|
|||||||
|
|
||||||
/* Search the file at stream FP from the beginning until a matching
|
/* Search the file at stream FP from the beginning until a matching
|
||||||
HEXGRIP is found; return success in this case and store true at
|
HEXGRIP is found; return success in this case and store true at
|
||||||
DISABLED if the found key has been disabled. */
|
DISABLED if the found key has been disabled. If R_TTL is not NULL
|
||||||
|
a specified TTL for that key is stored there. */
|
||||||
static gpg_error_t
|
static gpg_error_t
|
||||||
search_control_file (FILE *fp, const char *hexgrip, int *disabled)
|
search_control_file (FILE *fp, const char *hexgrip,
|
||||||
|
int *r_disabled, int *r_ttl)
|
||||||
{
|
{
|
||||||
int c, i;
|
int c, i;
|
||||||
char *p, line[256];
|
char *p, *pend, line[256];
|
||||||
|
long ttl;
|
||||||
|
|
||||||
assert (strlen (hexgrip) == 40 );
|
assert (strlen (hexgrip) == 40 );
|
||||||
|
|
||||||
rewind (fp);
|
rewind (fp);
|
||||||
*disabled = 0;
|
*r_disabled = 0;
|
||||||
next_line:
|
next_line:
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@ -746,10 +749,10 @@ search_control_file (FILE *fp, const char *hexgrip, int *disabled)
|
|||||||
}
|
}
|
||||||
while (!*p || *p == '\n' || *p == '#');
|
while (!*p || *p == '\n' || *p == '#');
|
||||||
|
|
||||||
*disabled = 0;
|
*r_disabled = 0;
|
||||||
if (*p == '!')
|
if (*p == '!')
|
||||||
{
|
{
|
||||||
*disabled = 1;
|
*r_disabled = 1;
|
||||||
for (p++; spacep (p); p++)
|
for (p++; spacep (p); p++)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
@ -763,7 +766,17 @@ search_control_file (FILE *fp, const char *hexgrip, int *disabled)
|
|||||||
return gpg_error (GPG_ERR_BAD_DATA);
|
return gpg_error (GPG_ERR_BAD_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fixme: Get TTL and flags. */
|
ttl = strtol (p, &pend, 10);
|
||||||
|
p = pend;
|
||||||
|
if (!(spacep (p) || *p == '\n') || ttl < -1)
|
||||||
|
{
|
||||||
|
log_error ("invalid TTL value in ssh control file; assuming 0\n");
|
||||||
|
ttl = 0;
|
||||||
|
}
|
||||||
|
if (r_ttl)
|
||||||
|
*r_ttl = ttl;
|
||||||
|
|
||||||
|
/* Here is the place to parse flags if we need them. */
|
||||||
|
|
||||||
return 0; /* Okay: found it. */
|
return 0; /* Okay: found it. */
|
||||||
}
|
}
|
||||||
@ -788,7 +801,7 @@ add_control_entry (ctrl_t ctrl, const char *hexgrip, int ttl)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = search_control_file (fp, hexgrip, &disabled);
|
err = search_control_file (fp, hexgrip, &disabled, NULL);
|
||||||
if (err && gpg_err_code(err) == GPG_ERR_EOF)
|
if (err && gpg_err_code(err) == GPG_ERR_EOF)
|
||||||
{
|
{
|
||||||
struct tm *tp;
|
struct tm *tp;
|
||||||
@ -808,6 +821,29 @@ add_control_entry (ctrl_t ctrl, const char *hexgrip, int ttl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Scan the sshcontrol file and return the TTL. */
|
||||||
|
static int
|
||||||
|
ttl_from_sshcontrol (const char *hexgrip)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
int disabled, ttl;
|
||||||
|
|
||||||
|
if (!hexgrip || strlen (hexgrip) != 40)
|
||||||
|
return 0; /* Wrong input: Use global default. */
|
||||||
|
|
||||||
|
if (open_control_file (&fp, 0))
|
||||||
|
return 0; /* Error: Use the global default TTL. */
|
||||||
|
|
||||||
|
if (search_control_file (fp, hexgrip, &disabled, &ttl)
|
||||||
|
|| disabled)
|
||||||
|
ttl = 0; /* Use the global default if not found or disabled. */
|
||||||
|
|
||||||
|
fclose (fp);
|
||||||
|
|
||||||
|
return ttl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1875,7 +1911,7 @@ ssh_handler_request_identities (ctrl_t ctrl,
|
|||||||
hexgrip[40] = 0;
|
hexgrip[40] = 0;
|
||||||
if ( strlen (hexgrip) != 40 )
|
if ( strlen (hexgrip) != 40 )
|
||||||
continue;
|
continue;
|
||||||
if (search_control_file (ctrl_fp, hexgrip, &disabled)
|
if (search_control_file (ctrl_fp, hexgrip, &disabled, NULL)
|
||||||
|| disabled)
|
|| disabled)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1972,6 +2008,7 @@ ssh_handler_request_identities (ctrl_t ctrl,
|
|||||||
return ret_err;
|
return ret_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* This function hashes the data contained in DATA of size DATA_N
|
/* This function hashes the data contained in DATA of size DATA_N
|
||||||
according to the message digest algorithm specified by MD_ALGORITHM
|
according to the message digest algorithm specified by MD_ALGORITHM
|
||||||
and writes the message digest to HASH, which needs to large enough
|
and writes the message digest to HASH, which needs to large enough
|
||||||
@ -2017,7 +2054,7 @@ data_sign (ctrl_t ctrl, ssh_signature_encoder_t sig_encoder,
|
|||||||
err = agent_pksign_do (ctrl,
|
err = agent_pksign_do (ctrl,
|
||||||
_("Please enter the passphrase "
|
_("Please enter the passphrase "
|
||||||
"for the ssh key%0A %c"), &signature_sexp,
|
"for the ssh key%0A %c"), &signature_sexp,
|
||||||
CACHE_MODE_SSH);
|
CACHE_MODE_SSH, ttl_from_sshcontrol);
|
||||||
ctrl->use_auth_call = 0;
|
ctrl->use_auth_call = 0;
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -986,7 +986,8 @@ send_back_passphrase (assuan_context_t ctx, int via_data, const char *pw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* GET_PASSPHRASE [--data] [--check] [--no-ask] [--repeat[=N]] <cache_id>
|
/* GET_PASSPHRASE [--data] [--check] [--no-ask] [--repeat[=N]]
|
||||||
|
[--qualitybar] <cache_id>
|
||||||
[<error_message> <prompt> <description>]
|
[<error_message> <prompt> <description>]
|
||||||
|
|
||||||
This function is usually used to ask for a passphrase to be used
|
This function is usually used to ask for a passphrase to be used
|
||||||
@ -1007,6 +1008,10 @@ send_back_passphrase (assuan_context_t ctx, int via_data, const char *pw)
|
|||||||
If the option "--no-ask" is used and the passphrase is not in the
|
If the option "--no-ask" is used and the passphrase is not in the
|
||||||
cache the user will not be asked to enter a passphrase but the error
|
cache the user will not be asked to enter a passphrase but the error
|
||||||
code GPG_ERR_NO_DATA is returned.
|
code GPG_ERR_NO_DATA is returned.
|
||||||
|
|
||||||
|
If the option "--qualitybar" is used a visual indication of the
|
||||||
|
entered passphrase quality is shown. (Unless no minimum passphrase
|
||||||
|
length has been configured.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -1020,7 +1025,8 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
|
|||||||
const char *desc2 = _("Please re-enter this passphrase");
|
const char *desc2 = _("Please re-enter this passphrase");
|
||||||
char *p;
|
char *p;
|
||||||
void *cache_marker;
|
void *cache_marker;
|
||||||
int opt_data, opt_check, opt_no_ask, opt_repeat = 0;
|
int opt_data, opt_check, opt_no_ask, opt_qualbar;
|
||||||
|
int opt_repeat = 0;
|
||||||
char *repeat_errtext = NULL;
|
char *repeat_errtext = NULL;
|
||||||
|
|
||||||
opt_data = has_option (line, "--data");
|
opt_data = has_option (line, "--data");
|
||||||
@ -1034,6 +1040,7 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
|
|||||||
else
|
else
|
||||||
opt_repeat = 1;
|
opt_repeat = 1;
|
||||||
}
|
}
|
||||||
|
opt_qualbar = has_option (line, "--qualitybar");
|
||||||
line = skip_options (line);
|
line = skip_options (line);
|
||||||
|
|
||||||
cacheid = line;
|
cacheid = line;
|
||||||
@ -1102,7 +1109,8 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
|
|||||||
|
|
||||||
next_try:
|
next_try:
|
||||||
rc = agent_get_passphrase (ctrl, &response, desc, prompt,
|
rc = agent_get_passphrase (ctrl, &response, desc, prompt,
|
||||||
repeat_errtext? repeat_errtext:errtext);
|
repeat_errtext? repeat_errtext:errtext,
|
||||||
|
opt_qualbar);
|
||||||
xfree (repeat_errtext);
|
xfree (repeat_errtext);
|
||||||
repeat_errtext = NULL;
|
repeat_errtext = NULL;
|
||||||
if (!rc)
|
if (!rc)
|
||||||
@ -1119,7 +1127,7 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
|
|||||||
char *response2;
|
char *response2;
|
||||||
|
|
||||||
rc = agent_get_passphrase (ctrl, &response2, desc2, prompt,
|
rc = agent_get_passphrase (ctrl, &response2, desc2, prompt,
|
||||||
errtext);
|
errtext, 0);
|
||||||
if (rc)
|
if (rc)
|
||||||
break;
|
break;
|
||||||
if (strcmp (response2, response))
|
if (strcmp (response2, response))
|
||||||
@ -1265,7 +1273,8 @@ cmd_passwd (assuan_context_t ctx, char *line)
|
|||||||
|
|
||||||
ctrl->in_passwd++;
|
ctrl->in_passwd++;
|
||||||
rc = agent_key_from_file (ctrl, ctrl->server_local->keydesc,
|
rc = agent_key_from_file (ctrl, ctrl->server_local->keydesc,
|
||||||
grip, &shadow_info, CACHE_MODE_IGNORE, &s_skey);
|
grip, &shadow_info, CACHE_MODE_IGNORE, NULL,
|
||||||
|
&s_skey);
|
||||||
if (rc)
|
if (rc)
|
||||||
;
|
;
|
||||||
else if (!s_skey)
|
else if (!s_skey)
|
||||||
|
@ -297,11 +297,12 @@ modify_description (const char *in, const char *comment, char **result)
|
|||||||
/* Unprotect the canconical encoded S-expression key in KEYBUF. GRIP
|
/* Unprotect the canconical encoded S-expression key in KEYBUF. GRIP
|
||||||
should be the hex encoded keygrip of that key to be used with the
|
should be the hex encoded keygrip of that key to be used with the
|
||||||
caching mechanism. DESC_TEXT may be set to override the default
|
caching mechanism. DESC_TEXT may be set to override the default
|
||||||
description used for the pinentry. */
|
description used for the pinentry. If LOOKUP_TTL is given this
|
||||||
|
function is used to lookup the default ttl. */
|
||||||
static int
|
static int
|
||||||
unprotect (ctrl_t ctrl, const char *desc_text,
|
unprotect (ctrl_t ctrl, const char *desc_text,
|
||||||
unsigned char **keybuf, const unsigned char *grip,
|
unsigned char **keybuf, const unsigned char *grip,
|
||||||
cache_mode_t cache_mode)
|
cache_mode_t cache_mode, lookup_ttl_t lookup_ttl)
|
||||||
{
|
{
|
||||||
struct pin_entry_info_s *pi;
|
struct pin_entry_info_s *pi;
|
||||||
struct try_unprotect_arg_s arg;
|
struct try_unprotect_arg_s arg;
|
||||||
@ -406,7 +407,8 @@ unprotect (ctrl_t ctrl, const char *desc_text,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
agent_put_cache (hexgrip, cache_mode, pi->pin, 0);
|
agent_put_cache (hexgrip, cache_mode, pi->pin,
|
||||||
|
lookup_ttl? lookup_ttl (hexgrip) : 0);
|
||||||
xfree (*keybuf);
|
xfree (*keybuf);
|
||||||
*keybuf = arg.unprotected_key;
|
*keybuf = arg.unprotected_key;
|
||||||
}
|
}
|
||||||
@ -488,11 +490,16 @@ read_key_file (const unsigned char *grip, gcry_sexp_t *result)
|
|||||||
to a token; in this case an allocated S-expression with the
|
to a token; in this case an allocated S-expression with the
|
||||||
shadow_info part from the file is stored at SHADOW_INFO.
|
shadow_info part from the file is stored at SHADOW_INFO.
|
||||||
CACHE_MODE defines now the cache shall be used. DESC_TEXT may be
|
CACHE_MODE defines now the cache shall be used. DESC_TEXT may be
|
||||||
set to present a custom description for the pinentry. */
|
set to present a custom description for the pinentry. LOOKUP_TTL
|
||||||
|
is an optional function to convey a TTL to the cache manager; we do
|
||||||
|
not simply pass the TTL value because the value is only needed if an
|
||||||
|
unprotect action was needed and looking up the TTL may have some
|
||||||
|
overhead (e.g. scanning the sshcontrol file). */
|
||||||
gpg_error_t
|
gpg_error_t
|
||||||
agent_key_from_file (ctrl_t ctrl, const char *desc_text,
|
agent_key_from_file (ctrl_t ctrl, const char *desc_text,
|
||||||
const unsigned char *grip, unsigned char **shadow_info,
|
const unsigned char *grip, unsigned char **shadow_info,
|
||||||
cache_mode_t cache_mode, gcry_sexp_t *result)
|
cache_mode_t cache_mode, lookup_ttl_t lookup_ttl,
|
||||||
|
gcry_sexp_t *result)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
@ -502,7 +509,7 @@ agent_key_from_file (ctrl_t ctrl, const char *desc_text,
|
|||||||
|
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
if (shadow_info)
|
if (shadow_info)
|
||||||
*shadow_info = NULL;
|
*shadow_info = NULL;
|
||||||
|
|
||||||
rc = read_key_file (grip, &s_skey);
|
rc = read_key_file (grip, &s_skey);
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -563,7 +570,8 @@ agent_key_from_file (ctrl_t ctrl, const char *desc_text,
|
|||||||
|
|
||||||
if (!rc)
|
if (!rc)
|
||||||
{
|
{
|
||||||
rc = unprotect (ctrl, desc_text_final, &buf, grip, cache_mode);
|
rc = unprotect (ctrl, desc_text_final, &buf, grip,
|
||||||
|
cache_mode, lookup_ttl);
|
||||||
if (rc)
|
if (rc)
|
||||||
log_error ("failed to unprotect the secret key: %s\n",
|
log_error ("failed to unprotect the secret key: %s\n",
|
||||||
gpg_strerror (rc));
|
gpg_strerror (rc));
|
||||||
|
@ -66,7 +66,7 @@ agent_pkdecrypt (ctrl_t ctrl, const char *desc_text,
|
|||||||
}
|
}
|
||||||
rc = agent_key_from_file (ctrl, desc_text,
|
rc = agent_key_from_file (ctrl, desc_text,
|
||||||
ctrl->keygrip, &shadow_info,
|
ctrl->keygrip, &shadow_info,
|
||||||
CACHE_MODE_NORMAL, &s_skey);
|
CACHE_MODE_NORMAL, NULL, &s_skey);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
if (gpg_err_code (rc) == GPG_ERR_ENOENT)
|
if (gpg_err_code (rc) == GPG_ERR_ENOENT)
|
||||||
|
@ -125,10 +125,12 @@ do_encode_raw_pkcs1 (const byte *md, size_t mdlen, unsigned int nbits,
|
|||||||
|
|
||||||
|
|
||||||
/* SIGN whatever information we have accumulated in CTRL and return
|
/* SIGN whatever information we have accumulated in CTRL and return
|
||||||
the signature S-Expression. */
|
the signature S-expression. LOOKUP is an optional function to
|
||||||
|
provide a way for lower layers to ask for the caching TTL. */
|
||||||
int
|
int
|
||||||
agent_pksign_do (ctrl_t ctrl, const char *desc_text,
|
agent_pksign_do (ctrl_t ctrl, const char *desc_text,
|
||||||
gcry_sexp_t *signature_sexp, cache_mode_t cache_mode)
|
gcry_sexp_t *signature_sexp,
|
||||||
|
cache_mode_t cache_mode, lookup_ttl_t lookup_ttl)
|
||||||
{
|
{
|
||||||
gcry_sexp_t s_skey = NULL, s_sig = NULL;
|
gcry_sexp_t s_skey = NULL, s_sig = NULL;
|
||||||
unsigned char *shadow_info = NULL;
|
unsigned char *shadow_info = NULL;
|
||||||
@ -138,7 +140,8 @@ agent_pksign_do (ctrl_t ctrl, const char *desc_text,
|
|||||||
return gpg_error (GPG_ERR_NO_SECKEY);
|
return gpg_error (GPG_ERR_NO_SECKEY);
|
||||||
|
|
||||||
rc = agent_key_from_file (ctrl, desc_text, ctrl->keygrip,
|
rc = agent_key_from_file (ctrl, desc_text, ctrl->keygrip,
|
||||||
&shadow_info, cache_mode, &s_skey);
|
&shadow_info, cache_mode, lookup_ttl,
|
||||||
|
&s_skey);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
log_error ("failed to read the secret key\n");
|
log_error ("failed to read the secret key\n");
|
||||||
@ -238,7 +241,7 @@ agent_pksign (ctrl_t ctrl, const char *desc_text,
|
|||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
rc = agent_pksign_do (ctrl, desc_text, &s_sig, cache_mode);
|
rc = agent_pksign_do (ctrl, desc_text, &s_sig, cache_mode, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto leave;
|
goto leave;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user