mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-22 14:57:02 +01:00
* passphrase.c (agent_get_passphrase): New args CUSTOM_PROMPT and
CUSTOM_DESCRIPTION. Changed all callers. * app-openpgp.c (do_getattr, do_learn_status, do_setattr): Support the new private DOs. (do_change_pin): Add a "N" prefix to the strings so that the callback can act accordingly for a new PIN. Unfortunately this breaks existing translations but I see no wother way to overvome this. * cardglue.c (learn_status_cb): Ditto. (agent_release_card_info): Ditto. (struct pin_cb_info_s): Removed and changed all users. (pin_cb): Reworked. * card-util.c (card_status): Print them (card_edit): New command PRIVATEDO. (change_private_do): New.
This commit is contained in:
parent
53ae360457
commit
9e52cf2758
@ -1,3 +1,24 @@
|
|||||||
|
2004-12-09 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
* passphrase.c (agent_get_passphrase): New args CUSTOM_PROMPT and
|
||||||
|
CUSTOM_DESCRIPTION. Changed all callers.
|
||||||
|
|
||||||
|
* app-openpgp.c (do_getattr, do_learn_status, do_setattr): Support
|
||||||
|
the new private DOs.
|
||||||
|
(do_change_pin): Add a "N" prefix to the strings so that the
|
||||||
|
callback can act accordingly for a new PIN. Unfortunately this
|
||||||
|
breaks existing translations but I see no wother way to overvome
|
||||||
|
this.
|
||||||
|
|
||||||
|
* cardglue.c (learn_status_cb): Ditto.
|
||||||
|
(agent_release_card_info): Ditto.
|
||||||
|
(struct pin_cb_info_s): Removed and changed all users.
|
||||||
|
(pin_cb): Reworked.
|
||||||
|
|
||||||
|
* card-util.c (card_status): Print them
|
||||||
|
(card_edit): New command PRIVATEDO.
|
||||||
|
(change_private_do): New.
|
||||||
|
|
||||||
2004-12-09 David Shaw <dshaw@jabberwocky.com>
|
2004-12-09 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
* keygen.c (ask_algo): Add a choose-your-own-capabilities option
|
* keygen.c (ask_algo): Add a choose-your-own-capabilities option
|
||||||
|
@ -81,6 +81,10 @@ static struct {
|
|||||||
{ 0x00C6, 0, 0x6E, 1, 0, 0, 0, "CA Fingerprints" },
|
{ 0x00C6, 0, 0x6E, 1, 0, 0, 0, "CA Fingerprints" },
|
||||||
{ 0x007A, 1, 0, 1, 0, 0, 0, "Security Support Template" },
|
{ 0x007A, 1, 0, 1, 0, 0, 0, "Security Support Template" },
|
||||||
{ 0x0093, 0, 0x7A, 1, 1, 0, 0, "Digital Signature Counter" },
|
{ 0x0093, 0, 0x7A, 1, 1, 0, 0, "Digital Signature Counter" },
|
||||||
|
{ 0x0101, 0, 0, 0, 0, 0, 0, "Private DO 1"},
|
||||||
|
{ 0x0102, 0, 0, 0, 0, 0, 0, "Private DO 2"},
|
||||||
|
{ 0x0103, 0, 0, 0, 0, 0, 0, "Private DO 3"},
|
||||||
|
{ 0x0104, 0, 0, 0, 0, 0, 0, "Private DO 4"},
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -613,6 +617,10 @@ do_getattr (app_t app, ctrl_t ctrl, const char *name)
|
|||||||
{ "SERIALNO", 0x004F, -1 },
|
{ "SERIALNO", 0x004F, -1 },
|
||||||
{ "AID", 0x004F },
|
{ "AID", 0x004F },
|
||||||
{ "EXTCAP", 0x0000, -2 },
|
{ "EXTCAP", 0x0000, -2 },
|
||||||
|
{ "PRIVATE-DO-1", 0x0101 },
|
||||||
|
{ "PRIVATE-DO-2", 0x0102 },
|
||||||
|
{ "PRIVATE-DO-3", 0x0103 },
|
||||||
|
{ "PRIVATE-DO-4", 0x0104 },
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
int idx, i;
|
int idx, i;
|
||||||
@ -708,6 +716,15 @@ do_learn_status (app_t app, ctrl_t ctrl)
|
|||||||
do_getattr (app, ctrl, "CA-FPR");
|
do_getattr (app, ctrl, "CA-FPR");
|
||||||
do_getattr (app, ctrl, "CHV-STATUS");
|
do_getattr (app, ctrl, "CHV-STATUS");
|
||||||
do_getattr (app, ctrl, "SIG-COUNTER");
|
do_getattr (app, ctrl, "SIG-COUNTER");
|
||||||
|
if (app->app_local->extcap.private_dos)
|
||||||
|
{
|
||||||
|
do_getattr (app, ctrl, "PRIVATE-DO-1");
|
||||||
|
do_getattr (app, ctrl, "PRIVATE-DO-2");
|
||||||
|
if (app->did_chv2)
|
||||||
|
do_getattr (app, ctrl, "PRIVATE-DO-3");
|
||||||
|
if (app->did_chv3)
|
||||||
|
do_getattr (app, ctrl, "PRIVATE-DO-4");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -867,17 +884,22 @@ do_setattr (app_t app, const char *name,
|
|||||||
static struct {
|
static struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
int tag;
|
int tag;
|
||||||
|
int need_chv;
|
||||||
int special;
|
int special;
|
||||||
} table[] = {
|
} table[] = {
|
||||||
{ "DISP-NAME", 0x005B },
|
{ "DISP-NAME", 0x005B, 3 },
|
||||||
{ "LOGIN-DATA", 0x005E, 2 },
|
{ "LOGIN-DATA", 0x005E, 3, 2 },
|
||||||
{ "DISP-LANG", 0x5F2D },
|
{ "DISP-LANG", 0x5F2D, 3 },
|
||||||
{ "DISP-SEX", 0x5F35 },
|
{ "DISP-SEX", 0x5F35, 3 },
|
||||||
{ "PUBKEY-URL", 0x5F50 },
|
{ "PUBKEY-URL", 0x5F50, 3 },
|
||||||
{ "CHV-STATUS-1", 0x00C4, 1 },
|
{ "CHV-STATUS-1", 0x00C4, 3, 1 },
|
||||||
{ "CA-FPR-1", 0x00CA },
|
{ "CA-FPR-1", 0x00CA, 3 },
|
||||||
{ "CA-FPR-2", 0x00CB },
|
{ "CA-FPR-2", 0x00CB, 3 },
|
||||||
{ "CA-FPR-3", 0x00CC },
|
{ "CA-FPR-3", 0x00CC, 3 },
|
||||||
|
{ "PRIVATE-DO-1", 0x0101, 2 },
|
||||||
|
{ "PRIVATE-DO-2", 0x0102, 3 },
|
||||||
|
{ "PRIVATE-DO-3", 0x0103, 2 },
|
||||||
|
{ "PRIVATE-DO-4", 0x0104, 3 },
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -887,7 +909,17 @@ do_setattr (app_t app, const char *name,
|
|||||||
if (!table[idx].name)
|
if (!table[idx].name)
|
||||||
return gpg_error (GPG_ERR_INV_NAME);
|
return gpg_error (GPG_ERR_INV_NAME);
|
||||||
|
|
||||||
rc = verify_chv3 (app, pincb, pincb_arg);
|
switch (table[idx].need_chv)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
rc = verify_chv2 (app, pincb, pincb_arg);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
rc = verify_chv3 (app, pincb, pincb_arg);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rc = 0;
|
||||||
|
}
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@ -956,10 +988,10 @@ do_change_pin (app_t app, ctrl_t ctrl, const char *chvnostr, int reset_mode,
|
|||||||
else
|
else
|
||||||
app->did_chv1 = app->did_chv2 = 0;
|
app->did_chv1 = app->did_chv2 = 0;
|
||||||
|
|
||||||
/* Note to translators: Do not translate the "|A|" prefix but
|
/* Note to translators: Do not translate the "|*|" prefixes but
|
||||||
keep it at the start of the string. We need this elsewhere
|
keep it at the start of the string. We need this elsewhere
|
||||||
to get some infos on the string. */
|
to get some infos on the string. */
|
||||||
rc = pincb (pincb_arg, chvno == 3? _("|A|New Admin PIN") : _("New PIN"),
|
rc = pincb (pincb_arg, chvno == 3? _("|AN|New Admin PIN") : _("|N|New PIN"),
|
||||||
&pinvalue);
|
&pinvalue);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
|
@ -377,6 +377,14 @@ card_status (FILE *fp, char *serialno, size_t serialnobuflen)
|
|||||||
info.disp_sex == 2? _("female") : _("unspecified"));
|
info.disp_sex == 2? _("female") : _("unspecified"));
|
||||||
print_name (fp, "URL of public key : ", info.pubkey_url);
|
print_name (fp, "URL of public key : ", info.pubkey_url);
|
||||||
print_name (fp, "Login data .......: ", info.login_data);
|
print_name (fp, "Login data .......: ", info.login_data);
|
||||||
|
if (info.private_do[0])
|
||||||
|
print_name (fp, "Private DO 1 .....: ", info.private_do[0]);
|
||||||
|
if (info.private_do[1])
|
||||||
|
print_name (fp, "Private DO 2 .....: ", info.private_do[1]);
|
||||||
|
if (info.private_do[2])
|
||||||
|
print_name (fp, "Private DO 3 .....: ", info.private_do[2]);
|
||||||
|
if (info.private_do[3])
|
||||||
|
print_name (fp, "Private DO 4 .....: ", info.private_do[3]);
|
||||||
if (info.cafpr1valid)
|
if (info.cafpr1valid)
|
||||||
{
|
{
|
||||||
tty_fprintf (fp, "CA fingerprint %d .:", 1);
|
tty_fprintf (fp, "CA fingerprint %d .:", 1);
|
||||||
@ -631,6 +639,75 @@ change_login (const char *args)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
change_private_do (const char *args, int nr)
|
||||||
|
{
|
||||||
|
char do_name[] = "PRIVATE-DO-X";
|
||||||
|
char *data;
|
||||||
|
int n;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
assert (nr >= 1 && nr <= 4);
|
||||||
|
do_name[11] = '0' + nr;
|
||||||
|
|
||||||
|
if (args && (args = strchr (args, '<'))) /* Read it from a file */
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
/* Fixme: Factor this duplicated code out. */
|
||||||
|
for (args++; spacep (args); args++)
|
||||||
|
;
|
||||||
|
fp = fopen (args, "rb");
|
||||||
|
#if GNUPG_MAJOR_VERSION == 1
|
||||||
|
if (fp && is_secured_file (fileno (fp)))
|
||||||
|
{
|
||||||
|
fclose (fp);
|
||||||
|
fp = NULL;
|
||||||
|
errno = EPERM;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
tty_printf (_("can't open `%s': %s\n"), args, strerror (errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = xmalloc (254);
|
||||||
|
n = fread (data, 1, 254, fp);
|
||||||
|
fclose (fp);
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
tty_printf (_("error reading `%s': %s\n"), args, strerror (errno));
|
||||||
|
xfree (data);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data = cpr_get ("cardedit.change_private_do",
|
||||||
|
_("Private DO data: "));
|
||||||
|
if (!data)
|
||||||
|
return -1;
|
||||||
|
trim_spaces (data);
|
||||||
|
cpr_kill_prompt ();
|
||||||
|
n = strlen (data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n > 254 )
|
||||||
|
{
|
||||||
|
tty_printf (_("Error: Private DO too long "
|
||||||
|
"(limit is %d characters).\n"), 254);
|
||||||
|
xfree (data);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = agent_scd_setattr (do_name, data, n );
|
||||||
|
if (rc)
|
||||||
|
log_error ("error setting private DO: %s\n", gpg_strerror (rc));
|
||||||
|
xfree (data);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
change_lang (void)
|
change_lang (void)
|
||||||
{
|
{
|
||||||
@ -1149,7 +1226,7 @@ card_edit (STRLIST commands)
|
|||||||
cmdNOP = 0,
|
cmdNOP = 0,
|
||||||
cmdQUIT, cmdADMIN, cmdHELP, cmdLIST, cmdDEBUG,
|
cmdQUIT, cmdADMIN, cmdHELP, cmdLIST, cmdDEBUG,
|
||||||
cmdNAME, cmdURL, cmdFETCH, cmdLOGIN, cmdLANG, cmdSEX, cmdCAFPR,
|
cmdNAME, cmdURL, cmdFETCH, cmdLOGIN, cmdLANG, cmdSEX, cmdCAFPR,
|
||||||
cmdFORCESIG, cmdGENERATE, cmdPASSWD,
|
cmdFORCESIG, cmdGENERATE, cmdPASSWD, cmdPRIVATEDO,
|
||||||
cmdINVCMD
|
cmdINVCMD
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1180,6 +1257,8 @@ card_edit (STRLIST commands)
|
|||||||
{ N_("generate"),
|
{ N_("generate"),
|
||||||
cmdGENERATE, 1, N_("generate new keys") },
|
cmdGENERATE, 1, N_("generate new keys") },
|
||||||
{ N_("passwd"), cmdPASSWD, 0, N_("menu to change or unblock the PIN") },
|
{ N_("passwd"), cmdPASSWD, 0, N_("menu to change or unblock the PIN") },
|
||||||
|
/* Note, that we do not announce this command yet. */
|
||||||
|
{ N_("privatedo"), cmdPRIVATEDO, 0, NULL },
|
||||||
{ NULL, cmdINVCMD, 0, NULL }
|
{ NULL, cmdINVCMD, 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1335,6 +1414,14 @@ card_edit (STRLIST commands)
|
|||||||
change_cafpr (arg_number);
|
change_cafpr (arg_number);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case cmdPRIVATEDO:
|
||||||
|
if ( arg_number < 1 || arg_number > 4 )
|
||||||
|
tty_printf ("usage: privatedo N\n"
|
||||||
|
" 1 <= N <= 4\n");
|
||||||
|
else
|
||||||
|
change_private_do (arg_string, arg_number);
|
||||||
|
break;
|
||||||
|
|
||||||
case cmdFORCESIG:
|
case cmdFORCESIG:
|
||||||
toggle_forcesig ();
|
toggle_forcesig ();
|
||||||
break;
|
break;
|
||||||
|
@ -49,12 +49,6 @@ struct ctrl_ctx_s {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct pin_cb_info_s
|
|
||||||
{
|
|
||||||
int repeat;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static char *default_reader_port;
|
static char *default_reader_port;
|
||||||
static APP current_app;
|
static APP current_app;
|
||||||
|
|
||||||
@ -233,6 +227,8 @@ app_get_serial_and_stamp (APP app, char **serial, time_t *stamp)
|
|||||||
void
|
void
|
||||||
agent_release_card_info (struct agent_card_info_s *info)
|
agent_release_card_info (struct agent_card_info_s *info)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
if (!info)
|
if (!info)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -243,6 +239,11 @@ agent_release_card_info (struct agent_card_info_s *info)
|
|||||||
xfree (info->login_data); info->login_data = NULL;
|
xfree (info->login_data); info->login_data = NULL;
|
||||||
info->fpr1valid = info->fpr2valid = info->fpr3valid = 0;
|
info->fpr1valid = info->fpr2valid = info->fpr3valid = 0;
|
||||||
info->cafpr1valid = info->cafpr2valid = info->cafpr3valid = 0;
|
info->cafpr1valid = info->cafpr2valid = info->cafpr3valid = 0;
|
||||||
|
for (i=0; i < 4; i++)
|
||||||
|
{
|
||||||
|
xfree (info->private_do[i]);
|
||||||
|
info->private_do[i] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -471,6 +472,7 @@ learn_status_cb (void *opaque, const char *line)
|
|||||||
int keywordlen;
|
int keywordlen;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* log_debug ("got status line `%s'\n", line); */
|
||||||
for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
|
for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
|
||||||
;
|
;
|
||||||
while (spacep (line))
|
while (spacep (line))
|
||||||
@ -570,7 +572,15 @@ learn_status_cb (void *opaque, const char *line)
|
|||||||
else if (no == 3)
|
else if (no == 3)
|
||||||
parm->cafpr3valid = unhexify_fpr (line, parm->cafpr3);
|
parm->cafpr3valid = unhexify_fpr (line, parm->cafpr3);
|
||||||
}
|
}
|
||||||
|
else if (keywordlen == 12 && !memcmp (keyword, "PRIVATE-DO-", 11)
|
||||||
|
&& strchr ("1234", keyword[11]))
|
||||||
|
{
|
||||||
|
int no = keyword[11] - '1';
|
||||||
|
assert (no >= 0 && no <= 3);
|
||||||
|
xfree (parm->private_do[no]);
|
||||||
|
parm->private_do[no] = unescape_status_string (line);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -626,21 +636,28 @@ agent_scd_getattr (const char *name, struct agent_card_info_s *info)
|
|||||||
static int
|
static int
|
||||||
pin_cb (void *opaque, const char *info, char **retstr)
|
pin_cb (void *opaque, const char *info, char **retstr)
|
||||||
{
|
{
|
||||||
struct pin_cb_info_s *parm = opaque;
|
|
||||||
char *value;
|
char *value;
|
||||||
int canceled;
|
int canceled;
|
||||||
int isadmin = 0;
|
int isadmin = 0;
|
||||||
|
int newpin = 0;
|
||||||
const char *again_text = NULL;
|
const char *again_text = NULL;
|
||||||
|
const char *ends, *s;
|
||||||
|
|
||||||
*retstr = NULL;
|
*retstr = NULL;
|
||||||
log_debug ("asking for PIN '%s'\n", info);
|
log_debug ("asking for PIN '%s'\n", info);
|
||||||
|
|
||||||
/* We use a special prefix to check whether the Admin PIN has been
|
/* We use a special prefix to check whether the Admin PIN has been
|
||||||
requested. */
|
requested. */
|
||||||
if (info && !strncmp (info, "|A|", 3))
|
if (info && *info =='|' && (ends=strchr (info+1, '|')))
|
||||||
{
|
{
|
||||||
isadmin = 1;
|
for (s=info+1; s < ends; s++)
|
||||||
info += 3;
|
{
|
||||||
|
if (*s == 'A')
|
||||||
|
isadmin = 1;
|
||||||
|
else if (*s == 'N')
|
||||||
|
newpin = 1;
|
||||||
|
}
|
||||||
|
info = ends+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
again:
|
again:
|
||||||
@ -649,8 +666,12 @@ pin_cb (void *opaque, const char *info, char **retstr)
|
|||||||
isadmin? "OPENPGP 3" : "OPENPGP 1");
|
isadmin? "OPENPGP 3" : "OPENPGP 1");
|
||||||
|
|
||||||
value = ask_passphrase (info, again_text,
|
value = ask_passphrase (info, again_text,
|
||||||
isadmin? "passphrase.adminpin.ask"
|
newpin && isadmin? "passphrase.adminpin.new.ask" :
|
||||||
: "passphrase.pin.ask",
|
newpin? "passphrase.pin.new.ask" :
|
||||||
|
isadmin? "passphrase.adminpin.ask" :
|
||||||
|
"passphrase.pin.ask",
|
||||||
|
newpin && isadmin? _("Enter New Admin PIN: ") :
|
||||||
|
newpin? _("Enter New PIN: ") :
|
||||||
isadmin? _("Enter Admin PIN: ")
|
isadmin? _("Enter Admin PIN: ")
|
||||||
: _("Enter PIN: "),
|
: _("Enter PIN: "),
|
||||||
&canceled);
|
&canceled);
|
||||||
@ -660,7 +681,7 @@ pin_cb (void *opaque, const char *info, char **retstr)
|
|||||||
else if (!value)
|
else if (!value)
|
||||||
return G10ERR_GENERAL;
|
return G10ERR_GENERAL;
|
||||||
|
|
||||||
if (parm->repeat)
|
if (newpin)
|
||||||
{
|
{
|
||||||
char *value2;
|
char *value2;
|
||||||
|
|
||||||
@ -701,15 +722,12 @@ agent_scd_setattr (const char *name,
|
|||||||
const unsigned char *value, size_t valuelen)
|
const unsigned char *value, size_t valuelen)
|
||||||
{
|
{
|
||||||
APP app;
|
APP app;
|
||||||
struct pin_cb_info_s parm;
|
|
||||||
|
|
||||||
memset (&parm, 0, sizeof parm);
|
|
||||||
|
|
||||||
app = current_app? current_app : open_card ();
|
app = current_app? current_app : open_card ();
|
||||||
if (!app)
|
if (!app)
|
||||||
return gpg_error (GPG_ERR_CARD);
|
return gpg_error (GPG_ERR_CARD);
|
||||||
|
|
||||||
return app->fnc.setattr (app, name, pin_cb, &parm, value, valuelen);
|
return app->fnc.setattr (app, name, pin_cb, NULL, value, valuelen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -772,9 +790,6 @@ agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force)
|
|||||||
APP app;
|
APP app;
|
||||||
char keynostr[20];
|
char keynostr[20];
|
||||||
struct ctrl_ctx_s ctrl;
|
struct ctrl_ctx_s ctrl;
|
||||||
struct pin_cb_info_s parm;
|
|
||||||
|
|
||||||
memset (&parm, 0, sizeof parm);
|
|
||||||
|
|
||||||
app = current_app? current_app : open_card ();
|
app = current_app? current_app : open_card ();
|
||||||
if (!app)
|
if (!app)
|
||||||
@ -787,7 +802,7 @@ agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force)
|
|||||||
|
|
||||||
return app->fnc.genkey (app, &ctrl, keynostr,
|
return app->fnc.genkey (app, &ctrl, keynostr,
|
||||||
force? 1:0,
|
force? 1:0,
|
||||||
pin_cb, &parm);
|
pin_cb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send a PKSIGN command to the SCdaemon. */
|
/* Send a PKSIGN command to the SCdaemon. */
|
||||||
@ -798,9 +813,6 @@ agent_scd_pksign (const char *serialno, int hashalgo,
|
|||||||
{
|
{
|
||||||
APP app;
|
APP app;
|
||||||
int rc;
|
int rc;
|
||||||
struct pin_cb_info_s parm;
|
|
||||||
|
|
||||||
memset (&parm, 0, sizeof parm);
|
|
||||||
|
|
||||||
*r_buf = NULL;
|
*r_buf = NULL;
|
||||||
*r_buflen = 0;
|
*r_buflen = 0;
|
||||||
@ -817,7 +829,7 @@ agent_scd_pksign (const char *serialno, int hashalgo,
|
|||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
return app->fnc.sign (app, serialno, hashalgo,
|
return app->fnc.sign (app, serialno, hashalgo,
|
||||||
pin_cb, &parm,
|
pin_cb, NULL,
|
||||||
indata, indatalen,
|
indata, indatalen,
|
||||||
r_buf, r_buflen);
|
r_buf, r_buflen);
|
||||||
}
|
}
|
||||||
@ -831,9 +843,6 @@ agent_scd_pkdecrypt (const char *serialno,
|
|||||||
{
|
{
|
||||||
APP app;
|
APP app;
|
||||||
int rc;
|
int rc;
|
||||||
struct pin_cb_info_s parm;
|
|
||||||
|
|
||||||
memset (&parm, 0, sizeof parm);
|
|
||||||
|
|
||||||
*r_buf = NULL;
|
*r_buf = NULL;
|
||||||
*r_buflen = 0;
|
*r_buflen = 0;
|
||||||
@ -850,7 +859,7 @@ agent_scd_pkdecrypt (const char *serialno,
|
|||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
return app->fnc.decipher (app, serialno,
|
return app->fnc.decipher (app, serialno,
|
||||||
pin_cb, &parm,
|
pin_cb, NULL,
|
||||||
indata, indatalen,
|
indata, indatalen,
|
||||||
r_buf, r_buflen);
|
r_buf, r_buflen);
|
||||||
}
|
}
|
||||||
@ -862,10 +871,6 @@ agent_scd_change_pin (int chvno)
|
|||||||
APP app;
|
APP app;
|
||||||
char chvnostr[20];
|
char chvnostr[20];
|
||||||
int reset = 0;
|
int reset = 0;
|
||||||
struct pin_cb_info_s parm;
|
|
||||||
|
|
||||||
memset (&parm, 0, sizeof parm);
|
|
||||||
parm.repeat = 1;
|
|
||||||
|
|
||||||
reset = (chvno >= 100);
|
reset = (chvno >= 100);
|
||||||
chvno %= 100;
|
chvno %= 100;
|
||||||
@ -876,7 +881,7 @@ agent_scd_change_pin (int chvno)
|
|||||||
|
|
||||||
sprintf (chvnostr, "%d", chvno);
|
sprintf (chvnostr, "%d", chvno);
|
||||||
return app->fnc.change_pin (app, NULL, chvnostr, reset,
|
return app->fnc.change_pin (app, NULL, chvnostr, reset,
|
||||||
pin_cb, &parm);
|
pin_cb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform a CHECKPIN operation. SERIALNO should be the serial
|
/* Perform a CHECKPIN operation. SERIALNO should be the serial
|
||||||
@ -886,15 +891,12 @@ int
|
|||||||
agent_scd_checkpin (const char *serialnobuf)
|
agent_scd_checkpin (const char *serialnobuf)
|
||||||
{
|
{
|
||||||
APP app;
|
APP app;
|
||||||
struct pin_cb_info_s parm;
|
|
||||||
|
|
||||||
memset (&parm, 0, sizeof parm);
|
|
||||||
|
|
||||||
app = current_app? current_app : open_card ();
|
app = current_app? current_app : open_card ();
|
||||||
if (!app)
|
if (!app)
|
||||||
return gpg_error (GPG_ERR_CARD);
|
return gpg_error (GPG_ERR_CARD);
|
||||||
|
|
||||||
return app->fnc.check_pin (app, serialnobuf, pin_cb, &parm);
|
return app->fnc.check_pin (app, serialnobuf, pin_cb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -907,9 +909,6 @@ agent_openpgp_storekey (int keyno,
|
|||||||
const unsigned char *e, size_t elen)
|
const unsigned char *e, size_t elen)
|
||||||
{
|
{
|
||||||
APP app;
|
APP app;
|
||||||
struct pin_cb_info_s parm;
|
|
||||||
|
|
||||||
memset (&parm, 0, sizeof parm);
|
|
||||||
|
|
||||||
app = current_app? current_app : open_card ();
|
app = current_app? current_app : open_card ();
|
||||||
if (!app)
|
if (!app)
|
||||||
@ -917,5 +916,5 @@ agent_openpgp_storekey (int keyno,
|
|||||||
|
|
||||||
return app_openpgp_storekey (app, keyno, template, template_len,
|
return app_openpgp_storekey (app, keyno, template, template_len,
|
||||||
created_at, m, mlen, e, elen,
|
created_at, m, mlen, e, elen,
|
||||||
pin_cb, &parm);
|
pin_cb, NULL);
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ struct agent_card_info_s {
|
|||||||
int disp_sex; /* 0 = unspecified, 1 = male, 2 = female */
|
int disp_sex; /* 0 = unspecified, 1 = male, 2 = female */
|
||||||
char *pubkey_url; /* malloced. */
|
char *pubkey_url; /* malloced. */
|
||||||
char *login_data; /* malloced. */
|
char *login_data; /* malloced. */
|
||||||
|
char *private_do[4]; /* malloced. */
|
||||||
char cafpr1valid;
|
char cafpr1valid;
|
||||||
char cafpr2valid;
|
char cafpr2valid;
|
||||||
char cafpr3valid;
|
char cafpr3valid;
|
||||||
|
@ -630,7 +630,8 @@ agent_close ( int fd )
|
|||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
agent_get_passphrase ( u32 *keyid, int mode, const char *tryagain_text,
|
agent_get_passphrase ( u32 *keyid, int mode, const char *tryagain_text,
|
||||||
int *canceled)
|
const char *custom_description,
|
||||||
|
const char *custom_prompt, int *canceled)
|
||||||
{
|
{
|
||||||
#if defined(__riscos__)
|
#if defined(__riscos__)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -648,6 +649,7 @@ agent_get_passphrase ( u32 *keyid, int mode, const char *tryagain_text,
|
|||||||
int prot;
|
int prot;
|
||||||
char *orig_codeset = NULL;
|
char *orig_codeset = NULL;
|
||||||
|
|
||||||
|
log_debug ("agent_get_passphrase tryagin='%s' prompt='%s'\n", tryagain_text, custom_prompt);
|
||||||
if (canceled)
|
if (canceled)
|
||||||
*canceled = 0;
|
*canceled = 0;
|
||||||
|
|
||||||
@ -663,7 +665,7 @@ agent_get_passphrase ( u32 *keyid, int mode, const char *tryagain_text,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_NLS
|
#ifdef ENABLE_NLS
|
||||||
/* The Assuan agent protol requires us to trasnmit utf-8 strings */
|
/* The Assuan agent protol requires us to transmit utf-8 strings */
|
||||||
orig_codeset = bind_textdomain_codeset (PACKAGE, NULL);
|
orig_codeset = bind_textdomain_codeset (PACKAGE, NULL);
|
||||||
#ifdef HAVE_LANGINFO_CODESET
|
#ifdef HAVE_LANGINFO_CODESET
|
||||||
if (!orig_codeset)
|
if (!orig_codeset)
|
||||||
@ -680,7 +682,9 @@ agent_get_passphrase ( u32 *keyid, int mode, const char *tryagain_text,
|
|||||||
if ( (fd = agent_open (&prot)) == -1 )
|
if ( (fd = agent_open (&prot)) == -1 )
|
||||||
goto failure;
|
goto failure;
|
||||||
|
|
||||||
if ( !mode && pk && keyid )
|
if (custom_description)
|
||||||
|
atext = native_to_utf8 (custom_description);
|
||||||
|
else if ( !mode && pk && keyid )
|
||||||
{
|
{
|
||||||
char *uid;
|
char *uid;
|
||||||
size_t uidlen;
|
size_t uidlen;
|
||||||
@ -818,9 +822,12 @@ agent_get_passphrase ( u32 *keyid, int mode, const char *tryagain_text,
|
|||||||
tryagain_text = _(tryagain_text);
|
tryagain_text = _(tryagain_text);
|
||||||
|
|
||||||
/* We allocate 2 time the needed space for atext so that there
|
/* We allocate 2 time the needed space for atext so that there
|
||||||
is nenough space for escaping */
|
is enough space for escaping */
|
||||||
line = m_alloc (15 + 46
|
line = m_alloc (15 + 46
|
||||||
+ 3*strlen (tryagain_text) + 3*strlen (atext) + 2);
|
+ 3*strlen (tryagain_text)
|
||||||
|
+ 3*strlen (atext)
|
||||||
|
+ 3*strlen (custom_prompt? custom_prompt:"")
|
||||||
|
+ 2);
|
||||||
strcpy (line, "GET_PASSPHRASE ");
|
strcpy (line, "GET_PASSPHRASE ");
|
||||||
p = line+15;
|
p = line+15;
|
||||||
if (!mode && have_fpr)
|
if (!mode && have_fpr)
|
||||||
@ -844,7 +851,28 @@ agent_get_passphrase ( u32 *keyid, int mode, const char *tryagain_text,
|
|||||||
*p++ = *s;
|
*p++ = *s;
|
||||||
}
|
}
|
||||||
*p++ = ' ';
|
*p++ = ' ';
|
||||||
*p++ = 'X'; /* Use the standard prompt */
|
|
||||||
|
/* The prompt. */
|
||||||
|
if (custom_prompt)
|
||||||
|
{
|
||||||
|
char *tmp = native_to_utf8 (custom_prompt);
|
||||||
|
for (i=0, s=tmp; *s; s++)
|
||||||
|
{
|
||||||
|
if (*s < ' ' || *s == '+')
|
||||||
|
{
|
||||||
|
sprintf (p, "%%%02X", *s);
|
||||||
|
p += 3;
|
||||||
|
}
|
||||||
|
else if (*s == ' ')
|
||||||
|
*p++ = '+';
|
||||||
|
else
|
||||||
|
*p++ = *s;
|
||||||
|
}
|
||||||
|
xfree (tmp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*p++ = 'X'; /* Use the standard prompt */
|
||||||
|
|
||||||
*p++ = ' ';
|
*p++ = ' ';
|
||||||
/* copy description */
|
/* copy description */
|
||||||
for (i=0, s= atext; *s; s++)
|
for (i=0, s= atext; *s; s++)
|
||||||
@ -1047,7 +1075,7 @@ ask_passphrase (const char *description,
|
|||||||
if ( opt.use_agent )
|
if ( opt.use_agent )
|
||||||
{
|
{
|
||||||
pw = agent_get_passphrase (NULL, 0,
|
pw = agent_get_passphrase (NULL, 0,
|
||||||
tryagain_text? tryagain_text :description,
|
tryagain_text, description, prompt,
|
||||||
canceled );
|
canceled );
|
||||||
if (!pw)
|
if (!pw)
|
||||||
{
|
{
|
||||||
@ -1188,9 +1216,9 @@ passphrase_to_dek( u32 *keyid, int pubkey_algo,
|
|||||||
next_pw = NULL;
|
next_pw = NULL;
|
||||||
}
|
}
|
||||||
else if ( opt.use_agent ) {
|
else if ( opt.use_agent ) {
|
||||||
/* Divert to teh gpg-agent. */
|
/* Divert to the gpg-agent. */
|
||||||
pw = agent_get_passphrase ( keyid, mode == 2? 1: 0,
|
pw = agent_get_passphrase ( keyid, mode == 2? 1: 0,
|
||||||
tryagain_text, canceled );
|
tryagain_text, NULL, NULL, canceled );
|
||||||
if (!pw)
|
if (!pw)
|
||||||
{
|
{
|
||||||
if (!opt.use_agent)
|
if (!opt.use_agent)
|
||||||
@ -1198,7 +1226,8 @@ passphrase_to_dek( u32 *keyid, int pubkey_algo,
|
|||||||
pw = m_strdup ("");
|
pw = m_strdup ("");
|
||||||
}
|
}
|
||||||
if( *pw && mode == 2 ) {
|
if( *pw && mode == 2 ) {
|
||||||
char *pw2 = agent_get_passphrase ( keyid, 2, NULL, canceled );
|
char *pw2 = agent_get_passphrase ( keyid, 2, NULL, NULL,
|
||||||
|
NULL, canceled );
|
||||||
if (!pw2)
|
if (!pw2)
|
||||||
{
|
{
|
||||||
if (!opt.use_agent)
|
if (!opt.use_agent)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user