在《AT命令交互之-PIN码》里面写到用AT命令的方式就行输入修改PIN码,这边将对用过直接的APDU交互方式进行PIN码的操作进行说明。
PIN码操作
COMMAND | 值 | 含义 |
---|---|---|
VERIFY CHV | '20' | 验证PIN码 |
CHANGE CHV | '24' | 修改PIN码 |
DISABLE CHV | '26' | 关闭PIN码验证 |
ENABLE CHV | '28' | 打开PIN码验证 |
1、VERIFY CHV 验证PIN码
命令 | CLA | INS | P1 | P2 | P3 |
---|---|---|---|---|---|
VERIFY CHV | 00 | 20 | 00 | CHV NO. | 08 |
=>00 20 00 01 08
<=20
=>31 32 33 34 FF FF FF FF //默认PIN码1234
<=90 00
(相当于AT命令中的:AT+CPIN=1234)
查询PIN码可输入次数
=>00 20 00 01 08
<=63 C3 //最后一个数据3代表PIN码还剩余3次可输入
如果输入一次错误的PIN码则会减一,如下:
=>00 20 00 01 08
<=63 C3 //剩余3次
=>00 20 00 01 08
<=20
=>32 32 33 34 FF FF FF FF //PIN码输入错误2234
<=63 C2 //剩余2次
=>00 20 00 01 08
<=63 C2 //剩余2次
如果在未开启PIN码验证功能时,却输入该指令会怎样
=>00 20 00 01 08
<=20
=>31 32 33 34 FF FF FF FF
<=69 84 //引用的数据失效
2、CHANGE CHV 修改PIN码
命令 | CLA | INS | P1 | P2 | P3 |
---|---|---|---|---|---|
CHANGE CHV | 00 | 24 | 00 | CHV NO. | 10 |
=>00 24 00 01 10
<=24
=>31 32 33 34 FF FF FF FF 34 33 32 31 FF FF FF FF //默认PIN码1234,修改成4321
<=9000 //引用的数据失效
如果输入错误,PIN码次数也会减一
=>00 20 00 01 08
<=63 C3 //剩余3次
=>00 24 00 01 10
<=24
=>31 32 33 34 FF FF FF FF 34 33 32 31 FF FF FF FF //上面修改一次后PIN码已经变成4321了,此时再用1234去修改PIN则会出错
<=63 C2 //剩余2次
=>00 20 00 01 08
<=63 C2 //剩余2次
(相当于AT命令中的:AT+CPWD="SC","1234","4321")
3、DISABLE CHV 关闭PIN码验证
命令 | CLA | INS | P1 | P2 | P3 |
---|---|---|---|---|---|
DISABLE CHV | 00 | 26 | 00 | 01 | 08 |
=>00 26 00 01 08
<=26
=>31 32 33 34 FF FF FF FF //使用PIN码1234关闭PIN码验证
<=9000
(相当于AT命令中的:AT+CLCK="SC",0,"1234")
4、ENABLE CHV 打开PIN码验证
命令 | CLA | INS | P1 | P2 | P3 |
---|---|---|---|---|---|
ENABLE CHV | 00 | 28 | 00 | 01 | 08 |
=>00 28 00 01 08
<=28
=>31 32 33 34 FF FF FF FF //使用PIN码1234打开PIN码验证
<=9000
(相当于AT命令中的:AT+CLCK="SC",1,"1234")
5、PIN状态查询
在AT命令里面,还有一条指令AT+CLCK="SC",2
用来判断PIN码功能是否已经开启,那我们用APDU数据怎么判断PIN码功能是否开启呢
我们在《SIM数据交互之-FCP》里面有讲到MF,DF,或者ADF的FCP,里面有一个字段,(PIN状态模板DO)C6,里面的PS_DO字节就可以判断是否开启了PIN码验证功能。
未开启PIN码验证功能时3F00对应的FCP的内容:
=>80 F2 00 00 00
<=6C 2B
=>80 F2 00 00 2B
<=F2 62278202782183023F00A507800171C00200018A01058B032F0602C60C90016083010183018183010A 9000
相当于AT命令中的:
AT+CLCK=\"SC\",2
AT+CLCK="SC",2
+CLCK: 0
OK
开启PIN码验证功能时3F00对应的FCP的内容:
=>80 F2 00 00 00
<=6C 2B
=>80 F2 00 00 2B
<=F2 62278202782183023F00A507800171C00200018A01058B032F0602C60C9001E083010183018183010A 9000
相当于AT命令中的:
AT+CLCK=\"SC\",2
AT+CLCK="SC",2
+CLCK: 1
OK
对比上面的两个数据可以发现当PIN码验证功能开启时,PS_DO字节的最高位会被置1
当我们分别在开启和没开启PIN码验证功能时,分别去读ADF的FCP或其他DF的FCP,都可以发现PS_DO字节的最高位会变化
所以要先判断是否开启了PIN码验证功能,只需要找到随便一个MF/DF/ADF的FCP对应的PS_DO字节最高位即可知道。
参考文献:3GPP,ISO7816,百度百科等