1from ykman.device import get_name
2from ykman.base import YUBIKEY
3from yubikit.core import TRANSPORT
4from yubikit.management import (
5    CAPABILITY,
6    FORM_FACTOR,
7    DeviceInfo,
8    DeviceConfig,
9    Version,
10)
11from typing import cast
12
13
14def info(form_factor):
15    return DeviceInfo(
16        config=cast(DeviceConfig, None),
17        serial=None,
18        version=Version(5, 3, 0),
19        form_factor=form_factor,
20        supported_capabilities={TRANSPORT.USB: 0xFF},  # type: ignore
21        is_locked=False,
22        is_fips=False,
23    )
24
25
26def info_nfc(form_factor):
27    with_nfc = info(form_factor)
28    with_nfc.supported_capabilities[TRANSPORT.NFC] = 0xFF
29    return with_nfc
30
31
32def test_yk5_formfactors():
33    kt = YUBIKEY.YK4
34    assert get_name(info(FORM_FACTOR.USB_A_KEYCHAIN), kt) == "YubiKey 5A"
35    assert get_name(info_nfc(FORM_FACTOR.USB_A_KEYCHAIN), kt) == "YubiKey 5 NFC"
36    assert get_name(info(FORM_FACTOR.USB_A_NANO), kt) == "YubiKey 5 Nano"
37    assert get_name(info(FORM_FACTOR.USB_C_KEYCHAIN), kt) == "YubiKey 5C"
38    assert get_name(info_nfc(FORM_FACTOR.USB_C_KEYCHAIN), kt) == "YubiKey 5C NFC"
39    assert get_name(info(FORM_FACTOR.USB_C_NANO), kt) == "YubiKey 5C Nano"
40    assert get_name(info(FORM_FACTOR.USB_C_LIGHTNING), kt) == "YubiKey 5Ci"
41    assert get_name(info(FORM_FACTOR.USB_A_BIO), kt) == "YubiKey Bio"
42    assert get_name(info(FORM_FACTOR.USB_C_BIO), kt) == "YubiKey C Bio"
43    assert get_name(info(FORM_FACTOR.UNKNOWN), kt) == "YubiKey 5"
44    assert get_name(info_nfc(FORM_FACTOR.UNKNOWN), kt) == "YubiKey 5 NFC"
45
46
47def fido(device_info):
48    device_info.supported_capabilities[TRANSPORT.USB] = (
49        CAPABILITY.U2F | CAPABILITY.FIDO2
50    )
51    if TRANSPORT.NFC in device_info.supported_capabilities:
52        device_info.supported_capabilities[TRANSPORT.NFC] = (
53            CAPABILITY.U2F | CAPABILITY.FIDO2
54        )
55    return device_info
56
57
58def test_yk5_fido():
59    kt = YUBIKEY.YK4
60    assert (
61        get_name(fido(info(FORM_FACTOR.USB_A_BIO)), kt) == "YubiKey Bio - FIDO Edition"
62    )
63    assert (
64        get_name(fido(info(FORM_FACTOR.USB_C_BIO)), kt)
65        == "YubiKey C Bio - FIDO Edition"
66    )
67
68
69def fips(device_info):
70    device_info.is_fips = True
71    return device_info
72
73
74def test_yk5_fips_formfactors():
75    kt = YUBIKEY.YK4
76    assert get_name(fips(info(FORM_FACTOR.USB_A_KEYCHAIN)), kt) == "YubiKey 5A FIPS"
77    assert (
78        get_name(fips(info_nfc(FORM_FACTOR.USB_A_KEYCHAIN)), kt) == "YubiKey 5 NFC FIPS"
79    )
80    assert get_name(fips(info(FORM_FACTOR.USB_A_NANO)), kt) == "YubiKey 5 Nano FIPS"
81    assert get_name(fips(info(FORM_FACTOR.USB_C_KEYCHAIN)), kt) == "YubiKey 5C FIPS"
82    assert (
83        get_name(fips(info_nfc(FORM_FACTOR.USB_C_KEYCHAIN)), kt)
84        == "YubiKey 5C NFC FIPS"
85    )
86    assert get_name(fips(info(FORM_FACTOR.USB_C_NANO)), kt) == "YubiKey 5C Nano FIPS"
87    assert get_name(fips(info(FORM_FACTOR.USB_C_LIGHTNING)), kt) == "YubiKey 5Ci FIPS"
88    assert get_name(fips(info(FORM_FACTOR.USB_A_BIO)), kt) == "YubiKey Bio FIPS"
89    assert get_name(fips(info(FORM_FACTOR.USB_C_BIO)), kt) == "YubiKey C Bio FIPS"
90    assert get_name(fips(info(FORM_FACTOR.UNKNOWN)), kt) == "YubiKey 5 FIPS"
91    assert get_name(fips(info_nfc(FORM_FACTOR.UNKNOWN)), kt) == "YubiKey 5 NFC FIPS"
92