@@ -56,14 +56,29 @@ CTAP2.1 standard says it's okay to return level three if two was requested,
5656but that breaks OpenSSH, so... credProtect is incorrectly implemented in
5757that it always applies level three internally.
5858
59- Finally , the CTAP API requires user presence detection, but there's really no
59+ Thirdly , the CTAP API requires user presence detection, but there's really no
6060way to do that on Javacard 3.0.4. We can't even use the "presence timeout"
6161that is described in the spec for NFC devices. So you're always treated as
6262being present, which is to some extent offset by the fact that anything real
6363requires you type your PIN (if one is set)...
6464
6565So set a PIN, and unplug your card when you're not using it.
6666
67+ Fourthly, the CTAP2.1 standard says that credential matches should be performed
68+ in most-recent order, but to save implementation complexity and runtime performance,
69+ this implementation does them in arbitrary order instead.
70+
71+ Finally, the CTAP2.0 and CTAP2.1 standards are actually mutually incompatible. When
72+ a getAssertion call is made with an ` allowList ` given, CTAP2.0 says that the
73+ authenticator should iterate through assertions generated with the matching
74+ credentials from the allowlist. CTAP2.1 says the authenticator should pick one
75+ matching credential, return an assertion generated with it, and ignore any
76+ other matches.
77+
78+ This implementation allows toggling either behavior by flipping a boolean in the
79+ code, but because one or the other must be chosen, it can't be both fully CTAP2.0
80+ compatible and CTAP2.1 compatible at the same time.
81+
6782## Why don't you implement U2F/CTAP1?
6883
6984U2F doesn't support PINs, and requires an attestation certificate.
0 commit comments