aboutsummaryrefslogtreecommitdiffstats
path: root/scd/app-piv.c
diff options
context:
space:
mode:
authorValtteri Vuorikoski <[email protected]>2021-03-11 13:06:51 +0000
committerWerner Koch <[email protected]>2021-03-11 13:06:51 +0000
commit8cad11d13b15b0ef672545b06450dfbea1fef18e (patch)
treedc54d269c0b39472d0724a0f5bbf7200a4f4ef9f /scd/app-piv.c
parentdoc: Add a sending patches section to HACKING. (diff)
downloadgnupg-8cad11d13b15b0ef672545b06450dfbea1fef18e.tar.gz
gnupg-8cad11d13b15b0ef672545b06450dfbea1fef18e.zip
scd:piv: Improve APT parser compatibility.
* scd/app-piv.c (app_select_piv): Allow for full AID. -- It appears that SP-800-73-x is not too clear about the format of these objects. Many current cards (such as the Yubikey 5 series) apparently have only the PIX in DO 0x4F and only the RID in object 0x79/0x4F. However, other cards as well as the PivApplet Javacard applet have the full AID in 0x4F (which actually seems closer to what the standard says). PivApplet also has the full AID in 0x79/0x4F, but this is probably incorrect. (Here is a long discussion of the matter from an OpenSC author: https://github.com/arekinath/PivApplet/issues/43#issuecomment-772649709) [Taken from a mail to gnupg-devel date 2021-02-03.] Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'scd/app-piv.c')
-rw-r--r--scd/app-piv.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/scd/app-piv.c b/scd/app-piv.c
index a12bb4ee1..441475b12 100644
--- a/scd/app-piv.c
+++ b/scd/app-piv.c
@@ -3641,20 +3641,23 @@ app_select_piv (app_t app)
}
s = find_tlv (apt, aptlen, 0x4F, &n);
- if (!s || n != 6 || memcmp (s, piv_aid+5, 4))
+ /* Some cards (new Yubikey) return only the PIX, while others
+ * (old Yubikey, PivApplet) return the RID+PIX. */
+ if (!s || !((n == 6 && !memcmp (s, piv_aid+5, 4))
+ || (n == 11 && !memcmp (s, piv_aid, 9))))
{
/* The PIX does not match. */
log_error ("piv: missing or invalid DO 0x4F in APT\n");
err = gpg_error (GPG_ERR_CARD);
goto leave;
}
- if (s[4] != 1 || s[5] != 0)
+ if (s[n-2] != 1 || s[n-1] != 0)
{
log_error ("piv: unknown PIV version %u.%u\n", s[4], s[5]);
err = gpg_error (GPG_ERR_CARD);
goto leave;
}
- app->appversion = ((s[4] << 8) | s[5]);
+ app->appversion = ((s[n-2] << 8) | s[n-1]);
s = find_tlv (apt, aptlen, 0x79, &n);
if (!s || n < 7)
@@ -3664,7 +3667,9 @@ app_select_piv (app_t app)
goto leave;
}
s = find_tlv (s, n, 0x4F, &n);
- if (!s || n != 5 || memcmp (s, piv_aid, 5))
+ /* Some cards may also return the full AID instead of just
+ * the 5-byte RID here. */
+ if (!s || !(n == 5 || n == 11) || memcmp (s, piv_aid, 5))
{
/* The RID does not match. */
log_error ("piv: missing or invalid DO 0x79.4F in APT\n");