profile
viewpoint
Dain Nilsson dainnilsson Yubico Stockholm, Sweden

dainnilsson/scripts 63

Various utility scripts, mostly for personal use

dainnilsson/flask-u2f-tutorial 28

Tutorial for adding U2F support to an existing sample application, using the Flask microframework

EOSIO/eosio-webauthn-example-app 26

Example web app demonstrating EOSIO signing via WebAuthn

Yubico/webauthn-recovery-extension 16

Asynchronous delegated key generation without shared secrets (DRAFT)

dainnilsson/adventofcode-2017 7

My solutions to Advent of Code 2017 in Python 3

dainnilsson/forwagent 4

Experimental gpg (and ssh) agent forwarding for Windows.

dainnilsson/adventofcode-2019 0

Solutions to https://adventofcode.com/ 2019 in Python.

dainnilsson/cryptography 0

cryptography is a package designed to expose cryptographic primitives and recipes to Python developers.

dainnilsson/hungergames 0

Game engine for Brilliant.org's Hunger Games competition

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 184c9f74865d3cd0ad19506e963b85a63d93bd56

Log more system info.

view details

Dain Nilsson

commit sha 08f3ae0bcd16daaf0b756d68258aae24ce33eb21

Refactor ykman.piv to get rid of PivController.

view details

push time in 6 hours

pull request commentYubico/python-u2flib-server

Support newer metdata formats

Thanks for the further explanation. I agree that there doesn't seem to be a better alternative for you at the moment, as long as the client is stuck on U2F. On an informal basis, I don't disagree with "it's no longer maintained, we accept patches and will release on an as possible basis". Since we can't figure out a good workaround for you I'll make sure we do merge this PR and make a new PyPI release. Not sure exactly when I'll be able to get around to it, but "soonish" I hope.

archoversight

comment created time in 9 hours

push eventYubico/yubikey-manager

Dain Nilsson

commit sha c897961a64fd7a9b503788b5839d3a31ed067b91

Fix get_pin_retries.

view details

Dain Nilsson

commit sha a5a4559f7d5c1b41077ea0d4b49916ecb4d63499

Make list_all_devices return devices.

view details

Dain Nilsson

commit sha 9199505cbf377b4d9f0c05cb3241d5d5f60f7da1

Make sure DeviceInfo always has a version.

view details

Dain Nilsson

commit sha 74a152e2ec9227823f04d7c7a158dd28b52565ab

Print warning to stderr if PC/SC isn't available.

view details

push time in 13 hours

push eventYubico/yubikit-android

Dain Nilsson

commit sha 1b14933cded3d023df966f573c1a3ad24dd28096

Dialog styling.

view details

push time in 5 days

push eventYubico/python-fido2

Dain Nilsson

commit sha a00150ee2c48fb55f1d9883d35f42800890002f8

Fix AD for Large Blobs.

view details

push time in 5 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 5c8b7b488c449314ef400bf0f81b0ebc75bdfe24

Fix for MacOS HID.

view details

push time in 7 days

pull request commentYubico/python-u2flib-server

Support newer metdata formats

The main issue is that U2F is deprecated in favor of FIDO2, and migration should ideally include both server and client implementations. You say this is for non-browser use? Is the client under your control? If migrating that to use a WebAuthn-like API is possible then that is what I would suggest. If not then you may be stuck using a U2F server implementation, as the formats are different in a way which doesn't allow conversion between them.

archoversight

comment created time in 8 days

pull request commentYubico/python-u2flib-server

Support newer metdata formats

Could you elaborate a bit on what payloads you're looking to generate?

archoversight

comment created time in 8 days

create barnchYubico/python-fido2

branch : more-ctap21

created branch time in 8 days

issue closedYubico/yubioath-android

OATH Functionality Missing

Whether I plug the Security Key NFC inyo USB or NFC it will not read in my Galaxy Note 20. It says OATH functionality is missing or error in YubiKey communication yet it works on a laptop and iOS.

closed time in 9 days

camkorth24

issue commentYubico/yubioath-android

OATH Functionality Missing

Yes, Android is supported.

camkorth24

comment created time in 11 days

issue commentYubico/yubioath-android

OATH Functionality Missing

The YubiKey 5 series keys have support for OATH-TOTP in addition to WebAuthn, but the number of credentials that can be stored is limited to 32 per YubiKey. If you have 250+ TOTP credentials then there's no YubiKey which will be able to store them all. You may be able to store them in a password manager with support for TOTP and YubiKey, but I'm afraid I can't help you with any recommendations there.

camkorth24

comment created time in 11 days

issue commentYubico/yubioath-android

OATH Functionality Missing

That definitely looks like a Security Key NFC to me. TOTP (OATH-TOTP) is the usually 6 digit codes which refresh every 30 seconds. If you're getting those from that key, then I'm not sure what's going on.

The Security Key is used for WebAuthn/FIDO, which is supported cross platform, and is supported on a growing number of sites. It doesn't require any typing of OTPs, and has better protections than OTP-based protocols. This requires a supported browser instead of a separate companion app (so no Yubico Authenticator needed). You can read more about it here: https://www.yubico.com/authentication-standards/webauthn/

camkorth24

comment created time in 11 days

issue commentYubico/yubioath-android

OATH Functionality Missing

Are you sure you have the Security Key NFC (a blue key)? Because TOTP should not work on that, on any platform.

camkorth24

comment created time in 11 days

issue commentYubico/yubioath-android

OATH Functionality Missing

The Security Key NFC indeed does not support the OATH protocol. When you say it works on a laptop and iOS, are you referring to WebAuthn/FIDO working? Because the Yubico Authenticator apps on those platforms should not work there either.

camkorth24

comment created time in 11 days

push eventYubico/yubikit-android

Dain Nilsson

commit sha 9cf25223358f028505c2d92aaf363018257f0451

Refactor USB connections.

view details

Dain Nilsson

commit sha 78cf02cb63ad6773b89a9c1a47c64c1dc854769d

Bump gradle version.

view details

push time in 12 days

push eventYubico/python-fido2

Dain Nilsson

commit sha e1790cba699f7ff417c5b02c7fffe564e616362c

Python 2 fix: Use array instead of bytearray for ioctl.

view details

push time in 12 days

issue commentLudovicRousseau/pyscard

Built-in NFC reader is truncating responses

This test now was running pyscard 1.9.9 (under Python 3.8.5).

I should also note that I haven't tested older versions, so I don't know if this particular reader has ever worked or not.

dainnilsson

comment created time in 13 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 0bb988058a642b297572273ecdfa36372b1f6e12

Rename Tlv.unwrap to Tlv.unpack For consistency with eg. struct.unpack

view details

Dain Nilsson

commit sha bb8700aac11946ff0f033c300e8d13ab93e482c9

Rename scard -> pcsc, and fix up some strings.

view details

push time in 13 days

issue commentYubico/yubioath-desktop

YubiKey NFC not detected with Lenovo built-in NFC reader

I suspect you're running into the same issue I have (different Lenovo laptop, but possibly the same reader). At least in my case the responses get truncated, which causes Yubico Authenticator to treat the responses as errors.

Seeing as I'm not the only one with this issue now, it prompted me to do some investigation and to open an issue with pyscard: https://github.com/LudovicRousseau/pyscard/issues/100

Hopefully we can figure something out!

jacopo-j

comment created time in 13 days

issue openedLudovicRousseau/pyscard

Built-in NFC reader is truncating responses

Hello! I have a rather strange (too me at least) issue I'm running into.

I have a Lenovo Carbon X1 laptop with a built in NFC reader. I'm running Windows 10. python-pyscard lists the reader as: ['Microsoft IFD 0', 'NXP NXP's Proximity based PCSC Reader 0']

I'm not sure why it gets 2 entries, but the first one (Microsoft) is the one that seems to somewhat work. I can connect to it and transmit commands. The second one (NXP) never shows as having a card connected.

Here's where I'm running into trouble: Response APDUs seem to get truncated to 8 bytes, where pyscard treats the first 6 as data, and the last 2 as SW1, SW2.

Here's an example to illustrate this. Using a different reader (getting a correct reponse): connection.transmit([0, 164, 4, 0, 8, 160, 0, 0, 5, 39, 71, 17, 23]) out: ([86, 105, 114, 116, 117, 97, 108, 32, 109, 103, 114, 32, 45, 32, 70, 87, 32, 118, 101, 114, 115, 105, 111, 110, 32, 53, 46, 50, 46, 54], 144, 0)

Using the built-in reader (getting a truncated response): connection.transmit([0, 164, 4, 0, 8, 160, 0, 0, 5, 39, 71, 17, 23]) out: ([86, 105, 114, 116, 117, 97], 108, 32)

Now to add to my confusion, I've also found that:

  • A C program using PCSC doesn't have this issue, the built-in reader works fine.
  • Attaching the built-in reader to a VMWare Guest running Ubuntu, and running python-pyscard in the guess against it also works fine.

Any clues as to what might be going on here? Anything I can provide to help figure this out? Thankful for any suggestions!

created time in 13 days

push eventYubico/yubikit-android

Dain Nilsson

commit sha 389592c347b864d3aa391e4fc0ac8b69c99703d8

More Tlv cleanups.

view details

push time in 13 days

push eventYubico/yubikit-android

Dain Nilsson

commit sha f567241e433c69855b597dae06d9bc0e6c1a814e

Use Signature/Cipher objects in sign/decrypt to support custom params.

view details

push time in 14 days

push eventYubico/yubikit-android

Dain Nilsson

commit sha 1c66f251de17112e1864368639ada0763428ad95

Use Signature/Cipher objects in sign/decrypt to support custom params.

view details

push time in 14 days

push eventYubico/yubikit-android

Dain Nilsson

commit sha 59d4cf1df0279dfb672e9b5eff9469576347b6e5

Clean up TLV handling.

view details

push time in 14 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha a54a4e97b484c0a8650a46b4c99cfefd3b2fdc5c

Update docs to specify Python 3.

view details

push time in 15 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha bb8efde7edf9d74ab4155192b6dea23989c07dc6

Update docs to specify Python 3.

view details

push time in 15 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 3d4eaef4be0e1269bee51a111d951aa220c48066

Fix broken tests.

view details

push time in 15 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 989a4364a34a0e1289f2491e2bffe61f48b58ac3

Fix types.

view details

push time in 15 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha aeae9908f8c9de7925a4d7bb0b4b3814e816d186

Make YubiKeyDevice Connection support discoverable.

view details

Dain Nilsson

commit sha 5b4b91d2849e77a092f8804b754ccf3a997a1279

Fix types.

view details

push time in 15 days

push eventYubico/yubikit-android

Dain Nilsson

commit sha 5b6e424e9b7485efddb2e64280c45e72495a4152

Rewrite thread handling for USB and NFC managers.

view details

push time in 15 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 38414a719921ff75f0d38884b3c5bf79a280d448

Rename transport and interface.

view details

push time in 19 days

push eventYubico/yubikit-android

Dain Nilsson

commit sha e4e5d5fd8617a3ad786f8ffdb6f06d0ad2cb7686

Rename Interface and Transport.

view details

push time in 20 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha fe379fa2fb1041ce7cee56a64cc169926f503f14

Better support for piping input to the ykman command.

view details

push time in 20 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 21ff84dabd24b67612a175f5d4adfe63c26cc188

Allow passing CLI arguments from file/stdin.

view details

push time in 20 days

create barnchYubico/yubikey-manager

branch : env-vars

created branch time in 21 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 3105722fc5e6bc7b10ca0b0ceeeb075fdc662483

Don't crash if smart card service is missing.

view details

Dain Nilsson

commit sha c18a20de32e33163942da2091ea66fb62c2aaa8d

Fix Version parsing.

view details

push time in 21 days

push eventYubico/yubikey-manager

Dennis Fokin

commit sha 13f527b5e9f82fc05a8f736a0a1e4bd7da7bb564

fido: show user.id, to be able to delete duplicates

view details

Dennis Fokin

commit sha b34b925f87ffe91265115eed88b16c4d4903bee9

Merge pull request #359 from Yubico/fido-duplicate-creds fido: show user.id, to be able to delete duplicates

view details

Dag Heyman

commit sha 744aa328420d59c679c13551df98ac7be8b9da66

actions: add codeql-action

view details

Gabriel Kihlman

commit sha 50b79a698fd1bb44da609d172fb1cdc37792a083

Merge pull request #360 from codeql-scan

view details

Dain Nilsson

commit sha b552d489ba157ef4819a887e6ed620e2fe3341d9

Merge branch 'master' into next

view details

Dain Nilsson

commit sha 94b12ee13e8c478978735c4ec66077b426868172

Update NEWS.

view details

push time in 21 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 657277d40faa0d20df403fee56b1f9a02f65d4c4

Clean up source headers.

view details

push time in 21 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha ffb2c27db67a56ce4c0cba4be7049a3a59056235

Use NamedTuple with type hints.

view details

push time in 21 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 7bf0e09ca706fed821b6eeb6e843f5a4003c31af

Use Python 3 on Mac builds.

view details

push time in 21 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha c2da8a368e94eff47948cb30c5d7690f988bc08e

Use Python 3 on Mac builds.

view details

push time in 21 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 8b43585fad457e8467a40637686b654255ba3304

Use contants named from hidraw.h

view details

Dain Nilsson

commit sha dd3ea5cc908ba7a15782c96c7d3bfa787ff871b1

Use python-fido2 from git (for now).

view details

push time in 21 days

push eventYubico/python-fido2

Dain Nilsson

commit sha 526013f9b78942a69618fa0ad68ca3028f664016

Reformat with Black.

view details

Dain Nilsson

commit sha cfebc3b5e50c148b68d5d3fc59905b522d0b1d63

Refactor CTAP HID implementation.

view details

Dain Nilsson

commit sha f41673485366e9f065e5da653626e778769735dd

Remove/fix broken tests.

view details

Dain Nilsson

commit sha a862fdaa938444faa3e3f4ef187d4a0c6a40d1b8

Make sure to release objects in on Mac.

view details

Dain Nilsson

commit sha 95792be016df7e4c0e88379b2354dc167e76eadd

Minor fixes.

view details

Dain Nilsson

commit sha b65e79f96b07dcb37ec3a832aa6a20b2c56d55fa

Clean up logging a bit.

view details

Dain Nilsson

commit sha 0d31400877b0e2f4e6f3439e167b80a93ace9b16

Add check to os.write and some minor cleanups.

view details

Dain Nilsson

commit sha 40b92974d2004a2f56c71d409bf1551360881c4e

Merge PR #102

view details

push time in 21 days

PR merged Yubico/python-fido2

Hid refactoring

Cleanup and rewrite of most of the low level HID code.

+1434 -2889

0 comment

31 changed files

dainnilsson

pr closed time in 21 days

Pull request review commentYubico/python-fido2

Hid refactoring

+# Original work Copyright 2016 Google Inc. All Rights Reserved.+#+# Licensed under the Apache License, Version 2.0 (the "License");+# you may not use this file except in compliance with the License.+# You may obtain a copy of the License at+#+#    http://www.apache.org/licenses/LICENSE-2.0+#+# Unless required by applicable law or agreed to in writing, software+# distributed under the License is distributed on an "AS IS" BASIS,+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+# See the License for the specific language governing permissions and+# limitations under the License.+#+# Modified work Copyright 2020 Yubico AB. All Rights Reserved.+# This file, with modifications, is licensed under the above Apache License.+++from __future__ import absolute_import++import os+import uhid_freebsd++from .base import HidDescriptor, parse_report_descriptor, FileCtapHidConnection++import logging++logger = logging.getLogger(__name__)+++def open_connection(descriptor):+    return FileCtapHidConnection(descriptor)+++def _read_descriptor(vid, pid, path):+    fd = os.open(path, os.O_RDONLY)+    data = uhid_freebsd.get_report_data(fd, 3)+    os.close(fd)+    max_in_size, max_out_size = parse_report_descriptor(data)+    return HidDescriptor(path, vid, pid, max_in_size, max_out_size)+++def get_descriptor(path):+    for dev in uhid_freebsd.enumerate():+        if dev["path"] == path:+            vid = dev["vendor_id"]+            pid = dev["product_id"]+            return _read_descriptor(vid, pid, path)+    raise ValueError("Device not found")+++def list_descriptors():+    descriptors = []+    for dev in uhid_freebsd.enumerate():+        try:+            descriptors.append(+                _read_descriptor(dev["vendor_id"], dev["product_id"], dev["path"])+            )+        except Exception as e:+            logger.debug("Failed opening HID device", exc_info=e)++    return descriptors

Ok, I tested this and it seems to work as-is. So, I have no idea why it was there in the first place. Though notable is that the parent class in the previous version prepended a single 0 byte, which we now only do in linux.py.

dainnilsson

comment created time in 21 days

PullRequestReviewEvent

push eventYubico/python-fido2

Dain Nilsson

commit sha 0d31400877b0e2f4e6f3439e167b80a93ace9b16

Add check to os.write and some minor cleanups.

view details

push time in 21 days

Pull request review commentYubico/python-fido2

Hid refactoring

+# Original work Copyright 2016 Google Inc. All Rights Reserved.+#+# Licensed under the Apache License, Version 2.0 (the "License");+# you may not use this file except in compliance with the License.+# You may obtain a copy of the License at+#+#    http://www.apache.org/licenses/LICENSE-2.0+#+# Unless required by applicable law or agreed to in writing, software+# distributed under the License is distributed on an "AS IS" BASIS,+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+# See the License for the specific language governing permissions and+# limitations under the License.+#+# Modified work Copyright 2020 Yubico AB. All Rights Reserved.+# This file, with modifications, is licensed under the above Apache License.+++from __future__ import absolute_import++from .base import HidDescriptor, CtapHidConnection, FIDO_USAGE_PAGE, FIDO_USAGE++import ctypes+import platform+from ctypes import wintypes, LibraryLoader, WinDLL++import logging++logger = logging.getLogger(__name__)+++# Load relevant DLLs+windll = LibraryLoader(WinDLL)+hid = windll.Hid+setupapi = windll.SetupAPI+kernel32 = windll.Kernel32+++# Various structs that are used in the Windows APIs we call+class GUID(ctypes.Structure):+    _fields_ = [+        ("Data1", ctypes.c_ulong),+        ("Data2", ctypes.c_ushort),+        ("Data3", ctypes.c_ushort),+        ("Data4", ctypes.c_ubyte * 8),+    ]+++# On Windows, SetupAPI.h packs structures differently in 64bit and+# 32bit mode.  In 64-bit mode, the structures are packed on 8 byte+# boundaries, while in 32-bit mode, they are packed on 1 byte boundaries.+# This is important to get right for some API calls that fill out these+# structures.+if platform.architecture()[0] == "64bit":+    SETUPAPI_PACK = 8+elif platform.architecture()[0] == "32bit":+    SETUPAPI_PACK = 1+else:+    raise OSError("Unknown architecture: %s" % platform.architecture()[0])+++class DeviceInterfaceData(ctypes.Structure):+    _fields_ = [+        ("cbSize", wintypes.DWORD),+        ("InterfaceClassGuid", GUID),+        ("Flags", wintypes.DWORD),+        ("Reserved", ctypes.POINTER(ctypes.c_ulong)),+    ]+    _pack_ = SETUPAPI_PACK+++class DeviceInterfaceDetailData(ctypes.Structure):+    _fields_ = [("cbSize", wintypes.DWORD), ("DevicePath", ctypes.c_byte * 1)]+    _pack_ = SETUPAPI_PACK+++class HidAttributes(ctypes.Structure):+    _fields_ = [+        ("Size", ctypes.c_ulong),+        ("VendorID", ctypes.c_ushort),+        ("ProductID", ctypes.c_ushort),+        ("VersionNumber", ctypes.c_ushort),+    ]+++class HidCapabilities(ctypes.Structure):+    _fields_ = [+        ("Usage", ctypes.c_ushort),+        ("UsagePage", ctypes.c_ushort),+        ("InputReportByteLength", ctypes.c_ushort),+        ("OutputReportByteLength", ctypes.c_ushort),+        ("FeatureReportByteLength", ctypes.c_ushort),+        ("Reserved", ctypes.c_ushort * 17),+        ("NotUsed", ctypes.c_ushort * 10),+    ]+++# Various void* aliases for readability.+HDEVINFO = ctypes.c_void_p+HANDLE = ctypes.c_void_p+PHIDP_PREPARSED_DATA = ctypes.c_void_p  # pylint: disable=invalid-name++# This is a HANDLE.+INVALID_HANDLE_VALUE = 0xFFFFFFFF++# Status codes+FILE_SHARE_READ = 0x00000001+FILE_SHARE_WRITE = 0x00000002+OPEN_EXISTING = 0x03+NTSTATUS = ctypes.c_long+HIDP_STATUS_SUCCESS = 0x00110000++# CreateFile Flags+GENERIC_WRITE = 0x40000000+GENERIC_READ = 0x80000000++DIGCF_DEVICEINTERFACE = 0x10+DIGCF_PRESENT = 0x02++# Function signatures+hid.HidD_GetHidGuid.restype = None+hid.HidD_GetHidGuid.argtypes = [ctypes.POINTER(GUID)]+hid.HidD_GetAttributes.restype = wintypes.BOOLEAN+hid.HidD_GetAttributes.argtypes = [HANDLE, ctypes.POINTER(HidAttributes)]+hid.HidD_GetPreparsedData.restype = wintypes.BOOLEAN+hid.HidD_GetPreparsedData.argtypes = [HANDLE, ctypes.POINTER(PHIDP_PREPARSED_DATA)]+hid.HidD_FreePreparsedData.restype = wintypes.BOOLEAN+hid.HidD_FreePreparsedData.argtypes = [PHIDP_PREPARSED_DATA]+hid.HidD_GetProductString.restype = wintypes.BOOLEAN+hid.HidD_GetProductString.argtypes = [HANDLE, ctypes.c_void_p, ctypes.c_ulong]+hid.HidP_GetCaps.restype = NTSTATUS+hid.HidP_GetCaps.argtypes = [PHIDP_PREPARSED_DATA, ctypes.POINTER(HidCapabilities)]+++hid.HidD_GetFeature.restype = wintypes.BOOL+hid.HidD_GetFeature.argtypes = [HANDLE, ctypes.c_void_p, ctypes.c_ulong]+hid.HidD_SetFeature.restype = wintypes.BOOL+hid.HidD_SetFeature.argtypes = [HANDLE, ctypes.c_void_p, ctypes.c_ulong]++setupapi.SetupDiGetClassDevsA.argtypes = [+    ctypes.POINTER(GUID),+    ctypes.c_char_p,+    wintypes.HWND,+    wintypes.DWORD,+]+setupapi.SetupDiGetClassDevsA.restype = HDEVINFO+setupapi.SetupDiEnumDeviceInterfaces.restype = wintypes.BOOL+setupapi.SetupDiEnumDeviceInterfaces.argtypes = [+    HDEVINFO,+    ctypes.c_void_p,+    ctypes.POINTER(GUID),+    wintypes.DWORD,+    ctypes.POINTER(DeviceInterfaceData),+]+setupapi.SetupDiGetDeviceInterfaceDetailA.restype = wintypes.BOOL+setupapi.SetupDiGetDeviceInterfaceDetailA.argtypes = [+    HDEVINFO,+    ctypes.POINTER(DeviceInterfaceData),+    ctypes.POINTER(DeviceInterfaceDetailData),+    wintypes.DWORD,+    ctypes.POINTER(wintypes.DWORD),+    ctypes.c_void_p,+]+setupapi.SetupDiDestroyDeviceInfoList.restype = wintypes.BOOL+setupapi.SetupDiDestroyDeviceInfoList.argtypes = [+    HDEVINFO,+]++kernel32.CreateFileA.restype = HANDLE+kernel32.CreateFileA.argtypes = [+    ctypes.c_char_p,+    wintypes.DWORD,+    wintypes.DWORD,+    ctypes.c_void_p,+    wintypes.DWORD,+    wintypes.DWORD,+    HANDLE,+]+kernel32.CloseHandle.restype = wintypes.BOOL+kernel32.CloseHandle.argtypes = [HANDLE]+++class WinCtapHidConnection(CtapHidConnection):+    def __init__(self, descriptor):+        self.descriptor = descriptor+        self.handle = kernel32.CreateFileA(+            descriptor.path,+            GENERIC_WRITE | GENERIC_READ,+            FILE_SHARE_READ | FILE_SHARE_WRITE,+            None,+            OPEN_EXISTING,+            0,+            None,+        )+        if self.handle == INVALID_HANDLE_VALUE:+            raise ctypes.WinError()++    def close(self):+        kernel32.CloseHandle(self.handle)++    def write_packet(self, packet):+        out = b"\0" + packet  # Prepend report ID+        num_written = wintypes.DWORD()+        ret = kernel32.WriteFile(+            self.handle, out, len(out), ctypes.byref(num_written), None+        )+        if not ret:+            raise ctypes.WinError()+        if num_written.value != len(out):+            raise OSError(+                "Failed to write complete packet.  "+                + "Expected %d, but got %d" % (len(out), num_written.value)+            )++    def read_packet(self):+        buf = ctypes.create_string_buffer(self.descriptor.report_size_in + 1)+        num_read = wintypes.DWORD()+        ret = kernel32.ReadFile(+            self.handle, buf, len(buf), ctypes.byref(num_read), None+        )+        if not ret:+            raise ctypes.WinError()++        if num_read.value != self.descriptor.report_size_in + 1:+            raise OSError("Failed to read full length report from device.")++        return buf.raw[1:]  # Strip report ID+++def get_vid_pid(device):+    attributes = HidAttributes()+    result = hid.HidD_GetAttributes(device, ctypes.byref(attributes))+    if not result:+        raise ctypes.WinError()++    return attributes.VendorID, attributes.ProductID+++def get_descriptor(path):+    device = kernel32.CreateFileA(+        path, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, 0, None,+    )+    if device == INVALID_HANDLE_VALUE:+        raise ctypes.WinError()+    try:+        preparsed_data = PHIDP_PREPARSED_DATA(0)+        ret = hid.HidD_GetPreparsedData(device, ctypes.byref(preparsed_data))+        if not ret:+            raise ctypes.WinError()++        try:+            caps = HidCapabilities()+            ret = hid.HidP_GetCaps(preparsed_data, ctypes.byref(caps))++            if ret != HIDP_STATUS_SUCCESS:+                raise ctypes.WinError()++            if caps.UsagePage == FIDO_USAGE_PAGE and caps.Usage == FIDO_USAGE:+                vid, pid = get_vid_pid(device)+                size_in = caps.InputReportByteLength - 1+                size_out = caps.OutputReportByteLength - 1+                return HidDescriptor(path, vid, pid, size_in, size_out)

I'll add a comment to clarify this. As per https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/hidpi/ns-hidpi-_hidp_caps these sizes include the 1-byte report ID which is pre-pended to the payload.

dainnilsson

comment created time in 21 days

PullRequestReviewEvent

Pull request review commentYubico/python-fido2

Hid refactoring

+# Original work Copyright 2016 Google Inc. All Rights Reserved.+#+# Licensed under the Apache License, Version 2.0 (the "License");+# you may not use this file except in compliance with the License.+# You may obtain a copy of the License at+#+#    http://www.apache.org/licenses/LICENSE-2.0+#+# Unless required by applicable law or agreed to in writing, software+# distributed under the License is distributed on an "AS IS" BASIS,+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+# See the License for the specific language governing permissions and+# limitations under the License.+#+# Modified work Copyright 2020 Yubico AB. All Rights Reserved.+# This file, with modifications, is licensed under the above Apache License.+++from __future__ import absolute_import++from .base import HidDescriptor, FileCtapHidConnection, parse_report_descriptor++import glob+import fcntl+import struct++import logging++logger = logging.getLogger(__name__)++GET_INFO = 0x80084803+GET_DESC_SIZE = 0x80044801+GET_DESC = 0x90044802+

Good point. I'll rename them to use the hidraw.h names.

dainnilsson

comment created time in 21 days

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentYubico/python-fido2

Hid refactoring

+# Original work Copyright 2016 Google Inc. All Rights Reserved.+#+# Licensed under the Apache License, Version 2.0 (the "License");+# you may not use this file except in compliance with the License.+# You may obtain a copy of the License at+#+#    http://www.apache.org/licenses/LICENSE-2.0+#+# Unless required by applicable law or agreed to in writing, software+# distributed under the License is distributed on an "AS IS" BASIS,+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+# See the License for the specific language governing permissions and+# limitations under the License.+#+# Modified work Copyright 2020 Yubico AB. All Rights Reserved.+# This file, with modifications, is licensed under the above Apache License.+++from __future__ import absolute_import++import os+import uhid_freebsd++from .base import HidDescriptor, parse_report_descriptor, FileCtapHidConnection++import logging++logger = logging.getLogger(__name__)+++def open_connection(descriptor):+    return FileCtapHidConnection(descriptor)+++def _read_descriptor(vid, pid, path):+    fd = os.open(path, os.O_RDONLY)+    data = uhid_freebsd.get_report_data(fd, 3)+    os.close(fd)+    max_in_size, max_out_size = parse_report_descriptor(data)+    return HidDescriptor(path, vid, pid, max_in_size, max_out_size)+++def get_descriptor(path):+    for dev in uhid_freebsd.enumerate():+        if dev["path"] == path:+            vid = dev["vendor_id"]+            pid = dev["product_id"]+            return _read_descriptor(vid, pid, path)+    raise ValueError("Device not found")+++def list_descriptors():+    descriptors = []+    for dev in uhid_freebsd.enumerate():+        try:+            descriptors.append(+                _read_descriptor(dev["vendor_id"], dev["product_id"], dev["path"])+            )+        except Exception as e:+            logger.debug("Failed opening HID device", exc_info=e)++    return descriptors

Hmm... I'm not sure actually. This may need some more testing...

dainnilsson

comment created time in 21 days

Pull request review commentYubico/python-fido2

Hid refactoring

+# Copyright (c) 2020 Yubico AB+# All rights reserved.+#+#   Redistribution and use in source and binary forms, with or+#   without modification, are permitted provided that the following+#   conditions are met:+#+#    1. Redistributions of source code must retain the above copyright+#       notice, this list of conditions and the following disclaimer.+#    2. Redistributions in binary form must reproduce the above+#       copyright notice, this list of conditions and the following+#       disclaimer in the documentation and/or other materials provided+#       with the distribution.+#+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+# POSSIBILITY OF SUCH DAMAGE.+++from __future__ import absolute_import++from collections import namedtuple+import struct+import abc+import os++FIDO_USAGE_PAGE = 0xF1D0+FIDO_USAGE = 0x1+++class HidDescriptor(+    namedtuple(+        "HidDescriptor", ["path", "vid", "pid", "report_size_in", "report_size_out"]+    )+):+    __slots__ = ()+++class CtapHidConnection(abc.ABC):+    @abc.abstractmethod+    def read_packet(self):+        """Reads a CTAP HID packet"""++    @abc.abstractmethod+    def write_packet(self, data):+        """Writes a CTAP HID packet"""++    @abc.abstractmethod+    def close(self):+        """Closes the connection"""+++class FileCtapHidConnection(CtapHidConnection):+    """Basic CtapHidConnection implementation which uses a path to a file descriptor"""++    def __init__(self, descriptor):+        self.handle = os.open(descriptor.path, os.O_RDWR)+        self.descriptor = descriptor++    def close(self):+        os.close(self.handle)++    def write_packet(self, packet):+        os.write(self.handle, packet)

Good point, will add a check!

dainnilsson

comment created time in 21 days

PullRequestReviewEvent

Pull request review commentYubico/python-fido2

Hid refactoring

+# Original work Copyright 2016 Google Inc. All Rights Reserved.+#+# Licensed under the Apache License, Version 2.0 (the "License");+# you may not use this file except in compliance with the License.+# You may obtain a copy of the License at+#+#    http://www.apache.org/licenses/LICENSE-2.0+#+# Unless required by applicable law or agreed to in writing, software+# distributed under the License is distributed on an "AS IS" BASIS,+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+# See the License for the specific language governing permissions and+# limitations under the License.+#+# Modified work Copyright 2020 Yubico AB. All Rights Reserved.+# This file, with modifications, is licensed under the above Apache License.+++from __future__ import absolute_import++import os+import uhid_freebsd++from .base import HidDescriptor, parse_report_descriptor, FileCtapHidConnection++import logging++logger = logging.getLogger(__name__)+++def open_connection(descriptor):+    return FileCtapHidConnection(descriptor)+++def _read_descriptor(vid, pid, path):+    fd = os.open(path, os.O_RDONLY)+    data = uhid_freebsd.get_report_data(fd, 3)

I believe this value is supposed to be this enum: https://docs.huihoo.com/doxygen/linux/kernel/3.7/uhid_8h_source.html#l00055

However, 3 doesn't look like it would be a valid number. The uhid-freebsd project has an example in the README which also uses the constant 3, so for now I think we'll just leave it as-is.

dainnilsson

comment created time in 21 days

PullRequestReviewEvent

create barnchYubico/yubikey-manager

branch : next

created branch time in 21 days

issue commentYubico/yubikey-manager

AttributeError: '_Ed25519PrivateKey' object has no attribute 'key_size'

Thanks. Let's leave it open for now as a reminder to deal with the error handling.

yawnt

comment created time in 23 days

issue commentYubico/yubikey-manager

AttributeError: '_Ed25519PrivateKey' object has no attribute 'key_size'

Agreed, we need to add some better error handling around that!

yawnt

comment created time in 23 days

push eventYubico/python-fido2

Dain Nilsson

commit sha b65e79f96b07dcb37ec3a832aa6a20b2c56d55fa

Clean up logging a bit.

view details

push time in 25 days

PR opened Yubico/python-fido2

Hid refactoring

Cleanup and rewrite of most of the low level HID code.

+1419 -2886

0 comment

30 changed files

pr created time in 25 days

push eventYubico/python-fido2

Dain Nilsson

commit sha 379b261d9d839cede7bf2966cb31881a87fbfbf7

Add length checks to PIN/UV token.

view details

Dain Nilsson

commit sha 526013f9b78942a69618fa0ad68ca3028f664016

Reformat with Black.

view details

Dain Nilsson

commit sha cfebc3b5e50c148b68d5d3fc59905b522d0b1d63

Refactor CTAP HID implementation.

view details

Dain Nilsson

commit sha f41673485366e9f065e5da653626e778769735dd

Remove/fix broken tests.

view details

Dain Nilsson

commit sha a862fdaa938444faa3e3f4ef187d4a0c6a40d1b8

Make sure to release objects in on Mac.

view details

Dain Nilsson

commit sha 95792be016df7e4c0e88379b2354dc167e76eadd

Minor fixes.

view details

push time in 25 days

issue commentYubico/python-fido2

AttributeError: 'list' object has no attribute 'read'

This doesn't look like an issue with any python-fido2 code. Can you try updating pipenv (and its dependencies)?

bogdanys

comment created time in 25 days

push eventYubico/yubikey-manager

Dain Nilsson

commit sha 4be0d36e7ffd522278dc8eccfc18d5649d9b8075

Clean up capability reading.

view details

Dain Nilsson

commit sha bcd22b96dcedd1d147ede62e661bfe976f02eb85

Use SLOT enum for OTP slots.

view details

push time in 25 days

push eventYubico/yubikit-android

Dain Nilsson

commit sha 9440ac47604912310bec96483d203c3d621922dc

Clean up yubiotp module.

view details

push time in a month

create barnchYubico/yubikey-manager

branch : yubikit-refactoring

created branch time in a month

push eventYubico/python-fido2

Dain Nilsson

commit sha 379b261d9d839cede7bf2966cb31881a87fbfbf7

Add length checks to PIN/UV token.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha 29b092c9cef9f226c210e49889173c375d4e3f75

Cleanups.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha 050dd61d18920f24fccacab98d3f8c7be5f5afe9

Fixup.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha 61b6887234b893b227159d3a1326d6a4be0674b1

Ensure only one USB connection is open at a time.

view details

Dain Nilsson

commit sha b2da6a4b966110a2bc797916cf9534560b2a7b55

Close connections when done.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha 177562e3e583ef6293ff4d316dc4375933125131

Better handling for NFC OTP issue on YK5.

view details

Dain Nilsson

commit sha 7c7dac7f540323479369732d78af4061ec45f67e

Add missing copyright headers.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha a28a1e59e60cdf19ca17d51137bfa3917e3accd9

Fix Java 8 incompatibility.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha 0e970c55509cf98e5969fda6789ced65424b2edd

Reformat.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha c49884b45ade49a0cad3a8ff1722f01f27f697d5

Refactor YubiOtpSession.

view details

Dain Nilsson

commit sha 829ebf036e42067b543914d58515dfe106b2a8c8

Reformat.

view details

push time in a month

push eventYubico/python-fido2

Dain Nilsson

commit sha ff7900c2dfca6b75919ea0ef2d7bff78e51affe9

Minor fixes.

view details

push time in a month

push eventYubico/python-fido2

Dain Nilsson

commit sha 0e03015e599a9f6dabda30ce189ed036e78f0e4b

Make sure to release objects in on Mac.

view details

push time in a month

push eventYubico/python-yubico

Andreas Olsson

commit sha 98a138a71fe63c368567963110457a93660c9949

Update Ubuntu/Debian install instructions

view details

Dain Nilsson

commit sha 170ea1ef1ce7f823c7da8899f2fc65cdc795f87a

Merge PR #48

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha be5093a67ade054a57309d9f617a6c6604acae09

Don't use NfcAdapter.ignore().

view details

push time in a month

PullRequestReviewEvent
PullRequestReviewEvent

pull request commentYubico/python-u2flib-server

Adding basic exception classes to provide more information on failures than ValueErrors.

Sorry, this is waaaay overdue. Would merging this to master even if no release is made be helpful? As this project isn't being actively worked on (as stated in the README, python-fido2 should be preferred) I'm reluctant to make a new release for this.

tonydelanuez

comment created time in a month

pull request commentYubico/python-u2flib-server

Support newer metdata formats

Would it be helpful if this was merged into master, even if no new release is made to include it? As this project isn't being actively worked on (as stated in the README, python-fido2 should be preferred) I'm reluctant to make a new release for this.

archoversight

comment created time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha 568033049f9bf7730bf2cfbb3f18bf5020a08dce

More renames.

view details

push time in a month

issue commentYubico/yubikey-manager-qt

[Windows] Yubikey Manager + ykman: usb.core.USBError: [Errno None] Other error

Alright, fully understandable! I hope the next major version solves your issue in any case!

OomJan

comment created time in a month

issue commentYubico/yubikey-manager-qt

[Windows] Yubikey Manager + ykman: usb.core.USBError: [Errno None] Other error

Thank you! It's clear that something is failing related to libusb, unfortunately the error there is very unhelpful ("Other error"). I suppose it could potentially have something to do with the AV software, perhaps you could try temporarily disabling it to see if that makes a difference or not.

We do have plans to move away from using libusb in the next major version of YubiKey Manager, though I have no exact date for that as of now. Hopefully that will have the benefit of solving your issue even if we don't know the exact cause for it.

OomJan

comment created time in a month

issue commentYubico/yubikey-manager

OATH read code APDUError

I'm relieved you were able to recover from the situation, and thanks so much for the detailed information, it's already given us a few leads to investigate. Based on your experience, I believe something went wrong with adding the new credential, likely due to the nature of NFC being an unreliable channel. We'll do some experimentation to see if we can reproduce this internally, and see how to best improve our apps to handle this situation. Again, showing that it's something we can recover from (at least in your specific case) means there is definite room for improvement here!

SharpEdgeMarshall

comment created time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha fb8cca06a545f6e349d049b44d0c6980067f29c1

Rename Application, Session, Device.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha 5ce40cd3b08066c1ea1e9b658c8d6188509418d4

Add spotbugs.

view details

push time in a month

push eventYubico/yubikit-android

Dain Nilsson

commit sha a4bdd05b88708f9d794a223ddb07b9ee733e9d48

Add 4.2.0 - 4.2.6 CCID touch timeout workaround.

view details

Dain Nilsson

commit sha 00441690005a62968017649e63651d3909faced2

Varioud improvements.

view details

Dain Nilsson

commit sha 6f78b8e63ae7445059fcae9b8a8ecc8c78f5b02b

Refactor Tlv.unwrapTlv.

view details

Dain Nilsson

commit sha 38ee5741100b56cecea38f9aa4d874ca5dac8738

Minor PIV improvements.

view details

Dain Nilsson

commit sha a4c536b3b747077bdd71e0a5b98324cd68e4c0a2

Don't expose ATR.

view details

Dain Nilsson

commit sha e457f67bcdf804d7f0726743efb43ff0ece664c6

Various renames.

view details

Dain Nilsson

commit sha ada85322dd6195b88389e638eee19a091576bc42

More renames.

view details

push time in a month

issue commentYubico/yubikit-android

Decrypt with PIV

I believe that comment refers to the underlying PIV specification than the class itself. Unfortunately this feature isn't currently implemented in this SDK, but it is on our roadmap to be included in a future release. I don't have a date at the moment, but will update this issue when there is more information to share.

In the meantime, if you can provide more details around the specifics of your use case we can make sure to use that input in the design of this feature.

immesys

comment created time in a month

push eventYubico/python-fido2

Dain Nilsson

commit sha 4811b6090b88cefee86c4a6208f7a89bf08fa799

Refactor CTAP HID implementation.

view details

Dain Nilsson

commit sha fcae210fc2f4f105df4fa354c6dd9c1f985cbf44

Remove/fix broken tests.

view details

push time in a month

create barnchYubico/python-fido2

branch : hid-refactoring

created branch time in 2 months

push eventYubico/developers.yubico.com

Dain Nilsson

commit sha bcb0a62a62c67c46dd4258de40ca93d5f1954601

Update preview CA cert.

view details

push time in 2 months

push eventYubico/yubikit-android

Dain Nilsson

commit sha 0de4bd865c75aecc5bfb0bf2a935e35d57ad0498

Fix JDK 1.8 compatibility.

view details

push time in 2 months

push eventYubico/yubikit-android

Dain Nilsson

commit sha 6849f9fff70bed54d1e5df71a34b630474aab9c2

Update Demo application to work with new SDK changes.

view details

Dain Nilsson

commit sha 033a9e1e1f1a1e1be1fad8671e79f11ccb269a27

Restructuring of class layout.

view details

Dain Nilsson

commit sha 938b4cb592515445fcf7ab60ed3cc2786a162321

Restructure exceptions.

view details

Dain Nilsson

commit sha d8f4072b44c109e98cede45cf8913aa8fc06889d

Use CommandState for OtpConnection.

view details

Dain Nilsson

commit sha 8b5e04881da358b446ba577d6ee2cd72c2fce15c

Reintroduce ApplicationNotAvailableException.

view details

Dain Nilsson

commit sha 4179979927d8a3386eab54845ebd979492d25e7a

Update AndroidDemo.

view details

Dain Nilsson

commit sha 6bcf45af6b6cad96d632c8c78df243f6074d8089

Oath improvements. - Add support for credential rename. - Ensure deviceId matches for Credentials.

view details

Dain Nilsson

commit sha 622f4393dbd81d3a02a0e40adf274c93fbd86d64

Add PIV Metadata.

view details

Dain Nilsson

commit sha b3cf79af19d0e04e3ed14d5551780f5fe1a4e8df

Fix javadoc.

view details

Dain Nilsson

commit sha 0ca8f4547672eebf03e5a1ffe6dff51c5ff4c9eb

Restructure otp configuration.

view details

Dain Nilsson

commit sha 2a5f7a8d744e6416289fa962c472ec54d0c26610

Minor cleanups.

view details

Dain Nilsson

commit sha 8ede645ea33462a4938177619298a60b9f6f4a16

Update dependencies.

view details

Dain Nilsson

commit sha 51eb70436362e963dedec0ab493c45183ece7753

Fix demo.

view details

push time in 2 months

push eventYubico/python-fido2

Dain Nilsson

commit sha 8e1740c214e7bcb36fd8b30bce4b4d899e06bccd

Add draft bio enrollment.

view details

Dain Nilsson

commit sha f122d8c19a9aaeda94852f29062334d33036c452

Rename PIN values that support UV. pin_token -> pin_uv_token pin_protocol -> pin_uv_protocol pin_protocols -> pin_uv_protocols pin_param -> pin_uv_param

view details

Dain Nilsson

commit sha 470ffc20bf60696dc2e8a469b1a055d8a8326719

Print capture errors.

view details

Dain Nilsson

commit sha dfbf696709b91fd47a237d02d5e488c732df2acc

Add ability to cancel ongoing bio call.

view details

Dain Nilsson

commit sha e413fd703b766391c0ef12d4a611be898ecbf178

Split PinProtocolV1 into ClientPin and PinProtocol.

view details

Dain Nilsson

commit sha d2f6942e460063e2583fe7ec9e3ed0eb8ea5f04a

Update hmac-secret extension.

view details

Kostas Georgantas

commit sha bac19422f796b4faf9e3537417667b6c47c39f88

adding permissions for getPinUvAuthTokenUsingUvWithPermissions sub-command

view details

Dain Nilsson

commit sha fdf8d50699421694823bb519760418d20fac83c2

More complete PIN/UV permissions.

view details

Dain Nilsson

commit sha f4895ec4acd0c58a9facd811f0fc7ca0c9aa0e9c

Fix tests.

view details

Dain Nilsson

commit sha 3eb942b8a85f97901872adc49f763fd503eb5673

Add PIN Protocol V2.

view details

Dain Nilsson

commit sha 26291acdf893864bbad25edda56bdabc19979f24

Use longer names for permissions constants.

view details

Dain Nilsson

commit sha d1005d4a1cb6ce8839ba806ff20d9946ca24f077

Expose remaining samples from FPEnrollmentContext.

view details

push time in 2 months

push eventYubico/yubikey-manager

Dain Nilsson

commit sha bd07e46e6ba3339a278cb3166dbe3894e62c8814

Allow the FIDO command to run over NFC.

view details

push time in 2 months

more