Linux下USB—Key通讯库的研究与实现

来源 :硅谷 | 被引量 : 0次 | 上传用户:zhangyananqd
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要 UKey在Linux下被枚举成Mass Storage类的SCSICD-ROM,通过发送SCSI指令进行设备操作。UKey的功能指令遵从ISO7816-4规范在SCSI中以APDU方式与设备通讯。Linux下采用基于libusb的无驱设计,以此与设备进行数据传输。文章基于MSC Bulk-Only协议,研究并实现一套与UKey通讯的封装库。
  关键词 MSC Bulk-Only;SCSI;APDU;libusb库;无驱设计
  中图分类号:TN918 文献标识码:A 文章编号:1671-7597(2013)20-0077-02
  在Linux系统下,并没有实现与UKey通讯协议的封装并提供简易的API接口。在此背景下,本文研究如何在Linux下实现与UKey的通讯,作为Linux系统下的对协议的封装库,并提供简易的接口以供上层应用调用。
  1 研究内容
  1.1 MSC Bulk-Only
  1.1.1 主机/设备包传输顺序
  主机先发送CBW包,再传输相关的输出数据;设备在接受到CBW包后,先发送输入数据,再发送CSW包。主机可以在发送CBW包之前,请求输入数据或者CSW包。
  1.1.2 命令块封装包
  依据协议对CBW的定义(协议5.1),实现CBW的结构体定义如下。
  structcommand_block_wrapper
  {
  uint8_t dCBWSignature[4];
  uint32_t dCBWTag;
  uint32_t dCBWDataTransferLength;
  uint8_t bmCBWFlags;
  uint8_t bCBWLUN;
  uint8_t bCBWCBLength;
  uint8_t CBWCB[16];
  };
  其中CBWCB字段就是SCSI指令部分。
  1.1.3 命令狀态封装包
  依据协议[0]关于CSW的定义(协议5.2),实现CSW结构体的定义如下:
  structcommand_status_wrapper
  {
  uint8_t dCSWSignature[4];
  uint32_t dCSWTag;
  uint32_t dCSWDataResidue;
  uint8_t bCSWStatus;
  };
  1.2 SCSI指令
  USBBulk-Only协议中规定的CBW中的SCSI指令集字段CBWCB中的内容即为命令块描述符。
  本项目将主要用到Write指令向设备发送信息;Read指令接收设备的信息。下面是将用到的指令。
  1)自定义Write: 0XE2h。
  2)自定义Read: 0XE1h。
  1.3 ISO7816-4规范
  该规范定义了数据传输的命令格式和响应格式,本文将按照该格式组织报文。
  1.4 libusb库
  libusb设计了一系列的API,通过这些API应用程序可以操作硬件,libusb更加接近USB规范。使得libusb的使用也比开发内核驱动相对容易的多。关于libusb请参看该项目的网站。
  2 结果展示
  综合以上内容,本项目实现了一套Linux下通用的与Ukey通讯的封装库。下面将介绍接口提供的数据结构与API,以及调用方法。
  2.1 数据结构
  //最顶层的包结构
  //对应于接口send_receive_data
  structdata_send_receive
  {
  uint8_t buffer[1024];//1K数据缓冲区
  uint32_t data_length;//数据长度
  uint32_t time_out;//超时时间
  };
  //用于SCSI封装
  //封装与协议有关的内容
  structcommand_packet
  {
  structdata_send_receivedsr;//数据
  uint8_tcdb[16];//命令描述块
  uint8_t cdb_length;/实际长度
  uint32_t ret_tag;//CBW和CSW的对应关系标签
  uint8_t expected_endpoint;//传输方向
  uint8_tlun;//为0
  uint32_tactual;//实际长度
  };
  2.2 通用API接口
  int
  inquiry(libusb_device_handle* handle,
  structdata_send_receive* dsr);
  返回值:0 成功;非0 失败,错误号参见libusb库
  参数:@handlelibusb打开设备获得到的句柄;
  @dsr数据包,参见2.1
  int
  send_receive_data(libusb_device_handle* handle,
  structdata_send_receive* dsr)
  返回值:0成功;非0失败,具体错误号请参见libusb库
  参数:@handle通过libusb库打开设备获得到的设备句柄;
  @dsr用户封装的数据包,具体参见2.1
  用户封装好要发送的数据后,直接调用该结构,返回结果将包含在dsr包中,原有的数据将被清空。
  int
  transfer_command(libusb_device_handle* handle,
  structcommand_packet* pComPkt);
  返回值:0成功;非0失败,错误号参见libusb库
  参数:@handle设备句柄;
  @pComPkt用户数据、指令和传输方向
  该接口为通讯库的中间层调用,上层功能接口都基于该方法实现。该方法封装了libusb库的libusb_bulk_transfer接口,具体实现了传输流程,给上层用户提供了更多的控制。
  3 总结
  在Linux下允许用户空间的程序与设备进行通讯,使得UKey开发人员无需被底层的USB协议和Linux下通讯机制所困扰,完成UKey上层应用的密钥管理及加解密等功能;使得上层应用开发人员能更加专注于业务逻辑的实现,更加高效的开发信息安全方面的应用。
  参考文献
  [1]Universal Serial Bus-Mass Storage Class-BulkOnlyTransport,Revision 1.0[S].
  [2]SCSI Commands Reference Manual, Rev. A[S].
  [3]ISO 7816-4: Interindustry Commands for Interchange [S].
  [4]http://libusb.org/[DB/OL].2013-07-11.
其他文献
期刊
摘 要 随着改革开放的发展,城市化还有工业化的到来,用电量也日渐增大,在能源稀缺的今天,如何提高电能的效率显得尤为重要。在我国的用电系统中,还存在着许多损耗无功功率的电气设备,解决电能损耗大,完善功率交换技术,提高电能的利用效率,提供高效安全的电气设备不可忽略。近年来,尽管我国的输配电系统动态无功补偿技术得到了很大的提升,但是目前的动态无功补偿技术还远远达不到现代时代发展的要求,还有很大的提高空间
期刊
近几年来,我校办学规模不断扩大,目前的班级数达50余个,平均每年有近400多名学生分到上海的涉外饭店、旅行社以及外资企业的中小型公司或办事处学习。学生在实习中表现较好
期刊
党的十五大描绘了我国新世纪农业现代化发展的宏伟蓝图。农业产业化进程的推进,为农村职业技术教育发展提供了良好机遇,同时也对农村职业技术教育提出了新的和更高的要求。
现代人的生活节奏加快,很多人在做一件事的同时还在做着另一件事,甚至在忙第三件事。自以为这种做法是忙中带闲,孰不知却在不知不觉中危害着自己的身体健康。1.边吃东西边看
期刊
期刊
期刊