mirror of
https://github.com/solokeys/solo2.git
synced 2026-03-11 17:15:15 -07:00
306 lines
3.7 KiB
Python
306 lines
3.7 KiB
Python
from smartcard.System import readers
|
|
|
|
r = readers()[0]
|
|
|
|
c = r.createConnection()
|
|
c.connect()
|
|
|
|
|
|
def hexy(l):
|
|
# return ':'.join([f'{x:x}' for x in l])
|
|
return ' '.join([f'{x:02X}' for x in l])
|
|
|
|
|
|
print(f"ATR = '{hexy(c.getATR())}'")
|
|
|
|
# CLA, INS, P1, P2, Lc
|
|
NIST_RID = [0xA0, 0x00, 0x00, 0x03, 0x08]
|
|
NIST_PIX_PIV_APP = [0x00, 0x00, 0x10, 0x00]
|
|
NIST_PIX_PIV_VERSION = [0x01, 0x00]
|
|
PIV = NIST_RID + NIST_PIX_PIV_APP + NIST_PIX_PIV_VERSION
|
|
|
|
SELECT = [0x00, 0xA4, 0x04, 0x00, len(PIV)]
|
|
|
|
# [0, 164, 4, 0, 11, 160, 0, 0, 3, 8, 0, 0, 16, 0, 1, 0]
|
|
# resp = c.transmit(SELECT + PIV + [0])
|
|
|
|
LONG_ASS = [
|
|
0x10,
|
|
0xDB,
|
|
0x3F,
|
|
0xFF,
|
|
0xFF,
|
|
0x5C,
|
|
0x03,
|
|
0x5F,
|
|
0xC1,
|
|
0x05,
|
|
0x53,
|
|
0x82,
|
|
0x01,
|
|
0x5B,
|
|
0x70,
|
|
0x82,
|
|
0x01,
|
|
0x52,
|
|
0x30,
|
|
0x82,
|
|
0x01,
|
|
0x4E,
|
|
0x30,
|
|
0x81,
|
|
0xF5,
|
|
0xA0,
|
|
0x03,
|
|
0x02,
|
|
0x01,
|
|
0x02,
|
|
0x02,
|
|
0x11,
|
|
0x00,
|
|
0x8B,
|
|
0xAB,
|
|
0x31,
|
|
0xCF,
|
|
0x3E,
|
|
0xB9,
|
|
0xF5,
|
|
0x6A,
|
|
0x6F,
|
|
0x38,
|
|
0xF0,
|
|
0x5A,
|
|
0x4D,
|
|
0x7F,
|
|
0x55,
|
|
0x62,
|
|
0x30,
|
|
0x0A,
|
|
0x06,
|
|
0x08,
|
|
0x2A,
|
|
0x86,
|
|
0x48,
|
|
0xCE,
|
|
0x3D,
|
|
0x04,
|
|
0x03,
|
|
0x02,
|
|
0x30,
|
|
0x2A,
|
|
0x31,
|
|
0x16,
|
|
0x30,
|
|
0x14,
|
|
0x06,
|
|
0x03,
|
|
0x55,
|
|
0x04,
|
|
0x0A,
|
|
0x13,
|
|
0x0D,
|
|
0x79,
|
|
0x75,
|
|
0x62,
|
|
0x69,
|
|
0x6B,
|
|
0x65,
|
|
0x79,
|
|
0x2D,
|
|
0x61,
|
|
0x67,
|
|
0x65,
|
|
0x6E,
|
|
0x74,
|
|
0x31,
|
|
0x10,
|
|
0x30,
|
|
0x0E,
|
|
0x06,
|
|
0x03,
|
|
0x55,
|
|
0x04,
|
|
0x0B,
|
|
0x13,
|
|
0x07,
|
|
0x28,
|
|
0x64,
|
|
0x65,
|
|
0x76,
|
|
0x65,
|
|
0x6C,
|
|
0x29,
|
|
0x30,
|
|
0x20,
|
|
0x17,
|
|
0x0D,
|
|
0x32,
|
|
0x30,
|
|
0x30,
|
|
0x35,
|
|
0x31,
|
|
0x36,
|
|
0x30,
|
|
0x31,
|
|
0x31,
|
|
0x37,
|
|
0x32,
|
|
0x36,
|
|
0x5A,
|
|
0x18,
|
|
0x0F,
|
|
0x32,
|
|
0x30,
|
|
0x36,
|
|
0x32,
|
|
0x30,
|
|
0x35,
|
|
0x31,
|
|
0x36,
|
|
0x30,
|
|
0x32,
|
|
0x31,
|
|
0x37,
|
|
0x32,
|
|
0x36,
|
|
0x5A,
|
|
0x30,
|
|
0x12,
|
|
0x31,
|
|
0x10,
|
|
0x30,
|
|
0x0E,
|
|
0x06,
|
|
0x03,
|
|
0x55,
|
|
0x04,
|
|
0x03,
|
|
0x13,
|
|
0x07,
|
|
0x53,
|
|
0x53,
|
|
0x48,
|
|
0x20,
|
|
0x6B,
|
|
0x65,
|
|
0x79,
|
|
0x30,
|
|
0x59,
|
|
0x30,
|
|
0x13,
|
|
0x06,
|
|
0x07,
|
|
0x2A,
|
|
0x86,
|
|
0x48,
|
|
0xCE,
|
|
0x3D,
|
|
0x02,
|
|
0x01,
|
|
0x06,
|
|
0x08,
|
|
0x2A,
|
|
0x86,
|
|
0x48,
|
|
0xCE,
|
|
0x3D,
|
|
0x03,
|
|
0x01,
|
|
0x07,
|
|
0x03,
|
|
0x42,
|
|
0x00,
|
|
0x04,
|
|
0x4F,
|
|
0x98,
|
|
0x63,
|
|
0x2F,
|
|
0x53,
|
|
0xBD,
|
|
0xAB,
|
|
0xEE,
|
|
0xBF,
|
|
0x69,
|
|
0x73,
|
|
0x3A,
|
|
0x84,
|
|
0x0F,
|
|
0xFD,
|
|
0x9F,
|
|
0x9D,
|
|
0xB3,
|
|
0xCE,
|
|
0x5C,
|
|
0x1E,
|
|
0x1B,
|
|
0x84,
|
|
0x06,
|
|
0x63,
|
|
0x32,
|
|
0xFF,
|
|
0x9C,
|
|
0x44,
|
|
0x0B,
|
|
0xCE,
|
|
0x56,
|
|
0x13,
|
|
0x94,
|
|
0x00,
|
|
0x98,
|
|
0xE3,
|
|
0x46,
|
|
0xC2,
|
|
0xBC,
|
|
0x3D,
|
|
0xE6,
|
|
0x5E,
|
|
0xF2,
|
|
0x81,
|
|
0x4B,
|
|
0xBC,
|
|
0xEA,
|
|
0x2B,
|
|
0x9D,
|
|
0x47,
|
|
0xCC,
|
|
0x9B,
|
|
0x5E,
|
|
0xBE,
|
|
0x1E,
|
|
0x2C,
|
|
0x69,
|
|
0x1D,
|
|
0xC3,
|
|
0x53,
|
|
0x4C,
|
|
0x89,
|
|
0x14,
|
|
0xA3,
|
|
0x12,
|
|
0x30,
|
|
0x10,
|
|
0x30,
|
|
0x0E,
|
|
0x06,
|
|
0x03,
|
|
0x55,
|
|
0x1D,
|
|
]
|
|
# call e.g. with 0x7E for discovery object,
|
|
# 0x7F61 for biometric information template interindustry tag,
|
|
# or 0x5FC107 for card capability container, etc.
|
|
# except these first two, all tags have length 3,
|
|
# and even are [0x5F, 0xC1, ?].
|
|
def get_data(object_tag):
|
|
if object_tag == 0x7E:
|
|
tag = [0x7E]
|
|
elif object_tag == 0x7F61:
|
|
tag = list(object_tag.to_bytes(2, byteorder='big'))
|
|
else:
|
|
tag = list(object_tag.to_bytes(3, byteorder='big'))
|
|
|
|
GET_DATA = [0x00, 0xCB, 0x3F, 0xFF]
|
|
apdu = GET_DATA + [len(tag) + 2] + [0x5C, len(tag)] + tag + [0]
|
|
print(f"apdu = {apdu}")
|
|
return c.transmit(apdu)
|