reader 如何将 pcsc 命令发送到 SAM 而不是卡

How to send pcsc commands to SAM and not to card on reader

我有带 SAM 插槽(安全访问模块)的 acr1281 reader。 我可以使用 python 库 smartcard 通过 pc/sc 与卡片通信。 但是我想向插入到 reader.

的 SAM 发送命令

如何'switch commands channel',这可能吗? 智能卡库可以向 reader (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.

但是我发送的所有命令都会转到放置在 reader 上的 MIFARE PICC。我想向插入 reader.

的 SAM 发送命令

在 Ubuntu Linux 中安装了 pscs 驱动程序 我在 smartcard 库中有 3 readers:

from smartcard.System import readers
print(readers())
  • ACS ACR1281 1S 双通道 Reader 00 00
  • ACS ACR1281 1S 双通道 Reader00 01
  • ACS ACR1281 1S 双通道 Reader 00 02

Reader 00 00 对我来说是无效的,我认为它是用于名片, reader 00 01 用于 PICC(在我的例子中是 MIFARE), reader 00 02 用于 ACR 中的 SAM 插槽,

所以我用reader01发卡APDU,reader02给SAM发指令,成功解决了我的任务

不确定如何自动找到它们,但我认为这个 00 00 等等是名称中的常量,我可以 select readers 用于 PICC 和 SAM 最后他们名字中的符号。

我通过 smartcard.CardRequest.CardRequest() 连接到 PICC reader - 在附近等待卡。 所以我必须只找到 SAM reader 并连接到它:

sam_connection = readers()[2].createConnection()
sam_connection.connect(mode=SCARD_SHARE_SHARED,
                        disposition=SCARD_LEAVE_CARD,
                        protocol=SCARD_PROTOCOL_ANY)