Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6b1b0f479f | |||
| e5c3e9c824 | |||
| a90e215aba | |||
| 9be8b77983 | |||
| 4739f797de | |||
| e0db8e1bab |
+27
-28
@@ -20,15 +20,6 @@
|
||||
import sys
|
||||
from .APDU import APDUResponse
|
||||
from .SecureChannel import SecureChannel
|
||||
|
||||
try:
|
||||
from smartcard.CardType import AnyCardType
|
||||
from smartcard.CardRequest import CardRequest
|
||||
from smartcard.Exceptions import CardRequestTimeoutException, CardConnectionException
|
||||
except ModuleNotFoundError:
|
||||
print('ERROR: smartcard module not found! Install pyscard package.\nTry with `pip install pyscard`')
|
||||
sys.exit(-1)
|
||||
|
||||
from .RescuePicoKey import RescuePicoKey
|
||||
from .PhyData import PhyData
|
||||
from .core import NamedIntEnum
|
||||
@@ -46,28 +37,36 @@ class Product(NamedIntEnum):
|
||||
OPENPGP = 3
|
||||
|
||||
class PicoKey:
|
||||
def __init__(self, slot=-1):
|
||||
def __init__(self, slot=-1, force_rescue=False):
|
||||
self.__sc = None
|
||||
cardtype = AnyCardType()
|
||||
try:
|
||||
# request card insertion
|
||||
readers = None
|
||||
if (slot >= 0):
|
||||
readers = CardRequest().getReaders()
|
||||
if (slot >= len(readers)):
|
||||
raise Exception('slot out of range')
|
||||
readers = [readers[slot]]
|
||||
cardrequest = CardRequest(timeout=1, cardType=cardtype, readers=readers)
|
||||
self.__card = cardrequest.waitforcard().connection
|
||||
|
||||
# connect to the card and perform a few transmits
|
||||
self.__card.connect()
|
||||
|
||||
except Exception:
|
||||
if (force_rescue):
|
||||
try:
|
||||
self.__card = RescuePicoKey()
|
||||
except Exception:
|
||||
raise Exception('time-out: no card inserted')
|
||||
else:
|
||||
from smartcard.CardType import AnyCardType
|
||||
from smartcard.CardRequest import CardRequest
|
||||
cardtype = AnyCardType()
|
||||
try:
|
||||
# request card insertion
|
||||
readers = None
|
||||
if (slot >= 0):
|
||||
readers = CardRequest().getReaders()
|
||||
if (slot >= len(readers)):
|
||||
raise Exception('slot out of range')
|
||||
readers = [readers[slot]]
|
||||
cardrequest = CardRequest(timeout=1, cardType=cardtype, readers=readers)
|
||||
self.__card = cardrequest.waitforcard().connection
|
||||
|
||||
# connect to the card and perform a few transmits
|
||||
self.__card.connect()
|
||||
|
||||
except Exception:
|
||||
try:
|
||||
self.__card = RescuePicoKey()
|
||||
except Exception:
|
||||
raise Exception('time-out: no card inserted')
|
||||
resp, sw1, sw2 = self.select_applet(rescue=True)
|
||||
try:
|
||||
resp, sw1, sw2 = self.select_applet(rescue=True)
|
||||
@@ -108,7 +107,7 @@ class PicoKey:
|
||||
|
||||
try:
|
||||
response, sw1, sw2 = self.__card.transmit(apdu)
|
||||
except CardConnectionException:
|
||||
except Exception:
|
||||
self.__card.reconnect()
|
||||
response, sw1, sw2 = self.__card.transmit(apdu)
|
||||
|
||||
@@ -144,7 +143,7 @@ class PicoKey:
|
||||
|
||||
try:
|
||||
response, sw1, sw2 = self.__card.transmit(apdu)
|
||||
except CardConnectionException:
|
||||
except Exception:
|
||||
self.__card.reconnect()
|
||||
response, sw1, sw2 = self.__card.transmit(apdu)
|
||||
|
||||
|
||||
@@ -17,8 +17,11 @@
|
||||
*/
|
||||
"""
|
||||
|
||||
import os
|
||||
import usb.core
|
||||
import usb.util
|
||||
import libusb_package
|
||||
import usb.backend.libusb1
|
||||
from .ICCD import ICCD
|
||||
|
||||
class RescuePicoKey:
|
||||
@@ -37,7 +40,12 @@ class RescuePicoKey:
|
||||
return True
|
||||
return False
|
||||
|
||||
devs = usb.core.find(find_all=True, custom_match=find_class(0x0B))
|
||||
backend = usb.backend.libusb1.get_backend(find_library=libusb_package.find_library)
|
||||
try:
|
||||
devs = usb.core.find(find_all=True, custom_match=find_class(0x0B), backend=backend)
|
||||
except Exception as e:
|
||||
print("RescuePicoKey: exception during usb.core.find:", e)
|
||||
devs = []
|
||||
found = False
|
||||
for dev in devs:
|
||||
if (dev.manufacturer == 'Pol Henarejos'):
|
||||
@@ -77,8 +85,15 @@ class RescuePicoKey:
|
||||
assert(self.__dev.write(self.__out, data, timeout) == len(data))
|
||||
|
||||
def exchange(self, data, timeout=2000):
|
||||
self.write(data=data, timeout=timeout)
|
||||
return self.read(timeout=timeout)
|
||||
try:
|
||||
self.write(data=data, timeout=timeout)
|
||||
except Exception as e:
|
||||
raise Exception("USB write error: " + str(e))
|
||||
try:
|
||||
ret = self.read(timeout=timeout)
|
||||
except Exception as e:
|
||||
raise Exception("USB read error: " + str(e))
|
||||
return ret
|
||||
|
||||
def powerOn(self):
|
||||
if (not self.__active):
|
||||
|
||||
+1
-1
@@ -18,4 +18,4 @@
|
||||
*/
|
||||
"""
|
||||
|
||||
__version__ = "1.1.1"
|
||||
__version__ = "1.1.4"
|
||||
|
||||
Reference in New Issue
Block a user