在本文中,将探讨如何与凤凰编程器接口进行交互,以便更深入地了解智能卡的个性化阶段。智能卡通常由不同的公司组装:一家公司制造树脂,另一家公司制造多晶硅芯片,第三家公司安装固件,第四家公司执行个性化(创建目录和文件结构)。通常,制造商使用一个历史性的ATR字节来指示卡片所处的阶段。具体来说,将在本实验室中使用一个智能卡固件,该固件在智能卡每次改变阶段时更新H4(第四个历史字节)。
首先,智能卡处于制造状态,并且在制作包含预个性化密钥的文件之前不会过渡到个性化状态;这是为了保护组装固件的公司和生成文件系统的公司之间的物流。
应用程序使用Swing来绘制应用程序的图形部分。启动后,它创建一个专用于与RS-232串行端口通信的线程。串行通信的类被命名为CommSerie,并且SerialPort对象被抽象在puertoSerie属性中。设置RTS线为5V,然后为0V重置智能卡,并在大约40000个时钟周期后获取ATR。接下来,通过读取串行I/O缓冲区,以byte[]的形式获取ATR。ATR格式如下:
-----------------------------------------------
| TS | T0 | TB | H1 || H2 | H3 | H4 | H5 | H6 |
-----------------------------------------------
历史字节是H1..H6;在本实验室中,H4字节(第11-12个字符串)包含有关智能卡生命周期阶段的信息。这是读取它的代码:
public void enviaReset(){
// 在低电平开始时启动ATR
puertoSerie.setRTS(true);
puertoSerie.setRTS(false);
}
读取后,将其与相应的状态进行比较,映射在'Constantes'接口中。
if (estado.equals(Constantes.ESTADO_FABRICACION))
sol =
"制造阶段。无法个性化";
else if (estado.equals(Constantes.ESTADO_PREPERSONAL))
sol =
"预个性化阶段。可以重用";
else if (estado.equals(Constantes.ESTADO_PERSONALZDA))
sol =
"卡片已个性化。无法重用";
else if (estado.equals(Constantes.ESTADO_OFFLINE))
sol =
"请给读卡器通电并插入卡片";
else
sol =
"卡片处于未知阶段。无法重用";