CN107315944B - 一种智能密钥设备及其工作方法 - Google Patents

一种智能密钥设备及其工作方法 Download PDF

Info

Publication number
CN107315944B
CN107315944B CN201710470325.XA CN201710470325A CN107315944B CN 107315944 B CN107315944 B CN 107315944B CN 201710470325 A CN201710470325 A CN 201710470325A CN 107315944 B CN107315944 B CN 107315944B
Authority
CN
China
Prior art keywords
data
apdu
virtual machine
submodule
judging
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201710470325.XA
Other languages
English (en)
Other versions
CN107315944A (zh
Inventor
陆舟
于华章
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Feitian Technologies Co Ltd
Original Assignee
Feitian Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Feitian Technologies Co Ltd filed Critical Feitian Technologies Co Ltd
Priority to CN201710470325.XA priority Critical patent/CN107315944B/zh
Publication of CN107315944A publication Critical patent/CN107315944A/zh
Application granted granted Critical
Publication of CN107315944B publication Critical patent/CN107315944B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/30Authentication, i.e. establishing the identity or authorisation of security principals
    • G06F21/31User authentication
    • G06F21/34User authentication involving the use of external additional devices, e.g. dongles or smart cards
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/10Program control for peripheral devices
    • G06F13/102Program control for peripheral devices where the programme performs an interfacing function, e.g. device driver
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/21Indexing scheme relating to G06F21/00 and subgroups addressing additional information or applications relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/2153Using hardware token as a secondary aspect

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Software Systems (AREA)
  • Mobile Radio Communication Systems (AREA)
  • Communication Control (AREA)

Abstract

本发明公开一种智能密钥设备及其工作方法,该方法包括:智能密钥设备上电,启动内部设置的虚拟机;当智能密钥设备接收到上位机下发的CCID消息时对其进行解析得到APDU数据并将其发送给虚拟机;虚拟机将接收到的APDU数据发送给当前逻辑通道中的当前应用进行处理,虚拟机接收当前应用返回的处理结果和状态字,并将处理结果和状态字发送给智能密钥设备;智能密钥设备将处理结果和状态字封装成CCID消息并返回给上位机;若当前逻辑通道中的当前应用接收到的虚拟机发送的指令时,根据指令中的接口标识调用相应接口。本发明的虚拟机使用USB接口与主机进行通信,通信速率不受卡片和读卡器设备速率限制,通信速度较快。

Description

一种智能密钥设备及其工作方法
技术领域
本发明涉及电子产品领域,尤其涉及一种智能密钥设备及其工作方法。
背景技术
在现有技术中,CCID(中文名称:芯片卡接口设备)标准规定了CCID是一种芯片/智能卡接口设备,设备通过USB接口与主机或其它嵌入式主机连接,进行符合CCID标准的数据通讯,同时设备通过符合7816标准协议的接口与智能卡进行通讯。APDU(中文名称:应用协议数据单元)是卡片内应用和卡片外应用的通信格式,APDU的格式在ISO7816-4规范中定义。TPDU(中文名称:传输协议数据单元)为传输层数据传输的格式,在ISO7816-3协议中定义了两种传输协议格式,一种是字符传输协议T0,一种是块传输协议T1。
当前的JavaCard智能卡采用ISO7816接口或/和非接触式接口,需要额外使用读卡器进行读写操作;并且通信速率也受通信接口速率的限制,同时也受智能卡卡片芯片通信接口速率和读卡器设备通信能力的限制。
发明内容
本发明的目的是为了克服现有技术的不足,提供一种智能密钥设备及其工作方法。
本发明提供了一种智能密钥设备的工作方法,包括:
步骤S1:智能密钥设备上电,启动内部设置的虚拟机;
步骤S2:当智能密钥设备接收到上位机下发的第一CCID消息时对其进行处理,包括:智能密钥设备对接收到的第一CCID消息进行解析得到第一TPDU数据,对所述第一TPDU数据解析得到APDU数据并将其发送给所述虚拟机;
步骤S3:所述虚拟机将接收到的APDU数据发送给当前逻辑通道中的当前应用进行处理,所述虚拟机接收当前应用返回的处理结果和状态字,并将所述处理结果和状态字发送给所述智能密钥设备;
步骤S4:所述智能密钥设备将所述处理结果和所述状态字封装成第一TPDU数据,将所述第一TPDU数据封装成第二CCID消息并返回给上位机,返回步骤S2;
所述APDU数据包括指令,所述方法还包括:若当前逻辑通道中的当前应用接收到虚拟机发送的指令时,根据所述指令中的接口标识调用相应接口;
若当前应用调用第一接口时,所述虚拟机从第一接口参数中获取APDU缓存区地址和开始存储数据的偏移地址,开始接收数据并将接收到的数据存储到所述APDU缓存区地址中与所述开始存储数据的偏移地址对应的位置;所述第一接口为APDU.setIncomingAndReceive();
若当前应用调用第七接口时,所述虚拟机设置通信方向为向外,所述虚拟机记录响应数据长度,并将所述APDU缓存区中的数据发送给所述智能密钥设备;所述第七接口为APDU.setOutgoingAndSend()。
进一步地,所述方法还包括:
若当前应用调用第二接口,所述虚拟机从第二接口参数中获取APDU缓存区地址和指定偏移地址,开始接收数据并将接收到的数据存储到对应于所述APDU缓存区地址中与所述指定偏移地址对应的位置;所述第二接口为APDU.receiveBytes();
若当前应用调用第三接口时,所述虚拟机设置通信方向为向外;所述第三接口为APDU.setOutgoing();
若当前应用调用第四接口时,所述虚拟机记录响应数据长度;所述第四接口为APDU.setOutgoingLength();
若当前应用调用第五接口时,所述虚拟机将APDU缓存区中的数据发送给所述智能密钥设备;所述第五接口为APDU.sendBytes();
若当前应用调用第六接口时,所述虚拟机将指定数组中的数据发送给所述智能密钥设备;所述第六接口为APDU.sendBytesLong()。
进一步地,在所述步骤S2与所述步骤S3之间包括:
步骤A1:当所述虚拟机接收到APDU数据时从所述APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
步骤A2:所述虚拟机根据所述指令头判断指令的类型,如为逻辑通道管理指令则执行步骤A3,如为选择指令则执行步骤A7,如为其他指令则执行步骤S3;
步骤A3:所述虚拟机从逻辑通道管理指令的指令头中获取第二逻辑通道号;
步骤A4:所述虚拟机判断逻辑通道的操作类型,如为打开逻辑通道则执行步骤A5,如为关闭逻辑通道则执行步骤A6;
步骤A5:所述虚拟机打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,返回步骤S2;
步骤A6:所述虚拟机关闭与所述第二逻辑通道号对应的逻辑通道,返回步骤S2;
步骤A7:所述虚拟机判断所述选择指令是否为应用选择指令,是则执行步骤A8,否则执行步骤S3;
步骤A8:所述虚拟机从所述选择指令的数据域中获取应用标识符;
步骤A9:所述虚拟机判断根据所述应用标识符是否找到对应的应用,是则执行步骤A11,否则执行步骤A10;
步骤A10:所述虚拟机将状态字发送给所述智能密钥设备,执行步骤S4;
步骤A11:所述虚拟机将找到的应用作为当前应用,并将所述选择指令发送给当前逻辑通道中的当前应用进行处理,虚拟机接收当前应用返回的处理结果和状态字,并将所述处理结果和状态字发送给所述智能密钥设备,执行步骤S4。
进一步地,在所述步骤S2与所述步骤S3之间包括:
步骤B1:当所述虚拟机接收到APDU数据时从所述APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
步骤B2:所述虚拟机根据所述指令头判断指令的类型是否为逻辑通道管理指令,是则执行步骤B3,否则执行步骤S3;
步骤B3:所述虚拟机从逻辑通道管理指令的指令头中获取第二逻辑通道号;
步骤B4:所述虚拟机判断逻辑通道的操作类型,如为打开逻辑通道则执行步骤B5,如为关闭逻辑通道则执行步骤B6;
步骤B5:所述虚拟机打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,返回步骤S2;
步骤B6:所述虚拟机关闭与所述第二逻辑通道号对应的逻辑通道,返回步骤S2。
进一步地,在所述步骤S2与所述步骤S3之间包括:
步骤C1:所述虚拟机根据指令头判断APDU数据的类型是否为选择指令,是则执行步骤C2,否则执行步骤S3;
步骤C2:所述虚拟机判断所述选择指令是否为应用选择指令,是则执行步骤C3,否则执行步骤S3;
步骤C3:所述虚拟机从所述选择指令的数据域中获取应用标识符;
步骤C4:所述虚拟机判断根据所述应用标识符是否找到对应的应用,是则执行步骤C6,否则执行步骤C5;
步骤C5:所述虚拟机将状态字发送给所述智能密钥设备,执行步骤S4;
步骤C6:所述虚拟机将找到的应用作为当前应用,并将所述选择指令发送给当前逻辑通道中的当前应用进行处理,所述虚拟机接收当前应用返回的处理结果和状态字,并将所述处理结果和所述状态字发送给所述智能密钥设备,执行步骤S4。
进一步地,所述从所述APDU数据的指令头中获取第一逻辑通道号具体为:从所述指令头的第一个字节上获取第一逻辑通道号。
进一步地,所述步骤A2包括:所述虚拟机判断所述指令头的第二字节数据,如为第一数值则为逻辑通道管理指令,如为第二数值则为选择指令,如为其他数据则为其他指令。
进一步地,所述虚拟机打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,包括:所述虚拟机判断所述逻辑通道管理指令的指令头中第三、第四字节数据,如为第三数值,则打开一个新的逻辑通道并将其作为当前逻辑通道,并将与所述新的逻辑通道对应的逻辑通道号作为响应数据返回给所述上位机;如为第四数值,则打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道。
进一步地,所述虚拟机关闭与所述第二逻辑通道号对应的逻辑通道包括:所述虚拟机判断逻辑通道管理指令的指令头中第三、第四字节数据,如为第五数值则关闭当前逻辑通道;如为第六数值,则关闭与所述第二逻辑通道号对应的逻辑通道。
进一步地,所述虚拟机判断选择指令是否为应用选择指令,包括:所述虚拟机判断所述指令头中的第三、第四字节数据是否为第七数值,是则所述选择指令为应用选择指令,否则所述选择指令不为应用选择指令。
进一步地,所述虚拟机设置通信方向为向外,包括:
步骤k1:所述虚拟机判断协议类型,如为T1则执行步骤k2,如为T0则执行步骤k3;
步骤k2:所述虚拟机从所述APDU数据中获取响应数据长度;
步骤k3:所述虚拟机判断APDU类型,如为第一类型则执行步骤k4,如为第三类型则执行步骤k5;
步骤k4:所述虚拟机将所述APDU类型转换为第二类型,将所述指令头的第五字节数据作为响应数据长度;
步骤k5:所述虚拟机将所述APDU类型转换为第四类型,将最大数据长度作为响应数据长度。
进一步地,所述虚拟机记录响应数据长度,包括:
步骤d1:所述虚拟机判断协议类型,如为T0则执行步骤d2,如为T1则执行步骤d6;
步骤d2:所述虚拟机判断APDU类型,如为第二类型则执行步骤d3,如为第四类型则执行步骤d5;
步骤d3:所述虚拟机判断所述第四接口的参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则记录响应数据长度,否则执行步骤d4;
步骤d4:所述虚拟机设置响应状态码为第一预设数据并将其发送给所述智能密钥设备;
步骤d5:所述虚拟机设置响应状态码为第二预设数据并将其发送给所述智能密钥设备,记录所述第四接口参数中的响应数据长度;
步骤d6:所述虚拟机记录所述第四接口参数中的响应数据长度。
进一步地,所述步骤d2包括:所述虚拟机判断当前应用是否调用了第一接口和第二接口,是则APDU类型为第四类型,否则APDU类型为第二类型。
进一步地,所述将APDU缓存区中的数据发送给智能密钥设备;包括:
步骤f1:所述虚拟机判断协议类型,如为T0则执行步骤f2,如为T1则执行步骤f7;
步骤f2:所述虚拟机判断响应数据长度是否小于所述APDU缓存区中的数据的长度,是则执行步骤f4,否则执行步骤f3;
步骤f3:所述虚拟机将所述APDU缓存区中的数据发送给智能密钥设备;
步骤f4:所述虚拟机根据响应数据长度将所述APDU缓存区中的对应长度的数据发送给智能密钥设备,执行步骤f5;
步骤f5:所述虚拟机判断所述APDU缓存区中的数据是否发送完成,是则结束,否则执行步骤f6;
步骤f6:所述虚拟机设置响应状态码为第二预设数据并发送给智能密钥设备;
步骤f7:所述虚拟机判断所述APDU缓存区中的数据的长度是否大于CCID设备数据域大小,是则执行步骤f8,否则将所述APDU缓存区中的数据存储到TPDU缓存区中;
步骤f8:虚拟机根据CCID设备数据域大小对所述APDU缓存区中的数据进行分组,并分别将整个数据组封装为T1的I型数据块发送给智能密钥设备;
步骤f9:虚拟机判断是否还有未发送的数据组,是则将数据组存储到所述TPDU缓存区中,结束,否则结束。
进一步地,所述将APDU缓存区中的数据发送给智能密钥设备;包括:
步骤h1:所述虚拟机判断协议类型,如为T0则执行步骤h2,如为T1则执行步骤h10;
步骤h2:所述虚拟机判断APDU类型,如为第二类型则执行步骤h3,如为第四类型则执行步骤h6;
步骤h3:所述虚拟机判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则执行步骤h5,否则执行步骤h4;
步骤h4:所述虚拟机设置响应状态码为第一预设数据并将其发送给智能密钥设备,执行步骤h5;
步骤h5:所述虚拟机将所述APDU缓存区中的数据发送给智能密钥设备;
步骤h6:所述虚拟机判断响应数据长度是否小于APDU缓存区中的数据的长度,是则执行步骤h7,否则将所述APDU缓存区中的数据发送给智能密钥设备;
步骤h7:所述虚拟机根据所述响应数据长度将所述APDU缓存区中的对应长度的数据发送给所述智能密钥设备;
步骤h8:所述虚拟机判断所述APDU缓存区中的数据是否全部发送完成,是则结束,否则执行步骤h9;
步骤h9:所述虚拟机设置响应状态码为第二预设数据并发送给智能密钥设备;
步骤h10:所述虚拟机判断所述APDU缓存区中的数据的长度是否大于CCID设备数据域大小,是则执行步骤h11,否则将所述APDU缓存区中的数据存储到TPDU缓存区中;
步骤h11:所述虚拟机根据CCID设备数据域大小对所述APDU缓存区中的数据进行分组,并分别将整个数据组封装为T1的I型数据块发送给智能密钥设备;
步骤h12:所述虚拟机判断是否还有未发送的数据组,是则将数据组存储到所述TPDU缓存区中,结束,否则结束。
进一步地,所述虚拟机将指定数组中的数据发送给所述智能密钥设备,包括:
所述虚拟机从第六接口中获取指定数组,将指定数组中的数据复制到APDU缓存区中,将所述APDU缓存区中的数据发送给智能密钥设备。
进一步地,所述步骤S2中所述当智能密钥设备接收到上位机下发的第一CCID消息时对其进行处理包括:
步骤Y1:所述智能密钥设备等待并接收第一CCID消息;
步骤Y2:当所述智能密钥设备接收到第一CCID消息时,判断所述第一CCID消息的类型,如为第一消息则执行步骤Y3,如为第二消息则执行步骤Y5,如为其他则根据CCID规范对接收到的所述第一CCID消息进行处理,将处理结果封装成第二CCID消息并返回给上位机,返回步骤Y1;所述第一消息为主机发送给智能密钥设备的上电消息,所述第二消息为主机发送给智能密钥设备的数据组消息;
步骤Y3:所述智能密钥设备进行复位操作生成复位应答;
步骤Y4:所述智能密钥设备将所述复位应答封装成第二CCID消息并将其返回给上位机,返回步骤Y1;
步骤Y5:所述智能密钥设备从所述第一CCID消息的数据域中获取第一TPDU数据;
步骤Y6:所述智能密钥设备判断是否获取到指定长度的第一TPDU数据,是则执行步骤Y7,否则返回步骤Y1;
步骤Y7:所述智能密钥设备判断接收数据的协议类型,如为T0则执行步骤Y8,如为T1则执行步骤Y10;
步骤Y8:所述智能密钥设备对所述第一TPDU数据进行解析得到APDU数据;
步骤Y9:所述智能密钥设备将所述APDU数据发送给所述虚拟机,返回步骤Y1;
步骤Y10:所述智能密钥设备对接收到的所述第一CCID消息进行解析得到一个T1协议块;
步骤Y11:所述智能密钥设备判断得到的所述T1协议块是否为T1协议信息块,是则执行步骤Y12,否则按照T1协议对获取到的所述第一TPDU数据进行处理,将处理结果封装成第二CCID消息并返回给上位机,返回步骤Y1;
步骤Y12:所述智能密钥设备从所述T1协议信息块的信息数据域中获取APDU数据;
步骤Y13:所述智能密钥设备判断是否获取到指定长度的APDU数据,是则将APDU数据发送给虚拟机,返回步骤Y1,否则返回步骤Y1。
进一步地,所述步骤S4包括:
步骤K1:所述智能密钥设备判断处理结果的协议类型,如为T0则执行步骤K2,如为T1则执行步骤K7;
步骤K2:所述智能密钥设备判断所述处理结果的长度是否大于获取的响应数据长度,是则执行K4,否则执行步骤K3;
步骤K3:所述智能密钥设备将所述处理结果和所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2;
步骤K4:所述智能密钥设备根据所述响应数据长度将所述处理结果中对应长度的数据封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,执行步骤K5;
步骤K5:所述智能密钥设备判断所述处理结果是否全部发送完成,是则所述智能密钥设备将所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2;否则执行步骤K6;
步骤K6:所述智能密钥设备将所述处理结果中的剩余数据和所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2;
步骤K7:所述智能密钥设备判断所述处理结果的长度是否大于CCID设备数据域大小,是则执行步骤K8,否则将所述处理结果作为当前数据,执行步骤K11;
步骤K8:所述智能密钥设备按照CCID设备数据域大小对所述处理结果进行分组;
步骤K9:所述智能密钥设备分别将每个完整的数据组封装成第二TPDU数据,分别将每个第二TPDU数据封装成第二CCID消息并返回给所述上位机;
步骤K10:所述智能密钥设备判断最后一个数据组是否为完整的数据组,是则所述智能密钥设备将所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2;否则将最后一个数据组作为当前数据,执行步骤K11;
步骤K11:所述智能密钥设备将所述当前数据和所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2。
进一步地,所述将第二TPDU数据封装成第二CCID消息并返回给上位机包括:
步骤P1:所述智能密钥设备判断第二TPDU数据的长度是否大于CCID消息最大长度,是则执行步骤P2,否则将TPDU数据作为当前TPDU数据组,执行步骤P5;
步骤P2:所述智能密钥设备根据CCID消息最大长度对所述第二TPDU数据进行分组,将第一个TPDU数据组作为当前TPDU数据组并将其存储到CCID缓存区中;
步骤P3:所述智能密钥设备将所述CCID缓存区中的数据封装成第二CCID消息并将其发送给上位机;
步骤P4:所述智能密钥设备判断所有TPDU数据组是否发送完成,是则发送数据结束,否则将下一个TPDU数据组作为当前TPDU数据组,执行步骤P5;
步骤P5:所述智能密钥设备判断当前TPDU数据组是否为完整的数据组,是则执行步骤P6,否则执行步骤P7;
步骤P6:所述智能密钥设备将所述当前TPDU数据组存储到所述CCID缓存区中,将CCID缓存区中的数据封装成第二CCID消息并将其发送给上位机,返回步骤P4;
步骤P7:所述智能密钥设备将所述当前TPDU数据组顺序存储到所述CCID缓存区中。
本发明又提供了一种智能密钥设备,包括虚拟机模块、应用模块和主体模块;
所述主体模块包括:
启动子模块,用于在所述智能密钥设备上电后启动所述虚拟机模块;
第一接收子模块,用于接收上位机下发的第一CCID消息,还用于接收所述虚拟机模块发送的处理结果和状态字;
第一处理子模块,用于对所述第一接收子模块接收到的所述第一CCID消息进行处理,所述第一处理子模块具体用于对所述第一接收子模块接收到的所述第一CCID消息进行解析得到第一TPDU数据,对所述第一TPDU数据解析得到APDU数据;
封装子模块,用于将所述第一接收子模块接收到的所述处理结果和所述状态字封装成TPDU数据,将所述TPDU数据封装成第二CCID消息;
第一发送子模块,用于将所述第一处理子模块解析得到的APDU数据发送给所述虚拟机模块;还用于将所述封装子模块封装得到的第二CCID消息返回给所述上位机;
所述虚拟机模块包括:
第二接收子模块,用于接收所述主体模块发送的APDU数据,还用于接收应用模块发送的处理结果和状态字;
第二发送子模块,用于将所述第二接收子模块接收到的所述APDU数据发送给当前逻辑通道中的当前应用模块,还用于将所述第二接收子模块接收到的所述处理结果和所述状态字发送给所述主体模块;
第一接口子模块,用于当第一接口被调用时,从所述第一接口的参数中获取APDU缓存区地址和开始存储数据的偏移地址,开始接收数据并将接收到的数据存储到所述APDU缓存区地址中与所述开始存储数据的偏移地址对应的位置;所述第一接口为APDU.setIncomingAndReceive();
第七接口子模块,用于当第七接口被调用时,设置通信方向为向外,记录响应数据长度,并将所述APDU缓存区中的数据发送给所述主体模块;所述第七接口为APDU.setOutgoingAndSend();
所述应用模块包括:
第三接收子模块,用于接收所述虚拟机模块发送的APDU数据,所述APDU数据包括指令;
第二处理子模块,用于对所述第三接收子模块接收到的所述APDU数据进行处理;
第三发送子模块,用于将所述第二处理子模块的处理结果和状态字发送给所述虚拟机模块;
调用子模块,用于根据所述第三接收子模块接收到的虚拟机模块发送的指令中的接口标识调用相应接口。
进一步地,所述虚拟机模块还包括:
第二接口子模块,用于当第二接口被调用时,从第二接口参数中获取APDU缓存区地址和指定偏移地址,开始接收数据并将接收到的数据存储到对应于所述APDU缓存区地址中与所述指定偏移地址对应的位置;所述第二接口为APDU.receiveBytes();
第三接口子模块,用于当第三接口被调用时,设置通信方向为向外;所述第三接口为APDU.setOutgoing();
第四接口子模块,用于当第四接口被调用时,记录响应数据长度;所述第四接口为APDU.setOutgoingLength();
第五接口子模块,用于当第五接口被调用时,将APDU缓存区中的数据发送给所述主体模块;所述第五接口为APDU.sendBytes();
第六接口子模块,用于当第六接口被调用时,将指定数组中的数据发送给所述主体模块;所述第六接口为APDU.sendBytesLong()。
进一步地,所述虚拟机模块还包括:
第一设置子模块,用于从所述第二接收子模块接收到的所述APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
第一判断子模块,用于根据所述APDU数据的指令头判断指令的类型;
第一获取子模块,用于当所述第一判断子模块判断指令的类型为逻辑通道管理指令时从所述逻辑通道管理指令的指令头中获取第二逻辑通道号;
第二判断子模块,用于判断逻辑通道的操作类型;
打开子模块,用于当所述第二判断子模块判断操作类型为打开逻辑通道时打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
关闭子模块,用于当所述第二判断子模块判断操作类型为关闭逻辑通道时关闭与所述第二逻辑通道号对应的逻辑通道;
第三判断子模块,用于当所述第一判断子模块判断指令的类型为选择指令时判断选择指令是否为应用选择指令;
第二获取子模块,用于当所述第三判断子模块判断为是时从所述选择指令的数据域中获取应用标识符;
第四判断子模块,用于判断根据所述应用标识符是否找到对应的应用;
第四发送子模块,用于当所述第四判断子模块判断为否时将状态字发送给所述主体模块;
作为子模块,用于当所述第四判断子模块判断为是时将找到的应用作为当前应用;
所述第二发送子模块还用于当所述第一判断子模块判断指令的类型为其他指令时和所述第三判断子模块判断为否时将所述APDU数据发送给当前逻辑通道中的当前应用模块;
所述第三接收子模块,还用于接收所述虚拟机模块发送的所述APDU数据;
所述第二处理子模块,还用于对所述第三接收子模块接收到的所述APDU数据进行处理。
进一步地,所述虚拟机模块还包括:
第一设置子模块,用于从所述第二接收子模块接收到的所述APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
第五判断子模块,用于根据所述指令头判断指令的类型是否为逻辑通道管理指令;
第一获取子模块,用于当所述第五判断子模块判断为是时从逻辑通道管理指令的指令头中获取第二逻辑通道号;
第二判断子模块,用于判断逻辑通道的操作类型;
打开子模块,用于当所述第二判断子模块判断操作类型为打开逻辑通道时打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
关闭子模块,用于当所述第二判断子模块判断操作类型为关闭逻辑通道时关闭与所述第二逻辑通道号对应的逻辑通道;
所述第二发送子模块还用于当所述第五判断子模块判断为否时将所述APDU数据发送给当前逻辑通道中的当前应用;
所述第三接收子模块,还用于接收所述虚拟机模块发送的所述APDU数据;
所述第二处理子模块,还用于对所述第三接收子模块接收到的所述APDU数据进行处理。
进一步地,所述虚拟机模块还包括:
第六判断子模块,用于根据所述APDU数据的指令头判断指令的类型是否为选择指令;
第三判断子模块,用于当所述第六判断子模块判断为是时判断所述选择指令是否为应用选择指令;
第二获取子模块,用于从当所述第三判断子模块判断为是时从所述选择指令的数据域中获取应用标识符;
第四判断子模块,用于判断根据所述应用标识符是否找到对应的应用;
第四发送子模块,用于当所述第四判断子模块判断为否时将状态字发送给所述主体模块;
作为子模块,用于当所述第四判断子模块判断为是时将找到的应用作为当前应用;
所述第二发送子模块还用于当所述第六判断子模块和所述第三判断子模块判断为否时将所述APDU数据发送给当前逻辑通道中的当前应用;
所述第三接收子模块,还用于接收所述虚拟机模块发送的所述APDU数据;
所述第二处理子模块,还用于对所述第三接收子模块接收到的所述APDU数据进行处理。
进一步地,所述第一设置子模块具体用于从所述指令头的第一个字节上获取第一逻辑通道号。
进一步地,所述第一判断子模块,具体用于判断所述APDU数据的指令头的第二字节数据,如为第一数值则为逻辑通道管理指令,如为第二数值则为选择指令,如为其他数据则为其他指令。
进一步地,所述打开子模块具体用于判断所述逻辑通道管理指令的指令头中第三、第四字节数据,如为第三数值,则打开一个新的逻辑通道并将其作为当前逻辑通道;如为第四数值,则打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
所述第二发送子模块还用于将与所述新的逻辑通道对应的逻辑通道号作为响应数据返回给所述上位机。
进一步地,所述关闭子模块具体用于判断逻辑通道管理指令的指令头中第三、第四字节数据,如为第五数值则关闭当前逻辑通道;如为第六数值,则关闭与所述第二逻辑通道号对应的逻辑通道。
进一步地,所述第三判断子模块具体用于判断所述APDU数据的指令头中的第三、第四字节数据是否为第七数值,是则判断选择指令为应用选择指令,否则判断选择指令不为应用选择指令。
进一步地,所述第三接口子模块包括:
第一判断单元,用于判断协议类型;
第一获取单元,用于当所述第一判断单元判断为T1时从所述APDU数据中获取响应数据长度;
第二判断单元,用于当所述第一判断单元判断为T0时判断APDU类型;
第一转换单元,用于当所述第二判断单元判断为第一类型时将所述APDU类型转换为第二类型,将所述指令头的第五字节数据作为响应数据长度;
第二转换单元,用于当所述第二判断单元判断为第三类型时将所述APDU类型转换为第四类型,将最大数据长度作为响应数据长度。
进一步地,所述第四接口子模块包括:
第三判断单元,用于判断协议类型;
第四判断单元,用于当所述第三判断单元判断为T0时判断APDU类型;
第五判断单元,用于当所述第四判断单元判断为第二类型时判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则记录响应数据长度;
第一设置单元,用于当所述第五判断单元判断为否时设置响应状态码为第一预设数据;
设置记录单元,用于当所述第四判断单元判断为第四类型时设置响应状态码为第二预设数据,记录所述第四接口参数中的响应数据长度;
第一纪录单元,用于当所述第三判断单元判断为T1时记录所述第四接口参数中的响应数据长度;
第二发送子模块,还用于将所述第一设置单元和所述设置记录单元设置的响应状态码发送给所述主体模块。
进一步地,所述第四判断单元具体用于判断当前应用是否调用了第一接口和第二接口,是则判断APDU类型为第四类型,否则判断APDU类型为第二类型。
进一步地,所述第五接口子模块包括:
第六判断单元,用于判断协议类型;
第七判断单元,用于当所述第六判断单元判断为T0时判断响应数据长度是否小于所述APDU缓存区中的数据的长度;
第八判断单元,用于在所述第二发送子模块根据响应数据长度将APDU缓存区中的对应长度的数据发送给所述主体模块之后判断APDU缓存区中的数据是否发送完成;
第二设置单元,用于当第八判断单元判断为否时设置响应状态码为第二预设数据;
第九判断单元,用于当所述第六判断单元判断为T1时判断所述APDU缓存区中的数据的长度是否大于CCID设备数据域大小;
第一存储单元,用于当所述第九判断单元判断为否时将所述APDU缓存区中的数据存储到TPDU缓存区中;
第一分组单元,用于当所述第九判断单元判断为是时根据CCID设备数据域大小对所述APDU缓存区中的数据进行分组;
第十判断单元,用于判断是否还有未发送的数据组;
第二存储单元,用于当所述第十判断单元判断为是时将数据组存储到所述TPDU缓存区中;
所述第二发送子模块,还用于将所述第二设置单元设置的响应状态码发送给所述主体模块,还用于当所述第七判断单元判断为是时根据响应数据长度将APDU缓存区中的对应长度的数据发送给所述主体模块,所述第七判断单元判断为否时将APDU缓存区中的数据发送给所述主体模块,还用于将所述第一分组单元分组得到的整个数据组封装为T1的I型数据块发送给所述主体模块。
进一步地,所述第五接口子模块包括:
第十一判断单元,用于判断协议类型;
第十二判断单元,用于当第十一判断单元判断为T0时判断APDU类型;
第十三判断单元,用于当第十二判断单元判断为第二类型时判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同;
第三设置单元,用于当所述第十三判断单元判断为否时设置响应状态码为第一预设数据;
第十四判断单元,用于当第十二判断单元判断为第四类型时判断响应数据长度是否小于APDU缓存区中的数据的长度;
第十五判断单元,用于在所述第二发送子模块根据响应数据长度将APDU缓存区中的对应长度的数据发送给所述主体模块之后判断所述APDU缓存区中的数据是否全部发送完成;
第四设置单元,用于当所述第十五判断单元判断为否时设置响应状态码为第二预设数据;
第十六判断单元,用于当第十一判断单元判断为T1时判断所述APDU缓存区中的数据的长度的是否大于CCID设备数据域大小;
第三存储单元,用于当所述第十六判断单元判断为否时将所述APDU缓存区中的数据存储到TPDU缓存区中;
第二分组单元,用于当所述第十六判断单元判断为是时根据CCID设备数据域大小对所述APDU缓存区中的数据进行分组;
第十七判断单元,还用于判断是否还有未发送的数据组;
第四存储单元,用于当所述第十七判断单元判断为是时将数据组存储到所述TPDU缓存区中;
所述第二发送子模块还用于将所述第三设置单元设置的响应状态码和APDU缓存区中的数据发送给所述主体模块,还用于当所述第十三判断单元判断为是时和所述第十四判断单元判断为否时将APDU缓存区中的数据发送给所述主体模块,还用于当所述第十四判断单元判断为是时根据响应数据长度将APDU缓存区中的对应长度的数据发送给所述主体模块,还用于将所述第四设置单元设置的响应状态码发送给所述主体模块;还用于将所述第二分组单元分组得到的整个数据组封装为T1的I型数据块发送给所述主体模块。
进一步地,所述第六接口子模块具体用于从第六接口中获取指定数组,将指定数组中的数据复制到APDU缓存区中,将所述APDU缓存区中的数据发送给所述主体模块。
进一步地,所述第一处理子模块包括:
第十八判断单元,用于判断第一CCID消息的类型;
第一处理单元,用于当所述第十八判断单元判断第一CCID消息为其他消息时根据CCID规范对接收到的所述第一CCID消息进行处理;
复位操作单元,用于当所述第十八判断单元判断第一CCID消息为第一消息时进行复位操作生成复位应答;所述第一消息为主机发送给智能密钥设备的上电消息;
第二获取单元,用于当所述第十八判断单元判断第一CCID消息为第二消息时从所述第一CCID消息的数据域中获取第一TPDU数据;所述第二消息为主机发送给智能密钥设备的数据组消息;
第十九判断单元,用于判断所述第二获取单元是否获取到指定长度的第一TPDU数据;
第二十判断单元,用于当所述第十九判断单元判断为是时判断接收数据的协议类型;
第一解析单元,用于当所述第二十判断单元判断为T0时对所述第一TPDU数据进行解析得到APDU数据;
第二解析单元,用于当所述第二十判断单元判断为T1时对接收到的所述第一CCID消息进行解析得到一个T1协议块;
第二十一判断单元,用于判断所述第二解析单元得到的所述T1协议块是否为T1协议信息块,
第二处理单元,用于当所述第二十一判断单元判断为否时按照T1协议对获取到的所述第一TPDU数据进行处理;
第三获取单元,用于当所述第二十一判断单元判断为是时从所述T1协议信息块的信息数据域中获取APDU数据;
第二十二判断单元,用于判断所述第三获取单元是否获取到指定长度的APDU数据;
封装子模块,还用于将所述第一处理单元和第二处理单元的处理结果封装成第二CCID消息,还用于将所述复位操作单元的复位应答封装成第二CCID消息;
所述第一发送子模块还用于当所述第二十二判断单元判断为是时将所述第三获取单元获取的APDU数据发送给虚拟机模块。
进一步地,所述封装子模块包括:
第二十三判断单元,用于判断处理结果的协议类型;
第二十四判断单元,用于当所述第二十三判断单元判断为T0时判断所述处理结果的长度是否大于获取的响应数据长度;
第一封装单元,用于当所述第二十四判断单元判断为否时将所述处理结果和所述状态字封装成第二TPDU数据;
第二封装单元,用于当所述第二十四判断单元判断为是时根据所述响应数据长度将所述处理结果中对应长度的数据封装成第二TPDU数据;
第二十五判断单元,用于在所述第一发送子模块将第七封装单元封装好的第二CCID消息返回给所述上位机之后判断处理结果是否全部发送完成;
第三封装单元,用于当所述第二十五判断单元判断为否时将所述处理结果中的剩余数据和所述状态字封装成第二TPDU数据;
第二十六判断单元,用于当所述第二十三判断单元判断为T1时判断所述处理结果的长度是否大于CCID设备数据域大小;
第一作为单元,用于当所述第二十六判断单元判断为否时将所述处理结果作为当前数据;
第三分组单元,用于当所述第二十六判断单元判断为是时按照CCID设备数据域大小对所述处理结果进行分组;
第四封装单元,用于分别将所述第三分组单元的每个完整的数据组封装成第二TPDU数据;
第二十七判断单元,用于判断最后一个数据组是否为完整的数据组;
第二作为单元,用于当第二十七判断单元判断为否时将最后一个数据组作为当前数据;
第五封装单元,用于当所述第二十五判断单元判断为是时和第二十七判断单元判断为是时将状态字封装成第二TPDU数据;
第六封装单元,用于分别将所述第一作为单元和第二作为单元的所述当前数据、所述状态字封装成第二TPDU数据;
所述第七封装单元,用于将所述第一封装单元、第二封装单元、第三封装单元、第四封装单元、第五封装单元和第六封装单元的第二TPDU数据封装成第二CCID消息。
进一步地,所述第七封装单元包括:
第一判断子单元,用于判断第二TPDU数据的长度是否大于CCID消息最大长度;
第一作为子单元,用于当所述第一判断子单元判断为否时将第二TPDU数据作为当前TPDU数据组;
第一分组子单元,用于当所述第一判断子单元判断为是时根据CCID消息最大长度对所述第二TPDU数据进行分组,将第一个TPDU数据组作为当前TPDU数据组并将其存储到CCID缓存区中;
第二判断子单元,用于在所述第一发送子模块将封装子单元封装好的第二CCID消息返回给所述上位机之后判断所有TPDU数据组是否发送完成;
第二作为子单元,用于当所述第二判断子单元判断为否时将下一个TPDU数据组作为当前TPDU数据组;
第三判断子单元,用于判断所述第一作为子单元和第二作为子单元的当前TPDU数据组是否为完整的数据组;
第一存储子单元,用于当所述第三判断子单元判断为是时将所述当前TPDU数据组存储到CCID缓存区中;
封装子单元,用于将所述第一分组子单元和第一存储子单元存储到所述CCID缓存区中的数据封装成第二CCID消息;
第二存储子单元,用于当所述第三判断子单元判断为否时将所述当前TPDU数据组顺序存储到CCID缓存区中。
本发明与现有技术相比,具有以下优点:
本实施例虚拟机使用USB接口与主机进行通信,不需要额外使用读卡器设备;由于通信时没有使用ISO7816接口,所以不受ISO7816接口的通信速率限制,通信速度较快。
附图说明
图1为本发明实施例一提供的一种智能密钥设备的工作方法流程图;
图2为本发明实施例二提供的智能密钥设备接收数据并对其进行处理的实现过程流程图;
图3为本发明实施例三提供的智能密钥设备将处理结果和状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机的实现方法流程图;
图4为本发明实施例四提供的一种智能密钥设备的方框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本发明实施例一提供一种智能密钥设备的工作方法,具体的,本实施例以智能密钥设备中只有一个逻辑通道,该逻辑通道中只有一个应用为例进行说明,如图1所示,包括:
步骤101:智能密钥设备上电,进行初始化;
具体的,在本实施例中,进行初始化包括:启动内部设置的虚拟机,芯片初始化、USB接口初始化、CCID(英文名称:Chip/Smart Card Interface Devices-USB,中文名称:芯片智能卡接口设备)初始化;
步骤102:当智能密钥设备接收到上位机下发的第一CCID消息时对其进行处理;
在本实施例中,步骤102包括:智能密钥设备对接收到的第一CCID消息进行解析得到第一TPDU数据,再对第一TPDU数据解析得到APDU数据并将其发送给虚拟机;本实施例中步骤102的具体实现过程在实施例二中进行详述;
例如,本实施例中的智能密钥设备接收到的第一CCID消息为0x6f 09 00 00 0000 60 00 00 00 00 40 05 00 70 00 00 01 34,其中前十个字节数据0x6f 09 00 00 0000 60 00 00 00为消息头,对第一CCID消息解析得到的第一TPDU数据为0x00 40 05 00 7000 00 01 34;对第一TPDU数据解析得到的APDU数据为0x00 70 00 00 01;
例如,本实施例中的智能密钥设备接收到的第一CCID消息为0x6f 09 00 00 0000 7d 00 00 00 00 00 05 00 70 00 02 00 77,其中前十个字节数据0x6f 09 00 00 0000 7d 00 00 00为消息头,对第一CCID消息解析得到的第一TPDU数据为0x00 00 05 00 7000 02 00 77;对第一TPDU数据解析得到的APDU数据为0x00 70 00 02 00;
例如,本实施例中的智能密钥设备接收到的第一CCID消息为0x6f 09 00 00 0000 63 00 00 00 00 00 05 00 70 80 02 01 f6,其中前十个字节数据0x6f 09 00 00 0000 63 00 00 00为消息头,对第一CCID消息解析得到的第一TPDU数据为0x00 00 05 00 7080 02 01 f6;对第一TPDU数据解析得到的APDU数据为0x00 70 80 02 01;
例如,本实施例中的智能密钥设备接收到的第一CCID消息为0x6f 05 00 00 0000 92 00 00 00 00 70 00 00 01,其中前十个字节数据0x6f 09 00 00 00 00 7d 00 0000为消息头,对第一CCID消息解析得到的第一TPDU数据为0x00 70 00 00 01;对第一TPDU数据解析得到的APDU数据为0x00 70 00 00 01;对于T0协议而言,解析得到的第一TPDU数据与APDU数据相同;
例如,本实施例中的智能密钥设备接收到的第一CCID消息为0x6f 05 00 00 0000 93 00 00 00 00 70 00 02 01,其中前十个字节数据0x6f 05 00 00 00 00 93 00 0000为消息头,对第一CCID消息解析得到的第一TPDU数据为0x00 70 00 02 01;对第一TPDU数据解析得到的APDU数据为0x00 70 00 02 01;
例如,本实施例中的智能密钥设备接收到的第一CCID消息为0x6f 05 00 00 0000 94 00 00 00 00 70 80 02 01,其中前十个字节数据0x6f 05 00 00 00 00 94 00 0000为消息头,对第一CCID消息解析得到的第一TPDU数据为0x00 70 80 02 01;对第一TPDU数据解析得到的APDU数据为0x00 70 80 02 01;
步骤103:虚拟机将接收到的APDU数据发送给当前逻辑通道中的当前应用进行处理,虚拟机接收当前应用返回的处理结果和状态字,并将处理结果和状态字发送给智能密钥设备;
具体的,在本实施例中,智能密钥设备中可以只有一个逻辑通道,该逻辑通道到有一个或多个应用,或智能密钥设备中有多个逻辑通道,每个通道中有一个或多个应用;
(一)如本实施例的智能密钥设备中有多个逻辑通道,每个逻辑通道中有多个应用,则在步骤102与步骤103之间还包括:
步骤A1:当虚拟机接收到APDU数据时从APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
在本实施例中,从APDU数据的指令头中获取第一逻辑通道号具体为:从指令头的第一个字节上获取第一逻辑通道号;
例如,APDU数据为0x00 70 00 00 01,则获取的第一逻辑通道号为0x00;
步骤A2:虚拟机根据指令头判断指令的类型,如为逻辑通道管理指令则执行步骤A3,如为选择指令则执行步骤A7,如为其他指令则执行步骤103;
具体的,本实施例中步骤A2包括:虚拟机判断指令头的第二字节数据,如为第一数值则为逻辑通道管理指令,如为第二数值则为选择指令,如为其他数据则为其他指令;优选的,第一数值为0x70,第二数值为0xA4;
例如,APDU数据为0x00 70 00 00 01,则判断指令的类型为逻辑通道管理指令;
步骤A3:虚拟机从逻辑通道管理指令的指令头中获取第二逻辑通道号;
具体的,在本实施例中,步骤A3包括:智能密钥设备中的虚拟机从逻辑通道号指令的指令头中第四字节上获取第二逻辑通道号;
例如,APDU数据为0x00 70 00 02 01,则获取的第二逻辑通道号为0x02;
步骤A4:虚拟机判断逻辑通道的操作类型,如为打开逻辑通道则执行步骤A5,如为关闭逻辑通道则执行步骤A6;
具体的,在本实施例中,虚拟机判断逻辑通道管理指令的指令头中第三字节数据的最高位,如为0则操作类型为打开逻辑通道,如为1则操作类型为关闭逻辑通道;
例如,APDU数据为0x00 70 00 00 01,则指令头中第三字节数据的最高位为0则操作类型为打开逻辑通道;APDU数据为0x00 70 80 02 01,则指令头中第三字节数据的最高位为1则操作类型为关闭逻辑通道;
步骤A5:虚拟机打开与第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,返回步骤102;
在本实施例中,步骤A5包括:虚拟机判断逻辑通道管理指令的指令头中第三、第四字节数据,如为第三数值,则打开一个新的逻辑通道并将其作为当前逻辑通道,并将与新的逻辑通道对应的逻辑通道号返回给上位机;如为第四数值,则打开与第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,给上位机返回操作成功响应;优选的,第三数值为0000,第四数值为00 01到00 13之间的任意数值;
在本实施例中,如T1协议中解析得到的APDU数据为0x00 70 00 00 01,则判断逻辑通道管理指令的指令头中第三、第四字节数据为第三数值,虚拟机打开一个新的逻辑通道并将其作为当前逻辑通道,并将与新的逻辑通道对应的逻辑通道号(例如0x01)返回给上位机,具体的,虚拟机给智能密钥设备返回的APDU数据为0x01 90 00,其中01为当前打开的逻辑通道号,90 00表示指令执行成功;智能密钥设备将APDU数据封装成的第二TPDU数据为0x00 40 03 01 90 00 d2,智能密钥设备将第二TPDU数据封装成第二CCID消息为0x80 0700 00 00 00 60 00 00 00 00 40 03 01 90 0 0d2并返回给上位机;如解析得到的APDU数据为0x00 70 00 02 00,则判断逻辑通道管理指令的指令头中第三、第四字节数据为第四数值,虚拟机打开与第二逻辑通道号(0x02)对应的逻辑通道并将其作为当前逻辑通道,具体的,虚拟机给智能密钥设备返回的APDU数据为0x90 00,其中90 00表示指令执行成功;智能密钥设备将APDU数据封装成的第二TPDU数据为0x00 00 02 90 00 92,智能密钥设备将第二TPDU数据封装成第二CCID消息为0x80 06 00 00 00 00 7d 00 00 00 00 00 02 9000 92并返回给上位机;
在本实施例中,如T0协议中如解析得到的APDU数据为0x00 70 00 00 01,则判断逻辑通道管理指令的指令头中第三、第四字节数据为第三数值,虚拟机打开一个新的逻辑通道并将其作为当前逻辑通道,并将与新的逻辑通道对应的逻辑通道号(例如0x01)返回给上位机,具体的,虚拟机给智能密钥设备返回的APDU数据为0x01 90 00,其中01为当前打开的逻辑通道号,90 00表示指令执行成功;智能密钥设备将APDU数据封装成的第二TPDU数据为0x01 90 00,智能密钥设备将第二TPDU数据封装成第二CCID消息为0x80 03 00 00 0000 92 00 00 00 01 90 00并返回给上位机;如解析得到的APDU数据为0x00 70 00 02 01,则判断逻辑通道管理指令的指令头中第三、第四字节数据为第四数值,虚拟机打开与第二逻辑通道号(0x02)对应的逻辑通道并将其作为当前逻辑通道,并给上位机返回操作成功信息,具体的,虚拟机给智能密钥设备返回的APDU数据为0x90 00,其中90 00表示指令执行成功;智能密钥设备将APDU数据封装成的第二TPDU数据为0x90 00,智能密钥设备将第二TPDU数据封装成第二CCID消息为0x80 02 00 00 00 00 93 00 00 00 90 00并返回给上位机;
步骤A6:虚拟机关闭与第二逻辑通道号对应的逻辑通道,返回步骤102;
在本实施例中,步骤A6包括:虚拟机判断辑逻辑通道管理指令的指令头中第三、第四字节数据,如为第五数值则关闭当前逻辑通道;如为第六数值,则关闭与第二逻辑通道号对应的逻辑通道;优选的,第五数值为80 00,第六数值为80 01到80 13之间的任意数值;
在本实施例中,如T1协议中解析得到的APDU数据为00 70 80 00 00,则判断逻辑通道管理指令的指令头中第三、第四字节数据为第五数值,虚拟机关闭当前逻辑通道,并给上位机返回操作成功信息,具体的,虚拟机给智能密钥设备返回的APDU数据为0x90 00,其中90 00表示指令执行成功;智能密钥设备将APDU数据封装成的第二TPDU数据为0x00 0002 90 00 92,智能密钥设备将第二TPDU数据封装成第二CCID消息为0x80 06 00 00 00 0064 00 00 00 00 00 02 90 00 92并返回给上位机;如解析得到的APDU数据为0x00 70 8002 01,则判断逻辑通道管理指令的指令头中第三、第四字节数据为第六数值,虚拟机关闭与第二逻辑通道号(0x02)对应的逻辑通道,并给上位机返回操作成功信息,具体的,虚拟机给智能密钥设备返回的APDU数据为0x90 00,其中90 00表示指令执行成功;智能密钥设备将APDU数据封装成的第二TPDU数据为0x00 00 02 90 00 92,智能密钥设备将第二TPDU数据封装成第二CCID消息为0x 80 06 00 00 00 00 63 00 00 00 00 00 02 90 00 92并返回给上位机;
在本实施例中,如T0协议中解析得到的APDU数据为01 70 80 00 00,则判断逻辑通道管理指令的指令头中第三、第四字节数据为第五数值,虚拟机关闭当前逻辑通道,并给上位机返回操作成功信息,具体的,虚拟机给智能密钥设备返回的APDU数据为0x90 00,其中90 00表示指令执行成功;智能密钥设备将APDU数据封装成的第二TPDU数据为0x90 00,智能密钥设备将第二TPDU数据封装成第二CCID消息为0x80 02 00 00 00 00a9 00 00 0090 00并返回给上位机;如解析得到的APDU数据为0x00 70 80 02 01,则判断逻辑通道管理指令的指令头中第三、第四字节数据为第六数值,虚拟机关闭与第二逻辑通道号(0x02)对应的逻辑通道,并给上位机返回操作成功信息,具体的,虚拟机给智能密钥设备返回的APDU数据为0x90 00,其中90 00表示指令执行成功;智能密钥设备将APDU数据封装成的第二TPDU数据为0x90 00,智能密钥设备将第二TPDU数据封装成第二CCID消息为0x80 02 00 0000 00 94 00 00 00 90 00并返回给上位机;
步骤A7:虚拟机判断选择指令是否为应用选择指令,是则执行步骤A8,否则执行步骤103;
具体的,本实施例中步骤A7包括:虚拟机判断指令头中的第三、第四字节数据是否为第七数值,是则选择指令为应用选择指令,否则选择指令不为应用选择指令;优选的,第七数值为04 00;
步骤A8:虚拟机从选择指令的数据域中获取应用标识符(应用AID);
步骤A9:虚拟机判断根据应用标识符是否找到对应的应用,是则执行步骤A11,否则执行步骤A10;
步骤A10:虚拟机将状态字发送给智能密钥设备,执行步骤104;
例如,本实施例中的状态字为FILE NOT FOUND;
步骤A11:虚拟机将找到的应用作为当前应用,并将选择指令发送给当前逻辑通道中的当前应用进行处理,虚拟机接收当前应用返回的处理结果和状态字,并将处理结果和状态字发送给智能密钥设备,执行步骤104。
(二)如本实施例的智能密钥设备中有多个逻辑通道,每个逻辑通道中有一个应用,则在步骤102与步骤103之间还包括:
步骤B1:当虚拟机接收到APDU数据时从APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
在本实施例中,从APDU数据的指令头中获取第一逻辑通道号具体为:从指令头的第一个字节上获取第一逻辑通道号;
步骤B2:虚拟机根据指令头判断指令的类型是否为逻辑通道管理指令,是则执行步骤B3,否则执行步骤103;
具体的,本实施例中步骤B2包括:虚拟机判断指令头的第二字节数据是否为第一数值,是则为逻辑通道管理指令,否则为其他指令。
步骤B3:虚拟机从逻辑通道管理指令的指令头中获取第二逻辑通道号;
步骤B4:虚拟机判断逻辑通道的操作类型,如为打开逻辑通道则执行步骤B5,如为关闭逻辑通道则执行步骤B6;
步骤B5:虚拟机打开与第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,返回步骤102;
在本实施例中,步骤B5的实现过程与步骤A5相同,在此不再赘述;
步骤B6:虚拟机关闭与第二逻辑通道号对应的逻辑通道,返回步骤102。
在本实施例中,步骤B6的实现过程与步骤A6相同,在此不再赘述;
(三)如本实施例的智能密钥设备中只有一个逻辑通道,该逻辑通道中有多个应用,则在步骤102与步骤103之间还包括:
步骤C1:虚拟机根据指令头判断指令的类型是否为选择指令,是则执行步骤C2,否则执行步骤103;
具体的,本实施例中步骤C1包括:虚拟机判断指令头的第二字节数据是否为第二数值,是则为选择指令,否则为其他指令。
步骤C2:虚拟机判断选择指令是否为应用选择指令,是则执行步骤C3,否则执行步骤103;
在本实施例中,步骤C2的实现过程与步骤A7相同,在此不再赘述;
步骤C3:虚拟机从选择指令的数据域中获取应用标识符;
步骤C4:虚拟机判断根据应用标识符是否找到对应的应用,是则执行步骤C6,否则执行步骤C5;
步骤C5:虚拟机将状态字发送给智能密钥设备,执行步骤104;
步骤C6:虚拟机将找到的应用作为当前应用,并将选择指令发送给当前逻辑通道中的当前应用进行处理,虚拟机接收当前应用返回的处理结果和状态字,并将处理结果和状态字一起发送给智能密钥设备,执行步骤104。
步骤104:智能密钥设备将处理结果和状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机,返回步骤102;
本实施例中,步骤104的具体实现过程在实施例三中进行详述。
本实施例的方法还包括:若当前逻辑通道中的当前应用接收到虚拟机发送的指令时,根据指令中的接口标识调用相应接口;
若当前应用调用第一接口时,虚拟机从第一接口参数中获取APDU(应用协议数据单元)缓存区地址和开始存储数据的偏移地址,开始接收数据并将接收到的数据存储到APDU缓存区地址中与开始存储数据的偏移地址对应的位置;
具体的,在本实施例中,第一接口为APDU.setIncomingAndReceive();如智能密钥设备收到的指令数据域的长度大于等于APDU缓存区大小减去APDU指令头长度时,所要存储数据的长度=APDU缓存区总长度-APDU指令头的长度,如智能密钥设备收到的指令数据域的长度小于APDU缓存区大小减去APDU指令头长度时,所要存储数据的长度=指令数据域的长度;
如智能密钥设备收取到的指令的长度大于缓存区空间时,当前应用调用第二接口,虚拟机从第二接口参数中获取APDU缓存区地址和指定偏移地址,开始接收数据并将接收到的数据存储到对应于APDU缓存区地址中与指定偏移地址对应的位置;
具体的,在本实施例中,第二接口为APDU.receiveBytes();当前数据包的长度=APDU缓存区长度-指定偏移值;
若当前应用调用第三接口时,虚拟机设置通信方向为向外;
具体的,在本实施例中,第三接口为APDU.setOutgoing();虚拟机设置通信方向为向外,包括:
步骤k1:虚拟机判断协议类型,如为T1则执行步骤k2,如为T0则执行步骤k3;
在本实施例中,虚拟机根据连接的参数判断协议类型;该连接用于连接上位机与智能密钥设备;
步骤k2:虚拟机从APDU数据中获取响应数据长度(Le);
步骤k3:虚拟机判断APDU类型,如为第一类型则执行步骤k4,如为第三类型则执行步骤k5;
具体的,在本实施例中,如果当前应用没有调用第一接口和第二接口则APDU类型为第一类型,如果当前应用调用了第一接口和第二接口去接收数据,则APDU类型为第三类型;
步骤k4:虚拟机将APDU类型转换为第二类型,将指令头的第五字节数据作为响应数据长度(Le);
步骤k5:虚拟机将APDU类型转换为第四类型,将最大数据长度作为响应数据长度(Le)。
若当前应用调用第四接口时,虚拟机记录响应数据长度;
在本实施例中,第四接口为APDU.setOutgoingLength();虚拟机记录响应数据长度,包括:
步骤d1:虚拟机判断协议类型,如为T0则执行步骤d2,如为T1则执行步骤d6;
步骤d2:虚拟机判断APDU类型,如为第二类型则执行步骤d3,如为第四类型则执行步骤d5;
具体的,在本实施例中,步骤d2包括:虚拟机判断当前应用是否调用第一接口和第二接口,是则APDU类型为第四类型,否则APDU类型为第二类型;
步骤d3:虚拟机判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则记录响应数据长度,否则执行步骤d4;
步骤d4:虚拟机设置响应状态码为第一预设数据并将其发送给智能密钥设备;
在本实施例中,响应状态码为第一预设数据表示虚拟机要求上位机重新发送带正确le的指令;优选的,第一预设数据为0x6CXX;智能密钥设备接收到响应状态码后将其封装成第二TPDU数据,再将第二TPDU数据封装成CCID消息返回给上位机;
步骤d5:虚拟机设置响应状态码为第二预设数据并将其发送给智能密钥设备,记录第四接口参数中的响应数据长度;
在本实施例中,响应状态码为第二预设数据表示虚拟机要求上位机发送GETRESPONSE指令获取响应结果,其中GET RESPONSE指令中包含le值,也就是上位机期望获取的数据长度;优选的,第二预设数据为0x61XX;智能密钥设备接收到响应状态码后将其封装成第二TPDU数据,再将第二TPDU数据封装成第二CCID消息返回给上位机;
步骤d6:虚拟机记录第四接口参数中的响应数据长度。
若当前应用调用第五接口时,虚拟机将APDU缓存区中的数据发送给智能密钥设备;其中,虚拟机将APDU缓存区中的数据发送给智能密钥设备,具体包括:
步骤f1:虚拟机判断协议类型,如为T0则执行步骤f2,如为T1则执行步骤f7;
步骤f2:虚拟机判断响应数据长度是否小于APDU缓存区中的数据的长度,是则执行步骤f4,否则执行步骤f3;
步骤f3:虚拟机将APDU缓存区中的数据发送给智能密钥设备;
步骤f4:虚拟机根据响应数据长度将APDU缓存区中的对应长度的数据发送给智能密钥设备,执行步骤f5;
在本实施例中,智能密钥设备接收到APDU数据之后将其封装成第二TPDU数据,再将第二TPDU数据封装成CCID消息并返回给上位机;
步骤f5:虚拟机判断APDU缓存区中的数据是否发送完成,是则结束,否则执行步骤f6;
步骤f6:虚拟机设置响应状态码为第二预设数据并发送给智能密钥设备;
在本实施例中,响应状态码为第二预设数据表示虚拟机要求上位机发送GETRESPONSE指令获取响应结果,其中GET RESPONSE指令中包含le值,也就是上位机期望获取的数据长度;优选的,第二预设数据为0x61XX;智能密钥设备接收到响应状态码后将其封装成第二TPDU数据,再将第二TPDU数据封装成CCID消息返回给上位机;
步骤f7:虚拟机判断APDU缓存区中的数据的长度是否大于IFSD(CCID设备数据域大小),是则执行步骤f8,否则将APDU缓存区中的数据存储到TPDU缓存区中;
步骤f8:虚拟机根据IFSD对APDU缓存区中的数据进行分组,并分别将整个数据组封装为T1的I型数据块发送给智能密钥设备;
步骤f9:虚拟机判断是否还有未发送的数据组,是则将数据组存储到TPDU缓存区中,结束,否则结束;
具体的,在本实施例中,第五接口为APDU.sendBytes();
若当前应用调用第六接口时,虚拟机将指定数组中的数据发送给智能密钥设备;本实施例中的指定数组是从第五接口的参数中获取的;
具体的,在本实施例中,第六接口为APDU.sendBytesLong();虚拟机将指定数组中的数据发送给智能密钥设备,包括:虚拟机从第六接口中获取指定数组,将指定数组中的数据复制到APDU缓存区中,将APDU缓存区中的数据发送给智能密钥设备。
若当前应用调用第七接口时,虚拟机设置通信方向为向外,虚拟机记录响应数据长度,并将APDU缓存区中的数据发送给智能密钥设备。
具体的,在本实施例中,第七接口为APDU.setOutgoingAndSend()。
在本实施例中,第四接口和第五接口被当前应用调用时还有另一种实现方式,具体为:
若当前应用调用第四接口时,虚拟机记录响应数据长度;
若当前应用调用第五接口时,虚拟机将APDU缓存区中的数据发送给智能密钥设备;其中,虚拟机将APDU缓存区中的数据发送给智能密钥设备,具体包括:
步骤h1:虚拟机判断协议类型,如为T0则执行步骤h2,如为T1则执行步骤h10;
步骤h2:虚拟机判断APDU类型,如为第二类型则执行步骤h3,如为第四类型则执行步骤h6;
具体的,在本实施例中,如果当前应用未调用第一接口和第二接口则APDU类型为第二类型,如果当前应用调用了第一接口和第二接口去接收数据,则APDU类型为第四类型;
步骤h3:虚拟机判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则执行步骤h5,否则执行步骤h4;
步骤h4:虚拟机设置响应状态码为第一预设数据并将其发送给智能密钥设备,执行步骤h5;
步骤h5:虚拟机将APDU缓存区中的数据发送给智能密钥设备;
步骤h6:虚拟机判断响应数据长度是否小于APDU缓存区中的数据的长度,是则执行步骤h7,否则将APDU缓存区中的数据发送给智能密钥设备;
步骤h7:虚拟机根据响应数据长度将APDU缓存区中的对应长度的数据发送给智能密钥设备;
步骤h8:虚拟机判断APDU缓存区中的数据是否全部发送完成,是则结束,否则执行步骤h9;
步骤h9:虚拟机设置响应状态码为第二预设数据并发送给智能密钥设备;
在本实施例中,响应状态码为第二预设数据表示虚拟机要求上位机发送GETRESPONSE指令获取响应结果,其中GET RESPONSE指令中包含le值,也就是上位机期望获取的数据长度;优选的,第二预设数据为0x61XX;智能密钥设备接收到响应状态码后将其封装成第二TPDU数据,再将第二TPDU数据封装成第二CCID消息返回给上位机;
步骤h10:虚拟机判断APDU缓存区中的数据的长度的是否大于IFSD(CCID设备数据域大小),是则执行步骤h11,否则将APDU缓存区中的数据存储到TPDU缓存区中;
步骤h11:虚拟机根据IFSD对APDU缓存区中的数据进行分组,并分别将整个数据组封装为T1的I型数据块发送给智能密钥设备;
步骤h12:虚拟机判断是否还有未发送的数据组,是则将数据组存储到TPDU缓存区中,结束,否则结束。
实施例二
本发明实施例二提供了智能密钥设备接收数据并对其进行处理的实现过程,如图2所示,包括:
步骤201:智能密钥设备等待并接收第一CCID消息;
例如,本实施例中,智能密钥设备接收到的第一CCID消息为0x62 00 00 00 00 0097 01 00 00;其中指令数据长度:0x00;
步骤202:智能密钥设备判断第一CCID消息的类型,如为第一消息则执行步骤203,如为第二消息则执行步骤205,如为其他则根据CCID规范对接收到的第一CCID消息进行处理,将处理结果封装成第二CCID消息并将其返回给上位机,返回步骤201;
在本实施例中,第一消息为PC_to_RDR_IccPowerOn(主机发送给智能密钥设备的上电消息),第二消息为PC_to_RDR_XfrBlock(主机发送给智能密钥设备的数据组消息);
对于本实施例中的数据实例,智能密钥设备根据第一CCID消息第一个字节数据0x62判断第一CCID消息的类型为第一消息;
步骤203:智能密钥设备进行复位操作生成ATR(复位应答);
步骤204:智能密钥设备将ATR封装成第二CCID消息并将其返回给上位机,返回步骤201;
例如,本实施例中的ATR为0x3b 90 95 80 01 84;封装成第二CCID消息为0x80 0600 00 00 00 97 00 00 00 3b 90 95 80 01 84;
步骤205:智能密钥设备从第一CCID消息的数据域中获取第一TPDU数据;
具体的,在本实施例中,第一CCID消息包括十个字节的消息头(其中,第1字节数据为消息类型、第2字节为第一CCID消息的数据长度)和第一TPDU数据,步骤205具体为:智能密钥设备从第一CCID消息的第十一个字节开始获取第一TPDU数据;例如,第一CCID消息为6f 12 00 00 00 00 76 00 00 00 00 00 0e 00a4 04 00 08a0 00 00 00 03 00 00 0000 05,其中,6f 12 00 00 00 00 76 00 00 00为消息头,00 00 0e 00a4 04 00 08a0 0000 00 03 00 00 00 00 05为第一TPDU数据;
步骤206:智能密钥设备判断是否获取到指定长度的第一TPDU数据,是则执行步骤207,否则返回步骤201;
步骤207:智能密钥设备判断接收数据的协议类型,如为T0则执行步骤208,如为T1则执行步骤210;
步骤208:智能密钥设备对第一TPDU数据进行解析得到APDU数据;
具体的,在本实施例中,如数据的协议类型为T0则第一TPDU数据与APDU数据是相同,例如,上述例子中第一TPDU数据为00 00 0e 00a4 04 00 08a0 00 00 00 03 00 00 0000 05,则在该步骤中解析得到的APDU数据为00 00 0e 00 a4 04 00 08a0 00 00 00 0300 00 00 00 05;
例如,在实施例一中步骤A1时则该步骤中的指定长度为5字节,若当前应用调用第一接口或第二接口时则指定长度为所要存储数据的长度;
步骤209:智能密钥设备将APDU数据发送给虚拟机,返回步骤201;
步骤210:智能密钥设备对接收到的第一CCID消息进行解析得到一个T1协议块;
具体的,在本实施例中,第一CCID消息包括十个字节的消息头(其中,第1字节数据为消息类型、第2字节为第一CCID消息的数据长度)和第一TPDU数据,步骤205具体为:智能密钥设备从第一CCID消息的第十一个字节开始获取第一TPDU数据;例如,第一CCID消息为6f 12 00 00 00 00 76 00 00 00 00 00 0e 00 a4 04 00 08 a0 00 00 00 03 00 00 0000 05,第一TPDU数据为00 00 0e 00 a4 04 00 08 a0 00 00 00 03 00 00 00 00 05;
步骤211:智能密钥设备判断得到的T1协议块是否为T1协议信息块,是则执行步骤212,否则按照T1协议对获取到的第一TPDU数据进行处理,将处理结果封装成第二CCID消息并返回给上位机,返回步骤201;
具体的,在本实施例中,第一TPDU数据分为T1协议信息块、R型信息块、S型信息块;
步骤212:智能密钥设备从T1协议信息块的INF域(信息数据域)中获取APDU数据;
具体的,在本实施例中,如数据的协议类型为T1则第一TPDU数据包括3个字节的数据头(其中,第1字节固定为0x00,第2字节表示T1协议块的类型,第3字节为APDU数据的长度)和APDU数据,例如,上述例子中第一TPDU数据为00 00 0e 00 a4 04 00 08 a0 00 0000 03 00 00 00 00 05,则在该步骤中解析得到的APDU数据为00 a4 04 00 08 a0 00 0000 03 00 00 00 00 05;
步骤213:智能密钥设备判断是否获取到指定长度的APDU数据,是则将获取到的APDU数据发送给虚拟机,返回步骤201;否则返回步骤201。
实施例三
本发明实施例三提供了智能密钥设备将处理结果和状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机的实现方法,如图3所示,本实施例方法包括:
步骤301:智能密钥设备判断处理结果的协议类型,如为T0则执行步骤302,如为T1则执行步骤307;
步骤302:智能密钥设备判断接收到的处理结果的长度是否大于获取的响应数据长度(Le),是则执行304,否则执行步骤303;
步骤303:智能密钥设备将处理结果和状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机;
本实施例中,处理结果的协议类型如为T0则将处理结果和状态字拼接成第二TPDU数据;再将消息头和第二TPDU数据拼接成第二CCID消息;例如,第二TPDU数据为61 5E,消息头为80 02 00 00 00 00 6e 00 00 00,则封装得到的第二CCID消息为80 02 00 00 00 006e 00 00 00 61 5e;
具体的,在本实施例中,将第二TPDU数据封装成第二CCID消息并返回给上位机,包括:
步骤P1:智能密钥设备判断第二TPDU数据的长度是否大于CCID消息最大长度,是则执行步骤P2,否则将第二TPDU数据作为当前TPDU数据组,执行步骤P5;
步骤P2:智能密钥设备根据CCID消息最大长度对第二TPDU数据进行分组,将第一个TPDU数据组作为当前TPDU数据组并将其存储到CCID缓存区中;
步骤P3:智能密钥设备将CCID缓存区中的数据封装成第二CCID消息并将其发送给上位机;
步骤P4:智能密钥设备判断所有TPDU数据组是否发送完成,是则发送数据结束,否则将下一个TPDU数据组作为当前TPDU数据组,执行步骤P5;
步骤P5:智能密钥设备判断当前TPDU数据组是否为完整的数据组,是则执行步骤P6,否则执行步骤P7;
步骤P6:智能密钥设备将当前TPDU数据组存储到CCID缓存区中,并将CCID缓存区中的数据封装成第二CCID消息并将其发送给上位机,返回步骤P4;
步骤P7:智能密钥设备将当前TPDU数据组顺序存储到CCID缓存区中。
步骤304:智能密钥设备根据响应数据长度将处理结果中对应长度的数据封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机;
步骤305:智能密钥设备判断处理结果是否全部发送完成,是则智能密钥设备将状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机;否则执行步骤306;
步骤306:智能密钥设备将处理结果中的剩余数据和状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机;
例如,在本实施例中的状态字为0x61XX;上位机接收到该响应状态字之后会发送GET RESPONSE指令获取数据,Le长度在指令中指定;
步骤307:智能密钥设备判断处理结果的长度是否大于IFSD(CCID设备数据域大小),是则执行步骤308,否则将响应数据作为当前数据,执行步骤311;
步骤308:智能密钥设备按照IFSD对处理结果进行分组;
步骤309:智能密钥设备分别将每个完整的数据组封装成第二TPDU数据,分别将每个第二TPDU数据封装成第二CCID消息并返回给上位机;
具体的,本实施例中该步骤的第二TPDU数据是T1协议信息块;例如,该步骤中一个完整的数据组为6f 5c 84 08a0 00 00 00 03 00 00 00a5 50 73 4a 06 07 2a 86 4886fc 6b 01 60 0c 06 0a 2a 86 48 86fc 6b 02 02 01 01 63 09 06 07 2a 86 48 86fc 6b 03 64 0b 06 09 2a 86 48 86fc 6b 04 02 15 65 0b 06 09 2b 85 10 86 48 6402 01 03 66 0c 06 0a 2b 06 01 04 01 2a 02 6e 01 02 9f 65 01 ff 90 00;第二TPDU数据头为00 00 60(第1字节数据为0x00,第2字节数据最高字节为0,表示为T1的I-Block,第3字节数据0x60为APDU数据的长度),封装成的第二TPDU数据为00 00 60 6f 5c 84 08a0 00 00 00 03 00 00 00 a5 50 73 4a 06 07 2a 86 48 86 fc 6b 01 60 0c 06 0a 2a86 48 86fc 6b 02 02 01 01 63 09 06 07 2a 86 48 86 fc 6b 03 64 0b 06 09 2a 8648 86 fc 6b 04 02 15 65 0b 06 09 2b 85 10 86 48 64 02 01 03 66 0c 06 0a 2b 0601 04 01 2a 02 6e 01 02 9f 65 01 ff 90 00;消息头为80 64 00 00 00 00 76 00 0000(其中,0x80表示为第二CCID消息的类型为第二消息,0x64表示第二CCID消息的数据域长度即第二TPDU数据的长度),封装成的第二CCID消息为80 64 00 00 00 00 76 00 00 0000 00 60 6f 5c 84 08 a0 00 00 00 03 00 00 00 a5 50 73 4a 06 07 2a 86 48 86 fc6b 01 60 0c 06 0a 2a 86 48 86 fc 6b 02 02 01 01 63 09 06 07 2a 86 48 86 fc 6b03 64 0b 06 09 2a 86 48 86fc 6b 04 02 15 65 0b 06 09 2b 85 10 86 48 64 02 0103 66 0c 06 0a 2b 06 01 04 01 2a 02 6e 01 02 9f 65 01 ff 90 00 20;
步骤310:智能密钥设备判断最后一个数据组是否为完整的数据组,是则智能密钥设备将状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机;否则将最后一个数据组作为当前数据,执行步骤311;
步骤311:智能密钥设备将当前数据和状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息并返回给上位机。
实施例四
本发明实施例四提供一种智能密钥设备,设备中可以设置有一个逻辑通道,该通道中有一个应用;或设备中有多个逻辑通道,每个逻辑通道中有多个应用;或设备中有多个逻辑通道,每个逻辑通道中有一个应用;或设备中只有一个逻辑通道,该逻辑通道中有多个应用。具体的,本实施例仅以设备中有一个逻辑通道,该通道中有一个应用为例进行说明,如图4所示,该设备包括虚拟机模块40、应用模块41和主体模块42;
主体模块42包括:
启动子模块420,用于在智能密钥设备上电后启动虚拟机模块40;
第一接收子模块421,用于接收上位机下发的第一CCID消息,还用于接收虚拟机模块40发送的处理结果和状态字;
第一处理子模块422,用于对第一接收子模块421接收到的第一CCID消息进行处理;
在本实施例中,第一处理子模块422具体用于对第一接收子模块422接收到的第一CCID消息进行解析得到第一TPDU数据,对第一TPDU数据解析得到APDU数据;
封装子模块423,用于将第一接收子模块421接收到的处理结果和状态字封装成第二TPDU数据,将第二TPDU数据封装成第二CCID消息;
第一发送子模块424,用于将第一处理子模块422解析得到的APDU数据发送给虚拟机模块40;还用于将封装子模块423封装得到的第二CCID消息返回给上位机;
虚拟机模块40包括:
第二接收子模块400,用于接收主体模块42发送的APDU数据,还用于接收应用模块41发送的处理结果和状态字;
第二发送子模块401,用于将第二接收子模块400接收到的APDU数据发送给当前逻辑通道中的当前应用模块41,还用于将第二接收子模块400接收到的处理结果和状态字发送给主体模块42;
第一接口子模块402,用于当第一接口被调用时,从第一接口参数中获取APDU缓存区地址和开始存储数据的偏移地址,开始接收数据并将接收到的数据存储到APDU缓存区地址中与开始存储数据的偏移地址对应的位置;
第七接口子模块403,用于当第七接口被调用时,设置通信方向为向外,记录响应数据长度,并将APDU缓存区中的数据发送给主体模块42;
应用模块41包括:
第三接收子模块410,用于接收虚拟机模块40发送的APDU数据;
具体的,在本实施例中,APDU数据包括指令;
第二处理子模块411,用于对第三接收子模块410接收到的APDU数据进行处理;
第三发送子模块412,用于将第二处理子模块411的处理结果和状态字发送给虚拟机模块40;
调用子模块413,用于根据第三接收子模块410接收到的虚拟机模块40发送的指令中的接口标识调用相应接口。
在本实施例中,虚拟机模块40还包括:
第二接口子模块,用于当第二接口被调用时,从第二接口参数中获取APDU缓存区地址和指定偏移地址,开始接收数据并将接收到的数据存储到对应于APDU缓存区地址中与指定偏移地址对应的位置;
第三接口子模块,用于当第三接口被调用时,设置通信方向为向外;
具体的,在本实施例中,第三接口子模块包括:
第一判断单元,用于判断协议类型;
第一获取单元,用于当第一判断单元判断为T1时从APDU数据中获取响应数据长度;
第二判断单元,用于当第一判断单元判断为T0时判断APDU类型;
第一转换单元,用于当第二判断单元判断为第一类型时将APDU类型转换为第二类型,将指令头的第五字节数据作为响应数据长度;
第二转换单元,用于当第二判断单元判断为第三类型时将APDU类型转换为第四类型,将最大数据长度作为响应数据长度;
第四接口子模块,用于当第四接口被调用时,记录响应数据长度;
具体的,在本实施例中,第四接口子模块包括:
第三判断单元,用于判断协议类型;
第四判断单元,用于当第三判断单元判断为T0时判断APDU类型;
在本实施例中,第四判断单元具体用于判断当前应用是否调用了第一接口和第二接口,是则判断APDU类型为第四类型,否则判断APDU类型为第二类型;
第五判断单元,用于当第四判断单元判断为第二类型时判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则记录响应数据长度;
第一设置单元,用于当第五判断单元判断为否时设置响应状态码为第一预设数据;
设置记录单元,用于当第四判断单元判断为第四类型时设置响应状态码为第二预设数据,记录第四接口参数中的响应数据长度;
第一纪录单元,用于当第三判断单元判断为T1时记录第四接口参数中的响应数据长度;
第二发送子模块401,还用于将第一设置单元和设置记录单元设置的响应状态码发送给主体模块42;
第五接口子模块,用于当第五接口被调用时,将APDU缓存区中的数据发送给主体模块;
在本实施例中,第五接口子模块有两种实现方式;
(1)第五接口子模块包括:
第六判断单元,用于判断协议类型;
第七判断单元,用于当第六判断单元判断为T0时判断响应数据长度是否小于APDU缓存区中的数据的长度;
第八判断单元,用于在第二发送子模块402根据响应数据长度将APDU缓存区中的对应长度的数据发送给主体模块41之后判断APDU缓存区中的数据是否发送完成;
第二设置单元,用于当第八判断单元判断为否时设置响应状态码为第二预设数据;
第九判断单元,用于当第六判断单元判断为T1时判断APDU缓存区中的数据的长度是否大于CCID设备数据域大小;
第一存储单元,用于当第九判断单元判断为否时将APDU缓存区中的数据存储到TPDU缓存区中;
第一分组单元,用于当第九判断单元判断为是时根据CCID设备数据域大小对APDU缓存区中的数据进行分组;
第十判断单元,用于判断是否还有未发送的数据组;
第二存储单元,用于当第十判断单元判断为是时将数据组存储到TPDU缓存区中;
第二发送子模块401,还用于将第二设置单元设置的响应状态码发送主体模块42,还用于当第七判断单元判断为是时根据响应数据长度将APDU缓存区中的对应长度的数据发送给主体模块42,第七判断单元判断为否时将APDU缓存区中的数据发送给主体模块42,还用于将第一分组单元分组得到的整个数据组封装为T1的I型数据块发送给主体模块42;
(2)第五接口子模块包括:
第十一判断单元,用于判断协议类型;
第十二判断单元,用于当第十一判断单元判断为T0时判断APDU类型;
第十三判断单元,用于当第十二判断单元判断为第二类型时判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同;
第三设置单元,用于当第十三判断单元判断为否时设置响应状态码为第一预设数据;
第十四判断单元,用于当第十二判断单元判断为第四类型时判断响应数据长度是否小于APDU缓存区中的数据的长度;
第十五判断单元,用于在第二发送子模块402根据响应数据长度将APDU缓存区中的对应长度的数据发送给主体模块42之后判断APDU缓存区中的数据是否全部发送完成;
第四设置单元,用于当第十五判断单元判断为否时设置响应状态码为第二预设数据;
第十六判断单元,用于当第十一判断单元判断为T1时判断APDU缓存区中的数据的长度的是否大于CCID设备数据域大小;
第三存储单元,用于当第十六判断单元判断为否时将APDU缓存区中的数据存储到TPDU缓存区中;
第二分组单元,用于当第十六判断单元判断为是时根据CCID设备数据域大小对APDU缓存区中的数据进行分组;
第十七判断单元,还用于判断是否还有未发送的数据组;
第四存储单元,用于当第十七判断单元判断为是时将数据组存储到TPDU缓存区中;
第二发送子模块401还用于将第三设置单元设置的响应状态码和APDU缓存区中的数据发送给主体模块42,还用于当第十三判断单元判断为是时和第十四判断单元判断为否时将APDU缓存区中的数据发送给主体模块42,还用于当第十四判断单元判断为是时根据响应数据长度将APDU缓存区中的对应长度的数据发送给主体模块42,还用于将第四设置单元设置的响应状态码发送给主体模块42;还用于将第二分组单元分组得到的整个数据组封装为T1的I型数据块发送给主体模块42;
第六接口子模块,用于当第六接口被调用时,将指定数组中的数据发送给主体模块42;
在本实施例中,第六接口子模块具体用于从第六接口中获取指定数组,将指定数组中的数据复制到APDU缓存区中,将APDU缓存区中的数据发送给主体模块42。
(一)如本实施例的智能密钥设备中有多个逻辑通道,每个逻辑通道中有多个应用,则虚拟机模块40还包括:
第一设置子模块,用于从第二接收子模块接收到的APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
第一判断子模块,用于根据APDU数据的指令头判断指令的类型;
在本实施例中,第一判断子模块,具体用于判断APDU数据的指令头的第二字节数据,如为第一数值则为逻辑通道管理指令,如为第二数值则为选择指令,如为其他数据则为其他指令;
第一获取子模块,用于当第一判断子模块判断指令的类型为逻辑通道管理指令时从逻辑通道管理指令的指令头中获取第二逻辑通道号;
第二判断子模块,用于判断逻辑通道的操作类型;
打开子模块,用于当第二判断子模块判断操作类型为打开逻辑通道时打开与第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
关闭子模块,用于当第二判断子模块判断操作类型为关闭逻辑通道时关闭与第二逻辑通道号对应的逻辑通道;
第三判断子模块,用于当第一判断子模块判断指令的类型为选择指令时判断选择指令是否为应用选择指令;
第二获取子模块,用于当第三判断子模块判断为是时从选择指令的数据域中获取应用标识符;
第四判断子模块,用于判断根据应用标识符是否找到对应的应用;
第四发送子模块,用于当第四判断子模块判断为否时将状态字发送给主体模块42;
作为子模块,用于当第四判断子模块判断为是时将找到的应用作为当前应用;
第二发送子模块401还用于当第一判断子模块判断指令的类型为其他指令时和第三判断子模块判断为否时将APDU数据发送给当前逻辑通道中的当前应用模块41;
第三接收子模块410,还用于接收虚拟机模块40发送的APDU数据;
第二处理子模块411,还用于对第三接收子模块410接收到的APDU数据进行处理。
(二)如本实施例的智能密钥设备中有多个逻辑通道,每个逻辑通道中有一个应用,则虚拟机模块40还包括:
第一设置子模块,用于从第二接收子模块接收到的APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
第五判断子模块,用于根据指令头判断指令的类型是否为逻辑通道管理指令;
第一获取子模块,用于当第五判断子模块判断为是时从逻辑通道管理指令的指令头中获取第二逻辑通道号;
第二判断子模块,用于判断逻辑通道的操作类型;
打开子模块,用于当第二判断子模块判断操作类型为打开逻辑通道时打开与第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
关闭子模块,用于当第二判断子模块判断操作类型为关闭逻辑通道时关闭与第二逻辑通道号对应的逻辑通道;
第二发送子模块401还用于当第五判断子模块判断为否时将APDU数据发送给当前逻辑通道中的当前应用模块41;
第三接收子模块410,还用于接收虚拟机模块40发送的APDU数据;
第二处理子模块411,还用于对第三接收子模块410接收到的APDU数据进行处理。
(三)如本实施例的智能密钥设备中只有一个逻辑通道,该逻辑通道中有多个应用,则虚拟机模块40还包括:
第六判断子模块,用于根据APDU数据的指令头判断指令的类型是否为选择指令;
第三判断子模块,用于当第六判断子模块判断为是时判断选择指令是否为应用选择指令;
第二获取子模块,用于从当第三判断子模块判断为是时从选择指令的数据域中获取应用标识符;
第四判断子模块,用于判断根据应用标识符是否找到对应的应用;
第四发送子模块,用于当第四判断子模块判断为否时将状态字发送给主体模块42;
作为子模块,用于当第四判断子模块判断为是时将找到的应用作为当前应用;
第二发送子模块401还用于当第六判断子模块判断和第三判断子模块为否时将APDU数据发送给当前逻辑通道中的当前应用模块41;
第三接收子模块410,还用于接收虚拟机模块40发送的APDU数据;
第二处理子模块411,还用于对第三接收子模块410接收到的APDU数据进行处理。
具体的,本实施例中的第一设置子模块具体用于从指令头的第一个字节上获取第一逻辑通道号。
具体的,本实施例中的打开子模块具体用于判断逻辑通道管理指令的指令头中第三、第四字节数据,如为第三数值,则打开一个新的逻辑通道并将其作为当前逻辑通道;如为第四数值,则打开与第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
第二发送子模块401还用于将与新的逻辑通道对应的逻辑通道号作为响应数据返回给上位机。
具体的,本实施例中的关闭子模块具体用于判断逻辑通道管理指令的指令头中第三、第四字节数据,如为第五数值则关闭当前逻辑通道;如为第六数值,则关闭与第二逻辑通道号对应的逻辑通道。
具体的,本实施例中的第三判断子模块具体用于判断APDU数据的指令头中的第三、第四字节数据是否为第七数值,是则判断选择指令为应用选择指令,否则判断选择指令不为应用选择指令。
具体的,在本实施例中,第一处理子模块422包括:
第十八判断单元,用于判断第一CCID消息的类型;
第一处理单元,用于当第十八判断单元判断第一CCID消息为其他消息时根据CCID规范对接收到的第一CCID消息进行处理;
复位操作单元,用于当第十八判断单元判断第一CCID消息为第一消息时进行复位操作生成复位应答;
第二获取单元,用于当第十八判断单元判断第一CCID消息为第二消息时从第一CCID消息的数据域中获取第一TPDU数据;
第十九判断单元,用于判断第二获取单元是否获取到指定长度的第一TPDU数据;
第二十判断单元,用于当第十九判断单元判断为是时判断接收数据的协议类型;
第一解析单元,用于当第二十判断单元判断为T0时对第一TPDU数据进行解析得到APDU数据;
第二解析单元,用于当第二十判断单元判断为T1时对接收到的第一CCID消息进行解析得到一个T1协议块;
第二十一判断单元,用于判断第二解析单元得到的T1协议块是否为T1协议信息块,
第二处理单元,用于当第二十一判断单元判断为否时按照T1协议对获取到的第一TPDU数据进行处理;
第三获取单元,用于当第二十一判断单元判断为是时从T1协议信息块的信息数据域中获取APDU数据;
第二十二判断单元,用于判断第三获取单元是否获取到指定长度的APDU数据;
封装子模块,还用于将第一处理单元和第二处理单元的处理结果封装成第二CCID消息,还用于将复位操作单元的复位应答封装成第二CCID消息;
第一发送子模块还用于当第二十二判断单元判断为是时将第三获取单元获取的APDU数据发送给虚拟机模块40。
具体的,在本实施例中,封装子模块423包括:
第二十三判断单元,用于判断处理结果的协议类型;
第二十四判断单元,用于当第二十三判断单元判断为T0时判断处理结果的长度是否大于获取的响应数据长度;
第一封装单元,用于当第二十四判断单元判断为否时将处理结果和状态字封装成第二TPDU数据;
第二封装单元,用于当第二十四判断单元判断为是时根据响应数据长度将处理结果中对应长度的数据封装成第二TPDU数据;
第二十五判断单元,用于在第一发送子模块424将第七封装单元封装好的第二CCID消息返回给上位机判断处理结果是否全部发送完成;
第三封装单元,用于当第二十五判断单元判断为否时将处理结果中的剩余数据和状态字封装成第二TPDU数据;
第二十六判断单元,用于当第二十三判断单元判断为T1时判断处理结果的长度是否大于CCID设备数据域大小;
第一作为单元,用于当第二十六判断单元判断为否时将处理结果作为当前数据;
第三分组单元,用于当第二十六判断单元判断为是时按照CCID设备数据域大小对处理结果进行分组;
第四封装单元,用于分别将第三分组单元的每个完整的数据组封装成第二TPDU数据;
第二十七判断单元,用于判断最后一个数据组是否为完整的数据组;
第二作为单元,用于当第二十七判断单元判断为否时将最后一个数据组作为当前数据;
第五封装单元,用于当第二十五判断单元判断为是时和第二十七判断单元判断为是时将状态字封装成第二TPDU数据;
第六封装单元,用于分别将第一作为单元和第二作为单元的当前数据、状态字封装成第二TPDU数据;
第七封装单元,用于将第一封装单元、第二封装单元、第三封装单元、第四封装单元、第五封装单元和第六封装单元的第二TPDU数据封装成第二CCID消息;
具体的,在本实施例中,第七封装单元包括:
第一判断子单元,用于判断第二TPDU数据的长度是否大于CCID消息最大长度;
第一作为子单元,用于当第一判断子单元判断为否时将第二TPDU数据作为当前TPDU数据组;
第一分组子单元,用于当第一判断子单元判断为是时根据CCID消息最大长度对第二TPDU数据进行分组,将第一个TPDU数据组作为当前TPDU数据组并将其存储到CCID缓存区中;
第二判断子单元,用于在第一发送子模块424将封装子单元封装好的第二CCID消息返回给上位机之后判断所有TPDU数据组是否发送完成;
第二作为子单元,用于当第二判断子单元判断为否时将下一个TPDU数据组作为当前TPDU数据组;
第三判断子单元,用于判断第一作为子单元和第二作为子单元的当前TPDU数据组是否为完整的数据组;
第一存储子单元,用于当第三判断子单元判断为是时将当前TPDU数据组存储到CCID缓存区中;
封装子单元,用于将第一分组子单元和第一存储子单元存储到CCID缓存区中的数据封装成第二CCID消息;
第二存储子单元,用于当第三判断子单元判断为否时将当前TPDU数据组顺序存储到CCID缓存区中。
本实施例提供了一种自定义功能的智能密钥设备,智能密钥设备内置Java虚拟机,符合GlobalPlatform规范和Java卡规范,是一种智能密钥设备形式的Java卡。支持多种算法,并提供了Java卡应用编程接口,用户可以自行开发符合自己功能需求的Java卡片应用下载到智能密钥设备中,同时支持多个不同功能的应用,真正的实现一个密钥设备多应用。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。

Claims (38)

1.一种智能密钥设备的工作方法,其特征在于,包括:
步骤S1:智能密钥设备上电,启动内部设置的虚拟机;
步骤S2:当智能密钥设备接收到上位机下发的第一CCID消息时对其进行处理,包括:智能密钥设备对接收到的第一CCID消息进行解析得到第一TPDU数据,对所述第一TPDU数据解析得到APDU数据并将其发送给所述虚拟机;
步骤S3:所述虚拟机将接收到的APDU数据发送给当前逻辑通道中的当前应用进行处理,所述虚拟机接收当前应用返回的处理结果和状态字,并将所述处理结果和状态字发送给所述智能密钥设备;
步骤S4:所述智能密钥设备将所述处理结果和所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给上位机,返回步骤S2;
所述APDU数据包括指令,所述方法还包括:若当前逻辑通道中的当前应用接收到虚拟机发送的指令时,根据所述指令中的接口标识调用相应接口;
若当前应用调用第一接口时,所述虚拟机从第一接口参数中获取APDU缓存区地址和开始存储数据的偏移地址,开始接收数据并将接收到的数据存储到所述APDU缓存区地址中与所述开始存储数据的偏移地址对应的位置;所述第一接口为APDU.setIncomingAndReceive();
若当前应用调用第七接口时,所述虚拟机设置通信方向为向外,所述虚拟机记录响应数据长度,并将所述APDU缓存区中的数据发送给所述智能密钥设备;所述第七接口为APDU.setOutgoingAndSend()。
2.如权利要求1所述的方法,其特征在于,还包括:
若当前应用调用第二接口,所述虚拟机从第二接口参数中获取APDU缓存区地址和指定偏移地址,开始接收数据并将接收到的数据存储到对应于所述APDU缓存区地址中与所述指定偏移地址对应的位置;所述第二接口为APDU.receiveBytes();
若当前应用调用第三接口时,所述虚拟机设置通信方向为向外;所述第三接口为APDU.setOutgoing();
若当前应用调用第四接口时,所述虚拟机记录响应数据长度;所述第四接口为APDU.setOutgoingLength();
若当前应用调用第五接口时,所述虚拟机将APDU缓存区中的数据发送给所述智能密钥设备;所述第五接口为APDU.sendBytes();
若当前应用调用第六接口时,所述虚拟机将指定数组中的数据发送给所述智能密钥设备;所述第六接口为APDU.sendBytesLong()。
3.如权利要求1所述的方法,其特征在于,在所述步骤S2与所述步骤S3之间包括:
步骤A1:当所述虚拟机接收到APDU数据时从所述APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
步骤A2:所述虚拟机根据所述指令头判断指令的类型,如为逻辑通道管理指令则执行步骤A3,如为选择指令则执行步骤A7,如为其他指令则执行步骤S3;
步骤A3:所述虚拟机从逻辑通道管理指令的指令头中获取第二逻辑通道号;
步骤A4:所述虚拟机判断逻辑通道的操作类型,如为打开逻辑通道则执行步骤A5,如为关闭逻辑通道则执行步骤A6;
步骤A5:所述虚拟机打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,返回步骤S2;
步骤A6:所述虚拟机关闭与所述第二逻辑通道号对应的逻辑通道,返回步骤S2;
步骤A7:所述虚拟机判断所述选择指令是否为应用选择指令,是则执行步骤A8,否则执行步骤S3;
步骤A8:所述虚拟机从所述选择指令的数据域中获取应用标识符;
步骤A9:所述虚拟机判断根据所述应用标识符是否找到对应的应用,是则执行步骤A11,否则执行步骤A10;
步骤A10:所述虚拟机将状态字发送给所述智能密钥设备,执行步骤S4;
步骤A11:所述虚拟机将找到的应用作为当前应用,并将所述选择指令发送给当前逻辑通道中的当前应用进行处理,虚拟机接收当前应用返回的处理结果和状态字,并将所述处理结果和状态字发送给所述智能密钥设备,执行步骤S4。
4.如权利要求1所述的方法,其特征在于,在所述步骤S2与所述步骤S3之间包括:
步骤B1:当所述虚拟机接收到APDU数据时从所述APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
步骤B2:所述虚拟机根据所述指令头判断指令的类型是否为逻辑通道管理指令,是则执行步骤B3,否则执行步骤S3;
步骤B3:所述虚拟机从逻辑通道管理指令的指令头中获取第二逻辑通道号;
步骤B4:所述虚拟机判断逻辑通道的操作类型,如为打开逻辑通道则执行步骤B5,如为关闭逻辑通道则执行步骤B6;
步骤B5:所述虚拟机打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,返回步骤S2;
步骤B6:所述虚拟机关闭与所述第二逻辑通道号对应的逻辑通道,返回步骤S2。
5.如权利要求1所述的方法,其特征在于,在所述步骤S2与所述步骤S3之间包括:
步骤C1:所述虚拟机根据指令头判断APDU数据的类型是否为选择指令,是则执行步骤C2,否则执行步骤S3;
步骤C2:所述虚拟机判断所述选择指令是否为应用选择指令,是则执行步骤C3,否则执行步骤S3;
步骤C3:所述虚拟机从所述选择指令的数据域中获取应用标识符;
步骤C4:所述虚拟机判断根据所述应用标识符是否找到对应的应用,是则执行步骤C6,否则执行步骤C5;
步骤C5:所述虚拟机将状态字发送给所述智能密钥设备,执行步骤S4;
步骤C6:所述虚拟机将找到的应用作为当前应用,并将所述选择指令发送给当前逻辑通道中的当前应用进行处理,所述虚拟机接收当前应用返回的处理结果和状态字,并将所述处理结果和所述状态字发送给所述智能密钥设备,执行步骤S4。
6.如权利要求3或4所述的方法,其特征在于,所述从所述APDU数据的指令头中获取第一逻辑通道号具体为:从所述指令头的第一个字节上获取第一逻辑通道号。
7.如权利要求3所述的方法,其特征在于,所述步骤A2包括:所述虚拟机判断所述指令头的第二字节数据,如为第一数值则为逻辑通道管理指令,如为第二数值则为选择指令,如为其他数据则为其他指令。
8.如权利要求3或4所述的方法,其特征在于,所述虚拟机打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道,包括:所述虚拟机判断所述逻辑通道管理指令的指令头中第三、第四字节数据,如为第三数值,则打开一个新的逻辑通道并将其作为当前逻辑通道,并将与所述新的逻辑通道对应的逻辑通道号作为响应数据返回给所述上位机;如为第四数值,则打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道。
9.如权利要求3或4所述的方法,其特征在于,所述虚拟机关闭与所述第二逻辑通道号对应的逻辑通道包括:所述虚拟机判断逻辑通道管理指令的指令头中第三、第四字节数据,如为第五数值则关闭当前逻辑通道;如为第六数值,则关闭与所述第二逻辑通道号对应的逻辑通道。
10.如权利要求3或5所述的方法,其特征在于,所述虚拟机判断选择指令是否为应用选择指令,包括:所述虚拟机判断所述指令头中的第三、第四字节数据是否为第七数值,是则所述选择指令为应用选择指令,否则所述选择指令不为应用选择指令。
11.如权利要求2所述的方法,其特征在于,所述虚拟机设置通信方向为向外,包括:
步骤k1:所述虚拟机判断协议类型,如为T1则执行步骤k2,如为T0则执行步骤k3;
步骤k2:所述虚拟机从所述APDU数据中获取响应数据长度;
步骤k3:所述虚拟机判断APDU类型,如为第一类型则执行步骤k4,如为第三类型则执行步骤k5;
步骤k4:所述虚拟机将所述APDU类型转换为第二类型,将所述指令头的第五字节数据作为响应数据长度;
步骤k5:所述虚拟机将所述APDU类型转换为第四类型,将最大数据长度作为响应数据长度。
12.如权利要求2所述的方法,其特征在于,所述虚拟机记录响应数据长度,包括:
步骤d1:所述虚拟机判断协议类型,如为T0则执行步骤d2,如为T1则执行步骤d6;
步骤d2:所述虚拟机判断APDU类型,如为第二类型则执行步骤d3,如为第四类型则执行步骤d5;
步骤d3:所述虚拟机判断所述第四接口的参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则记录响应数据长度,否则执行步骤d4;
步骤d4:所述虚拟机设置响应状态码为第一预设数据并将其发送给所述智能密钥设备;
步骤d5:所述虚拟机设置响应状态码为第二预设数据并将其发送给所述智能密钥设备,记录所述第四接口参数中的响应数据长度;
步骤d6:所述虚拟机记录所述第四接口参数中的响应数据长度。
13.如权利要求12所述的方法,其特征在于,所述步骤d2包括:所述虚拟机判断当前应用是否调用了第一接口和第二接口,是则APDU类型为第四类型,否则APDU类型为第二类型。
14.如权利要求2所述的方法,其特征在于,所述将APDU缓存区中的数据发送给智能密钥设备;包括:
步骤f1:所述虚拟机判断协议类型,如为T0则执行步骤f2,如为T1则执行步骤f7;
步骤f2:所述虚拟机判断响应数据长度是否小于所述APDU缓存区中的数据的长度,是则执行步骤f4,否则执行步骤f3;
步骤f3:所述虚拟机将所述APDU缓存区中的数据发送给智能密钥设备;
步骤f4:所述虚拟机根据响应数据长度将所述APDU缓存区中的对应长度的数据发送给智能密钥设备,执行步骤f5;
步骤f5:所述虚拟机判断所述APDU缓存区中的数据是否发送完成,是则结束,否则执行步骤f6;
步骤f6:所述虚拟机设置响应状态码为第二预设数据并发送给智能密钥设备;
步骤f7:所述虚拟机判断所述APDU缓存区中的数据的长度是否大于CCID设备数据域大小,是则执行步骤f8,否则将所述APDU缓存区中的数据存储到TPDU缓存区中;
步骤f8:虚拟机根据CCID设备数据域大小对所述APDU缓存区中的数据进行分组,并分别将整个数据组封装为T1的I型数据块发送给智能密钥设备;
步骤f9:虚拟机判断是否还有未发送的数据组,是则将数据组存储到所述TPDU缓存区中,结束,否则结束。
15.如权利要求2所述的方法,其特征在于,所述将APDU缓存区中的数据发送给智能密钥设备;包括:
步骤h1:所述虚拟机判断协议类型,如为T0则执行步骤h2,如为T1则执行步骤h10;
步骤h2:所述虚拟机判断APDU类型,如为第二类型则执行步骤h3,如为第四类型则执行步骤h6;
步骤h3:所述虚拟机判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则执行步骤h5,否则执行步骤h4;
步骤h4:所述虚拟机设置响应状态码为第一预设数据并将其发送给智能密钥设备,执行步骤h5;
步骤h5:所述虚拟机将所述APDU缓存区中的数据发送给智能密钥设备;
步骤h6:所述虚拟机判断响应数据长度是否小于APDU缓存区中的数据的长度,是则执行步骤h7,否则将所述APDU缓存区中的数据发送给智能密钥设备;
步骤h7:所述虚拟机根据所述响应数据长度将所述APDU缓存区中的对应长度的数据发送给所述智能密钥设备;
步骤h8:所述虚拟机判断所述APDU缓存区中的数据是否全部发送完成,是则结束,否则执行步骤h9;
步骤h9:所述虚拟机设置响应状态码为第二预设数据并发送给智能密钥设备;
步骤h10:所述虚拟机判断所述APDU缓存区中的数据的长度是否大于CCID设备数据域大小,是则执行步骤h11,否则将所述APDU缓存区中的数据存储到TPDU缓存区中;
步骤h11:所述虚拟机根据CCID设备数据域大小对所述APDU缓存区中的数据进行分组,并分别将整个数据组封装为T1的I型数据块发送给智能密钥设备;
步骤h12:所述虚拟机判断是否还有未发送的数据组,是则将数据组存储到所述TPDU缓存区中,结束,否则结束。
16.如权利要求2所述的方法,其特征在于,所述虚拟机将指定数组中的数据发送给所述智能密钥设备,包括:
所述虚拟机从第六接口中获取指定数组,将指定数组中的数据复制到APDU缓存区中,将所述APDU缓存区中的数据发送给智能密钥设备。
17.如权利要求1所述的方法,其特征在于,所述步骤S2中所述当智能密钥设备接收到上位机下发的第一CCID消息时对其进行处理包括:
步骤Y1:所述智能密钥设备等待并接收第一CCID消息;
步骤Y2:当所述智能密钥设备接收到第一CCID消息时,判断所述第一CCID消息的类型,如为第一消息则执行步骤Y3,如为第二消息则执行步骤Y5,如为其他则根据CCID规范对接收到的所述第一CCID消息进行处理,将处理结果封装成第二CCID消息并返回给上位机,返回步骤Y1;所述第一消息为主机发送给智能密钥设备的上电消息,所述第二消息为主机发送给智能密钥设备的数据组消息;
步骤Y3:所述智能密钥设备进行复位操作生成复位应答;
步骤Y4:所述智能密钥设备将所述复位应答封装成第二CCID消息并将其返回给上位机,返回步骤Y1;
步骤Y5:所述智能密钥设备从所述第一CCID消息的数据域中获取第一TPDU数据;
步骤Y6:所述智能密钥设备判断是否获取到指定长度的第一TPDU数据,是则执行步骤Y7,否则返回步骤Y1;
步骤Y7:所述智能密钥设备判断接收数据的协议类型,如为T0则执行步骤Y8,如为T1则执行步骤Y10;
步骤Y8:所述智能密钥设备对所述第一TPDU数据进行解析得到APDU数据;
步骤Y9:所述智能密钥设备将所述APDU数据发送给所述虚拟机,返回步骤Y1;
步骤Y10:所述智能密钥设备对接收到的所述第一CCID消息进行解析得到一个T1协议块;
步骤Y11:所述智能密钥设备判断得到的所述T1协议块是否为T1协议信息块,是则执行步骤Y12,否则按照T1协议对获取到的所述第一TPDU数据进行处理,将处理结果封装成第二CCID消息并返回给上位机,返回步骤Y1;
步骤Y12:所述智能密钥设备从所述T1协议信息块的信息数据域中获取APDU数据;
步骤Y13:所述智能密钥设备判断是否获取到指定长度的APDU数据,是则将APDU数据发送给虚拟机,返回步骤Y1,否则返回步骤Y1。
18.如权利要求1所述的方法,其特征在于,所述步骤S4包括:
步骤K1:所述智能密钥设备判断处理结果的协议类型,如为T0则执行步骤K2,如为T1则执行步骤K7;
步骤K2:所述智能密钥设备判断所述处理结果的长度是否大于获取的响应数据长度,是则执行K4,否则执行步骤K3;
步骤K3:所述智能密钥设备将所述处理结果和所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2;
步骤K4:所述智能密钥设备根据所述响应数据长度将所述处理结果中对应长度的数据封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,执行步骤K5;
步骤K5:所述智能密钥设备判断所述处理结果是否全部发送完成,是则所述智能密钥设备将所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2;否则执行步骤K6;
步骤K6:所述智能密钥设备将所述处理结果中的剩余数据和所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2;
步骤K7:所述智能密钥设备判断所述处理结果的长度是否大于CCID设备数据域大小,是则执行步骤K8,否则将所述处理结果作为当前数据,执行步骤K11;
步骤K8:所述智能密钥设备按照CCID设备数据域大小对所述处理结果进行分组;
步骤K9:所述智能密钥设备分别将每个完整的数据组封装成第二TPDU数据,分别将每个第二TPDU数据封装成第二CCID消息并返回给所述上位机;
步骤K10:所述智能密钥设备判断最后一个数据组是否为完整的数据组,是则所述智能密钥设备将所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2;否则将最后一个数据组作为当前数据,执行步骤K11;
步骤K11:所述智能密钥设备将所述当前数据和所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息并返回给所述上位机,返回步骤S2。
19.如权利要求18所述的方法,其特征在于,所述将第二TPDU数据封装成第二CCID消息并返回给上位机包括:
步骤P1:所述智能密钥设备判断第二TPDU数据的长度是否大于CCID消息最大长度,是则执行步骤P2,否则将第二TPDU数据作为当前TPDU数据组,执行步骤P5;
步骤P2:所述智能密钥设备根据CCID消息最大长度对所述第二TPDU数据进行分组,将第一个TPDU数据组作为当前TPDU数据组并将其存储到CCID缓存区中;
步骤P3:所述智能密钥设备将所述CCID缓存区中的数据封装成第二CCID消息并将其发送给上位机;
步骤P4:所述智能密钥设备判断所有TPDU数据组是否发送完成,是则发送数据结束,否则将下一个TPDU数据组作为当前TPDU数据组,执行步骤P5;
步骤P5:所述智能密钥设备判断当前TPDU数据组是否为完整的数据组,是则执行步骤P6,否则执行步骤P7;
步骤P6:所述智能密钥设备将所述当前TPDU数据组存储到所述CCID缓存区中,将CCID缓存区中的数据封装成第二CCID消息并将其发送给上位机,返回步骤P4;
步骤P7:所述智能密钥设备将所述当前TPDU数据组顺序存储到所述CCID缓存区中。
20.一种智能密钥设备,其特征在于,包括虚拟机模块、应用模块和主体模块;
所述主体模块包括:
启动子模块,用于在所述智能密钥设备上电后启动所述虚拟机模块;
第一接收子模块,用于接收上位机下发的第一CCID消息,还用于接收所述虚拟机模块发送的处理结果和状态字;
第一处理子模块,用于对所述第一接收子模块接收到的所述第一CCID消息进行处理,所述第一处理子模块具体用于对所述第一接收子模块接收到的所述第一CCID消息进行解析得到第一TPDU数据,对所述第一TPDU数据解析得到APDU数据;
封装子模块,用于将所述第一接收子模块接收到的所述处理结果和所述状态字封装成第二TPDU数据,将所述第二TPDU数据封装成第二CCID消息;
第一发送子模块,用于将所述第一处理子模块解析得到的APDU数据发送给所述虚拟机模块;还用于将所述封装子模块封装得到的第二CCID消息返回给所述上位机;
所述虚拟机模块包括:
第二接收子模块,用于接收所述主体模块发送的APDU数据,还用于接收应用模块发送的处理结果和状态字;
第二发送子模块,用于将所述第二接收子模块接收到的所述APDU数据发送给当前逻辑通道中的当前应用模块,还用于将所述第二接收子模块接收到的所述处理结果和所述状态字发送给所述主体模块;
第一接口子模块,用于当第一接口被调用时,从所述第一接口的参数中获取APDU缓存区地址和开始存储数据的偏移地址,开始接收数据并将接收到的数据存储到所述APDU缓存区地址中与所述开始存储数据的偏移地址对应的位置;所述第一接口为APDU.setIncomingAndReceive();
第七接口子模块,用于当第七接口被调用时,设置通信方向为向外,记录响应数据长度,并将所述APDU缓存区中的数据发送给所述主体模块;所述第七接口为APDU.setOutgoingAndSend();
所述应用模块包括:
第三接收子模块,用于接收所述虚拟机模块发送的APDU数据,所述APDU数据包括指令;
第二处理子模块,用于对所述第三接收子模块接收到的所述APDU数据进行处理;
第三发送子模块,用于将所述第二处理子模块的处理结果和状态字发送给所述虚拟机模块;
调用子模块,用于根据所述第三接收子模块接收到虚拟机模块发送的指令中的接口标识调用相应接口。
21.如权利要求20所述的设备,其特征在于,所述虚拟机模块还包括:
第二接口子模块,用于当第二接口被调用时,从第二接口参数中获取APDU缓存区地址和指定偏移地址,开始接收数据并将接收到的数据存储到对应于所述APDU缓存区地址中与所述指定偏移地址对应的位置;所述第二接口为APDU.receiveBytes();
第三接口子模块,用于当第三接口被调用时,设置通信方向为向外;所述第三接口为APDU.setOutgoing();
第四接口子模块,用于当第四接口被调用时,记录响应数据长度;所述第四接口为APDU.setOutgoingLength();
第五接口子模块,用于当第五接口被调用时,将APDU缓存区中的数据发送给所述主体模块;所述第五接口为APDU.sendBytes();
第六接口子模块,用于当第六接口被调用时,将指定数组中的数据发送给所述主体模块;所述第六接口为APDU.sendBytesLong()。
22.如权利要求20所述的设备,其特征在于,所述虚拟机模块还包括:
第一设置子模块,用于从所述第二接收子模块接收到的所述APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
第一判断子模块,用于根据所述APDU数据的指令头判断指令的类型;
第一获取子模块,用于当所述第一判断子模块判断指令的类型为逻辑通道管理指令时从所述逻辑通道管理指令的指令头中获取第二逻辑通道号;
第二判断子模块,用于判断逻辑通道的操作类型;
打开子模块,用于当所述第二判断子模块判断操作类型为打开逻辑通道时打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
关闭子模块,用于当所述第二判断子模块判断操作类型为关闭逻辑通道时关闭与所述第二逻辑通道号对应的逻辑通道;
第三判断子模块,用于当所述第一判断子模块判断指令的类型为选择指令时判断选择指令是否为应用选择指令;
第二获取子模块,用于当所述第三判断子模块判断为是时从所述选择指令的数据域中获取应用标识符;
第四判断子模块,用于判断根据所述应用标识符是否找到对应的应用;
第四发送子模块,用于当所述第四判断子模块判断为否时将状态字发送给所述主体模块;
作为子模块,用于当所述第四判断子模块判断为是时将找到的应用作为当前应用;
所述第二发送子模块还用于当所述第一判断子模块判断指令的类型为其他指令时和所述第三判断子模块判断为否时将所述APDU数据发送给当前逻辑通道中的当前应用模块;
所述第三接收子模块,还用于接收所述虚拟机模块发送的所述APDU数据;
所述第二处理子模块,还用于对所述第三接收子模块接收到的所述APDU数据进行处理。
23.如权利要求20所述的设备,其特征在于,所述虚拟机模块还包括:
第一设置子模块,用于从所述第二接收子模块接收到的所述APDU数据的指令头中获取第一逻辑通道号并将对应的逻辑通道设置为当前逻辑通道;
第五判断子模块,用于根据所述指令头判断指令的类型是否为逻辑通道管理指令;
第一获取子模块,用于当所述第五判断子模块判断为是时从逻辑通道管理指令的指令头中获取第二逻辑通道号;
第二判断子模块,用于判断逻辑通道的操作类型;
打开子模块,用于当所述第二判断子模块判断操作类型为打开逻辑通道时打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
关闭子模块,用于当所述第二判断子模块判断操作类型为关闭逻辑通道时关闭与所述第二逻辑通道号对应的逻辑通道;
所述第二发送子模块还用于当所述第五判断子模块判断为否时将所述APDU数据发送给当前逻辑通道中的当前应用;
所述第三接收子模块,还用于接收所述虚拟机模块发送的所述APDU数据;
所述第二处理子模块,还用于对所述第三接收子模块接收到的所述APDU数据进行处理。
24.如权利要求20所述的设备,其特征在于,所述虚拟机模块还包括:
第六判断子模块,用于根据所述APDU数据的指令头判断指令的类型是否为选择指令;
第三判断子模块,用于当所述第六判断子模块判断为是时判断所述选择指令是否为应用选择指令;
第二获取子模块,用于从当所述第三判断子模块判断为是时从所述选择指令的数据域中获取应用标识符;
第四判断子模块,用于判断根据所述应用标识符是否找到对应的应用;
第四发送子模块,用于当所述第四判断子模块判断为否时将状态字发送给所述主体模块;
作为子模块,用于当所述第四判断子模块判断为是时将找到的应用作为当前应用;
所述第二发送子模块还用于当所述第六判断子模块和所述第三判断子模块判断为否时将所述APDU数据发送给当前逻辑通道中的当前应用;
所述第三接收子模块,还用于接收所述虚拟机模块发送的所述APDU数据;
所述第二处理子模块,还用于对所述第三接收子模块接收到的所述APDU数据进行处理。
25.如权利要求22或23所述的设备,其特征在于,所述第一设置子模块具体用于从所述指令头的第一个字节上获取第一逻辑通道号。
26.如权利要求22所述的设备,其特征在于,所述第一判断子模块,具体用于判断所述APDU数据的指令头的第二字节数据,如为第一数值则为逻辑通道管理指令,如为第二数值则为选择指令,如为其他数据则为其他指令。
27.如权利要求22或23所述的设备,其特征在于,所述打开子模块具体用于判断所述逻辑通道管理指令的指令头中第三、第四字节数据,如为第三数值,则打开一个新的逻辑通道并将其作为当前逻辑通道;如为第四数值,则打开与所述第二逻辑通道号对应的逻辑通道并将其作为当前逻辑通道;
所述第二发送子模块还用于将与所述新的逻辑通道对应的逻辑通道号作为响应数据返回给所述上位机。
28.如权利要求22或23所述的设备,其特征在于,所述关闭子模块具体用于判断逻辑通道管理指令的指令头中第三、第四字节数据,如为第五数值则关闭当前逻辑通道;如为第六数值,则关闭与所述第二逻辑通道号对应的逻辑通道。
29.如权利要求22或24所述的设备,其特征在于,所述第三判断子模块具体用于判断所述APDU数据的指令头中的第三、第四字节数据是否为第七数值,是则判断选择指令为应用选择指令,否则判断选择指令不为应用选择指令。
30.如权利要求21所述的设备,其特征在于,所述第三接口子模块包括:
第一判断单元,用于判断协议类型;
第一获取单元,用于当所述第一判断单元判断为T1时从所述APDU数据中获取响应数据长度;
第二判断单元,用于当所述第一判断单元判断为T0时判断APDU类型;
第一转换单元,用于当所述第二判断单元判断为第一类型时将所述APDU类型转换为第二类型,将所述指令头的第五字节数据作为响应数据长度;
第二转换单元,用于当所述第二判断单元判断为第三类型时将所述APDU类型转换为第四类型,将最大数据长度作为响应数据长度。
31.如权利要求21所述的设备,其特征在于,所述第四接口子模块包括:
第三判断单元,用于判断协议类型;
第四判断单元,用于当所述第三判断单元判断为T0时判断APDU类型;
第五判断单元,用于当所述第四判断单元判断为第二类型时判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同,是则记录响应数据长度;
第一设置单元,用于当所述第五判断单元判断为否时设置响应状态码为第一预设数据;
设置记录单元,用于当所述第四判断单元判断为第四类型时设置响应状态码为第二预设数据,记录所述第四接口参数中的响应数据长度;
第一纪录单元,用于当所述第三判断单元判断为T1时记录所述第四接口参数中的响应数据长度;
第二发送子模块,还用于将所述第一设置单元和所述设置记录单元设置的响应状态码发送给所述主体模块。
32.如权利要求31所述的设备,其特征在于,所述第四判断单元具体用于判断当前应用是否调用了第一接口和第二接口,是则判断APDU类型为第四类型,否则判断APDU类型为第二类型。
33.如权利要求21所述的设备,其特征在于,所述第五接口子模块包括:
第六判断单元,用于判断协议类型;
第七判断单元,用于当所述第六判断单元判断为T0时判断响应数据长度是否小于所述APDU缓存区中的数据的长度;
第八判断单元,用于在所述第二发送子模块根据响应数据长度将APDU缓存区中的对应长度的数据发送给所述主体模块之后判断APDU缓存区中的数据是否发送完成;
第二设置单元,用于当第八判断单元判断为否时设置响应状态码为第二预设数据;
第九判断单元,用于当所述第六判断单元判断为T1时判断所述APDU缓存区中的数据的长度是否大于CCID设备数据域大小;
第一存储单元,用于当所述第九判断单元判断为否时将所述APDU缓存区中的数据存储到TPDU缓存区中;
第一分组单元,用于当所述第九判断单元判断为是时根据CCID设备数据域大小对所述APDU缓存区中的数据进行分组;
第十判断单元,用于判断是否还有未发送的数据组;
第二存储单元,用于当所述第十判断单元判断为是时将数据组存储到所述TPDU缓存区中;
所述第二发送子模块,还用于将所述第二设置单元设置的响应状态码发送给所述主体模块,还用于当所述第七判断单元判断为是时根据响应数据长度将APDU缓存区中的对应长度的数据发送给所述主体模块,所述第七判断单元判断为否时将APDU缓存区中的数据发送给所述主体模块,还用于将所述第一分组单元分组得到的整个数据组封装为T1的I型数据块发送给所述主体模块。
34.如权利要求21所述的设备,其特征在于,所述第五接口子模块包括:
第十一判断单元,用于判断协议类型;
第十二判断单元,用于当第十一判断单元判断为T0时判断APDU类型;
第十三判断单元,用于当第十二判断单元判断为第二类型时判断第四接口参数中的响应数据长度与第三接口中获取的响应数据长度是否相同;
第三设置单元,用于当所述第十三判断单元判断为否时设置响应状态码为第一预设数据;
第十四判断单元,用于当第十二判断单元判断为第四类型时判断响应数据长度是否小于APDU缓存区中的数据的长度;
第十五判断单元,用于在所述第二发送子模块根据响应数据长度将APDU缓存区中的对应长度的数据发送给所述主体模块之后判断所述APDU缓存区中的数据是否全部发送完成;
第四设置单元,用于当所述第十五判断单元判断为否时设置响应状态码为第二预设数据;
第十六判断单元,用于当第十一判断单元判断为T1时判断所述APDU缓存区中的数据的长度的是否大于CCID设备数据域大小;
第三存储单元,用于当所述第十六判断单元判断为否时将所述APDU缓存区中的数据存储到TPDU缓存区中;
第二分组单元,用于当所述第十六判断单元判断为是时根据CCID设备数据域大小对所述APDU缓存区中的数据进行分组;
第十七判断单元,还用于判断是否还有未发送的数据组;
第四存储单元,用于当所述第十七判断单元判断为是时将数据组存储到所述TPDU缓存区中;
所述第二发送子模块还用于将所述第三设置单元设置的响应状态码和APDU缓存区中的数据发送给所述主体模块,还用于当所述第十三判断单元判断为是时和所述第十四判断单元判断为否时将APDU缓存区中的数据发送给所述主体模块,还用于当所述第十四判断单元判断为是时根据响应数据长度将APDU缓存区中的对应长度的数据发送给所述主体模块,还用于将所述第四设置单元设置的响应状态码发送给所述主体模块;还用于将所述第二分组单元分组得到的整个数据组封装为T1的I型数据块发送给所述主体模块。
35.如权利要求21所述的设备,其特征在于,所述第六接口子模块具体用于从第六接口中获取指定数组,将指定数组中的数据复制到APDU缓存区中,将所述APDU缓存区中的数据发送给所述主体模块。
36.如权利要求20所述的设备,其特征在于,所述第一处理子模块包括:
第十八判断单元,用于判断第一CCID消息的类型;
第一处理单元,用于当所述第十八判断单元判断第一CCID消息为其他消息时根据CCID规范对接收到的所述第一CCID消息进行处理;
复位操作单元,用于当所述第十八判断单元判断第一CCID消息为第一消息时进行复位操作生成复位应答;所述第一消息为主机发送给智能密钥设备的上电消息;
第二获取单元,用于当所述第十八判断单元判断第一CCID消息为第二消息时从所述第一CCID消息的数据域中获取第一TPDU数据;所述第二消息为主机发送给智能密钥设备的数据组消息;
第十九判断单元,用于判断所述第二获取单元是否获取到指定长度的第一TPDU数据;
第二十判断单元,用于当所述第十九判断单元判断为是时判断接收数据的协议类型;
第一解析单元,用于当所述第二十判断单元判断为T0时对所述第一TPDU数据进行解析得到APDU数据;
第二解析单元,用于当所述第二十判断单元判断为T1时对接收到的所述第一CCID消息进行解析得到一个T1协议块;
第二十一判断单元,用于判断所述第二解析单元得到的所述T1协议块是否为T1协议信息块,
第二处理单元,用于当所述第二十一判断单元判断为否时按照T1协议对获取到的所述第一TPDU数据进行处理;
第三获取单元,用于当所述第二十一判断单元判断为是时从所述T1协议信息块的信息数据域中获取APDU数据;
第二十二判断单元,用于判断所述第三获取单元是否获取到指定长度的APDU数据;
封装子模块,还用于将所述第一处理单元和第二处理单元的处理结果封装成第二CCID消息,还用于将所述复位操作单元的复位应答封装成第二CCID消息;
所述第一发送子模块还用于当所述第二十二判断单元判断为是时将所述第三获取单元获取的APDU数据发送给虚拟机模块。
37.如权利要求20所述的设备,其特征在于,所述封装子模块包括:
第二十三判断单元,用于判断处理结果的协议类型;
第二十四判断单元,用于当所述第二十三判断单元判断为T0时判断所述处理结果的长度是否大于获取的响应数据长度;
第一封装单元,用于当所述第二十四判断单元判断为否时将所述处理结果和所述状态字封装成第二TPDU数据;
第二封装单元,用于当所述第二十四判断单元判断为是时根据所述响应数据长度将所述处理结果中对应长度的数据封装成第二TPDU数据;
第二十五判断单元,用于在所述第一发送子模块将第七封装单元封装好的第二CCID消息返回给所述上位机之后判断处理结果是否全部发送完成;
第三封装单元,用于当所述第二十五判断单元判断为否时将所述处理结果中的剩余数据和所述状态字封装成第二TPDU数据;
第二十六判断单元,用于当所述第二十三判断单元判断为T1时判断所述处理结果的长度是否大于CCID设备数据域大小;
第一作为单元,用于当所述第二十六判断单元判断为否时将所述处理结果作为当前数据;
第三分组单元,用于当所述第二十六判断单元判断为是时按照CCID设备数据域大小对所述处理结果进行分组;
第四封装单元,用于分别将所述第三分组单元的每个完整的数据组封装成第二TPDU数据;
第二十七判断单元,用于判断最后一个数据组是否为完整的数据组;
第二作为单元,用于当第二十七判断单元判断为否时将最后一个数据组作为当前数据;
第五封装单元,用于当所述第二十五判断单元判断为是时和第二十七判断单元判断为是时将状态字封装成第二TPDU数据;
第六封装单元,用于分别将所述第一作为单元和第二作为单元的所述当前数据、所述状态字封装成第二TPDU数据;
所述第七封装单元,用于将所述第一封装单元、第二封装单元、第三封装单元、第四封装单元、第五封装单元和第六封装单元的第二TPDU数据封装成第二CCID消息。
38.如权利要求37所述的设备,其特征在于,所述第七封装单元包括:
第一判断子单元,用于判断第二TPDU数据的长度是否大于CCID消息最大长度;
第一作为子单元,用于当所述第一判断子单元判断为否时将第二TPDU数据作为当前TPDU数据组;
第一分组子单元,用于当所述第一判断子单元判断为是时根据CCID消息最大长度对所述第二TPDU数据进行分组,将第一个TPDU数据组作为当前TPDU数据组并将其存储到CCID缓存区中;
第二判断子单元,用于在所述第一发送子模块将封装子单元封装好的第二CCID消息返回给所述上位机之后判断所有TPDU数据组是否发送完成;
第二作为子单元,用于当所述第二判断子单元判断为否时将下一个TPDU数据组作为当前TPDU数据组;
第三判断子单元,用于判断所述第一作为子单元和第二作为子单元的当前TPDU数据组是否为完整的数据组;
第一存储子单元,用于当所述第三判断子单元判断为是时将所述当前TPDU数据组存储到CCID缓存区中;
封装子单元,用于将所述第一分组子单元和第一存储子单元存储到所述CCID缓存区中的数据封装成第二CCID消息;
第二存储子单元,用于当所述第三判断子单元判断为否时将所述当前TPDU数据组顺序存储到CCID缓存区中。
CN201710470325.XA 2017-06-20 2017-06-20 一种智能密钥设备及其工作方法 Active CN107315944B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710470325.XA CN107315944B (zh) 2017-06-20 2017-06-20 一种智能密钥设备及其工作方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710470325.XA CN107315944B (zh) 2017-06-20 2017-06-20 一种智能密钥设备及其工作方法

Publications (2)

Publication Number Publication Date
CN107315944A CN107315944A (zh) 2017-11-03
CN107315944B true CN107315944B (zh) 2019-10-08

Family

ID=60183312

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710470325.XA Active CN107315944B (zh) 2017-06-20 2017-06-20 一种智能密钥设备及其工作方法

Country Status (1)

Country Link
CN (1) CN107315944B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111062064B (zh) * 2019-12-24 2021-11-02 飞天诚信科技股份有限公司 一种加密u盘系统的实现方法及系统
CN112748984B (zh) * 2020-12-28 2022-12-06 海光信息技术股份有限公司 虚拟机数据处理、控制方法、处理器、芯片、装置及介质
CN112835836B (zh) * 2021-01-29 2022-04-08 郑州信大捷安信息技术股份有限公司 一种主机与智能卡信息交互的方法及装置
CN113221073B (zh) * 2021-07-08 2021-09-14 飞天诚信科技股份有限公司 一种增加piv应用支持证书数量的实现方法及装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101042738A (zh) * 2006-03-24 2007-09-26 中国银联股份有限公司 一种实现智能卡多应用的方法及数据处理装置
EP2447836A1 (en) * 2010-10-18 2012-05-02 Simulity Labs Ltd Multiple virtual machine engines on a single card
CN104281825A (zh) * 2014-09-29 2015-01-14 飞天诚信科技股份有限公司 一种基于智能sd卡的读卡器的工作方法
CN105427098A (zh) * 2015-11-02 2016-03-23 飞天诚信科技股份有限公司 一种不同应用之间信息共享的实现方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7374099B2 (en) * 2004-02-24 2008-05-20 Sun Microsystems, Inc. Method and apparatus for processing an application identifier from a smart card

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101042738A (zh) * 2006-03-24 2007-09-26 中国银联股份有限公司 一种实现智能卡多应用的方法及数据处理装置
EP2447836A1 (en) * 2010-10-18 2012-05-02 Simulity Labs Ltd Multiple virtual machine engines on a single card
CN104281825A (zh) * 2014-09-29 2015-01-14 飞天诚信科技股份有限公司 一种基于智能sd卡的读卡器的工作方法
CN105427098A (zh) * 2015-11-02 2016-03-23 飞天诚信科技股份有限公司 一种不同应用之间信息共享的实现方法及装置

Also Published As

Publication number Publication date
CN107315944A (zh) 2017-11-03

Similar Documents

Publication Publication Date Title
CN107315944B (zh) 一种智能密钥设备及其工作方法
CN102624874B (zh) 一种语音信息传送方法及系统
CN109714327A (zh) 数据处理方法、装置、终端、系统及服务器
CN107689931A (zh) 一种基于国产fpga的实现以太网交换功能系统及方法
CN106452833B (zh) 一种rtu多协议动态加载的数据传输方法
JP2004056728A5 (zh)
CA2310909A1 (en) Packet switching apparatus and method in data network
CN109819065A (zh) 基于fpga的数据传输及存储系统、方法以及数据系统
CN108173727A (zh) 一种智能家电入网方法及设备
WO2011140754A1 (zh) 无线优盘的实现方法及系统
JP6929946B2 (ja) データ伝送方法、装置、送信端、受信端及びシステム
CN109376108A (zh) 基于串口通信的数据传输方法、设备、发送端及接收端
CN101466163B (zh) 信息处理方法、信息处理系统及相关设备
CN110247926A (zh) 一种交互方法和系统
CN101582884B (zh) 基于fpga的3g数据包重组系统及方法
CN104090654B (zh) 一种通过方法调用实现与外围设备交互的方法和设备
CN113010292A (zh) 一种对多加密芯片的并发机制调度方法、装置及存储介质
US8131864B2 (en) Methods and systems for communicating with storage systems using slim IP stacks
CN115361191A (zh) 一种基于sflow的防火墙流量检测方法、系统、设备及介质
CN101572716A (zh) 传输小型计算机系统接口scsi包的方法和装置
CN109495931A (zh) 链路聚合的数据传输方法及相关装置
CN104579766B (zh) 一种多应用层网管并发访问方法及装置
CN103559074B (zh) 一种模拟通信插件及其工作方法
CN101156358A (zh) 话单生成方法、话单传送方法、系统、设备及功能实体
CN101697618A (zh) 一种销量信息采集的方法、网络系统及移动终端

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
OL01 Intention to license declared
OL01 Intention to license declared