Problems with Feitian MultiPass FIDO device
avzuquete opened this issue · 4 comments
What version of libfido2 are you using?
1.13.0
What operating system are you running?
Ubuntu 22.04.2 LTS, 5.15.0-67-genereric kernel
What application are you using in conjunction with libfido2?
My own
How does the problem manifest itself?
Some fido_dev_supports_XXX give a wrong indication for a Feitian MultiPass FIDO device.
I checked the libfido2 code and I guess the source of the problem is the interpretation that is made of the flags/options deported by the device.
This device reports up=true (instead of uv=true), so the function fido_dev_supports_uv returns FALSE.
This device reports clientPin=false, so the flags field gets a FIDO_DEV_PIN_UNSET, which latter make fido_dev_supports_pin to return TRUE.
Is the problem reproducible?
Yes.
What are the steps that lead to the problem?
Explained before.
Does the problem happen with different authenticators?
Could not check.
Please include the output of fido2-token -L
.
fido2-token -L
$ fido2-token -L /dev/hidraw1: vendor=0x096e, product=0x085a (FS ePass FIDO)
Please include the output of fido2-token -I
.
fido2-token -I
$ fido2-token -I <device> proto: 0x02 major: 0x01 minor: 0x00 build: 0x01 caps: 0x0f (wink, cbor, nomsg) version strings: U2F_V2, FIDO_2_0, FIDO_2_1_PRE extension strings: credProtect, hmac-secret transport strings: ble, nfc, usb algorithms: es256 (public-key) aaguid: 310b2830bd4a4da5832e9a0dfc90abf2 options: rk, up, noplat, noclientPin, credentialMgmtPreview maxmsgsiz: 1024 maxcredcntlst: 6 maxcredlen: 96 fwversion: 0x0 pin protocols: 1 pin retries: undefined uv retries: undefined
Please include the output of FIDO_DEBUG=1
.
FIDO_DEBUG=1
$ export FIDO_DEBUG=1 $ fido2-token -L fido_hid_unix_open: open /dev/hidraw0: Permission denied /dev/hidraw1: vendor=0x096e, product=0x085a (FS ePass FIDO) $ fido2-token -I /dev/hidraw1 fido_tx: dev=0x556fc09222a0, cmd=0x06 fido_tx: buf=0x556fc09222a0, len=8 0000: 57 66 8a 35 d0 1e 60 4f fido_rx: dev=0x556fc09222a0, cmd=0x06, ms=-1 rx_preamble: buf=0x7ffeba17a080, len=64 0000: ff ff ff ff 86 00 11 57 66 8a 35 d0 1e 60 4f 00 0016: 00 00 1b 02 01 00 01 0f 00 00 00 00 00 00 00 00 0032: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0048: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 rx: payload_len=17 fido_rx: buf=0x556fc09222a8, len=17 0000: 57 66 8a 35 d0 1e 60 4f 00 00 00 1b 02 01 00 01 0016: 0f fido_dev_get_cbor_info_tx: dev=0x556fc09222a0 fido_tx: dev=0x556fc09222a0, cmd=0x10 fido_tx: buf=0x7ffeba17a137, len=1 0000: 04 fido_dev_get_cbor_info_rx: dev=0x556fc09222a0, ci=0x556fc09223f0, ms=-1 fido_rx: dev=0x556fc09222a0, cmd=0x10, ms=-1 rx_preamble: buf=0x7ffeba179840, len=64 0000: 00 00 00 1b 90 00 b1 00 aa 01 83 66 55 32 46 5f 0016: 56 32 68 46 49 44 4f 5f 32 5f 30 6c 46 49 44 4f 0032: 5f 32 5f 31 5f 50 52 45 02 82 6b 63 72 65 64 50 0048: 72 6f 74 65 63 74 6b 68 6d 61 63 2d 73 65 63 72 rx: payload_len=177 rx: buf=0x7ffeba179840, len=64 0000: 00 00 00 1b 00 65 74 03 50 31 0b 28 30 bd 4a 4d 0016: a5 83 2e 9a 0d fc 90 ab f2 04 a5 62 72 6b f5 62 0032: 75 70 f5 64 70 6c 61 74 f4 69 63 6c 69 65 6e 74 0048: 50 69 6e f4 75 63 72 65 64 65 6e 74 69 61 6c 4d rx: buf=0x7ffeba179840, len=64 0000: 00 00 00 1b 01 67 6d 74 50 72 65 76 69 65 77 f5 0016: 05 19 04 00 06 81 01 07 06 08 18 60 09 83 63 62 0032: 6c 65 63 6e 66 63 63 75 73 62 0a 81 a2 63 61 6c 0048: 67 26 64 74 79 70 65 6a 70 75 62 6c 69 63 2d 6b rx: buf=0x7ffeba179840, len=64 0000: 00 00 00 1b 02 65 79 00 00 00 00 00 00 00 00 00 0016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0032: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0048: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fido_rx: buf=0x7ffeba1798d0, len=177 0000: 00 aa 01 83 66 55 32 46 5f 56 32 68 46 49 44 4f 0016: 5f 32 5f 30 6c 46 49 44 4f 5f 32 5f 31 5f 50 52 0032: 45 02 82 6b 63 72 65 64 50 72 6f 74 65 63 74 6b 0048: 68 6d 61 63 2d 73 65 63 72 65 74 03 50 31 0b 28 0064: 30 bd 4a 4d a5 83 2e 9a 0d fc 90 ab f2 04 a5 62 0080: 72 6b f5 62 75 70 f5 64 70 6c 61 74 f4 69 63 6c 0096: 69 65 6e 74 50 69 6e f4 75 63 72 65 64 65 6e 74 0112: 69 61 6c 4d 67 6d 74 50 72 65 76 69 65 77 f5 05 0128: 19 04 00 06 81 01 07 06 08 18 60 09 83 63 62 6c 0144: 65 63 6e 66 63 63 75 73 62 0a 81 a2 63 61 6c 67 0160: 26 64 74 79 70 65 6a 70 75 62 6c 69 63 2d 6b 65 0176: 79 fido_dev_open_rx: FIDO_MAXMSG=2048, maxmsgsiz=1024 proto: 0x02 major: 0x01 minor: 0x00 build: 0x01 caps: 0x0f (wink, cbor, nomsg) fido_dev_get_cbor_info_tx: dev=0x556fc09222a0 fido_tx: dev=0x556fc09222a0, cmd=0x10 fido_tx: buf=0x7ffeba17a1a7, len=1 0000: 04 fido_dev_get_cbor_info_rx: dev=0x556fc09222a0, ci=0x556fc09228b0, ms=-1 fido_rx: dev=0x556fc09222a0, cmd=0x10, ms=-1 rx_preamble: buf=0x7ffeba1798d0, len=64 0000: 00 00 00 1b 90 00 b1 00 aa 01 83 66 55 32 46 5f 0016: 56 32 68 46 49 44 4f 5f 32 5f 30 6c 46 49 44 4f 0032: 5f 32 5f 31 5f 50 52 45 02 82 6b 63 72 65 64 50 0048: 72 6f 74 65 63 74 6b 68 6d 61 63 2d 73 65 63 72 rx: payload_len=177 rx: buf=0x7ffeba1798d0, len=64 0000: 00 00 00 1b 00 65 74 03 50 31 0b 28 30 bd 4a 4d 0016: a5 83 2e 9a 0d fc 90 ab f2 04 a5 62 72 6b f5 62 0032: 75 70 f5 64 70 6c 61 74 f4 69 63 6c 69 65 6e 74 0048: 50 69 6e f4 75 63 72 65 64 65 6e 74 69 61 6c 4d rx: buf=0x7ffeba1798d0, len=64 0000: 00 00 00 1b 01 67 6d 74 50 72 65 76 69 65 77 f5 0016: 05 19 04 00 06 81 01 07 06 08 18 60 09 83 63 62 0032: 6c 65 63 6e 66 63 63 75 73 62 0a 81 a2 63 61 6c 0048: 67 26 64 74 79 70 65 6a 70 75 62 6c 69 63 2d 6b rx: buf=0x7ffeba1798d0, len=64 0000: 00 00 00 1b 02 65 79 00 00 00 00 00 00 00 00 00 0016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0032: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0048: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fido_rx: buf=0x7ffeba179960, len=177 0000: 00 aa 01 83 66 55 32 46 5f 56 32 68 46 49 44 4f 0016: 5f 32 5f 30 6c 46 49 44 4f 5f 32 5f 31 5f 50 52 0032: 45 02 82 6b 63 72 65 64 50 72 6f 74 65 63 74 6b 0048: 68 6d 61 63 2d 73 65 63 72 65 74 03 50 31 0b 28 0064: 30 bd 4a 4d a5 83 2e 9a 0d fc 90 ab f2 04 a5 62 0080: 72 6b f5 62 75 70 f5 64 70 6c 61 74 f4 69 63 6c 0096: 69 65 6e 74 50 69 6e f4 75 63 72 65 64 65 6e 74 0112: 69 61 6c 4d 67 6d 74 50 72 65 76 69 65 77 f5 05 0128: 19 04 00 06 81 01 07 06 08 18 60 09 83 63 62 6c 0144: 65 63 6e 66 63 63 75 73 62 0a 81 a2 63 61 6c 67 0160: 26 64 74 79 70 65 6a 70 75 62 6c 69 63 2d 6b 65 0176: 79 version strings: U2F_V2, FIDO_2_0, FIDO_2_1_PRE extension strings: credProtect, hmac-secret transport strings: ble, nfc, usb algorithms: es256 (public-key) aaguid: 310b2830bd4a4da5832e9a0dfc90abf2 options: rk, up, noplat, noclientPin, credentialMgmtPreview maxmsgsiz: 1024 maxcredcntlst: 6 maxcredlen: 96 fwversion: 0x0 pin protocols: 1 fido_tx: dev=0x556fc09222a0, cmd=0x10 fido_tx: buf=0x556fc0922650, len=6 0000: 06 a2 01 01 02 01 fido_rx: dev=0x556fc09222a0, cmd=0x10, ms=-1 rx_preamble: buf=0x7ffeba1798f0, len=64 0000: 00 00 00 1b 90 00 01 35 00 00 00 00 00 00 00 00 0016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0032: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0048: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 rx: payload_len=1 fido_rx: buf=0x7ffeba179980, len=1 0000: 35 cbor_parse_reply: blob[0]=0x35 fido_dev_get_pin_retry_count_rx: parse_pin_retry_count pin retries: undefined fido_tx: dev=0x556fc09222a0, cmd=0x10 fido_tx: buf=0x556fc0922650, len=6 0000: 06 a2 01 01 02 07 fido_rx: dev=0x556fc09222a0, cmd=0x10, ms=-1 rx_preamble: buf=0x7ffeba1798f0, len=64 0000: 00 00 00 1b 90 00 01 02 00 00 00 00 00 00 00 00 0016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0032: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0048: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 rx: payload_len=1 fido_rx: buf=0x7ffeba179980, len=1 0000: 02 cbor_parse_reply: blob[0]=0x02 fido_dev_get_uv_retry_count_rx: parse_uv_retry_count uv retries: undefined fido_tx: dev=0x556fc09222a0, cmd=0x10 fido_tx: buf=0x556fc0922650, len=6 0000: 40 a2 01 01 02 07 fido_rx: dev=0x556fc09222a0, cmd=0x10, ms=-1 rx_preamble: buf=0x7ffeba1798b0, len=64 0000: 00 00 00 1b 90 00 01 01 00 00 00 00 00 00 00 00 0016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0032: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0048: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 rx: payload_len=1 fido_rx: buf=0x7ffeba179940, len=1 0000: 01 cbor_parse_reply: blob[0]=0x01 bio_rx_info: bio_parse_info bio_get_info_wait: tx/rx
fido_dev_supports_uv()
returns false because the authenticator does not support UV. Note that UP != UV. fido_dev_supports_pin()
returns true because the authenticator supports a pin, although one isn't set. fido_dev_has_pin()
can be used to distinguish between the two cases.
These functions are documented in https://developers.yubico.com/libfido2/Manuals/fido_dev_supports_uv.html. Please let us know if there's anything we can do to improve our documentation. Thank you!
Thank you for your response. What does UP means? User Presence? Could you elaborate a bit?
In FIDO2, User Presence (UP) indicates that someone has interacted with the authenticator to authorise an operation, typically through touch. On the other hand, User Verification (UV) signifies that, to a reasonable degree of confidence, the person who authorised an operation was the same individual who previously enrolled a secret, such as a fingerprint or a PIN, on the device.
While a PIN can be used to achieve UV, the two terms are separate concepts in FIDO2, with UV being reserved for methods of user verification that are entirely built-in to the authenticator, such as facial recognition or fingerprint matching. In this sense, most FIDO2 authenticators support PIN but not UV.
So, when the device reports clientPin=false, that means that a PIN is supported but is not set? If the token does not support a PIN the clientPin indication should not even exist?
Yes, that's correct.
Kind regards,
-p.