PCSC那事儿(一)

写作背景

      由于微软在PC/SC工作组中的领头羊地位,且PC/SC的一个关键组件——资源管理器已经在Microsoft Windows中得到了支持,PC/SC发展非常迅速,市面上出现了一系列的支持PC/SC的智能卡读写器。

近年来,自由开放的Linux各种开源代码包括操作系统正在不断地发展并得到了广泛的应用。因为开源PCSC-LITE套件实现了windows下同样的winscard api接口,在Linux操作系统下应用程序采用PCSC-LITE套件可以轻便地与smartcard和读卡器进行通讯,也从一定程度上方便了读卡器操作的移植。

 

      目前PCSC-LITE套件广泛应用于Linux操作系统中。各知名智能卡读写器产商除了提供windows下的读卡器驱动,也提供可供PCSC-LITE使用的IFD-HANDLE驱动。也有不少读卡器直接支持CCID标准驱动。

对于不满足于仅仅调用 winscard api的读者,想深入了解PCSC-LITE框架的读者,甚至想在PCSC-LITE基础上,建立自己的读卡器应用框架的读者,您需要这样的一本书。

 

您想知道客户端是怎样和服务端通讯

您想知道服务端是如何和多个版本的IFDHANDLE驱动结合的

您想知道服务端是如何使用LIBUSB的

您想知道服务端是如何感知读卡器(usb接口,串口接口)的hotplug

您想知道目前版本的代码,存在哪些不足,存在哪些bug

...

 

特点

(1)基于PCSC-LITE1.5.5(截至完稿,这是最新版本)

(2)专注于客户端和服务器关键代码的详细分析。力求对PCSC-LITE框架的原理进行深入、透彻的讲解。当然了,关系到Linux编程基础的知识,也只能一带而过,不可能面面俱到。所以本书不适合于作为Linux入门的材料。

(3)前两部分,相对比较简单,为了使得读者能够轻松愉快地理解,采用了幽默的笔调。第三部分,相对比较复杂,采用了比较严肃的笔调。最后一部分,是著者的实际实验过程。嵌入式设备采用市面上流行的ARM-Friendly(S3c2440)套件。读卡器采用OmniKey CardMan 3121.

(4)本书不重在如何使用PCSC-LITE提供的API函数。而把重点放在这些函数实现的详细分析上,力求做到知其然更知其所以然。

 

 主要内容

      第1章首先对PCSC2.0规范做些介绍。PCSC2.0共有10份规范(11份文件)。本书重点讲解了7,1,6,5 这些和软件密切相关的文件。采用幽默的写法,让读者感受到规范的解说,也可以被写得不呆板,通俗易懂。

      第2章,讲解pcsc-lite的客户端代码。重要的函数和结构体分析。覆盖所有的winscard api函数。这章,同样采用上章的写法。让读者轻松愉快地过渡到比较复杂的第3章。

      第3章,讲解pcsc-lite的服务端代码。服务端的实现相对客户端的更加复杂。在那里,解说了更多的函数和结构。覆盖了所有的winscard api的服务端实现。采用了比较正规的写法,让读者能比较集中精力,阅读并思考这里的解析过程。

      第4章,著者亲自经过多次反复实验得出的PCSC-LITE、LIBUSB、CCID在arm9上移植过程。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
最新的PCSC、CCID以及测试源码。 贴一段源码: LONG SCardEstablishContext(DWORD dwScope, /*@unused@*/ LPCVOID pvReserved1, /*@unused@*/ LPCVOID pvReserved2, LPSCARDCONTEXT phContext) { (void)pvReserved1; (void)pvReserved2; if (dwScope != SCARD_SCOPE_USER && dwScope != SCARD_SCOPE_TERMINAL && dwScope != SCARD_SCOPE_SYSTEM && dwScope != SCARD_SCOPE_GLOBAL) { *phContext = 0; return SCARD_E_INVALID_VALUE; } /* * Unique identifier for this server so that it can uniquely be * identified by clients and distinguished from others */ *phContext = (PCSCLITE_SVC_IDENTITY + SYS_RandomInt(1, 65535)); Log2(PCSC_LOG_DEBUG, "Establishing Context: 0x%X", *phContext); return SCARD_S_SUCCESS; } LONG SCardReleaseContext(SCARDCONTEXT hContext) { /* * Nothing to do here RPC layer will handle this */ Log2(PCSC_LOG_DEBUG, "Releasing Context: 0x%X", hContext); return SCARD_S_SUCCESS; } LONG SCardConnect(/*@unused@*/ SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol) { LONG rv; READER_CONTEXT * rContext = NULL; uint32_t readerState; (void)hContext; PROFILE_START *phCard = 0; if ((dwShareMode != SCARD_SHARE_DIRECT) && !(dwPreferredProtocols & SCARD_PROTOCOL_T0) && !(dwPreferredProtocols & SCARD_PROTOCOL_T1) && !(dwPreferredProtocols & SCARD_PROTOCOL_RAW) && !(dwPreferredProtocols & SCARD_PROTOCOL_ANY_OLD)) return SCARD_E_PROTO_MISMATCH; if (dwShareMode != SCARD_SHARE_EXCLUSIVE && dwShareMode != SCARD_SHARE_SHARED && dwShareMode != SCARD_SHARE_DIRECT) return SCARD_E_INVALID_VALUE; Log3(PCSC_LOG_DEBUG, "Attempting Connect to %s using protocol: %d", szReader, dwPreferredProtocols); rv = RFReaderInfo((LPSTR) szReader, &rContext); if (rv != SCARD_S_SUCCESS) { Log2(PCSC_LOG_ERROR, "Reader %s Not Found", szReader); return rv; } /* * Make sure the reader is working properly */ rv = RFCheckReaderStatus(rContext); if (rv != SCARD_S_SUCCESS) re

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值