在安卓系统中开发智能卡读取器

11

我们开发了一个带有微控制器的原型板,可以与智能卡通信(可以读取ATR、发出和读取APDU命令等)。现在我想使用这个硬件与Android手机或平板电脑配合使用。我们的板子有一个USB连接口,通过它我们可以通过Android读写MCU。

最终目标是在Android平台上拥有一个功能良好的智能卡读卡器,并提供一个库给智能卡读卡器的最终用户,以便他们可以与自己的卡通信,并支持PKCS #11。

我已经阅读了关于该主题的几篇讨论,其中一些人表示我需要构建自定义的Android系统才能实现这一点。我对Android架构不是很熟悉,无法理解为什么我必须重新构建Android,当我可以通过USB与我的外设(读卡器)通信时。在我看来,如果我提供一个实现类似CCID接口的库,用户就可以通过将我的库集成到他们的目标.apk文件中,通过Android USB堆栈与我的读卡器通信。

上述计划是否存在我们不知道的问题?我担心我们在开始实施上述描述的库时会遗漏关于Android或智能卡读卡器的一些基本问题(例如:安全性),这将给我们带来问题。


这篇关于Android USB连接的信息对回答你的问题有帮助吗? - Joe
安全主要由智能卡本身提供。主要的漏洞是,手机中的秘密数据(例如PIN)被另一个恶意软件应用程序抓取;因此,不让PIN离开读卡器的PIN键盘读卡器具有优势。一些建议:使用安全消息传递来保护传输路径,不要在手机上存储未加密的任何内容,也不要缓存PIN码。 - guidot
如果您能提供您所阅读的关于需要自定义Android ROM的原始讨论链接,那将会很有帮助。这部分对我来说也不太清楚。他们的项目中可能存在一个隐藏的要求,您可能没有注意到,或者只是没有看到(而且很可能与您的项目无关)。也可能是他们的讨论相当古老,早于Android 3.0及以上引入的Android USB主机。 - Stephan Branczyk
3个回答

3

在这个领域进行了更多的调研后,您有几个解决方案可供选择:

  1. 制作自定义驱动程序(简单通信,一些简单的命令来重置卡片和提供电源)。在这种情况下,您只需实现重置/电源命令和T = 1通信协议即可,但这种方法的一个大缺点是它仅适用于您的读卡器,这是一个很大的限制。
  2. 在控制器上实现CCID接口,并将其包装在APDU命令周围。只要遵守规范(很多制造商不遵守,这就是为什么pcsc-lite有支持的读卡器列表),这种方法是可扩展的。如果您想销售大量读卡器,这种方法是最具成本效益的。您可以在此处找到规范。
  3. 向您的组件添加已经实现了CCID通信的CCID芯片。多个供应商制造此类芯片,STMelectronics拥有大量此类芯片,但在这种情况下,您的最终读卡器将费用更高,并且您将无法完全控制协议。

至于Android端,seek提供了pcsc-lite驱动程序的端口,我没有尝试过,但可以从源代码中看出,他们只修改了原始驱动程序的usb api,并使用JNI接口与c代码进行通信。


2
我已经将USB外设集成到我的自定义Gingerbread发行版中。您之所以要定制Android平台,是为了添加或修改一些驱动程序,以便让您访问USB设备。如果您的USB设备已经使用标准Android设备支持的协议,那么就可以直接使用了!但在庆祝胜利之前,最好在多个设备上尝试一下。在Android和内核级别上,谷歌提供了一个非常基础的发行版,其中包含大量驱动程序源代码。根据其设备使用的硬件,手机/平板电脑制造商决定包括哪些低级驱动程序和协议。由于手机/平板电脑上的内存数量有限,通常的规则是仅包括所需内容。在PC-Linux架构中,您不会遇到这个问题,因为硬盘空间非常大,您可以包含所有存在的驱动程序,并让系统根据其发现的情况选择需要的内容。
希望这个简单的答案能够有所帮助。

2

我不确定读卡器的CCID实现,但是对于安卓平台,有一些C / C ++端口,但不确定是否有效。在安卓平台上,实现CCID协议很容易,请参考这个链接。最难的部分是制作读卡器的固件,你需要注意许多小细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接