要管理您的 CanoKey,可以使用 Admin 应用来:
Admin 应用的 AID 为 F000000000。
CLA 必须为 00h;唯一的例外是 Write FIDO Cert 的链式数据块使用 10h(见下文)。其它 CLA 返回 6E00。
标记为“需要 PIN”的指令,需要先成功执行 Verify PIN 命令后才可使用。未验证 PIN 时执行这些指令将返回 6982。未列出的指令编码返回 6D00。
部分指令或功能需要特定版本以上的固件,详见各小节的版本说明。
| 名称 | 编码 | 需要 PIN |
|---|---|---|
| Write FIDO Key | 01h | Y |
| Write FIDO Cert | 02h | Y |
| Reset OpenPGP | 03h | Y |
| Reset PIV | 04h | Y |
| Reset OATH | 05h | Y |
| Reset NDEF | 07h | Y |
| Set NDEF Read-only | 08h | Y |
| Reset CTAP | 09h | Y |
| Read CTAP SM2 Config | 11h | Y |
| Write CTAP SM2 Config | 12h | Y |
| Reset Pass | 13h | Y |
| NFC Enable | 14h | 读取:N;设置:Y |
| Verify PIN | 20h | N |
| Change PIN | 21h | Y |
| Write SN | 30h | Y |
| Get Version | 31h | N |
| Get SN | 32h | N |
| Config | 40h | Y |
| Flash Usage | 41h | N |
| Read Config | 42h | N |
| Read Pass Config | 43h | Y |
| Write Pass Config | 44h | Y |
| Factory Reset | 50h | N |
| Select | A4h | N |
| Vendor Specific | FFh | Y |
选择应用以供使用。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | A4h |
| P1 | 04h |
| P2 | 00h |
| Lc | AID 的长度(5) |
| Data | AID(F0 00 00 00 00) |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
验证本 Admin 应用的 PIN。默认 PIN 为 123456(字符串形式)或 31 32 33 34 35 36(十六进制形式)。
Admin / OpenPGP / PIV 各应用的 PIN 相互独立。
最大重试次数为 3。超过此限制后,应用将被锁定。验证成功会重置该计数。
如果输入为空(Lc = 0),则返回 PIN 的实际验证状态。如果 PIN 已验证,应用返回正常状态字(SW = 9000)。如果 PIN 尚未验证而又需要验证,应用返回状态字 63CX,其中 ‘X’ 表示剩余的可重试次数。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 20h |
| P1 | 00h |
| P2 | 00h |
| Lc | PIN 的长度或 0 |
| Data | PIN |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 63CX | 验证失败,剩余 X 次重试机会 |
| 6700 | 长度错误 |
| 6983 | 应用已被锁定 |
验证成功后,您可以使用此命令直接修改 PIN。PIN 长度应在 6 到 64 之间。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 21h |
| P1 | 00h |
| P2 | 00h |
| Lc | 新 PIN 的长度 |
| Data | 新 PIN |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6700 | 长度错误 |
您可以使用此命令手动写入私钥。私钥应为 secp256r1 (NIST P-256) 密钥,长度 32 字节。
私钥更新后,证书也应相应更新。写入私钥会同时将 CTAP SM2 配置重置为默认值。
一旦写入新的私钥,您原有的 2FA 凭据(FIDO2)将失效。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 01h |
| P1 | 00h |
| P2 | 00h |
| Lc | 密钥长度(20h) |
| Data | 私钥 |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6700 | 长度错误 |
FIDO 证书是与您的私钥对应的 X.509 der 格式证书。
证书的最大长度为 1152 字节。证书可能超过单条短 APDU 的长度,此时请使用 ISO 7816-4 命令链接(command chaining)分块写入:除最后一块外,各块的 CLA 均为 10h,最后一块的 CLA 为 00h。总长度超过 1152 字节时写入失败并返回 6700。
| 字段 | 值 |
|---|---|
| CLA | 00h(最后一块)或 10h(链式块) |
| INS | 02h |
| P1 | 00h |
| P2 | 00h |
| Lc | 本块证书数据的长度 |
| Data | 证书数据块 |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6700 | 长度错误 |
执行这些命令将重置相应的应用。
| 指令编码 | 应用 | 需要固件版本 |
|---|---|---|
| 03h | OpenPGP | - |
| 04h | PIV | - |
| 05h | OATH | - |
| 09h | CTAP | 3.0.0+ |
| 07h | NDEF | - |
| 13h | Pass | 3.0.0+ |
重置 CTAP 后,所有 FIDO2 凭据将失效。NDEF 和 Pass 仅在固件编译了相应应用时可用,否则返回 6D00。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 03h / 04h / 05h / 09h / 07h / 13h |
| P1 | 00h |
| P2 | 00h |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
设置 NDEF 是否为只读。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 08h |
| P1 | 00h 表示可读写,01h 表示只读 |
| P2 | 00h |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
读取或写入 CTAP 应用的 SM2 配置(需要固件 3.0.0 或更高版本)。配置为 8 字节,依次为 32 位的 curve_id 和 32 位的 algo_id(COSE 标识符)。写入时 algo_id 不得与 ES256 或 EdDSA 的算法标识冲突,否则返回 6A80。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 11h(读取)/ 12h(写入) |
| P1 | 00h |
| P2 | 00h |
| Lc | 仅写入时使用:08h |
| Data | 仅写入时使用:配置数据 |
读取时返回 8 字节的配置数据。
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6700 | 长度错误 |
| 6A80 | 数据错误 |
读取或设置 NFC 是否启用(需要固件 3.0.0 或更高版本)。该指令由具体硬件平台实现。设置时需要先验证 PIN。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 14h |
| P1 | 00h 表示读取,01h 表示设置 |
| P2 | 设置时使用:00h 关闭,01h 开启 |
| Lc | 0 |
读取时返回 1 字节:00h 表示关闭,01h 表示开启。
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6982 | 设置时未验证 PIN |
SN 只能写入一次。受 OpenPGP 卡规范限制,序列号长度为 4 字节。
如果您自行制作 CanoKey,应使用此命令写入 SN。否则,SN 已经写入完毕。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 30h |
| P1 | 00h |
| P2 | 00h |
| Lc | SN 的长度(4) |
| Data | SN |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6700 | 长度错误 |
| 6985 | SN 已写入 |
读取固件版本或硬件型号。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 31h |
| P1 | 00h 表示固件版本,01h 表示硬件型号 |
| P2 | 00h |
| Le | 00h |
以 UTF-8 编码的字符串。
| SW | 描述 |
|---|---|
| 9000 | 成功 |
读取 CanoKey 的序列号或芯片 ID。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 32h |
| P1 | 00h 表示 CanoKey SN(4 字节),01h 表示芯片 ID |
| P2 | 00h |
| Le | 00h |
原始数据。
| SW | 描述 |
|---|---|
| 9000 | 成功 |
配置 LED、NDEF 和 WebUSB 着陆页:
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 40h |
| P1 | 01h:LED;04h:NDEF;05h:WebUSB 着陆页 |
| P2 | 00h 关闭,01h 开启 |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6A86 | P1/P2 错误 |
获取闪存占用情况,无需验证 PIN。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 41h |
| P1 | 00h |
| P2 | 00h |
| Le | 至少 2 |
P1 为 00h 时返回 2 字节:第一个字节为已用空间(单位 KiB),第二个字节为闪存总容量(单位 KiB)。
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6700 | 长度错误 |
获取当前配置,无需验证 PIN。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 42h |
| P1 | 00h |
| P2 | 00h |
| Le | 至少 5 |
共 5 字节。
| 字节 | 含义 |
|---|---|
| 1 | LED |
| 2 | 保留 |
| 3 | NDEF 只读 |
| 4 | NDEF 启用 |
| 5 | WebUSB 着陆页启用 |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
读取或配置触摸输出(Pass)应用(需要固件 3.0.0 或更高版本)。Pass 有两个槽位:短按和长按。OATH 类型的槽位由 OATH 应用设置,不能通过 Write Pass Config 写入。
Read Pass Config(43h)返回两个槽位的配置,依次为短按槽位和长按槽位。每个槽位的第一个字节为类型:
| 类型 | 含义 | 后续字节 |
|---|---|---|
| 00h | 关闭 | 无 |
| 01h | OATH | 名称长度、名称、是否附加回车 |
| 02h | 静态密码 | 是否附加回车(不返回密码本身) |
Write Pass Config(44h)的请求如下:
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 44h |
| P1 | 01h 表示短按槽位,02h 表示长按槽位 |
| P2 | 00h |
| Data | 槽位数据(见下) |
Data 的第一个字节为类型:
00h:关闭该槽位,Lc = 1。02h:静态密码,格式为 02h || 密码长度 || 密码 || 是否附加回车。密码最长 32 字节。| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6700 | 长度错误 |
| 6A80 | 数据错误 |
| 6A86 | P1/P2 错误 |
重置所有应用(包括 Admin 自身的 PIN 与配置;SN 不会被重置)。所有 FIDO2 凭据将失效。
必须先用完 PIN 重试次数才能开始重置,且不能通过 NFC 执行。
命令执行后,您必须在 LED 闪烁时 2 秒内触摸,直到其返回 9000。
| 字段 | 值 |
|---|---|
| CLA | 00h |
| INS | 50h |
| P1 | 00h |
| P2 | 00h |
| Lc | 05h |
| Data | RESET(ASCII 编码) |
| SW | 描述 |
|---|---|
| 9000 | 成功 |
| 6982 | 闪烁时未触摸 |
| 6985 | PIN 尚未锁定,或正通过 NFC 访问 |
| 6A80 | 数据错误 |
此指令由具体硬件平台定义(例如进入固件更新模式),需要验证 PIN,不应直接使用。