我有带SAM插槽(安全访问模块)的acr1281读卡器。我可以使用python库智能卡通过PC/sc与卡进行通信。但是我想将命令发送到插入到读取器的SAM。
如何为此"切换命令通道",甚至可能吗?智能卡库可以将控制命令发送到读取器(PC_to_RDR_Escape),但在acr1281文档中仅指定了GetFirmvareVersion命令。
我什至可以看到是否插入了SAM - 我调用SCardStatus()并在插入SAM的情况下获取0x34代码(据我所知,这是SCARD_POWERED=0x10 | SCARD_NEGOTIABLE=0x20 | SCARD_PRESENT=0x04
),如果没有SAM,它是0x0c = SCARD_SWALLOWED=0x08 | SCARD_PRESENT=0x04
。
但是我发送的所有命令都转到MIFARE PICC放在阅读器上。我想将命令发送到插入阅读器的 SAM。
在安装了 pscss 驱动程序的 Ubuntu Linux 中,我在smartcard
库中有 3 个阅读器:
from smartcard.System import readers
print(readers())
- ACS ACR1281 1S 双读卡器 00 00
- ACS ACR1281 1S 双读卡器 00 01
- ACS ACR1281 1S 双读卡器 00 02
阅读器00 00
对我来说是不活跃的,我认为它是针对联系人卡片的,读者00 01
是针对PICC的(在我的情况下是MIFARE),读取器00 02
用于 ACR 中的 SAM 插槽,
所以我用读卡器01
发送卡APDU,读卡器02
向SAM发送命令,成功解决了我的任务。
不知道如何自动找到它们,但我认为这个00 00
等等是名称中的常量,我可以通过名称中的最后一个符号为 PICC 和 SAM 选择读者。
我连接到PICC读卡器只是通过smartcard.CardRequest.CardRequest()
- 等待附近的卡。所以我必须只找到SAM阅读器并连接到它:
sam_connection = readers()[2].createConnection()
sam_connection.connect(mode=SCARD_SHARE_SHARED,
disposition=SCARD_LEAVE_CARD,
protocol=SCARD_PROTOCOL_ANY)