Solaris 开发者安全性指南

第 10 章 使用智能卡框架

智能卡框架是包含微处理器和内存的便携式计算机。智能卡的形状和大小通常与信用卡相同。智能卡为可通过验证和加密保护的机密信息提供高度安全存储。

本章包含以下主题:

Solaris 智能卡框架概述

在 Solaris 操作系统中,智能卡框架用于将消费方应用程序与智能卡终端连接起来。消费方应用程序可以调用智能卡框架 (smart card framework, SCF) API。智能卡终端通过接口设备 (interface device, IFD) 处理程序(本质上为设备驱动程序)与消费方应用程序进行通信。IFD 处理程序通过终端接口连接至框架。请参见下图。

图 10–1 智能卡框架

图中显示了智能卡框架的体系结构。

Solaris 操作系统在专用文件中存储智能卡配置信息。与此相反,Linux 实现通常使用 /etc/reader.conf。要更改配置文件中的项,请使用命令 smartcard(1M)

目前,智能卡框架与 Solaris 加密框架无关。

开发智能卡消费方应用程序

SCF API 提供了一组用于访问智能卡的接口。这些接口采用低级应用程序协议数据单元 (application protocol data unit, APDU) 形式提供与卡之间的通信。C 和 Java 中都提供了这些接口。这些接口与 Solaris 操作系统支持的所有读取器以及与 APDU 通信的任何智能卡协同工作。SCF API 基于以下组件:

SCF API 提供以下领域的功能:

以下各节提供有关特定 SCF 接口的信息。

SCF 会话接口

以下函数用于 SCF 会话。

SCF_Session_getSession(3SMARTCARD)

使用系统的智能卡框架建立会话。打开会话后,可以将该会话与 SCF_Session_getTerminal(3SMARTCARD) 一同使用,以访问智能卡终端。

SCF_Session_close(3SMARTCARD)

释放打开会话时分配的资源。另外,关闭与该会话关联的所有终端或卡。

SCF_Session_getInfo(3SMARTCARD)

获取有关会话的信息。

SCF_Session_freeInfo(3SMARTCARD)

取消从 SCF_Session_getInfo(3SMARTCARD) 返回的存储的分配。

SCF_Session_getTerminal(3SMARTCARD)

使用特定的智能卡终端在会话中建立上下文。终端对象用于检测卡移动(即插入或删除)。终端对象还用于创建用于访问特定卡的卡对象。

SCF 终端接口

以下函数用于访问 SCF 终端。

SCF_Terminal_close(3SMARTCARD)

释放打开终端时分配的资源。该函数还可以关闭所有与终端关联的卡。

SCF_Terminal_getInfo(3SMARTCARD)

获取有关终端的信息。

SCF_Terminal_freeInfo(3SMARTCARD)

取消从 SCF_Terminal_getInfo(3SMARTCARD) 返回的存储的分配。

SCF_Terminal_waitForCardPresent(3SMARTCARD)

阻塞并等待,直到指定终端中出现卡为止。

SCF_Terminal_waitForCardAbsent(3SMARTCARD)

阻塞并等待,直到指定终端中移除卡为止。

SCF_Terminal_addEventListener(3SMARTCARD)

在终端发生事件时,允许程序接收回叫通知。此概念与信号处理程序类似。发生事件时,服务线程将执行提供的回叫函数。

SCF_Terminal_updateEventListener(3SMARTCARD)

更新与此终端关联的指定事件侦听器。

SCF_Terminal_removeEventListener(3SMARTCARD)

从与此终端关联的侦听器列表中删除指定的事件侦听器。

SCF_Terminal_getCard(3SMARTCARD)

使用特定的智能卡在终端中建立上下文。可以使用卡对象借助 SCF_Card_exchangeAPDU(3SMARTCARD) 将 APDU 发送给卡。

SCF 卡和各种接口

以下函数用于访问智能卡及获取状态。

SCF_Card_close(3SMARTCARD)

释放打开卡时分配的资源(如内存和线程)。另外,还释放该卡持有的锁定。

SCF_Card_getInfo(3SMARTCARD)

获取有关卡的信息。

SCF_Card_freeInfo(3SMARTCARD)

取消从 SCF_Card_getInfo(3SMARTCARD) 返回的存储的分配。

SCF_Card_lock(3SMARTCARD)

获取对特定卡的锁定。此函数允许应用程序执行多重 APDU 事务,而不会受到其他智能卡应用程序的干扰。

SCF_Card_unlock(3SMARTCARD)

从特定卡中删除锁定。

SCF_Card_exchangeAPDU(3SMARTCARD)

将命令 APDU 发送给卡并读取卡的响应。

SCF_Card_waitForCardRemoved(3SMARTCARD)

查看是否已移除特定卡。如果插入了其他卡或重新插入了同一个卡,则该函数将报告旧卡已被移除。

SCF_Card_reset(3SMARTCARD)

重置特定卡。

SCF_strerror(3SMARTCARD)

获取描述状态代码的字符串。

为智能卡终端开发 IFD 处理程序

为 Solaris OS 开发的智能卡终端使用的 API 组与 Linux 智能卡终端所使用 API 组完全相同。如果您以前未开发过 IFD 处理程序,则可访问一个提供 IFD 源代码的 Linux 环境 Web 站点,如 http://www.musclecard.com/drivers.html。要为 Solaris 操作系统中的智能卡终端开发 IFD 处理程序,需要包括 /usr/include/smartcard/ifdhandler.h 并实现以下接口:


注 –

当前不使用 IFDHCreateChannel()IFDHSetCapabilities()IFDHControl(),但未来的发行版中可能需要这些函数。


IFDHICCPresence()IFDHPowerICC() 函数对于测试非常有用。例如,可以使用 IFDHICCPresence() 函数来测试插槽中是否存在卡。检查智能卡电源是否正常工作的一种方式是使用 IFDHPowerICC() 函数。此函数可获取已插入智能卡的重置应答 (Answer to Reset, ATR) 值。

安装智能卡终端

Solaris 智能卡框架不支持可热插拔的终端,如 USB 终端。请使用以下方法连接和安装智能卡终端:

  1. 在终端与系统之间建立物理连接。

  2. 将 IFD 处理程序的共享库复制到系统中。

  3. 使用 smartcard(1M) 在框架中注册终端的 IFD 处理程序。