diff --git a/tools/ctap_test.py b/tools/ctap_test.py index 5274438..c80b36d 100644 --- a/tools/ctap_test.py +++ b/tools/ctap_test.py @@ -61,6 +61,7 @@ class Tester(): self.origin = 'https://examplo.org' def find_device(self,): + print (list(CtapHidDevice.list_devices())) dev = next(CtapHidDevice.list_devices(), None) if not dev: raise RuntimeError('No FIDO device found') @@ -118,34 +119,34 @@ class Tester(): def test_long_ping(self): amt = 1000 - while 1 : - pingdata = os.urandom(amt) + pingdata = os.urandom(amt) + try: + t1 = time.time() * 1000 + r = self.send_data(CTAPHID.PING, pingdata) + t2 = time.time() * 1000 + delt = t2 - t1 + #if (delt < 140 ): + #raise RuntimeError('Fob is too fast (%d ms)' % delt) + if (delt > 555 * (amt/1000)): + raise RuntimeError('Fob is too slow (%d ms)' % delt) + if (r != pingdata): + raise ValueError('Ping data not echo\'d') + print('1000 byte ping time: %s ms' % delt) + except CtapError as e: + print('7609 byte Ping failed:', e) + raise RuntimeError('ping failed') + print('PASS: 7609 byte ping') + #sys.flush(sys.sto) + sys.stdout.flush() + + + def test_hid(self,check_timeouts = False): + if check_timeouts: + print('Test idle') try: - t1 = time.time() * 1000 - r = self.send_data(CTAPHID.PING, pingdata) - t2 = time.time() * 1000 - delt = t2 - t1 - #if (delt < 140 ): - #raise RuntimeError('Fob is too fast (%d ms)' % delt) - if (delt > 555 * (amt/1000)): - raise RuntimeError('Fob is too slow (%d ms)' % delt) - if (r != pingdata): - raise ValueError('Ping data not echo\'d') - print('1000 byte ping time: %s ms' % delt) - except CtapError as e: - print('7609 byte Ping failed:', e) - raise RuntimeError('ping failed') - print('PASS: 7609 byte ping') - #sys.flush(sys.sto) - sys.stdout.flush() - - - def test_hid(self,): - #print('Test idle') - #try: - #cmd,resp = self.recv_raw() - #except socket.timeout: - #print('Pass: Idle') + cmd,resp = self.recv_raw() + except socket.timeout: + print('Pass: Idle') print('Test init') r = self.send_data(CTAPHID.INIT, '\x11\x11\x11\x11\x11\x11\x11\x11') @@ -216,18 +217,19 @@ class Tester(): self.check_error(resp, CtapError.ERR.INVALID_LENGTH) print('PASS: invalid length') - #r = self.send_data(CTAPHID.PING, '\x44'*200) - #print('Sending packets that skip a sequence number.') - #self.send_raw('\x81\x04\x90') - #self.send_raw('\x00') - #self.send_raw('\x01') - ## skip 2 - #self.send_raw('\x03') - #cmd,resp = self.recv_raw() - #self.check_error(resp, CtapError.ERR.INVALID_SEQ) - #cmd,resp = self.recv_raw() - #assert(cmd == 0xbf) # timeout - #print('PASS: invalid sequence') + r = self.send_data(CTAPHID.PING, '\x44'*200) + print('Sending packets that skip a sequence number.') + self.send_raw('\x81\x04\x90') + self.send_raw('\x00') + self.send_raw('\x01') + # skip 2 + self.send_raw('\x03') + cmd,resp = self.recv_raw() + self.check_error(resp, CtapError.ERR.INVALID_SEQ) + if check_timeouts: + cmd,resp = self.recv_raw() + assert(cmd == 0xbf) # timeout + print('PASS: invalid sequence') print('Resync and send ping') try: @@ -262,13 +264,13 @@ class Tester(): cmd,r = self.recv_raw() # init response assert(cmd == 0x86) self.set_cid(oldcid) - #print('wait for timeout') - #cmd,r = self.recv_raw() # timeout response - #assert(cmd == 0xbf) + if check_timeouts: + #print('wait for timeout') + cmd,r = self.recv_raw() # timeout response + assert(cmd == 0xbf) print('PASS: resync and timeout') - print('Test timeout') self.send_data(CTAPHID.INIT, '\x11\x22\x33\x44\x55\x66\x77\x88') t1 = time.time() * 1000 @@ -294,14 +296,15 @@ class Tester(): assert(r[0] == CtapError.ERR.INVALID_SEQ) print('PASS: Test not cont') - print('Check random cont ignored') - #self.send_data(CTAPHID.INIT, '\x11\x22\x33\x44\x55\x66\x77\x88') - #self.send_raw('\x01\x10\x00') - #try: - #cmd,r = self.recv_raw() # timeout response - #except socket.timeout: - #pass - print('PASS: random cont') + if check_timeouts: + print('Check random cont ignored') + self.send_data(CTAPHID.INIT, '\x11\x22\x33\x44\x55\x66\x77\x88') + self.send_raw('\x01\x10\x00') + try: + cmd,r = self.recv_raw() # timeout response + except socket.timeout: + pass + print('PASS: random cont') print('Check busy') t1 = time.time() * 1000 @@ -336,11 +339,13 @@ class Tester(): self.send_raw('\x81\x00\x63') self.send_raw('\x00') + cmd,r = self.recv_raw() # busy response + self.set_cid(cid1) # finish 1st channel ping self.send_raw('\x00') self.set_cid(cid2) - cmd,r = self.recv_raw() # busy response + assert(cmd == 0xbf) assert(r[0] == CtapError.ERR.CHANNEL_BUSY) @@ -349,18 +354,19 @@ class Tester(): assert(cmd == 0x81) assert(len(r) == 0x63) - #cmd,r = self.recv_raw() # timeout - #assert(cmd == 0xbf) - #assert(r[0] == CtapError.ERR.TIMEOUT) + if check_timeouts: + cmd,r = self.recv_raw() # timeout + assert(cmd == 0xbf) + assert(r[0] == CtapError.ERR.TIMEOUT) print('PASS: busy interleaved') - - print('Test idle, wait for timeout') - sys.stdout.flush() - try: - cmd,resp = self.recv_raw() - except socket.timeout: - print('Pass: Idle') + if check_timeouts: + print('Test idle, wait for timeout') + sys.stdout.flush() + try: + cmd,resp = self.recv_raw() + except socket.timeout: + print('Pass: Idle') print('Test cid 0 is invalid') self.set_cid('\x00\x00\x00\x00') @@ -593,12 +599,9 @@ def test_find_brute_force(): if __name__ == '__main__': t = Tester() t.find_device() - #t.test_hid() - #t.test_long_ping() + # t.test_hid() + # t.test_long_ping() t.test_fido2() #test_find_brute_force() #t.test_fido2_simple() - t.test_fido2_brute_force() - - - + #t.test_fido2_brute_force()