Admin 应用

要管理您的 CanoKey,可以使用 Admin 应用来:

  • 重置 OpenPGP / PIV / OATH / CTAP / NDEF / Pass。
  • 导入 FIDO 私钥和证书。
  • 配置 LED、NDEF、WebUSB 和触摸输出(Pass)。
  • 读取固件版本、序列号和存储占用。

1. 基本定义

AID

Admin 应用的 AID 为 F000000000

CLA

CLA 必须为 00h;唯一的例外是 Write FIDO Cert 的链式数据块使用 10h(见下文)。其它 CLA 返回 6E00

指令(Instructions)

标记为“需要 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

2. Select

选择应用以供使用。

请求

字段
CLA 00h
INS A4h
P1 04h
P2 00h
Lc AID 的长度(5)
Data AID(F0 00 00 00 00)

响应

SW 描述
9000 成功

3. Verify PIN

验证本 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 应用已被锁定

4. Change PIN

验证成功后,您可以使用此命令直接修改 PIN。PIN 长度应在 6 到 64 之间。

请求

字段
CLA 00h
INS 21h
P1 00h
P2 00h
Lc 新 PIN 的长度
Data 新 PIN

响应

SW 描述
9000 成功
6700 长度错误

5. Write FIDO Key

您可以使用此命令手动写入私钥。私钥应为 secp256r1 (NIST P-256) 密钥,长度 32 字节。

私钥更新后,证书也应相应更新。写入私钥会同时将 CTAP SM2 配置重置为默认值。

一旦写入新的私钥,您原有的 2FA 凭据(FIDO2)将失效

请求

字段
CLA 00h
INS 01h
P1 00h
P2 00h
Lc 密钥长度(20h)
Data 私钥

响应

SW 描述
9000 成功
6700 长度错误

6. Write FIDO Certification

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 长度错误

7. Reset OpenPGP / PIV / OATH / CTAP / NDEF / Pass

执行这些命令将重置相应的应用。

指令编码 应用 需要固件版本
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 成功

8. Set NDEF read-only

设置 NDEF 是否为只读。

请求

字段
CLA 00h
INS 08h
P1 00h 表示可读写,01h 表示只读
P2 00h

响应

SW 描述
9000 成功

9. Read / Write CTAP SM2 Config

读取或写入 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 数据错误

10. NFC Enable

读取或设置 NFC 是否启用(需要固件 3.0.0 或更高版本)。该指令由具体硬件平台实现。设置时需要先验证 PIN。

请求

字段
CLA 00h
INS 14h
P1 00h 表示读取,01h 表示设置
P2 设置时使用:00h 关闭,01h 开启
Lc 0

响应

读取时返回 1 字节:00h 表示关闭,01h 表示开启。

SW 描述
9000 成功
6982 设置时未验证 PIN

11. Write SN

SN 只能写入一次。受 OpenPGP 卡规范限制,序列号长度为 4 字节。

如果您自行制作 CanoKey,应使用此命令写入 SN。否则,SN 已经写入完毕。

请求

字段
CLA 00h
INS 30h
P1 00h
P2 00h
Lc SN 的长度(4)
Data SN

响应

SW 描述
9000 成功
6700 长度错误
6985 SN 已写入

12. Get version

读取固件版本或硬件型号。

请求

字段
CLA 00h
INS 31h
P1 00h 表示固件版本,01h 表示硬件型号
P2 00h
Le 00h

响应

以 UTF-8 编码的字符串。

SW 描述
9000 成功

13. Get serial number

读取 CanoKey 的序列号或芯片 ID。

请求

字段
CLA 00h
INS 32h
P1 00h 表示 CanoKey SN(4 字节),01h 表示芯片 ID
P2 00h
Le 00h

响应

原始数据。

SW 描述
9000 成功

14. Config

配置 LED、NDEF 和 WebUSB 着陆页:

  • LED 可配置为在不闪烁时常亮(ON)或熄灭(OFF)。默认值为 ON。
  • NDEF 和 WebUSB 着陆页开关需要固件 2.0.0 或更高版本,默认均为开启。

请求

字段
CLA 00h
INS 40h
P1 01h:LED;04h:NDEF;05h:WebUSB 着陆页
P2 00h 关闭,01h 开启

响应

SW 描述
9000 成功
6A86 P1/P2 错误

15. Get flash usage

获取闪存占用情况,无需验证 PIN。

请求

字段
CLA 00h
INS 41h
P1 00h
P2 00h
Le 至少 2

响应

P1 为 00h 时返回 2 字节:第一个字节为已用空间(单位 KiB),第二个字节为闪存总容量(单位 KiB)。

SW 描述
9000 成功
6700 长度错误

16. Get current configurations

获取当前配置,无需验证 PIN。

请求

字段
CLA 00h
INS 42h
P1 00h
P2 00h
Le 至少 5

响应

共 5 字节。

字节 含义
1 LED
2 保留
3 NDEF 只读
4 NDEF 启用
5 WebUSB 着陆页启用
SW 描述
9000 成功

17. Read / Write Pass Config

读取或配置触摸输出(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 错误

18. Factory Reset

重置所有应用(包括 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 数据错误

19. Vendor specific

此指令由具体硬件平台定义(例如进入固件更新模式),需要验证 PIN,不应直接使用。