aboutsummaryrefslogtreecommitdiffstats
path: root/tools/gpg-card.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gpg-card.c')
-rw-r--r--tools/gpg-card.c60
1 files changed, 42 insertions, 18 deletions
diff --git a/tools/gpg-card.c b/tools/gpg-card.c
index 22b95d0d7..8b3a3082b 100644
--- a/tools/gpg-card.c
+++ b/tools/gpg-card.c
@@ -315,9 +315,9 @@ main (int argc, char **argv)
/* Set defaults for non given options. */
if (!opt.gpg_program)
- opt.gpg_program = gnupg_module_name (GNUPG_MODULE_NAME_GPG);
+ opt.gpg_program = xstrdup (gnupg_module_name (GNUPG_MODULE_NAME_GPG));
if (!opt.gpgsm_program)
- opt.gpgsm_program = gnupg_module_name (GNUPG_MODULE_NAME_GPGSM);
+ opt.gpgsm_program = xstrdup (gnupg_module_name (GNUPG_MODULE_NAME_GPGSM));
/* Now build the list of commands. We guess the size of the array
* by assuming each item is a complete command. Obviously this will
@@ -836,6 +836,21 @@ list_one_kinfo (card_info_t info, key_info_t kinfo,
}
+/* Return the retired key number if KEYREF is for a retired key; 0 if
+ * not. */
+static int
+piv_keyref_is_retired (const char *keyref)
+{
+ if (!strncmp (keyref, "PIV.8", 5)
+ && keyref[5] >= '2' && hexdigitp (keyref + 5))
+ return xtoi_1 (keyref+5) - 1;
+ else if (!strncmp (keyref, "PIV.9", 5)
+ && keyref[5] >= '0' && keyref[5] <= '5')
+ return atoi_1 (keyref+5) + 15;
+ else
+ return 0;
+}
+
/* List all keyinfo in INFO using the list of LABELS. */
static void
list_all_kinfo (card_info_t info, keyinfolabel_t labels, estream_t fp,
@@ -843,6 +858,7 @@ list_all_kinfo (card_info_t info, keyinfolabel_t labels, estream_t fp,
{
key_info_t kinfo;
int idx, i, j;
+ int rn;
/* Print the keyinfo. We first print those we known and then all
* remaining item. */
@@ -864,9 +880,15 @@ list_all_kinfo (card_info_t info, keyinfolabel_t labels, estream_t fp,
{
if (kinfo->xflag)
continue;
- tty_fprintf (fp, "Key %s", kinfo->keyref);
- for (i=4+strlen (kinfo->keyref), j=0; i < 18; i++, j=1)
- tty_fprintf (fp, j? ".":" ");
+ if (info->apptype == APP_TYPE_PIV
+ && (rn = piv_keyref_is_retired (kinfo->keyref)))
+ tty_fprintf (fp, "Key retired %2d ...", rn);
+ else
+ {
+ tty_fprintf (fp, "Key %s", kinfo->keyref);
+ for (i=4+strlen (kinfo->keyref), j=0; i < 18; i++, j=1)
+ tty_fprintf (fp, j? ".":" ");
+ }
tty_fprintf (fp, ":");
list_one_kinfo (info, kinfo, NULL, fp, no_key_lookup, create_shadow);
}
@@ -2218,13 +2240,15 @@ cmd_writecert (card_info_t info, char *argstr)
&& ascii_memistr (data, datalen, "-----END CERTIFICATE-----")
&& !memchr (data, 0, datalen) && !memchr (data, 1, datalen))
{
- struct b64state b64;
+ gpgrt_b64state_t b64;
- err = b64dec_start (&b64, "");
- if (!err)
- err = b64dec_proc (&b64, data, datalen, &datalen);
+ b64 = gpgrt_b64dec_start ("");
+ if (!b64)
+ err = gpg_error_from_syserror ();
+ else
+ err = gpgrt_b64dec_proc (b64, data, datalen, &datalen);
if (!err)
- err = b64dec_finish (&b64);
+ err = gpgrt_b64dec_finish (b64);
if (err)
goto leave;
}
@@ -3779,7 +3803,7 @@ cmd_gpg (card_info_t info, char *argstr, int use_gpgsm)
char **argarray;
ccparray_t ccp;
const char **argv = NULL;
- pid_t pid;
+ gnupg_process_t proc;
int i;
if (!info)
@@ -3807,15 +3831,15 @@ cmd_gpg (card_info_t info, char *argstr, int use_gpgsm)
goto leave;
}
- err = gnupg_spawn_process (use_gpgsm? opt.gpgsm_program:opt.gpg_program,
- argv, NULL, (GNUPG_SPAWN_KEEP_STDOUT
- |GNUPG_SPAWN_KEEP_STDERR),
- NULL, NULL, NULL, &pid);
+ err = gnupg_process_spawn (use_gpgsm? opt.gpgsm_program:opt.gpg_program,
+ argv,
+ (GNUPG_PROCESS_STDOUT_KEEP
+ | GNUPG_PROCESS_STDERR_KEEP),
+ NULL, NULL, &proc);
if (!err)
{
- err = gnupg_wait_process (use_gpgsm? opt.gpgsm_program:opt.gpg_program,
- pid, 1, NULL);
- gnupg_release_process (pid);
+ err = gnupg_process_wait (proc, 1);
+ gnupg_process_release (proc);
}