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

点赞:13329 浏览:57827 近期更新时间:2024-04-14 作者:网友分享原创网站原创

摘 要 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的结构体定义如下.

structmand_block_wrapper

{

uint8_t dCBWSignature[4];

uint32_t dCBWTag;

uint32_t dCBWDataTranerLength;

uint8_t bmCBWFlags;

uint8_t bCBWLUN;

uint8_t bCBWCBLength;

uint8_t CBWCB[16];

};

其中CBWCB字段就是SCSI指令部分.

1.1.3 命令状态封装包

依据协议[0]关于CSW的定义(协议5.2),实现CSW结构体的定义如下:

structmand_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封装

//封装与协议有关的内容

structmand_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包中,原有的数据将被清空.

Linux下USB—Key通讯库的与实现参考属性评定
有关论文范文主题研究: 数据结构相关论文范文 大学生适用: 硕士论文、专科毕业论文
相关参考文献下载数量: 29 写作解决问题: 写作资料
毕业论文开题报告: 论文模板、论文目录 职称论文适用: 刊物发表、高级职称
所属大学生专业类别: 写作资料 论文题目推荐度: 免费选题

int

traner_mand(libusb_device_handle* handle,

structmand_packet* pComPkt);

返回值:0成功;非0失败,错误号参见libusb库

参数:@handle设备句柄;

@pComPkt用户数据、指令和传输方向

该接口为通讯库的中间层调用,上层功能接口都基于该方法实现.该方法封装了libusb库的libusb_bulk_traner接口,具体实现了传输流程,给上层用户提供了更多的控制.

3.总结

在Linux下允许用户空间的程序与设备进行通讯,使得UKey开发人员无需被底层的USB协议和Linux下通讯机制所困扰,完成UKey上层应用的密钥管理及加解密等功能;使得上层应用开发人员能更加专注于业务逻辑的实现,更加高效的开发信息安全方面的应用.