大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

14-SIM数据交互之-PIN

在《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,百度百科等