From e59d2b3632d8c778bd2c4375a1c3ba9c786c4360 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Tue, 27 Oct 2020 14:35:20 +0900 Subject: [PATCH] scd: Handle canonical serialno and app specific serialno differently. * scd/app-common.h (card_get_serialno): Add IS_CANONICAL arg. * scd/app.c (app_send_devinfo): Use app specific serialno. (card_get_serialno): Support two different cases. (app_get_serialno): Return app specific serialno. (send_serialno_and_app_status): Return canonical serialno. * scd/command.c (cmd_serialno): Return app specific serialno. (cmd_learn): Return canonical serialno. -- GnuPG-bug-id: 5100 Signed-off-by: NIIBE Yutaka --- scd/app-common.h | 2 +- scd/app.c | 11 ++++++----- scd/command.c | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/scd/app-common.h b/scd/app-common.h index a9a6bd065..ed2a549ae 100644 --- a/scd/app-common.h +++ b/scd/app-common.h @@ -235,7 +235,7 @@ const char *strapptype (apptype_t t); void app_update_priority_list (const char *arg); gpg_error_t app_send_card_list (ctrl_t ctrl); gpg_error_t app_send_active_apps (card_t card, ctrl_t ctrl); -char *card_get_serialno (card_t card); +char *card_get_serialno (card_t card, int is_canonical); char *app_get_serialno (app_t app); char *yubikey_get_serialno (app_t app); diff --git a/scd/app.c b/scd/app.c index 8f054a81f..872eb0ab2 100644 --- a/scd/app.c +++ b/scd/app.c @@ -302,7 +302,7 @@ app_send_devinfo (ctrl_t ctrl) char *serialno; char card_info[80]; - serialno = card_get_serialno (c); + serialno = card_get_serialno (c, 0); snprintf (card_info, sizeof card_info, "DEVICE %s %s", strcardtype (c->cardtype), serialno); xfree (serialno); @@ -1182,7 +1182,7 @@ app_munge_serialno (card_t card) returned as a malloced string (hex encoded) in SERIAL. Caller must free SERIAL unless the function returns an error. */ char * -card_get_serialno (card_t card) +card_get_serialno (card_t card, int is_canonical) { char *serial; @@ -1191,7 +1191,8 @@ card_get_serialno (card_t card) if (!card->serialnolen) serial = xtrystrdup ("FF7F00"); - else if (card->cardtype == CARDTYPE_YUBIKEY) + else if (card->cardtype == CARDTYPE_YUBIKEY && !is_canonical + && card->app && card->app->apptype == APPTYPE_OPENPGP) { app_t a; @@ -1226,7 +1227,7 @@ app_get_serialno (app_t app) { if (!app || !app->card) return NULL; - return card_get_serialno (app->card); + return card_get_serialno (app->card, 0); } @@ -2135,7 +2136,7 @@ send_serialno_and_app_status (card_t card, int with_apps, ctrl_t ctrl) membuf_t mb; int any = 0; - serial = card_get_serialno (card); + serial = card_get_serialno (card, 1); if (!serial) return 0; /* Oops. */ diff --git a/scd/command.c b/scd/command.c index 56d422a4a..b8f7bccab 100644 --- a/scd/command.c +++ b/scd/command.c @@ -346,7 +346,7 @@ cmd_serialno (assuan_context_t ctx, char *line) return rc; } - serial = card_get_serialno (ctrl->card_ctx); + serial = card_get_serialno (ctrl->card_ctx, 0); if (!serial) return gpg_error (GPG_ERR_INV_VALUE); @@ -522,7 +522,7 @@ cmd_learn (assuan_context_t ctx, char *line) send_status_direct (ctrl, "READER", reader); /* No need to free the string of READER. */ - serial = card_get_serialno (ctrl->card_ctx); + serial = card_get_serialno (ctrl->card_ctx, 1); if (!serial) return gpg_error (GPG_ERR_INV_VALUE);