Skip to content
This repository was archived by the owner on Jun 9, 2022. It is now read-only.

Commit 8de9941

Browse files
committed
Cleanups and tests for u2flib_host.u2f.
1 parent ff2c897 commit 8de9941

2 files changed

Lines changed: 77 additions & 13 deletions

File tree

test/test_u2f.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Copyright (c) 2016 Yubico AB
2+
# All rights reserved.
3+
#
4+
# Redistribution and use in source and binary forms, with or
5+
# without modification, are permitted provided that the following
6+
# conditions are met:
7+
#
8+
# 1. Redistributions of source code must retain the above copyright
9+
# notice, this list of conditions and the following disclaimer.
10+
# 2. Redistributions in binary form must reproduce the above
11+
# copyright notice, this list of conditions and the following
12+
# disclaimer in the documentation and/or other materials provided
13+
# with the distribution.
14+
#
15+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18+
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19+
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21+
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24+
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25+
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
# POSSIBILITY OF SUCH DAMAGE.
27+
28+
from u2flib_host import u2f, u2f_v2
29+
import unittest
30+
31+
32+
class MockDevice(object):
33+
34+
def __init__(self, *versions):
35+
self._versions = versions
36+
37+
def get_supported_versions(self):
38+
return self._versions
39+
40+
def send_apdu(self, ins, p1, p2, request):
41+
return b''
42+
43+
44+
class TestU2F(unittest.TestCase):
45+
46+
def test_get_lib_supported(self):
47+
lib = u2f.get_lib(MockDevice('U2F_V2'), {'version': 'U2F_V2'})
48+
self.assertEqual(lib, u2f_v2)
49+
50+
lib = u2f.get_lib(MockDevice('foo', 'U2F_V2'), {'version': 'U2F_V2'})
51+
self.assertEqual(lib, u2f_v2)
52+
53+
lib = u2f.get_lib(MockDevice('U2F_V2', 'bar'), {'version': 'U2F_V2'})
54+
self.assertEqual(lib, u2f_v2)
55+
56+
def test_get_lib_unsupported_by_device(self):
57+
self.assertRaises(ValueError, u2f.get_lib,
58+
MockDevice('unknown', 'versions'),
59+
{'version': 'U2F_V2'})
60+
61+
def test_get_lib_unsupported_by_lib(self):
62+
self.assertRaises(ValueError, u2f.get_lib,
63+
MockDevice('U2F_V2'),
64+
{'version': 'invalid_version'})

u2flib_host/u2f.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727

2828
from u2flib_host import u2f_v2
2929
from u2flib_host import hid_transport
30+
from u2flib_host.yubicommon.compat import string_types
31+
32+
import json
3033

3134
TRANSPORTS = [
3235
hid_transport
@@ -48,27 +51,24 @@ def list_devices():
4851
return devices
4952

5053

51-
def get_lib(data):
52-
return LIB_VERSIONS[data.get('version', 'U2F_V2')]
53-
54+
def get_lib(device, data):
55+
if isinstance(data, string_types):
56+
data = json.loads(data)
5457

55-
def register(device, data, facet):
56-
version = data.get('version')
58+
version = data['version']
5759
if version not in device.get_supported_versions():
5860
raise ValueError("Device does not support U2F version: %s" % version)
5961
if version not in LIB_VERSIONS:
6062
raise ValueError("Library does not support U2F version: %s" % version)
6163

62-
lib = LIB_VERSIONS[version]
64+
return LIB_VERSIONS[version]
65+
66+
67+
def register(device, data, facet):
68+
lib = get_lib(device, data)
6369
return lib.register(device, data, facet)
6470

6571

6672
def authenticate(device, data, facet, check_only=False):
67-
version = data['version']
68-
if version not in device.get_supported_versions():
69-
raise ValueError("Device does not support U2F version: %s" % version)
70-
if version not in LIB_VERSIONS:
71-
raise ValueError("Library does not support U2F version: %s" % version)
72-
73-
lib = LIB_VERSIONS[version]
73+
lib = get_lib(device, data)
7474
return lib.authenticate(device, data, facet, check_only)

0 commit comments

Comments
 (0)