From fb6ff7ead7dff33541b595f3e8d5342f9c7a6d6c Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 10 Feb 2020 00:33:51 +0100 Subject: [PATCH] scd:openpgp: Let the genkey function also accept a full keyref. * scd/app-openpgp.c (send_key_attr): Use log_assert. (do_genkey): Allow prefix. -- It is more uniform to always use full keyref (e.g. "OPENPGP.1") instead of just the key number. Signed-off-by: Werner Koch --- g10/gpg.c | 2 +- scd/app-openpgp.c | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/g10/gpg.c b/g10/gpg.c index a095795f7..83524b13c 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -2171,7 +2171,7 @@ static struct gnupg_compliance_option compliance_options[] = static void set_compliance_option (enum cmd_and_opt_values option) { - opt.flags.rfc4880bis = 0; /* Clear becuase it is initially set. */ + opt.flags.rfc4880bis = 0; /* Clear because it is initially set. */ switch (option) { diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c index 293c53cb5..07fbf7474 100644 --- a/scd/app-openpgp.c +++ b/scd/app-openpgp.c @@ -955,8 +955,12 @@ send_key_attr (ctrl_t ctrl, app_t app, const char *keyword, int keyno) { char buffer[200]; - assert (keyno >=0 && keyno < DIM(app->app_local->keyattr)); + log_assert (keyno >=0 && keyno < DIM(app->app_local->keyattr)); + /* Note that the code in gpg-card supports prefixing the key number + * with "OPENPGP." but older code does not yet support this. There + * is also a discrepancy with the algorithm numbers: We should use + * the gcrypt numbers but the current code assumes OpenPGP numbers. */ if (app->app_local->keyattr[keyno].key_type == KEY_TYPE_RSA) snprintf (buffer, sizeof buffer, "%d 1 rsa%u %u %d", keyno+1, @@ -4311,7 +4315,7 @@ do_genkey (app_t app, ctrl_t ctrl, const char *keynostr, const char *keytype, const unsigned char *keydata; size_t buflen, keydatalen; u32 created_at; - int keyno = atoi (keynostr) - 1; + int keyno; int force = (flags & 1); time_t start_at; int exmode = 0; @@ -4319,7 +4323,12 @@ do_genkey (app_t app, ctrl_t ctrl, const char *keynostr, const char *keytype, (void)keytype; /* Ignored for OpenPGP cards. */ - if (keyno < 0 || keyno > 2) + /* Strip the OpenPGP prefix which is for historical reasons optional. */ + if (!ascii_strncasecmp (keynostr, "OPENPGP.", 8)) + keynostr += 8; + + keyno = atoi (keynostr) - 1; + if (!digitp (keynostr) || keyno < 0 || keyno > 2) return gpg_error (GPG_ERR_INV_ID); /* We flush the cache to increase the traffic before a key