本發(fā)明涉及電子產(chǎn)品領(lǐng)域,尤其涉及一種智能密鑰設(shè)備及其工作方法。
背景技術(shù):
在現(xiàn)有技術(shù)中,ccid(中文名稱:芯片卡接口設(shè)備)標(biāo)準(zhǔn)規(guī)定了ccid是一種芯片/智能卡接口設(shè)備,設(shè)備通過usb接口與主機(jī)或其它嵌入式主機(jī)連接,進(jìn)行符合ccid標(biāo)準(zhǔn)的數(shù)據(jù)通訊,同時(shí)設(shè)備通過符合7816標(biāo)準(zhǔn)協(xié)議的接口與智能卡進(jìn)行通訊。apdu(中文名稱:應(yīng)用協(xié)議數(shù)據(jù)單元)是卡片內(nèi)應(yīng)用和卡片外應(yīng)用的通信格式,apdu的格式在iso7816-4規(guī)范中定義。tpdu(中文名稱:傳輸協(xié)議數(shù)據(jù)單元)為傳輸層數(shù)據(jù)傳輸?shù)母袷?,在iso7816-3協(xié)議中定義了兩種傳輸協(xié)議格式,一種是字符傳輸協(xié)議t=0,一種是塊傳輸協(xié)議t=1。
當(dāng)前的javacard智能卡采用iso7816接口或/和非接觸式接口,需要額外使用讀卡器進(jìn)行讀寫操作;并且通信速率也受通信接口速率的限制,同時(shí)也受智能卡卡片芯片通信接口速率和讀卡器設(shè)備通信能力的限制。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是為了克服現(xiàn)有技術(shù)的不足,提供一種智能密鑰設(shè)備及其工作方法。
本發(fā)明提供了一種智能密鑰設(shè)備的工作方法,包括:
步驟s1:智能密鑰設(shè)備上電,啟動(dòng)內(nèi)部設(shè)置的虛擬機(jī);
步驟s2:當(dāng)智能密鑰設(shè)備接收到上位機(jī)下發(fā)的ccid消息時(shí)對(duì)其進(jìn)行處理,包括:智能密鑰設(shè)備對(duì)接收到的ccid消息進(jìn)行解析得到tpdu數(shù)據(jù),對(duì)所述tpdu數(shù)據(jù)解析得到apdu數(shù)據(jù)并將其發(fā)送給所述虛擬機(jī);
步驟s3:所述虛擬機(jī)將接收到的apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用進(jìn)行處理,所述虛擬機(jī)接收當(dāng)前應(yīng)用返回的處理結(jié)果和狀態(tài)字,并將所述處理結(jié)果和狀態(tài)字發(fā)送給所述智能密鑰設(shè)備;
步驟s4:所述智能密鑰設(shè)備將所述處理結(jié)果和所述狀態(tài)字封裝成tpdu數(shù)據(jù),將所述tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī),返回步驟s2;
所述apdu數(shù)據(jù)包括指令,所述方法還包括:若當(dāng)前邏輯通道中的當(dāng)前應(yīng)用接收到的虛擬機(jī)發(fā)送的指令時(shí),根據(jù)所述指令中的接口標(biāo)識(shí)調(diào)用相應(yīng)接口;
若當(dāng)前應(yīng)用調(diào)用第一接口時(shí),所述虛擬機(jī)從第一接口參數(shù)中獲取apdu緩存區(qū)地址和開始存儲(chǔ)數(shù)據(jù)的偏移地址,開始接收數(shù)據(jù)并將接收到的數(shù)據(jù)存儲(chǔ)到所述apdu緩存區(qū)地址中與所述開始存儲(chǔ)數(shù)據(jù)的偏移地址的對(duì)應(yīng)位置;
若當(dāng)前應(yīng)用調(diào)用第七接口時(shí),所述虛擬機(jī)設(shè)置通信方向?yàn)橄蛲猓鎏摂M機(jī)記錄響應(yīng)數(shù)據(jù)長(zhǎng)度,并將所述apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給所述智能密鑰設(shè)備。
進(jìn)一步地,所述方法還包括:
若當(dāng)前應(yīng)用調(diào)用第二接口,所述虛擬機(jī)從第二接口參數(shù)中獲取apdu緩存區(qū)地址和指定偏移地址,開始接收數(shù)據(jù)并將接收到的數(shù)據(jù)存儲(chǔ)到對(duì)應(yīng)于所述apdu緩存區(qū)地址中與所述指定偏移地址對(duì)應(yīng)的位置;
若當(dāng)前應(yīng)用調(diào)用第三接口時(shí),所述虛擬機(jī)設(shè)置通信方向?yàn)橄蛲猓?/p>
若當(dāng)前應(yīng)用調(diào)用第四接口時(shí),所述虛擬機(jī)記錄響應(yīng)數(shù)據(jù)長(zhǎng)度;
若當(dāng)前應(yīng)用調(diào)用第五接口時(shí),所述虛擬機(jī)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給所述智能密鑰設(shè)備;
若當(dāng)前應(yīng)用調(diào)用第六接口時(shí),所述虛擬機(jī)將指定數(shù)組中的數(shù)據(jù)發(fā)送給所述智能密鑰設(shè)備。
進(jìn)一步地,在所述步驟s2與所述步驟s3之間包括:
步驟a1:當(dāng)所述虛擬機(jī)接收到apdu數(shù)據(jù)時(shí)從所述apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)并將對(duì)應(yīng)的邏輯通道設(shè)置為當(dāng)前邏輯通道;
步驟a2:所述虛擬機(jī)根據(jù)所述指令頭判斷指令的類型,如為邏輯通道管理指令則執(zhí)行步驟a3,如為選擇指令則執(zhí)行步驟a7,如為其他指令則執(zhí)行步驟s3;
步驟a3:所述虛擬機(jī)從邏輯通道管理指令的指令頭中獲取第二邏輯通道號(hào);
步驟a4:所述虛擬機(jī)判斷邏輯通道的操作類型,如為打開邏輯通道則執(zhí)行步驟a5,如為關(guān)閉邏輯通道則執(zhí)行步驟a6;
步驟a5:所述虛擬機(jī)打開與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道,返回步驟s2;
步驟a6:所述虛擬機(jī)關(guān)閉與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道,返回步驟s2;
步驟a7:所述虛擬機(jī)判斷所述選擇指令是否為應(yīng)用選擇指令,是則執(zhí)行步驟a8,否則執(zhí)行步驟s3;
步驟a8:所述虛擬機(jī)從所述選擇指令的數(shù)據(jù)域中獲取應(yīng)用程序標(biāo)識(shí)符;
步驟a9:所述虛擬機(jī)判斷根據(jù)所述應(yīng)用標(biāo)識(shí)符是否找到對(duì)應(yīng)的應(yīng)用,是則執(zhí)行步驟a11,否則執(zhí)行步驟a10;
步驟a10:所述虛擬機(jī)將狀態(tài)字發(fā)送給所述智能密鑰設(shè)備,執(zhí)行步驟s4;
步驟a11:所述虛擬機(jī)將找到的應(yīng)用作為當(dāng)前應(yīng)用,并將所述選擇指令發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用進(jìn)行處理,虛擬機(jī)接收當(dāng)前應(yīng)用返回的處理結(jié)果和狀態(tài)字,并將所述處理結(jié)果和狀態(tài)字發(fā)送給所述智能密鑰設(shè)備,執(zhí)行步驟s4。
進(jìn)一步地,在所述步驟s2與所述步驟s3之間包括:
步驟b1:當(dāng)所述虛擬機(jī)接收到apdu數(shù)據(jù)時(shí)從所述apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)并將對(duì)應(yīng)的邏輯通道設(shè)置為當(dāng)前邏輯通道;
步驟b2:所述虛擬機(jī)根據(jù)所述指令頭判斷指令的類型是否為邏輯通道管理指令,是則執(zhí)行步驟b3,否則執(zhí)行步驟s3;
步驟b3:所述虛擬機(jī)從邏輯通道管理指令的指令頭中獲取第二邏輯通道號(hào);
步驟b4:所述虛擬機(jī)判斷邏輯通道的操作類型,如為打開邏輯通道則執(zhí)行步驟b5,如為關(guān)閉邏輯通道則執(zhí)行步驟b6;
步驟b5:所述虛擬機(jī)打開與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道,返回步驟s2;
步驟b6:所述虛擬機(jī)關(guān)閉與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道,返回步驟s2。
進(jìn)一步地,在所述步驟s2與所述步驟s3之間包括:
步驟c1:所述虛擬機(jī)根據(jù)指令頭判斷apdu數(shù)據(jù)的類型是否為選擇指令,是則執(zhí)行步驟c2,否則執(zhí)行步驟s3;
步驟c2:所述虛擬機(jī)判斷所述選擇指令是否為應(yīng)用選擇指令,是則執(zhí)行步驟c3,否則執(zhí)行步驟s3;
步驟c3:所述虛擬機(jī)從所述選擇指令的數(shù)據(jù)域中獲取應(yīng)用程序標(biāo)識(shí)符;
步驟c4:所述虛擬機(jī)判斷根據(jù)所述應(yīng)用標(biāo)識(shí)符是否找到對(duì)應(yīng)的應(yīng)用,是則執(zhí)行步驟c6,否則執(zhí)行步驟c5;
步驟c5:所述虛擬機(jī)將狀態(tài)字發(fā)送給所述智能密鑰設(shè)備,執(zhí)行步驟s4;
步驟c6:所述虛擬機(jī)將找到的應(yīng)用作為當(dāng)前應(yīng)用,并將所述選擇指令發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用進(jìn)行處理,所述虛擬機(jī)接收當(dāng)前應(yīng)用返回的處理結(jié)果和狀態(tài)字,并將所述處理結(jié)果和所述狀態(tài)字發(fā)送給所述智能密鑰設(shè)備,執(zhí)行步驟s4。
進(jìn)一步地,所述從所述apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)具體為:從所述指令頭的第一個(gè)字節(jié)上獲取第一邏輯通道號(hào)。
進(jìn)一步地,所述步驟a2包括:所述虛擬機(jī)判斷所述指令頭的第二字節(jié)數(shù)據(jù),如為第一數(shù)值則為邏輯通道管理指令,如為第二數(shù)值則為選擇指令,如為其他數(shù)據(jù)則為其他指令。
進(jìn)一步地,所述虛擬機(jī)打開與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道,包括:所述虛擬機(jī)判斷所述邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù),如為第三數(shù)值,則打開一個(gè)新的邏輯通道并將其作為當(dāng)前邏輯通道,并將與所述新的邏輯通道對(duì)應(yīng)的邏輯通道號(hào)作為響應(yīng)數(shù)據(jù)返回給智能密鑰設(shè)備;如為第四數(shù)值,則打開與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道。
進(jìn)一步地,所述虛擬機(jī)關(guān)閉與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道包括:所述虛擬機(jī)判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù),如為第五數(shù)值則關(guān)閉當(dāng)前邏輯通道;如為第六數(shù)值,則關(guān)閉與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道。
進(jìn)一步地,所述虛擬機(jī)判斷選擇指令是否為應(yīng)用選擇指令,包括:所述虛擬機(jī)判斷所述指令頭中的第三、第四字節(jié)數(shù)據(jù)是否為第七數(shù)值,是則所述選擇指令為應(yīng)用選擇指令,否則所述選擇指令不為應(yīng)用選擇指令。
進(jìn)一步地,所述虛擬機(jī)設(shè)置通信方向?yàn)橄蛲?,包括?/p>
步驟k1:所述虛擬機(jī)判斷協(xié)議類型,如為t1則執(zhí)行步驟k2,如為t0則執(zhí)行步驟k3;
步驟k2:所述虛擬機(jī)從所述apdu數(shù)據(jù)中獲取響應(yīng)數(shù)據(jù)長(zhǎng)度;
步驟k3:所述虛擬機(jī)判斷apdu類型,如為第一類型則執(zhí)行步驟k4,如為第三類型則執(zhí)行步驟k5;
步驟k4:所述虛擬機(jī)將所述apdu類型轉(zhuǎn)換為第二類型,將所述指令頭的第五字節(jié)數(shù)據(jù)作為響應(yīng)數(shù)據(jù)長(zhǎng)度;
步驟k5:所述虛擬機(jī)將所述apdu類型轉(zhuǎn)換為第四類型,將最大數(shù)據(jù)長(zhǎng)度作為響應(yīng)數(shù)據(jù)長(zhǎng)度。
進(jìn)一步地,所述虛擬機(jī)記錄響應(yīng)數(shù)據(jù)長(zhǎng)度,包括:
步驟d1:所述虛擬機(jī)判斷協(xié)議類型,如為t0則執(zhí)行步驟d2,如為t1則執(zhí)行步驟d6;
步驟d2:所述虛擬機(jī)判斷apdu類型,如為第二類型則執(zhí)行步驟d3,如為第四類型則執(zhí)行步驟d5;
步驟d3:所述虛擬機(jī)判斷所述第四接口的參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度與第三接口函數(shù)中獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度是否相同,是則記錄響應(yīng)數(shù)據(jù)長(zhǎng)度,否則執(zhí)行步驟d4;
步驟d4:所述虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù)并將其發(fā)送給所述智能密鑰設(shè)備;
步驟d5:所述虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)并將其發(fā)送給所述智能密鑰設(shè)備,記錄所述第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度;
步驟d6:所述虛擬機(jī)記錄所述第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度。
進(jìn)一步地,所述步驟d2包括:所述虛擬機(jī)判斷當(dāng)前應(yīng)用是否調(diào)用了第一接口和第二接口,是則apdu類型為第四類型,否則apdu類型為第二類型。
進(jìn)一步地,所述將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;包括:
步驟f1:所述虛擬機(jī)判斷協(xié)議類型,如為t0則執(zhí)行步驟f2,如為t1則執(zhí)行步驟f7;
步驟f2:所述虛擬機(jī)判斷響應(yīng)數(shù)據(jù)長(zhǎng)度是否小于所述apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度,是則執(zhí)行步驟f4,否則執(zhí)行步驟f3;
步驟f3:所述虛擬機(jī)將所述apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;
步驟f4:所述虛擬機(jī)根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將所述apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備,執(zhí)行步驟f5;
步驟f5:所述虛擬機(jī)判斷所述apdu緩存區(qū)中的數(shù)據(jù)是否發(fā)送完成,是則結(jié)束,否則執(zhí)行步驟f6;
步驟f6:所述虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)并發(fā)送給智能密鑰設(shè)備;
步驟f7:所述虛擬機(jī)判斷所述apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度是否大于ccid設(shè)備數(shù)據(jù)域大小,是則執(zhí)行步驟f8,否則將所述apdu緩存區(qū)中的數(shù)據(jù)存儲(chǔ)到tpdu緩存區(qū)中;
步驟f8:虛擬機(jī)根據(jù)ccid設(shè)備數(shù)據(jù)域大小對(duì)所述apdu緩存區(qū)中的數(shù)據(jù)進(jìn)行分組,并分別將整個(gè)數(shù)據(jù)組封裝為t1的i型數(shù)據(jù)塊發(fā)送給智能密鑰設(shè)備;
步驟f9:虛擬機(jī)判斷是否還有未發(fā)送的數(shù)據(jù)組,是則將數(shù)據(jù)組存儲(chǔ)到所述tpdu緩存區(qū)中,結(jié)束,否則結(jié)束。
進(jìn)一步地,所述將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;包括:
步驟h1:所述虛擬機(jī)判斷協(xié)議類型,如為t0則執(zhí)行步驟h2,如為t1則執(zhí)行步驟h10;
步驟h2:所述虛擬機(jī)判斷apdu類型,如為第二類型則執(zhí)行步驟h3,如為第四類型則執(zhí)行步驟h6;
步驟h3:所述虛擬機(jī)判斷第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度與第三接口函數(shù)中獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度是否相同,是則執(zhí)行步驟h5,否則執(zhí)行步驟h4;
步驟h4:所述虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù)并將其發(fā)送給智能密鑰設(shè)備,執(zhí)行步驟h5;
步驟h5:所述虛擬機(jī)將所述apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;
步驟h6:所述虛擬機(jī)判斷響應(yīng)數(shù)據(jù)長(zhǎng)度是否小于apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度,是則執(zhí)行步驟h7,否則將所述apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;
步驟h7:所述虛擬機(jī)根據(jù)所述響應(yīng)數(shù)據(jù)長(zhǎng)度將所述apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給所述智能密鑰設(shè)備;
步驟h8:所述虛擬機(jī)判斷所述apdu緩存區(qū)中的數(shù)據(jù)是否全部發(fā)送完成,是則結(jié)束,否則執(zhí)行步驟h9;
步驟h9:所述虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)并發(fā)送給智能密鑰設(shè)備;
步驟h10:所述虛擬機(jī)判斷所述apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度是否大于ccid設(shè)備數(shù)據(jù)域大小,是則執(zhí)行步驟h11,否則將所述apdu緩存區(qū)中的數(shù)據(jù)存儲(chǔ)到tpdu緩存區(qū)中;
步驟h11:所述虛擬機(jī)根據(jù)ccid設(shè)備數(shù)據(jù)域大小對(duì)所述apdu緩存區(qū)中的數(shù)據(jù)進(jìn)行分組,并分別將整個(gè)數(shù)據(jù)組封裝為t1的i型數(shù)據(jù)塊發(fā)送給智能密鑰設(shè)備;
步驟h12:所述虛擬機(jī)判斷是否還有未發(fā)送的數(shù)據(jù)組,是則將數(shù)據(jù)組存儲(chǔ)到所述tpdu緩存區(qū)中,結(jié)束,否則結(jié)束。
進(jìn)一步地,所述虛擬機(jī)將指定數(shù)組中的數(shù)據(jù)發(fā)送給所述智能密鑰設(shè)備,包括:
所述虛擬機(jī)從第六接口中獲取指定數(shù)組,將指定數(shù)組中的數(shù)據(jù)復(fù)制到apdu緩存區(qū)中,將所述apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備。
進(jìn)一步地,所述步驟s2中所述當(dāng)智能密鑰設(shè)備接收到上位機(jī)下發(fā)的ccid消息時(shí)對(duì)其進(jìn)行處理包括:
步驟y1:所述智能密鑰設(shè)備等待并接收ccid消息;
步驟y2:當(dāng)所述智能密鑰設(shè)備接收到ccid消息時(shí),判斷所述ccid消息的類型,如為第一消息則執(zhí)行步驟y3,如為第二消息則執(zhí)行步驟y5,如為其他則根據(jù)ccid規(guī)范對(duì)接收到的所述ccid消息進(jìn)行處理,將處理結(jié)果封裝成ccid消息并返回給上位機(jī),返回步驟y1;
步驟y3:所述智能密鑰設(shè)備進(jìn)行復(fù)位操作生成復(fù)位應(yīng)答;
步驟y4:所述智能密鑰設(shè)備將所述復(fù)位應(yīng)答封裝成ccid消息并將其返回給上位機(jī),返回步驟y1;
步驟y5:所述智能密鑰設(shè)備從所述ccid消息的數(shù)據(jù)域中獲取tpdu數(shù)據(jù);
步驟y6:所述智能密鑰設(shè)備判斷是否獲取到指定長(zhǎng)度的tpdu數(shù)據(jù),是則執(zhí)行步驟y7,否則返回步驟y1;
步驟y7:所述智能密鑰設(shè)備判斷接收數(shù)據(jù)的協(xié)議類型,如為t0則執(zhí)行步驟y8,如為t1則執(zhí)行步驟y10;
步驟y8:所述智能密鑰設(shè)備對(duì)所述tpdu數(shù)據(jù)進(jìn)行解析得到apdu數(shù)據(jù);
步驟y9:所述智能密鑰設(shè)備將所述apdu數(shù)據(jù)發(fā)送給所述虛擬機(jī),返回步驟y1;
步驟y10:所述智能密鑰設(shè)備對(duì)接收到的所述ccid消息進(jìn)行解析得到一個(gè)t1協(xié)議塊;
步驟y11:所述智能密鑰設(shè)備判斷得到的所述t1協(xié)議塊是否為t1協(xié)議信息塊,是則執(zhí)行步驟y12,否則按照t1協(xié)議對(duì)獲取到的所述tpdu數(shù)據(jù)進(jìn)行處理,將處理結(jié)果封裝成ccid消息并返回給上位機(jī),返回步驟y1;
步驟y12:所述智能密鑰設(shè)備從所述t1協(xié)議信息塊的信息數(shù)據(jù)域中獲取apdu數(shù)據(jù);
步驟y13:所述智能密鑰設(shè)備判斷是否獲取到指定長(zhǎng)度的apdu數(shù)據(jù),是則將apdu數(shù)據(jù)發(fā)送給虛擬機(jī),返回步驟y1,否則返回步驟y1。
進(jìn)一步地,所述步驟s4包括:
步驟k1:所述智能密鑰設(shè)備判斷處理結(jié)果的協(xié)議類型,如為t0則執(zhí)行步驟k2,如為t1則執(zhí)行步驟k7;
步驟k2:所述智能密鑰設(shè)備判斷所述處理結(jié)果的長(zhǎng)度是否大于獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度,是則執(zhí)行k4,否則執(zhí)行步驟k3;
步驟k3:所述智能密鑰設(shè)備將所述處理結(jié)果和所述狀態(tài)字封裝成tpdu數(shù)據(jù),將所述tpdu數(shù)據(jù)封裝成ccid消息并返回給所述上位機(jī),返回步驟s2;
步驟k4:所述智能密鑰設(shè)備根據(jù)所述響應(yīng)數(shù)據(jù)長(zhǎng)度將所述處理結(jié)果中對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)封裝成tpdu數(shù)據(jù),將所述tpdu數(shù)據(jù)封裝成ccid消息并返回給所述上位機(jī),執(zhí)行步驟k5;
步驟k5:所述智能密鑰設(shè)備判斷所述處理結(jié)果是否全部發(fā)送完成,是則所述智能密鑰設(shè)備將所述狀態(tài)字封裝成tpdu數(shù)據(jù),將所述tpdu數(shù)據(jù)封裝成ccid消息并返回給所述上位機(jī),返回步驟s2;否則執(zhí)行步驟k6;
步驟k6:所述智能密鑰設(shè)備將所述處理結(jié)果中的剩余數(shù)據(jù)和所述狀態(tài)字封裝成tpdu數(shù)據(jù),將所述tpdu數(shù)據(jù)封裝成ccid消息并返回給所述上位機(jī),返回步驟s2;
步驟k7:所述智能密鑰設(shè)備判斷所述處理結(jié)果的長(zhǎng)度是否大于ccid設(shè)備數(shù)據(jù)域大小,是則執(zhí)行步驟k8,否則將所述處理結(jié)果作為當(dāng)前數(shù)據(jù),執(zhí)行步驟k11;
步驟k8:所述智能密鑰設(shè)備按照ccid設(shè)備數(shù)據(jù)域大小對(duì)所述處理結(jié)果進(jìn)行分組;
步驟k9:所述智能密鑰設(shè)備分別將每個(gè)完整的數(shù)據(jù)組封裝成tpdu數(shù)據(jù),分別將每個(gè)tpdu數(shù)據(jù)封裝成ccid消息并返回給所述上位機(jī);
步驟k10:所述智能密鑰設(shè)備判斷最后一個(gè)數(shù)據(jù)組是否為完整的數(shù)據(jù)組,是則所述智能密鑰設(shè)備將所述狀態(tài)字封裝成tpdu數(shù)據(jù),將所述tpdu數(shù)據(jù)封裝成ccid消息并返回給所述上位機(jī),返回步驟s2;否則將最后一個(gè)數(shù)據(jù)組作為當(dāng)前數(shù)據(jù),執(zhí)行步驟k11;
步驟k11:所述智能密鑰設(shè)備將所述當(dāng)前數(shù)據(jù)和所述狀態(tài)字封裝成tpdu數(shù)據(jù),將所述tpdu數(shù)據(jù)封裝成ccid消息并返回給所述上位機(jī),返回步驟s2。
進(jìn)一步地,所述將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī)包括:
步驟p1:所述智能密鑰設(shè)備判斷tpdu數(shù)據(jù)的長(zhǎng)度是否大于ccid消息最大長(zhǎng)度,是則執(zhí)行步驟p2,否則將tpdu數(shù)據(jù)作為當(dāng)前tpdu數(shù)據(jù)組,執(zhí)行步驟p5;
步驟p2:所述智能密鑰設(shè)備根據(jù)ccid消息最大長(zhǎng)度對(duì)所述tpdu數(shù)據(jù)進(jìn)行分組,將第一個(gè)tpdu數(shù)據(jù)組作為當(dāng)前tpdu數(shù)據(jù)組并將其存儲(chǔ)到ccid緩存區(qū)中;
步驟p3:所述智能密鑰設(shè)備將所述ccid緩存區(qū)中的數(shù)據(jù)封裝成ccid消息并將其發(fā)送給上位機(jī);
步驟p4:所述智能密鑰設(shè)備判斷所有tpdu數(shù)據(jù)組是否發(fā)送完成,是則發(fā)送數(shù)據(jù)結(jié)束,否則將下一個(gè)tpdu數(shù)據(jù)組作為當(dāng)前tpdu數(shù)據(jù)組,執(zhí)行步驟p5;
步驟p5:所述智能密鑰設(shè)備判斷當(dāng)前tpdu數(shù)據(jù)組是否為完整的數(shù)據(jù)組,是則執(zhí)行步驟p6,否則執(zhí)行步驟p7;
步驟p6:所述智能密鑰設(shè)備將所述當(dāng)前tpdu數(shù)據(jù)組存儲(chǔ)到所述ccid緩存區(qū)中,將ccid緩存區(qū)中的數(shù)據(jù)封裝成ccid消息并將其發(fā)送給上位機(jī),返回步驟p4;
步驟p7:所述智能密鑰設(shè)備將所述當(dāng)前tpdu數(shù)據(jù)組順序存儲(chǔ)到所述ccid緩存區(qū)中。
本發(fā)明又提供了一種智能密鑰設(shè)備,包括虛擬機(jī)模塊、應(yīng)用模塊和主體模塊;
所述主體模塊包括:
啟動(dòng)子模塊,用于在所述智能密鑰設(shè)備上電后啟動(dòng)所述虛擬機(jī)模塊;
第一接收子模塊,用于接收上位機(jī)下發(fā)的ccid消息,還用于接收所述虛擬機(jī)模塊發(fā)送的處理結(jié)果和狀態(tài)字;
第一處理子模塊,用于對(duì)所述第一接收子模塊接收到的所述ccid消息進(jìn)行處理,所述第一處理子模塊具體用于對(duì)所述第一接收子模塊接收到的所述ccid消息進(jìn)行解析得到tpdu數(shù)據(jù),對(duì)所述tpdu數(shù)據(jù)解析得到apdu數(shù)據(jù);
封裝子模塊,用于將所述第一接收子模塊接收到的所述處理結(jié)果和所述狀態(tài)字封裝成tpdu數(shù)據(jù),將所述tpdu數(shù)據(jù)封裝成ccid消息;
第一發(fā)送子模塊,用于將所述第一處理子模塊解析得到的apdu數(shù)據(jù)發(fā)送給所述虛擬機(jī)模塊;還用于將所述封裝子模塊封裝得到的ccid消息返回給所述上位機(jī);
所述虛擬機(jī)模塊包括:
第二接收子模塊,用于接收所述主體模塊發(fā)送的apdu數(shù)據(jù),還用于接收應(yīng)用模塊發(fā)送的處理結(jié)果和狀態(tài)字;
第二發(fā)送子模塊,用于將所述第二接收子模塊接收到的所述apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用模塊,還用于將所述第二接收子模塊接收到的所述處理結(jié)果和所述狀態(tài)字發(fā)送給所述主體模塊;
第一接口子模塊,用于當(dāng)?shù)谝唤涌诒徽{(diào)用時(shí),從所述第一接口的參數(shù)中獲取apdu緩存區(qū)地址和開始存儲(chǔ)數(shù)據(jù)的偏移地址,開始接收數(shù)據(jù)并將接收到的數(shù)據(jù)存儲(chǔ)到所述apdu緩存區(qū)地址中與所述開始存儲(chǔ)數(shù)據(jù)的偏移地址的對(duì)應(yīng)位置;
第七接口子模塊,用于當(dāng)?shù)谄呓涌诒徽{(diào)用時(shí),設(shè)置通信方向?yàn)橄蛲?,記錄響?yīng)數(shù)據(jù)長(zhǎng)度,并將所述apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給所述主體模塊;
所述應(yīng)用模塊包括:
第三接收子模塊,用于接收所述虛擬機(jī)模塊發(fā)送的apdu數(shù)據(jù),所述apdu數(shù)據(jù)包括指令;
第二處理子模塊,用于對(duì)所述第三接收子模塊接收到的所述apdu數(shù)據(jù)進(jìn)行處理;
第三發(fā)送子模塊,用于將所述第二處理子模塊的處理結(jié)果和狀態(tài)字發(fā)送給所述虛擬機(jī)模塊;
調(diào)用子模塊,用于根據(jù)所述第三接收子模塊接收到的虛擬機(jī)模塊發(fā)送的指令中的接口標(biāo)識(shí)調(diào)用相應(yīng)接口。
進(jìn)一步地,所述虛擬機(jī)模塊還包括:
第二接口子模塊,用于當(dāng)?shù)诙涌诒徽{(diào)用時(shí),從第二接口參數(shù)中獲取apdu緩存區(qū)地址和指定偏移地址,開始接收數(shù)據(jù)并將接收到的數(shù)據(jù)存儲(chǔ)到對(duì)應(yīng)于所述apdu緩存區(qū)地址中與所述指定偏移地址對(duì)應(yīng)的位置;
第三接口子模塊,用于當(dāng)?shù)谌涌诒徽{(diào)用時(shí),設(shè)置通信方向?yàn)橄蛲猓?/p>
第四接口子模塊,用于當(dāng)?shù)谒慕涌诒徽{(diào)用時(shí),記錄響應(yīng)數(shù)據(jù)長(zhǎng)度;
第五接口子模塊,用于當(dāng)?shù)谖褰涌诒徽{(diào)用時(shí),將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給所述主體模塊;
第六接口子模塊,用于當(dāng)?shù)诹涌诒徽{(diào)用時(shí),將指定數(shù)組中的數(shù)據(jù)發(fā)送給所述主體模塊。
進(jìn)一步地,所述虛擬機(jī)模塊還包括:
第一設(shè)置子模塊,用于從所述第二接收子模塊接收到的所述apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)并將對(duì)應(yīng)的邏輯通道設(shè)置為當(dāng)前邏輯通道;
第一判斷子模塊,用于根據(jù)所述apdu數(shù)據(jù)的指令頭判斷指令的類型;
第一獲取子模塊,用于當(dāng)所述第一判斷子模塊判斷指令的類型為邏輯通道管理指令時(shí)從所述邏輯通道管理指令的指令頭中獲取第二邏輯通道號(hào);
第二判斷子模塊,用于判斷邏輯通道的操作類型;
打開子模塊,用于當(dāng)所述第二判斷子模塊判斷操作類型為打開邏輯通道時(shí)打開與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道;
關(guān)閉子模塊,用于當(dāng)所述第二判斷子模塊判斷操作類型為關(guān)閉邏輯通道時(shí)關(guān)閉與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道;
第三判斷子模塊,用于當(dāng)所述第一判斷子模塊判斷指令的類型為選擇指令時(shí)判斷選擇指令是否為應(yīng)用選擇指令;
第二獲取子模塊,用于當(dāng)所述第三判斷子模塊判斷為是時(shí)從所述選擇指令的數(shù)據(jù)域中獲取應(yīng)用程序標(biāo)識(shí)符;
第四判斷子模塊,用于判斷根據(jù)所述應(yīng)用標(biāo)識(shí)符是否找到對(duì)應(yīng)的應(yīng)用;
第四發(fā)送子模塊,用于當(dāng)所述第四判斷子模塊判斷為否時(shí)將狀態(tài)字發(fā)送給所述主體模塊;
作為子模塊,用于當(dāng)所述第四判斷子模塊判斷為是時(shí)將找到的應(yīng)用作為當(dāng)前應(yīng)用;
所述第二發(fā)送子模塊還用于當(dāng)所述第一判斷子模塊判斷指令的類型為其他指令時(shí)和所述第三判斷子模塊判斷為否時(shí)將所述apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用模塊;
所述第三接收子模塊,還用于接收所述虛擬機(jī)模塊發(fā)送的所述apdu數(shù)據(jù);
所述第二處理子模塊,還用于對(duì)所述第三接收子模塊接收到的所述apdu數(shù)據(jù)進(jìn)行處理。
進(jìn)一步地,所述虛擬機(jī)模塊還包括:
第一設(shè)置子模塊,用于從所述第二接收子模塊接收到的所述apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)并將對(duì)應(yīng)的邏輯通道設(shè)置為當(dāng)前邏輯通道;
第五判斷子模塊,用于根據(jù)所述指令頭判斷指令的類型是否為邏輯通道管理指令;
第一獲取子模塊,用于當(dāng)所述第五判斷子模塊判斷為是時(shí)從邏輯通道管理指令的指令頭中獲取第二邏輯通道號(hào);
第二判斷子模塊,用于判斷邏輯通道的操作類型;
打開子模塊,用于當(dāng)所述第二判斷子模塊判斷操作類型為打開邏輯通道時(shí)打開與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道;
關(guān)閉子模塊,用于當(dāng)所述第二判斷子模塊判斷操作類型為關(guān)閉邏輯通道時(shí)關(guān)閉與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道;
所述第二發(fā)送子模塊還用于當(dāng)所述第五判斷子模塊判斷為否時(shí)將所述apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用;
所述第三接收子模塊,還用于接收所述虛擬機(jī)模塊發(fā)送的所述apdu數(shù)據(jù);
所述第二處理子模塊,還用于對(duì)所述第三接收子模塊接收到的所述apdu數(shù)據(jù)進(jìn)行處理。
進(jìn)一步地,所述虛擬機(jī)模塊還包括:
第六判斷子模塊,用于根據(jù)所述apdu數(shù)據(jù)的指令頭判斷指令的類型是否為選擇指令;
第三判斷子模塊,用于當(dāng)所述第六判斷子模塊判斷為是時(shí)判斷所述選擇指令是否為應(yīng)用選擇指令;
第二獲取子模塊,用于從當(dāng)所述第三判斷子模塊判斷為是時(shí)從所述選擇指令的數(shù)據(jù)域中獲取應(yīng)用程序標(biāo)識(shí)符;
第四判斷子模塊,用于判斷根據(jù)所述應(yīng)用標(biāo)識(shí)符是否找到對(duì)應(yīng)的應(yīng)用;
第四發(fā)送子模塊,用于當(dāng)所述第四判斷子模塊判斷為否時(shí)將狀態(tài)字發(fā)送給所述主體模塊;
作為子模塊,用于當(dāng)所述第四判斷子模塊判斷為是時(shí)將找到的應(yīng)用作為當(dāng)前應(yīng)用;
所述第二發(fā)送子模塊還用于當(dāng)所述第六判斷子模塊和所述第三判斷子模塊判斷為否時(shí)將所述apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用;
所述第三接收子模塊,還用于接收所述虛擬機(jī)模塊發(fā)送的所述apdu數(shù)據(jù);
所述第二處理子模塊,還用于對(duì)所述第三接收子模塊接收到的所述apdu數(shù)據(jù)進(jìn)行處理。
進(jìn)一步地,所述第一設(shè)置子模塊具體用于從所述指令頭的第一個(gè)字節(jié)上獲取第一邏輯通道號(hào)。
進(jìn)一步地,所述第一判斷子模塊,具體用于判斷所述apdu數(shù)據(jù)的指令頭的第二字節(jié)數(shù)據(jù),如為第一數(shù)值則為邏輯通道管理指令,如為第二數(shù)值則為選擇指令,如為其他數(shù)據(jù)則為其他指令。
進(jìn)一步地,所述打開子模塊具體用于判斷所述邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù),如為第三數(shù)值,則打開一個(gè)新的邏輯通道并將其作為當(dāng)前邏輯通道;如為第四數(shù)值,則打開與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道;
所述第二發(fā)送子模塊還用于將與所述新的邏輯通道對(duì)應(yīng)的邏輯通道號(hào)作為響應(yīng)數(shù)據(jù)返回給所述主體模塊。
進(jìn)一步地,所述關(guān)閉子模塊具體用于判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù),如為第五數(shù)值則關(guān)閉當(dāng)前邏輯通道;如為第六數(shù)值,則關(guān)閉與所述第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道。
進(jìn)一步地,所述第三判斷子模塊具體用于判斷所述apdu數(shù)據(jù)的指令頭中的第三、第四字節(jié)數(shù)據(jù)是否為第七數(shù)值,是則判斷選擇指令為應(yīng)用選擇指令,否則判斷選擇指令不為應(yīng)用選擇指令。
進(jìn)一步地,所述第三接口子模塊包括:
第一判斷單元,用于判斷協(xié)議類型;
第一獲取單元,用于當(dāng)所述第一判斷單元判斷為t1時(shí)從所述apdu數(shù)據(jù)中獲取響應(yīng)數(shù)據(jù)長(zhǎng)度;
第二判斷單元,用于當(dāng)所述第一判斷單元判斷為t0時(shí)判斷apdu類型;
第一轉(zhuǎn)換單元,用于當(dāng)所述第二判斷單元判斷為第一類型時(shí)將所述apdu類型轉(zhuǎn)換為第二類型,將所述指令頭的第五字節(jié)數(shù)據(jù)作為響應(yīng)數(shù)據(jù)長(zhǎng)度;
第二轉(zhuǎn)換單元,用于當(dāng)所述第二判斷單元判斷為第三類型時(shí)將所述apdu類型轉(zhuǎn)換為第四類型,將最大數(shù)據(jù)長(zhǎng)度作為響應(yīng)數(shù)據(jù)長(zhǎng)度。
進(jìn)一步地,所述第四接口子模塊包括:
第三判斷單元,用于判斷協(xié)議類型;
第四判斷單元,用于當(dāng)所述第三判斷單元判斷為t0時(shí)判斷apdu類型;
第五判斷單元,用于當(dāng)所述第四判斷單元判斷為第二類型時(shí)判斷第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度與第三接口函數(shù)中獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度是否相同,是則記錄響應(yīng)數(shù)據(jù)長(zhǎng)度;
第一設(shè)置單元,用于當(dāng)所述第五判斷單元判斷為否時(shí)設(shè)置響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù);
設(shè)置記錄單元,用于當(dāng)所述第四判斷單元判斷為第四類型時(shí)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù),記錄所述第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度;
第一紀(jì)錄單元,用于當(dāng)所述第三判斷單元判斷為t1時(shí)記錄所述第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度;
第二發(fā)送子模塊,還用于將所述第一設(shè)置單元和所述設(shè)置記錄單元設(shè)置的響應(yīng)狀態(tài)碼發(fā)送給所述主體模塊。
進(jìn)一步地,所述第四判斷單元具體用于判斷當(dāng)前應(yīng)用是否調(diào)用了第一接口和第二接口,是則判斷apdu類型為第四類型,否則判斷apdu類型為第二類型。
進(jìn)一步地,所述第五接口子模塊包括:
第六判斷單元,用于判斷協(xié)議類型;
第七判斷單元,用于當(dāng)所述第六判斷單元判斷為t0時(shí)判斷響應(yīng)數(shù)據(jù)長(zhǎng)度是否小于所述apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度;
第八判斷單元,用于在所述第二發(fā)送子模塊根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給所述主體模塊之后判斷apdu緩存區(qū)中的數(shù)據(jù)是否發(fā)送完成;
第二設(shè)置單元,用于當(dāng)?shù)诎伺袛鄦卧袛酁榉駮r(shí)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù);
第九判斷單元,用于當(dāng)所述第六判斷單元判斷為t1時(shí)判斷所述apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度是否大于ccid設(shè)備數(shù)據(jù)域大?。?/p>
第一存儲(chǔ)單元,用于當(dāng)所述第九判斷單元判斷為否時(shí)將所述apdu緩存區(qū)中的數(shù)據(jù)存儲(chǔ)到tpdu緩存區(qū)中;
第一分組單元,用于當(dāng)所述第九判斷單元判斷為是時(shí)根據(jù)ccid設(shè)備數(shù)據(jù)域大小對(duì)所述apdu緩存區(qū)中的數(shù)據(jù)進(jìn)行分組;
第十判斷單元,用于判斷是否還有未發(fā)送的數(shù)據(jù)組;
第二存儲(chǔ)單元,用于當(dāng)所述第十判斷單元判斷為是時(shí)將數(shù)據(jù)組存儲(chǔ)到所述tpdu緩存區(qū)中;
所述第二發(fā)送子模塊,還用于將所述第二設(shè)置單元設(shè)置的響應(yīng)狀態(tài)碼發(fā)送給所述主體模塊,還用于當(dāng)所述第七判斷單元判斷為是時(shí)根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給所述主體模塊,所述第七判斷單元判斷為否時(shí)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給所述主體模塊,還用于將所述第一分組單元分組得到的整個(gè)數(shù)據(jù)組封裝為t1的i型數(shù)據(jù)塊發(fā)送給所述主體模塊。
進(jìn)一步地,所述第五接口子模塊包括:
第十一判斷單元,用于判斷協(xié)議類型;
第十二判斷單元,用于當(dāng)?shù)厥慌袛鄦卧袛酁閠0時(shí)判斷apdu類型;
第十三判斷單元,用于當(dāng)?shù)厥袛鄦卧袛酁榈诙愋蜁r(shí)判斷第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度與第三接口函數(shù)中獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度是否相同;
第三設(shè)置單元,用于當(dāng)所述第十三判斷單元判斷為否時(shí)設(shè)置響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù);
第十四判斷單元,用于當(dāng)?shù)厥袛鄦卧袛酁榈谒念愋蜁r(shí)判斷響應(yīng)數(shù)據(jù)長(zhǎng)度是否小于apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度;
第十五判斷單元,用于在所述第二發(fā)送子模塊根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給所述主體模塊之后判斷所述apdu緩存區(qū)中的數(shù)據(jù)是否全部發(fā)送完成;
第四設(shè)置單元,用于當(dāng)所述第十五判斷單元判斷為否時(shí)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù);
第十六判斷單元,用于當(dāng)?shù)厥慌袛鄦卧袛酁閠1時(shí)判斷所述apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度的是否大于ccid設(shè)備數(shù)據(jù)域大??;
第三存儲(chǔ)單元,用于當(dāng)所述第十六判斷單元判斷為否時(shí)將所述apdu緩存區(qū)中的數(shù)據(jù)存儲(chǔ)到tpdu緩存區(qū)中;
第二分組單元,用于當(dāng)所述第十六判斷單元判斷為是時(shí)根據(jù)ccid設(shè)備數(shù)據(jù)域大小對(duì)所述apdu緩存區(qū)中的數(shù)據(jù)進(jìn)行分組;
第十七判斷單元,還用于判斷是否還有未發(fā)送的數(shù)據(jù)組;
第四存儲(chǔ)單元,用于當(dāng)所述第十七判斷單元判斷為是時(shí)將數(shù)據(jù)組存儲(chǔ)到所述tpdu緩存區(qū)中;
所述第二發(fā)送子模塊還用于將所述第三設(shè)置單元設(shè)置的響應(yīng)狀態(tài)碼和apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給所述主體模塊,還用于當(dāng)所述第十三判斷單元判斷為是時(shí)和所述第十四判斷單元判斷為否時(shí)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給所述主體模塊,還用于當(dāng)所述第十四判斷單元判斷為是時(shí)根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給所述主體模塊,還用于將所述第四設(shè)置單元設(shè)置的響應(yīng)狀態(tài)碼發(fā)送給所述主體模塊;還用于將所述第二分組單元分組得到的整個(gè)數(shù)據(jù)組封裝為t1的i型數(shù)據(jù)塊發(fā)送給所述主體模塊。
進(jìn)一步地,所述第六接口子模塊具體用于從第六接口中獲取指定數(shù)組,將指定數(shù)組中的數(shù)據(jù)復(fù)制到apdu緩存區(qū)中,將所述apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給所述主體模塊。
進(jìn)一步地,所述第一處理子模塊包括:
第十八判斷單元,用于判斷ccid消息的類型;
第一處理單元,用于當(dāng)所述第十八判斷單元判斷ccid消息為其他消息時(shí)根據(jù)ccid規(guī)范對(duì)接收到的所述ccid消息進(jìn)行處理;
復(fù)位操作單元,用于當(dāng)所述第十八判斷單元判斷ccid消息為第一消息時(shí)進(jìn)行復(fù)位操作生成復(fù)位應(yīng)答;
第二獲取單元,用于當(dāng)所述第十八判斷單元判斷ccid消息為第二消息從所述ccid消息的數(shù)據(jù)域中獲取tpdu數(shù)據(jù);
第十九判斷單元,用于判斷所述第二獲取單元是否獲取到指定長(zhǎng)度的tpdu數(shù)據(jù);
第二十判斷單元,用于當(dāng)所述第十九判斷單元判斷為是時(shí)判斷接收數(shù)據(jù)的協(xié)議類型;
第一解析單元,用于當(dāng)所述第二十判斷單元判斷為t0時(shí)對(duì)所述tpdu數(shù)據(jù)進(jìn)行解析得到apdu數(shù)據(jù);
第二解析單元,用于當(dāng)所述第二十判斷單元判斷為t1時(shí)對(duì)接收到的所述ccid消息進(jìn)行解析得到一個(gè)t1協(xié)議塊;
第二十一判斷單元,用于判斷所述第二解析單元得到的所述t1協(xié)議塊是否為t1協(xié)議信息塊,
第二處理單元,用于當(dāng)所述第二十一判斷單元判斷為否時(shí)按照t1協(xié)議對(duì)獲取到的所述tpdu數(shù)據(jù)進(jìn)行處理;
第三獲取單元,用于當(dāng)所述第二十一判斷單元判斷為是時(shí)從所述t1協(xié)議信息塊的信息數(shù)據(jù)域中獲取apdu數(shù)據(jù);
第二十二判斷單元,用于判斷所述第三獲取單元是否獲取到指定長(zhǎng)度的apdu數(shù)據(jù);
封裝子模塊,還用于將所述第一處理單元和第二處理單元的處理結(jié)果封裝成ccid消息,還用于將所述復(fù)位操作單元的復(fù)位應(yīng)答封裝成ccid消息;
所述第一發(fā)送子模塊還用于當(dāng)所述第二十二判斷單元判斷為是時(shí)將所述第三獲取單元獲取的apdu數(shù)據(jù)發(fā)送給虛擬機(jī)模塊。
進(jìn)一步地,所述封裝子模塊包括:
第二十三判斷單元,用于判斷處理結(jié)果的協(xié)議類型;
第二十四判斷單元,用于當(dāng)所述第二十三判斷單元判斷為t0時(shí)判斷所述處理結(jié)果的長(zhǎng)度是否大于獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度;
第一封裝單元,用于當(dāng)所述第二十四判斷單元判斷為否時(shí)將所述處理結(jié)果和所述狀態(tài)字封裝成tpdu數(shù)據(jù);
第二封裝單元,用于當(dāng)所述第二十四判斷單元判斷為是時(shí)根據(jù)所述響應(yīng)數(shù)據(jù)長(zhǎng)度將所述處理結(jié)果中對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)封裝成tpdu數(shù)據(jù);
第二十五判斷單元,用于在所述第一發(fā)送子模塊將第七封裝單元封裝好的ccid消息返回給所述上位機(jī)之后判斷處理結(jié)果是否全部發(fā)送完成;
第三封裝單元,用于當(dāng)所述第二十五判斷單元判斷為否時(shí)將所述處理結(jié)果中的剩余數(shù)據(jù)和所述狀態(tài)字封裝成tpdu數(shù)據(jù);
第二十六判斷單元,用于當(dāng)所述第二十三判斷單元判斷為t1時(shí)判斷所述處理結(jié)果的長(zhǎng)度是否大于ccid設(shè)備數(shù)據(jù)域大??;
第一作為單元,用于當(dāng)所述第二十六判斷單元判斷為否時(shí)將所述處理結(jié)果作為當(dāng)前數(shù)據(jù);
第三分組單元,用于當(dāng)所述第二十六判斷單元判斷為是時(shí)按照ccid設(shè)備數(shù)據(jù)域大小對(duì)所述處理結(jié)果進(jìn)行分組;
第四封裝單元,用于分別將所述第三分組單元的每個(gè)完整的數(shù)據(jù)組封裝成tpdu數(shù)據(jù);
第二十七判斷單元,用于判斷最后一個(gè)數(shù)據(jù)組是否為完整的數(shù)據(jù)組;
第二作為單元,用于當(dāng)?shù)诙吲袛鄦卧袛酁榉駮r(shí)將最后一個(gè)數(shù)據(jù)組作為當(dāng)前數(shù)據(jù);
第五封裝單元,用于當(dāng)所述第二十五判斷單元判斷為是時(shí)和第二十七判斷單元判斷為是時(shí)將狀態(tài)字封裝成tpdu數(shù)據(jù);
第六封裝單元,用于分別將所述第一作為單元和第二作為單元的所述當(dāng)前數(shù)據(jù)、所述狀態(tài)字封裝成tpdu數(shù)據(jù);
所述第七封裝單元,用于將所述第一封裝單元、第二封裝單元、第三封裝單元、第四封裝單元、第五封裝單元和第六封裝單元的tpdu數(shù)據(jù)封裝成ccid消息。
進(jìn)一步地,所述第七封裝單元包括:
第一判斷子單元,用于判斷tpdu數(shù)據(jù)的長(zhǎng)度是否大于ccid消息最大長(zhǎng)度;
第一作為子單元,用于當(dāng)所述第一判斷子單元判斷為否時(shí)將tpdu數(shù)據(jù)作為當(dāng)前tpdu數(shù)據(jù)組;
第一分組子單元,用于當(dāng)所述第一判斷子單元判斷為是時(shí)根據(jù)ccid消息最大長(zhǎng)度對(duì)所述tpdu數(shù)據(jù)進(jìn)行分組,將第一個(gè)tpdu數(shù)據(jù)組作為當(dāng)前tpdu數(shù)據(jù)組并將其存儲(chǔ)到ccid緩存區(qū)中;
第二判斷子單元,用于在所述第一發(fā)送子模塊將封裝子單元封裝好的ccid消息返回給所述上位機(jī)之后判斷所有tpdu數(shù)據(jù)組是否發(fā)送完成;
第二作為子單元,用于當(dāng)所述第二判斷子單元判斷為否時(shí)將下一個(gè)tpdu數(shù)據(jù)組作為當(dāng)前tpdu數(shù)據(jù)組;
第三判斷子單元,用于判斷所述第一作為子單元和第二作為子單元的當(dāng)前tpdu數(shù)據(jù)組是否為完整的數(shù)據(jù)組;
第一存儲(chǔ)子單元,用于當(dāng)所述第三判斷子單元判斷為是時(shí)將所述當(dāng)前tpdu數(shù)據(jù)組存儲(chǔ)到ccid緩存區(qū)中;
封裝子單元,用于將所述第一分組子單元和第一存儲(chǔ)子單元存儲(chǔ)到所述ccid緩存區(qū)中的數(shù)據(jù)封裝成ccid消息;
第二存儲(chǔ)子單元,用于當(dāng)所述第三判斷子單元判斷為否時(shí)將所述當(dāng)前tpdu數(shù)據(jù)組順序存儲(chǔ)到ccid緩存區(qū)中。
本發(fā)明與現(xiàn)有技術(shù)相比,具有以下優(yōu)點(diǎn):
本實(shí)施例虛擬機(jī)使用usb接口與主機(jī)進(jìn)行通信,不需要額外使用讀卡器設(shè)備;由于通信時(shí)沒有使用iso7816接口,所以不受iso7816接口的通信速率限制,通信速度較快。
附圖說明
圖1為本發(fā)明實(shí)施例一提供的一種智能密鑰設(shè)備的工作方法流程圖;
圖2為本發(fā)明實(shí)施例二提供的智能密鑰設(shè)備接收數(shù)據(jù)并對(duì)其進(jìn)行處理的實(shí)現(xiàn)過程流程圖;
圖3為本發(fā)明實(shí)施例三提供的智能密鑰設(shè)備將處理結(jié)果和狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī)的實(shí)現(xiàn)方法流程圖;
圖4為本發(fā)明實(shí)施例四提供的一種智能密鑰設(shè)備的方框圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
實(shí)施例一
本發(fā)明實(shí)施例一提供一種智能密鑰設(shè)備的工作方法,具體的,本實(shí)施例以智能密鑰設(shè)備中只有一個(gè)邏輯通道,該邏輯通道中只有一個(gè)應(yīng)用為例進(jìn)行說明,如圖1所示,包括:
步驟101:智能密鑰設(shè)備上電,進(jìn)行初始化;
具體的,在本實(shí)施例中,進(jìn)行初始化包括:?jiǎn)?dòng)內(nèi)部設(shè)置的虛擬機(jī),芯片初始化、usb接口初始化、ccid(英文名稱:chip/smartcardinterfacedevices-usb,中文名稱:芯片智能卡接口設(shè)備)初始化;
步驟102:當(dāng)智能密鑰設(shè)備接收到上位機(jī)下發(fā)的ccid消息時(shí)對(duì)其進(jìn)行處理;
在本實(shí)施例中,步驟102包括:智能密鑰設(shè)備對(duì)接收到的ccid消息進(jìn)行解析得到tpdu數(shù)據(jù),再對(duì)tpdu數(shù)據(jù)解析得到apdu數(shù)據(jù)并將其發(fā)送給虛擬機(jī);本實(shí)施例中步驟102的具體實(shí)現(xiàn)過程在實(shí)施例二中進(jìn)行詳述;
例如,本實(shí)施例中的智能密鑰設(shè)備接收到的ccid消息為0x6f090000000060000000004005007000000134,其中前十個(gè)字節(jié)數(shù)據(jù)0x6f090000000060000000為ccid消息頭,對(duì)ccid消息解析得到的tpdu數(shù)據(jù)為0x004005007000000134;對(duì)tpdu數(shù)據(jù)解析得到的apdu數(shù)據(jù)為0x0070000001;
例如,本實(shí)施例中的智能密鑰設(shè)備接收到的ccid消息為0x6f09000000007d000000000005007000020077,其中前十個(gè)字節(jié)數(shù)據(jù)0x6f09000000007d000000為ccid消息頭,對(duì)ccid消息解析得到的tpdu數(shù)據(jù)為0x000005007000020077;對(duì)tpdu數(shù)據(jù)解析得到的apdu數(shù)據(jù)為0x0070000200;
例如,本實(shí)施例中的智能密鑰設(shè)備接收到的ccid消息為0x6f0900000000630000000000050070800201f6,其中前十個(gè)字節(jié)數(shù)據(jù)0x6f090000000063000000為ccid消息頭,對(duì)ccid消息解析得到的tpdu數(shù)據(jù)為0x0000050070800201f6;對(duì)tpdu數(shù)據(jù)解析得到的apdu數(shù)據(jù)為0x0070800201;
例如,本實(shí)施例中的智能密鑰設(shè)備接收到的ccid消息為0x6f0500000000920000000070000001,其中前十個(gè)字節(jié)數(shù)據(jù)0x6f09000000007d000000為ccid消息頭,對(duì)ccid消息解析得到的tpdu數(shù)據(jù)為0x0070000001;對(duì)tpdu數(shù)據(jù)解析得到的apdu數(shù)據(jù)為0x0070000001;對(duì)于t0協(xié)議而言,解析得到的tpdu數(shù)據(jù)與apdu數(shù)據(jù)相同;
例如,本實(shí)施例中的智能密鑰設(shè)備接收到的ccid消息為0x6f0500000000930000000070000201,其中前十個(gè)字節(jié)數(shù)據(jù)0x6f050000000093000000為ccid消息頭,對(duì)ccid消息解析得到的tpdu數(shù)據(jù)為0x0070000201;對(duì)tpdu數(shù)據(jù)解析得到的apdu數(shù)據(jù)為0x0070000201;
例如,本實(shí)施例中的智能密鑰設(shè)備接收到的ccid消息為0x6f0500000000940000000070800201,其中前十個(gè)字節(jié)數(shù)據(jù)0x6f050000000094000000為ccid消息頭,對(duì)ccid消息解析得到的tpdu數(shù)據(jù)為0x0070800201;對(duì)tpdu數(shù)據(jù)解析得到的apdu數(shù)據(jù)為0x0070800201;
步驟103:虛擬機(jī)將接收到的apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用進(jìn)行處理,虛擬機(jī)接收當(dāng)前應(yīng)用返回的處理結(jié)果和狀態(tài)字,并將處理結(jié)果和狀態(tài)字發(fā)送給智能密鑰設(shè)備;
具體的,在本實(shí)施例中,智能密鑰設(shè)備中可以只有一個(gè)邏輯通道,該邏輯通道到有一個(gè)或多個(gè)應(yīng)用,或智能密鑰設(shè)備中有多個(gè)邏輯通道,每個(gè)通道中有一個(gè)或多個(gè)應(yīng)用;
(一)如本實(shí)施例的智能密鑰設(shè)備中有多個(gè)邏輯通道,每個(gè)邏輯通道中有多個(gè)應(yīng)用,則在步驟102與步驟103之間還包括:
步驟a1:當(dāng)虛擬機(jī)接收到apdu數(shù)據(jù)時(shí)從apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)并將對(duì)應(yīng)的邏輯通道設(shè)置為當(dāng)前邏輯通道;
在本實(shí)施例中,從apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)具體為:從指令頭的第一個(gè)字節(jié)上獲取第一邏輯通道號(hào);
例如,apdu數(shù)據(jù)為0x0070000001,則獲取的第一邏輯通道號(hào)為0x00;
步驟a2:虛擬機(jī)根據(jù)指令頭判斷指令的類型,如為邏輯通道管理指令則執(zhí)行步驟a3,如為選擇指令則執(zhí)行步驟a7,如為其他指令則執(zhí)行步驟103;
具體的,本實(shí)施例中步驟a2包括:虛擬機(jī)判斷指令頭的第二字節(jié)數(shù)據(jù),如為第一數(shù)值則為邏輯通道管理指令,如為第二數(shù)值則為選擇指令,如為其他數(shù)據(jù)則為其他指令;優(yōu)選的,第一數(shù)值為0x70,第二數(shù)值為0xa4;
例如,apdu數(shù)據(jù)為0x0070000001,則判斷指令的類型為邏輯通道管理指令;
步驟a3:虛擬機(jī)從邏輯通道管理指令的指令頭中獲取第二邏輯通道號(hào);
具體的,在本實(shí)施例中,步驟a3包括:智能密鑰設(shè)備中的虛擬機(jī)從邏輯通道號(hào)指令的指令頭中第四字節(jié)上獲取第二邏輯通道號(hào);
例如,apdu數(shù)據(jù)為0x0070000201,則獲取的第二邏輯通道號(hào)為0x02;
步驟a4:虛擬機(jī)判斷邏輯通道的操作類型,如為打開邏輯通道則執(zhí)行步驟a5,如為關(guān)閉邏輯通道則執(zhí)行步驟a6;
具體的,在本實(shí)施例中,虛擬機(jī)判斷輯通道管理指令的指令頭中第三字節(jié)數(shù)據(jù)的最高位,如為0則操作類型為打開邏輯通道,如為1則操作類型為關(guān)閉邏輯通道;
例如,apdu數(shù)據(jù)為0x0070000001,則指令頭中第三字節(jié)數(shù)據(jù)的最高位為0則操作類型為打開邏輯通道;apdu數(shù)據(jù)為0x0070800201,則指令頭中第三字節(jié)數(shù)據(jù)的最高位為1則操作類型為關(guān)閉邏輯通道;
步驟a5:虛擬機(jī)打開與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道,返回步驟102;
在本實(shí)施例中,步驟a5包括:虛擬機(jī)判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù),如為第三數(shù)值,則打開一個(gè)新的邏輯通道并將其作為當(dāng)前邏輯通道,并將與新的邏輯通道對(duì)應(yīng)的邏輯通道號(hào)返回給上位機(jī);如為第四數(shù)值,則打開與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道,給上位機(jī)返回操作成功響應(yīng);優(yōu)選的,第三數(shù)值為0000,第四數(shù)值為0001到0013之間的任意數(shù)值;
在本實(shí)施例中,如t1協(xié)議中解析得到的apdu數(shù)據(jù)為0x0070000001,則判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù)為第三數(shù)值,虛擬機(jī)打開一個(gè)新的邏輯通道并將其作為當(dāng)前邏輯通道,并將與新的邏輯通道對(duì)應(yīng)的邏輯通道號(hào)(例如0x01)返回給上位機(jī),具體的,虛擬機(jī)給智能密鑰設(shè)備返回的apdu數(shù)據(jù)為0x019000,其中01為當(dāng)前打開的邏輯通道號(hào),9000表示指令執(zhí)行成功;智能密鑰設(shè)備將apdu數(shù)據(jù)封裝成的tpdu數(shù)據(jù)為0x004003019000d2,智能密鑰設(shè)備將tpdu數(shù)據(jù)封裝成ccid消息為0x80070000000060000000004003019000d2并返回給上位機(jī);如解析得到的apdu數(shù)據(jù)為0x0070000200,則判斷道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù)為第四數(shù)值,虛擬機(jī)打開與第二邏輯通道號(hào)(0x02)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道,具體的,虛擬機(jī)給智能密鑰設(shè)備返回的apdu數(shù)據(jù)為0x9000,其中9000表示指令執(zhí)行成功;智能密鑰設(shè)備將apdu數(shù)據(jù)封裝成的tpdu數(shù)據(jù)為0x000002900092,智能密鑰設(shè)備將tpdu數(shù)據(jù)封裝成ccid消息為0x8006000000007d000000000002900092并返回給上位機(jī);
在本實(shí)施例中,如t0協(xié)議中如解析得到的apdu數(shù)據(jù)為0x0070000001,則判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù)為第三數(shù)值,虛擬機(jī)打開一個(gè)新的邏輯通道并將其作為當(dāng)前邏輯通道,并將與新的邏輯通道對(duì)應(yīng)的邏輯通道號(hào)(例如0x01)返回給上位機(jī),具體的,虛擬機(jī)給智能密鑰設(shè)備返回的apdu數(shù)據(jù)為0x019000,其中01為當(dāng)前打開的邏輯通道號(hào),9000表示指令執(zhí)行成功;智能密鑰設(shè)備將apdu數(shù)據(jù)封裝成的tpdu數(shù)據(jù)為0x019000,智能密鑰設(shè)備將tpdu數(shù)據(jù)封裝成ccid消息為0x80030000000092000000019000并返回給上位機(jī);如解析得到的apdu數(shù)據(jù)為0x0070000201,則判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù)為第四數(shù)值,虛擬機(jī)打開與第二邏輯通道號(hào)(0x02)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道,并給上位機(jī)返回操作成功信息,具體的,虛擬機(jī)給智能密鑰設(shè)備返回的apdu數(shù)據(jù)為0x9000,其中9000表示指令執(zhí)行成功;智能密鑰設(shè)備將apdu數(shù)據(jù)封裝成的tpdu數(shù)據(jù)為0x9000,智能密鑰設(shè)備將tpdu數(shù)據(jù)封裝成ccid消息為0x800200000000930000009000并返回給上位機(jī);
步驟a6:虛擬機(jī)關(guān)閉與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道,返回步驟102;
在本實(shí)施例中,步驟a6包括:虛擬機(jī)判斷輯邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù),如為第五數(shù)值則關(guān)閉當(dāng)前邏輯通道;如為第六數(shù)值,則關(guān)閉與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道;優(yōu)選的,第五數(shù)值為8000,第六數(shù)值為8001到8013之間的任意數(shù)值;
在本實(shí)施例中,如t1協(xié)議中解析得到的apdu數(shù)據(jù)為0070800000,則判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù)為第五數(shù)值,虛擬機(jī)關(guān)閉當(dāng)前邏輯通道,并給上位機(jī)返回操作成功信息,具體的,虛擬機(jī)給智能密鑰設(shè)備返回的apdu數(shù)據(jù)為0x9000,其中9000表示指令執(zhí)行成功;智能密鑰設(shè)備將apdu數(shù)據(jù)封裝成的tpdu數(shù)據(jù)為0x000002900092,智能密鑰設(shè)備將tpdu數(shù)據(jù)封裝成ccid消息為0x80060000000064000000000002900092并返回給上位機(jī);如解析得到的apdu數(shù)據(jù)為0x0070800201,則判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù)為第六數(shù)值,虛擬機(jī)關(guān)閉與第二邏輯通道號(hào)(0x02)對(duì)應(yīng)的邏輯通道,并給上位機(jī)返回操作成功信息,具體的,虛擬機(jī)給智能密鑰設(shè)備返回的apdu數(shù)據(jù)為0x9000,其中9000表示指令執(zhí)行成功;智能密鑰設(shè)備將apdu數(shù)據(jù)封裝成的tpdu數(shù)據(jù)為0x000002900092,智能密鑰設(shè)備將tpdu數(shù)據(jù)封裝成ccid消息為0x80060000000063000000000002900092并返回給上位機(jī);
在本實(shí)施例中,如t0協(xié)議中解析得到的apdu數(shù)據(jù)為0170800000,則判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù)為第五數(shù)值,虛擬機(jī)關(guān)閉當(dāng)前邏輯通道,并給上位機(jī)返回操作成功信息,具體的,虛擬機(jī)給智能密鑰設(shè)備返回的apdu數(shù)據(jù)為0x9000,其中9000表示指令執(zhí)行成功;智能密鑰設(shè)備將apdu數(shù)據(jù)封裝成的tpdu數(shù)據(jù)為0x9000,智能密鑰設(shè)備將tpdu數(shù)據(jù)封裝成ccid消息為0x800200000000a90000009000并返回給上位機(jī);如解析得到的apdu數(shù)據(jù)為0x0070800201,則判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù)為第六數(shù)值,虛擬機(jī)關(guān)閉與第二邏輯通道號(hào)(0x02)對(duì)應(yīng)的邏輯通道,并給上位機(jī)返回操作成功信息,具體的,虛擬機(jī)給智能密鑰設(shè)備返回的apdu數(shù)據(jù)為0x9000,其中9000表示指令執(zhí)行成功;智能密鑰設(shè)備將apdu數(shù)據(jù)封裝成的tpdu數(shù)據(jù)為0x9000,智能密鑰設(shè)備將tpdu數(shù)據(jù)封裝成ccid消息為0x800200000000940000009000并返回給上位機(jī);
步驟a7:虛擬機(jī)判斷選擇指令是否為應(yīng)用選擇指令,是則執(zhí)行步驟a8,否則執(zhí)行步驟103;
具體的,本實(shí)施例中步驟a7包括:虛擬機(jī)判斷指令頭中的第三、第四字節(jié)數(shù)據(jù)是否為第七數(shù)值,是則選擇指令為應(yīng)用選擇指令,否則選擇指令不為應(yīng)用選擇指令;優(yōu)選的,第七數(shù)值為0400;
步驟a8:虛擬機(jī)從選擇指令的數(shù)據(jù)域中獲取應(yīng)用程序標(biāo)識(shí)符(應(yīng)用aid);
步驟a9:虛擬機(jī)判斷根據(jù)應(yīng)用標(biāo)識(shí)符是否找到對(duì)應(yīng)的應(yīng)用,是則執(zhí)行步驟a11,否則執(zhí)行步驟a10;
步驟a10:虛擬機(jī)將狀態(tài)字發(fā)送給智能密鑰設(shè)備,執(zhí)行步驟104;
例如,本實(shí)施例中的狀態(tài)字為filenotfound;
步驟a11:虛擬機(jī)將找到的應(yīng)用作為當(dāng)前應(yīng)用,并將選擇指令發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用進(jìn)行處理,虛擬機(jī)接收當(dāng)前應(yīng)用返回的處理結(jié)果和狀態(tài)字,并將處理結(jié)果和狀態(tài)字發(fā)送給智能密鑰設(shè)備,執(zhí)行步驟104。
(二)如本實(shí)施例的智能密鑰設(shè)備中有多個(gè)邏輯通道,每個(gè)邏輯通道中有一個(gè)應(yīng)用,則在步驟102與步驟103之間還包括:
步驟b1:當(dāng)虛擬機(jī)接收到apdu數(shù)據(jù)時(shí)從apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)并將對(duì)應(yīng)的邏輯通道設(shè)置為當(dāng)前邏輯通道;
在本實(shí)施例中,從apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)具體為:從指令頭的第一個(gè)字節(jié)上獲取第一邏輯通道號(hào);
步驟b2:虛擬機(jī)根據(jù)指令頭判斷指令的類型是否為邏輯通道管理指令,是則執(zhí)行步驟b3,否則執(zhí)行步驟103;
具體的,本實(shí)施例中步驟b2包括:虛擬機(jī)判斷指令頭的第二字節(jié)數(shù)據(jù)是否為第一數(shù)值,是則為邏輯通道管理指令,否則為其他指令。
步驟b3:虛擬機(jī)從邏輯通道管理指令的指令頭中獲取第二邏輯通道號(hào);
步驟b4:虛擬機(jī)判斷邏輯通道的操作類型,如為打開邏輯通道則執(zhí)行步驟b5,如為關(guān)閉邏輯通道則執(zhí)行步驟b6;
步驟b5:虛擬機(jī)打開與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道,返回步驟102;
在本實(shí)施例中,步驟b5的實(shí)現(xiàn)過程與步驟a5相同,在此不再贅述;
步驟b6:虛擬機(jī)關(guān)閉與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道,返回步驟102。
在本實(shí)施例中,步驟b6的實(shí)現(xiàn)過程與步驟a6相同,在此不再贅述;
(三)如本實(shí)施例的智能密鑰設(shè)備中只有一個(gè)邏輯通道,該邏輯通道中有多個(gè)應(yīng)用,則在步驟102與步驟103之間還包括:
步驟c1:虛擬機(jī)根據(jù)指令頭判斷指令的類型是否為選擇指令,是則執(zhí)行步驟c2,否則執(zhí)行步驟103;
具體的,本實(shí)施例中步驟c1包括:虛擬機(jī)判斷指令頭的第二字節(jié)數(shù)據(jù)是否為第二數(shù)值,是則為選擇指令,否則為其他指令。
步驟c2:虛擬機(jī)判斷選擇指令是否為應(yīng)用選擇指令,是則執(zhí)行步驟c3,否則執(zhí)行步驟103;
在本實(shí)施例中,步驟c2的實(shí)現(xiàn)過程與步驟a7相同,在此不再贅述;
步驟c3:虛擬機(jī)從選擇指令的數(shù)據(jù)域中獲取應(yīng)用程序標(biāo)識(shí)符;
步驟c4:虛擬機(jī)判斷根據(jù)應(yīng)用標(biāo)識(shí)符是否找到對(duì)應(yīng)的應(yīng)用,是則執(zhí)行步驟c6,否則執(zhí)行步驟c5;
步驟c5:虛擬機(jī)將狀態(tài)字發(fā)送給智能密鑰設(shè)備,執(zhí)行步驟104;
步驟c6:虛擬機(jī)將找到的應(yīng)用作為當(dāng)前應(yīng)用,并將選擇指令發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用進(jìn)行處理,虛擬機(jī)接收當(dāng)前應(yīng)用返回的處理結(jié)果和狀態(tài)字,并將處理結(jié)果和狀態(tài)字一起發(fā)送給智能密鑰設(shè)備,執(zhí)行步驟104。
步驟104:智能密鑰設(shè)備將處理結(jié)果和狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī),返回步驟102;
本實(shí)施例中,步驟104的具體實(shí)現(xiàn)過程在實(shí)施例三中進(jìn)行詳述。
本實(shí)施例的方法還包括:若當(dāng)前邏輯通道中的當(dāng)前應(yīng)用接收到的虛擬機(jī)發(fā)送的指令時(shí),根據(jù)指令中的接口標(biāo)識(shí)調(diào)用相應(yīng)接口;
若當(dāng)前應(yīng)用調(diào)用第一接口時(shí),虛擬機(jī)從第一接口參數(shù)中獲取apdu(應(yīng)用協(xié)議數(shù)據(jù)單元)緩存區(qū)地址和開始存儲(chǔ)數(shù)據(jù)的偏移地址,開始接收數(shù)據(jù)并將接收到的數(shù)據(jù)存儲(chǔ)到apdu緩存區(qū)地址中與開始存儲(chǔ)數(shù)據(jù)的偏移地址的對(duì)應(yīng)位置;
具體的,在本實(shí)施例中,第一接口為apdu.setincomingandreceive();如智能密鑰設(shè)備收到的指令數(shù)據(jù)域的長(zhǎng)度大于等于apdu緩存區(qū)大小減去apdu指令頭長(zhǎng)度時(shí),所要存儲(chǔ)數(shù)據(jù)的長(zhǎng)度=apdu緩存區(qū)總長(zhǎng)度-apdu指令頭的長(zhǎng)度,如智能密鑰設(shè)備收到的指令數(shù)據(jù)域的長(zhǎng)度小于apdu緩存區(qū)大小減去apdu指令頭長(zhǎng)度時(shí),所要存儲(chǔ)數(shù)據(jù)的長(zhǎng)度=指令數(shù)據(jù)域的長(zhǎng)度;
如智能密鑰設(shè)備收取到的指令的長(zhǎng)度大于緩存區(qū)空間時(shí),當(dāng)前應(yīng)用調(diào)用第二接口,虛擬機(jī)從第二接口參數(shù)中獲取apdu緩存區(qū)地址和指定偏移地址,開始接收數(shù)據(jù)并將接收到的數(shù)據(jù)存儲(chǔ)到對(duì)應(yīng)于apdu緩存區(qū)地址中與指定偏移地址對(duì)應(yīng)的位置;
具體的,在本實(shí)施例中,第二接口為apdu.receivebytes();當(dāng)前數(shù)據(jù)包的長(zhǎng)度=apdu緩存區(qū)長(zhǎng)度-指定偏移值;
若當(dāng)前應(yīng)用調(diào)用第三接口時(shí),虛擬機(jī)設(shè)置通信方向?yàn)橄蛲猓?/p>
具體的,在本實(shí)施例中,第三接口為apdu.setoutgoing();虛擬機(jī)設(shè)置通信方向?yàn)橄蛲?,包括?/p>
步驟k1:虛擬機(jī)判斷協(xié)議類型,如為t1則執(zhí)行步驟k2,如為t0則執(zhí)行步驟k3;
在本實(shí)施例中,虛擬機(jī)根據(jù)連接函數(shù)的參數(shù)判斷協(xié)議類型;該連接函數(shù)用于連接上位機(jī)與智能密鑰設(shè)備;
步驟k2:虛擬機(jī)從apdu數(shù)據(jù)中獲取響應(yīng)數(shù)據(jù)長(zhǎng)度(le);
步驟k3:虛擬機(jī)判斷apdu類型,如為第一類型則執(zhí)行步驟k4,如為第三類型則執(zhí)行步驟k5;
具體的,在本實(shí)施例中,如果當(dāng)前應(yīng)用沒有調(diào)用第一接口和第二接口則apdu類型為第一類型,如果當(dāng)前應(yīng)用調(diào)用了第一接口和第二接口去接收數(shù)據(jù),則apdu類型為第三類型;
步驟k4:虛擬機(jī)將apdu類型轉(zhuǎn)換為第二類型,將指令頭的第五字節(jié)數(shù)據(jù)作為響應(yīng)數(shù)據(jù)長(zhǎng)度(le);
步驟k5:虛擬機(jī)將apdu類型轉(zhuǎn)換為第四類型,將最大數(shù)據(jù)長(zhǎng)度作為響應(yīng)數(shù)據(jù)長(zhǎng)度(le)。
若當(dāng)前應(yīng)用調(diào)用第四接口時(shí),虛擬機(jī)記錄響應(yīng)數(shù)據(jù)長(zhǎng)度;
在本實(shí)施例中,第四接口為apdu.setoutgoinglength();虛擬機(jī)記錄響應(yīng)數(shù)據(jù)長(zhǎng)度,包括:
步驟d1:虛擬機(jī)判斷協(xié)議類型,如為t0則執(zhí)行步驟d2,如為t1則執(zhí)行步驟d6;
步驟d2:虛擬機(jī)判斷apdu類型,如為第二類型則執(zhí)行步驟d3,如為第四類型則執(zhí)行步驟d5;
具體的,在本實(shí)施例中,步驟d2包括:虛擬機(jī)判斷當(dāng)前應(yīng)用是否調(diào)用第一接口和第二接口,是則apdu類型為第四類型,否則apdu類型為第二類型;
步驟d3:虛擬機(jī)判斷第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度與第三接口函數(shù)中獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度是否相同,是則記錄響應(yīng)數(shù)據(jù)長(zhǎng)度,否則執(zhí)行步驟d4;
步驟d4:虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù)并將其發(fā)送給智能密鑰設(shè)備;
在本實(shí)施例中,響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù)表示虛擬機(jī)要求上位機(jī)重新發(fā)送帶正確le的指令;優(yōu)選的,第一預(yù)設(shè)數(shù)據(jù)為0x6cxx;智能密鑰設(shè)備接收到響應(yīng)狀態(tài)碼后將其封裝成tpdu數(shù)據(jù),再將tpdu數(shù)據(jù)封裝成ccid返回給上位機(jī);
步驟d5:虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)并將其發(fā)送給智能密鑰設(shè)備,記錄第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度;
在本實(shí)施例中,響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)表示虛擬機(jī)要求上位機(jī)發(fā)送getresponse指令獲取響應(yīng)結(jié)果,其中g(shù)etresponse指令中包含le值,也就是上位機(jī)期望獲取的數(shù)據(jù)長(zhǎng)度;優(yōu)選的,第二預(yù)設(shè)數(shù)據(jù)為0x61xx;智能密鑰設(shè)備接收到響應(yīng)狀態(tài)碼后將其封裝成tpdu數(shù)據(jù),再將tpdu數(shù)據(jù)封裝成ccid返回給上位機(jī);
步驟d6:虛擬機(jī)記錄第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度。
若當(dāng)前應(yīng)用調(diào)用第五接口時(shí),虛擬機(jī)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;其中,虛擬機(jī)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備,具體包括:
步驟f1:虛擬機(jī)判斷協(xié)議類型,如為t0則執(zhí)行步驟f2,如為t1則執(zhí)行步驟f7;
步驟f2:虛擬機(jī)判斷響應(yīng)數(shù)據(jù)長(zhǎng)度是否小于apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度,是則執(zhí)行步驟f4,否則執(zhí)行步驟f3;
步驟f3:虛擬機(jī)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;
步驟f4:虛擬機(jī)根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備,執(zhí)行步驟f5;
在本實(shí)施例中,智能密鑰設(shè)備接收到apdu數(shù)據(jù)之后將其封裝成tpdu數(shù)據(jù),再將tpdu數(shù)據(jù)封裝成ccid數(shù)據(jù)并返回給上位機(jī);
步驟f5:虛擬機(jī)判斷apdu緩存區(qū)中的數(shù)據(jù)是否發(fā)送完成,是則結(jié)束,否則執(zhí)行步驟f6;
步驟f6:虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)并發(fā)送給智能密鑰設(shè)備;
在本實(shí)施例中,響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)表示虛擬機(jī)要求上位機(jī)發(fā)送getresponse指令獲取響應(yīng)結(jié)果,其中g(shù)etresponse指令中包含le值,也就是上位機(jī)期望獲取的數(shù)據(jù)長(zhǎng)度;優(yōu)選的,第二預(yù)設(shè)數(shù)據(jù)為0x61xx;智能密鑰設(shè)備接收到響應(yīng)狀態(tài)碼后將其封裝成tpdu數(shù)據(jù),再將tpdu數(shù)據(jù)封裝成ccid返回給上位機(jī);
步驟f7:虛擬機(jī)判斷apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度是否大于ifsd(ccid設(shè)備數(shù)據(jù)域大小),是則執(zhí)行步驟f8,否則將apdu緩存區(qū)中的數(shù)據(jù)存儲(chǔ)到tpdu緩存區(qū)中;
步驟f8:虛擬機(jī)根據(jù)ifsd對(duì)apdu緩存區(qū)中的數(shù)據(jù)進(jìn)行分組,并分別將整個(gè)數(shù)據(jù)組封裝為t1的i型數(shù)據(jù)塊發(fā)送給智能密鑰設(shè)備;
步驟f9:虛擬機(jī)判斷是否還有未發(fā)送的數(shù)據(jù)組,是則將數(shù)據(jù)組存儲(chǔ)到tpdu緩存區(qū)中,結(jié)束,否則結(jié)束;
具體的,在本實(shí)施例中,第五接口函數(shù)為apdu.sendbytes();
若當(dāng)前應(yīng)用調(diào)用第六接口時(shí),虛擬機(jī)將指定數(shù)組中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;本實(shí)施例中的指定數(shù)組是從第五接口函數(shù)的參數(shù)中獲取的;
具體的,在本實(shí)施例中,第六接口函數(shù)為apdu.sendbyteslong();虛擬機(jī)將指定數(shù)組中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備,包括:虛擬機(jī)從第六接口中獲取指定數(shù)組,將指定數(shù)組中的數(shù)據(jù)復(fù)制到apdu緩存區(qū)中,將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備。
若當(dāng)前應(yīng)用調(diào)用第七接口時(shí),虛擬機(jī)設(shè)置通信方向?yàn)橄蛲猓摂M機(jī)記錄響應(yīng)數(shù)據(jù)長(zhǎng)度,并將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備。
具體的,在本實(shí)施例中,第七接口函數(shù)為apdu.setoutgoingandsend()。
在本實(shí)施例中,第四接口和第五接口被當(dāng)前應(yīng)用調(diào)用時(shí)還有另一種實(shí)現(xiàn)方式,具體為:
若當(dāng)前應(yīng)用調(diào)用第四接口時(shí),虛擬機(jī)記錄響應(yīng)數(shù)據(jù)長(zhǎng)度;
若當(dāng)前應(yīng)用調(diào)用第五接口時(shí),虛擬機(jī)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;其中,虛擬機(jī)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備,具體包括:
步驟h1:虛擬機(jī)判斷協(xié)議類型,如為t0則執(zhí)行步驟h2,如為t1則執(zhí)行步驟h10;
步驟h2:虛擬機(jī)判斷apdu類型,如為第二類型則執(zhí)行步驟h3,如為第四類型則執(zhí)行步驟h6;
具體的,在本實(shí)施例中,如果當(dāng)前應(yīng)用未調(diào)用第一接口和第二接口則apdu類型為第二類型,如果當(dāng)前應(yīng)用調(diào)用了第一接口和第二接口去接收數(shù)據(jù),則apdu類型為第四類型;
步驟h3:虛擬機(jī)判斷第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度與第三接口函數(shù)中獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度是否相同,是則執(zhí)行步驟h5,否則執(zhí)行步驟h4;
步驟h4:虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù)并將其發(fā)送給智能密鑰設(shè)備,執(zhí)行步驟h5;
步驟h5:虛擬機(jī)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;
步驟h6:虛擬機(jī)判斷響應(yīng)數(shù)據(jù)長(zhǎng)度是否小于apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度,是則執(zhí)行步驟h7,否則將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;
步驟h7:虛擬機(jī)根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給智能密鑰設(shè)備;
步驟h8:虛擬機(jī)判斷apdu緩存區(qū)中的數(shù)據(jù)是否全部發(fā)送完成,是則結(jié)束,否則執(zhí)行步驟h9;
步驟h9:虛擬機(jī)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)并發(fā)送給智能密鑰設(shè)備;
在本實(shí)施例中,響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù)表示虛擬機(jī)要求上位機(jī)發(fā)送getresponse指令獲取響應(yīng)結(jié)果,其中g(shù)etresponse指令中包含le值,也就是上位機(jī)期望獲取的數(shù)據(jù)長(zhǎng)度;優(yōu)選的,第二預(yù)設(shè)數(shù)據(jù)為0x61xx;智能密鑰設(shè)備接收到響應(yīng)狀態(tài)碼后將其封裝成tpdu數(shù)據(jù),再將tpdu數(shù)據(jù)封裝成ccid返回給上位機(jī);
步驟h10:虛擬機(jī)判斷apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度的是否大于ifsd(ccid設(shè)備數(shù)據(jù)域大小),是則執(zhí)行步驟h11,否則將apdu緩存區(qū)中的數(shù)據(jù)存儲(chǔ)到tpdu緩存區(qū)中;
步驟h11:虛擬機(jī)根據(jù)ifsd對(duì)apdu緩存區(qū)中的數(shù)據(jù)進(jìn)行分組,并分別將整個(gè)數(shù)據(jù)組封裝為t1的i型數(shù)據(jù)塊發(fā)送給智能密鑰設(shè)備;
步驟h12:虛擬機(jī)判斷是否還有未發(fā)送的數(shù)據(jù)組,是則將數(shù)據(jù)組存儲(chǔ)到tpdu緩存區(qū)中,結(jié)束,否則結(jié)束。
實(shí)施例二
本發(fā)明實(shí)施例二提供了智能密鑰設(shè)備接收數(shù)據(jù)并對(duì)其進(jìn)行處理的實(shí)現(xiàn)過程,如圖2所示,包括:
步驟201:智能密鑰設(shè)備等待并接收ccid消息;
例如,本實(shí)施例中,智能密鑰設(shè)備接收到的ccid消息為0x62000000000097010000;其中指令數(shù)據(jù)長(zhǎng)度:0x00;
步驟202:智能密鑰設(shè)備判斷ccid消息的類型,如為第一消息則執(zhí)行步驟203,如為第二消息則執(zhí)行步驟205,如為其他則根據(jù)ccid規(guī)范對(duì)接收到的ccid消息進(jìn)行處理,將處理結(jié)果封裝成ccid消息并將其返回給上位機(jī),返回步驟201;
在本實(shí)施例中,第一消息為pc_to_rdr_iccpoweron(主機(jī)發(fā)送給智能密鑰設(shè)備的上電消息),第二消息為pc_to_rdr_xfrblock(主機(jī)發(fā)送給智能密鑰設(shè)備的數(shù)據(jù)組消息);
對(duì)于本實(shí)施例中的數(shù)據(jù)實(shí)例,智能密鑰設(shè)備根據(jù)ccid消息第一個(gè)字節(jié)數(shù)據(jù)0x62判斷ccid消息的類型為第一消息;
步驟203:智能密鑰設(shè)備進(jìn)行復(fù)位操作生成atr(復(fù)位應(yīng)答);
步驟204:智能密鑰設(shè)備將atr封裝成ccid消息并將其返回給上位機(jī),返回步驟201;
例如,本實(shí)施例中的atr為0x3b9095800184;封裝成ccid消息為0x800600000000970000003b9095800184;
步驟205:智能密鑰設(shè)備從ccid消息的數(shù)據(jù)域中獲取tpdu數(shù)據(jù);
具體的,在本實(shí)施例中,ccid消息包括十個(gè)字節(jié)的消息頭(其中,第1字節(jié)數(shù)據(jù)為消息類型、第2字節(jié)為ccid消息的數(shù)據(jù)長(zhǎng)度)和tpdu數(shù)據(jù),步驟205具體為:智能密鑰設(shè)備從ccid消息的第十一個(gè)字節(jié)開始獲取tpdu數(shù)據(jù);例如,ccid消息為6f12000000007600000000000e00a4040008a0000000030000000005,其中,6f120000000076000000為消息頭,00000e00a4040008a0000000030000000005為tpdu數(shù)據(jù);
步驟206:智能密鑰設(shè)備判斷是否獲取到指定長(zhǎng)度的tpdu數(shù)據(jù),是則執(zhí)行步驟207,否則返回步驟201;
步驟207:智能密鑰設(shè)備判斷接收數(shù)據(jù)的協(xié)議類型,如為t0則執(zhí)行步驟208,如為t1則執(zhí)行步驟210;
步驟208:智能密鑰設(shè)備對(duì)tpdu數(shù)據(jù)進(jìn)行解析得到apdu數(shù)據(jù);
具體的,在本實(shí)施例中,如數(shù)據(jù)的協(xié)議類型為t0則tpdu數(shù)據(jù)與apdu數(shù)據(jù)是相同,例如,上述例子中tpdu數(shù)據(jù)為00000e00a4040008a0000000030000000005,則在該步驟中解析得到的apdu數(shù)據(jù)為00000e00a4040008a0000000030000000005;
例如,在實(shí)施例一中步驟a1時(shí)則該步驟中的指定長(zhǎng)度為5字節(jié),若當(dāng)前應(yīng)用調(diào)用第一接口或第二接口時(shí)則指定長(zhǎng)度為所要存儲(chǔ)數(shù)據(jù)的長(zhǎng)度;
步驟209:智能密鑰設(shè)備將apdu數(shù)據(jù)發(fā)送給虛擬機(jī),返回步驟201;
步驟210:智能密鑰設(shè)備對(duì)接收到的ccid消息進(jìn)行解析得到一個(gè)t1協(xié)議塊;
具體的,在本實(shí)施例中,ccid消息包括十個(gè)字節(jié)的消息頭(其中,第1字節(jié)數(shù)據(jù)為消息類型、第2字節(jié)為ccid消息的數(shù)據(jù)長(zhǎng)度)和tpdu數(shù)據(jù),步驟205具體為:智能密鑰設(shè)備從ccid消息的第十一個(gè)字節(jié)開始獲取tpdu數(shù)據(jù);例如,ccid消息為6f12000000007600000000000e00a4040008a0000000030000000005,tpdu數(shù)據(jù)為00000e00a4040008a0000000030000000005;
步驟211:智能密鑰設(shè)備判斷得到的t1協(xié)議塊是否為t1協(xié)議信息塊,是則執(zhí)行步驟212,否則按照t1協(xié)議對(duì)獲取到的tpdu數(shù)據(jù)進(jìn)行處理,將處理結(jié)果封裝成ccid消息并返回給上位機(jī),返回步驟201;
具體的,在本實(shí)施例中,tpdu數(shù)據(jù)分為t1協(xié)議信息塊、r型信息塊、s型信息塊;
步驟212:智能密鑰設(shè)備從t1協(xié)議信息塊的inf域(信息數(shù)據(jù)域)中獲取apdu數(shù)據(jù);
具體的,在本實(shí)施例中,如數(shù)據(jù)的協(xié)議類型為t1則tpdu數(shù)據(jù)包括3個(gè)字節(jié)的數(shù)據(jù)頭(其中,第1字節(jié)固定未0x00,第2字節(jié)表示t1協(xié)議塊的類型,第3字節(jié)為apdu數(shù)據(jù)的長(zhǎng)度)和apdu數(shù)據(jù),例如,上述例子中tpdu數(shù)據(jù)為00000e00a4040008a0000000030000000005,則在該步驟中解析得到的apdu數(shù)據(jù)為00a4040008a0000000030000000005;
步驟213:智能密鑰設(shè)備判斷是否獲取到指定長(zhǎng)度的apdu數(shù)據(jù),是則將獲取到的apdu數(shù)據(jù)發(fā)送給虛擬機(jī),返回步驟201;否則返回步驟201。
實(shí)施例三
本發(fā)明實(shí)施例三提供了智能密鑰設(shè)備將處理結(jié)果和狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī)的實(shí)現(xiàn)方法,如圖3所示,本實(shí)施例方法包括:
步驟301:智能密鑰設(shè)備判斷處理結(jié)果的協(xié)議類型,如為t0則執(zhí)行步驟302,如為t1則執(zhí)行步驟307;
步驟302:智能密鑰設(shè)備判斷接收到的處理結(jié)果的長(zhǎng)度是否大于獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度(le),是則執(zhí)行304,否則執(zhí)行步驟303;
步驟303:智能密鑰設(shè)備將處理結(jié)果和狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī);
本實(shí)施例中,處理結(jié)果的協(xié)議類型如為t0則將處理結(jié)果和狀態(tài)字拼接成tpdu數(shù)據(jù);再將ccid消息頭和tpdu數(shù)據(jù)拼接成ccid消息;例如,tpdu數(shù)據(jù)為615e,ccid消息頭為8002000000006e000000,則封裝得到的ccid消息為8002000000006e000000615e;
具體的,在本實(shí)施例中,將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī),包括:
步驟p1:智能密鑰設(shè)備判斷tpdu數(shù)據(jù)的長(zhǎng)度是否大于ccid消息最大長(zhǎng)度,是則執(zhí)行步驟p2,否則將tpdu數(shù)據(jù)作為當(dāng)前tpdu數(shù)據(jù)組,執(zhí)行步驟p5;
步驟p2:智能密鑰設(shè)備根據(jù)ccid消息最大長(zhǎng)度對(duì)tpdu數(shù)據(jù)進(jìn)行分組,將第一個(gè)tpdu數(shù)據(jù)組作為當(dāng)前tpdu數(shù)據(jù)組并將其存儲(chǔ)到ccid緩存區(qū)中;
步驟p3:智能密鑰設(shè)備將ccid緩存區(qū)中的數(shù)據(jù)封裝成ccid消息并將其發(fā)送給上位機(jī);
步驟p4:智能密鑰設(shè)備判斷所有tpdu數(shù)據(jù)組是否發(fā)送完成,是則發(fā)送數(shù)據(jù)結(jié)束,否則將下一個(gè)tpdu數(shù)據(jù)組作為當(dāng)前tpdu數(shù)據(jù)組,執(zhí)行步驟p5;
步驟p5:智能密鑰設(shè)備判斷當(dāng)前tpdu數(shù)據(jù)組是否為完整的數(shù)據(jù)組,是則執(zhí)行步驟p6,否則執(zhí)行步驟p7;
步驟p6:智能密鑰設(shè)備將當(dāng)前tpdu數(shù)據(jù)組存儲(chǔ)到ccid緩存區(qū)中,并將ccid緩存區(qū)中的數(shù)據(jù)封裝成ccid消息并將其發(fā)送給上位機(jī),返回步驟p4;
步驟p7:智能密鑰設(shè)備將當(dāng)前tpdu數(shù)據(jù)組順序存儲(chǔ)到ccid緩存區(qū)中。
步驟304:智能密鑰設(shè)備根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將處理結(jié)果中對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī);
步驟305:智能密鑰設(shè)備判斷處理結(jié)果是否全部發(fā)送完成,是則智能密鑰設(shè)備將狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī);否則執(zhí)行步驟306;
步驟306:智能密鑰設(shè)備將處理結(jié)果中的剩余數(shù)據(jù)和狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī);
例如,在本實(shí)施例中的狀態(tài)字為0x61xx;上位機(jī)接收到該響應(yīng)狀態(tài)字之后會(huì)發(fā)送getresponse指令獲取數(shù)據(jù),le長(zhǎng)度在指令中指定;
步驟307:智能密鑰設(shè)備判斷處理結(jié)果的長(zhǎng)度是否大于ifsd(ccid設(shè)備數(shù)據(jù)域大小),是則執(zhí)行步驟308,否則將響應(yīng)數(shù)據(jù)作為當(dāng)前數(shù)據(jù),執(zhí)行步驟311;
步驟308:智能密鑰設(shè)備按照ifsd對(duì)處理結(jié)果進(jìn)行分組;
步驟309:智能密鑰設(shè)備分別將每個(gè)完整的數(shù)據(jù)組封裝成tpdu數(shù)據(jù),分別將每個(gè)tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī);
具體的,本實(shí)施例中該步驟的tpdu數(shù)據(jù)是t1協(xié)議信息塊;例如,該步驟中一個(gè)完整的數(shù)據(jù)組為6f5c8408a000000003000000a550734a06072a864886fc6b01600c060a2a864886fc6b02020101630906072a864886fc6b03640b06092a864886fc6b040215650b06092b8510864864020103660c060a2b060104012a026e01029f6501ff9000;tpdu數(shù)據(jù)頭為000060(第1字節(jié)數(shù)據(jù)為0x00,第2字節(jié)數(shù)據(jù)最高字節(jié)為0,表示為t1的i-block,第3字節(jié)數(shù)據(jù)0x60為apdu數(shù)據(jù)的長(zhǎng)度),封裝成的tpdu數(shù)據(jù)為0000606f5c8408a000000003000000a550734a06072a864886fc6b01600c060a2a864886fc6b02020101630906072a864886fc6b03640b06092a864886fc6b040215650b06092b8510864864020103660c060a2b060104012a026e01029f6501ff9000;ccid消息頭為80640000000076000000(其中,0x80表示為ccid的消息類型為第二消息,0x64表示ccid消息的數(shù)據(jù)域長(zhǎng)度即tpdu數(shù)據(jù)的長(zhǎng)度),封裝成的ccid消息為806400000000760000000000606f5c8408a000000003000000a550734a06072a864886fc6b01600c060a2a864886fc6b02020101630906072a864886fc6b03640b06092a864886fc6b040215650b06092b8510864864020103660c060a2b060104012a026e01029f6501ff900020;
步驟310:智能密鑰設(shè)備判斷最后一個(gè)數(shù)據(jù)組是否為完整的數(shù)據(jù)組,是則智能密鑰設(shè)備將狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī);否則將最后一個(gè)數(shù)據(jù)組作為當(dāng)前數(shù)據(jù),執(zhí)行步驟311;
步驟311:智能密鑰設(shè)備將當(dāng)前數(shù)據(jù)和狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息并返回給上位機(jī)。
實(shí)施例四
本發(fā)明實(shí)施例四提供一種智能密鑰設(shè)備,設(shè)備中可以設(shè)置有一個(gè)邏輯通道,該通道中有一個(gè)應(yīng)用;或設(shè)備中有多個(gè)邏輯通道,每個(gè)邏輯通道中有多個(gè)應(yīng)用;或設(shè)備中有多個(gè)邏輯通道,每個(gè)邏輯通道中有一個(gè)應(yīng)用;或設(shè)備中只有一個(gè)邏輯通道,該邏輯通道中有多個(gè)應(yīng)用。具體的,本實(shí)施例僅以設(shè)備中有一個(gè)邏輯通道,該通道中有一個(gè)應(yīng)用為例進(jìn)行說明,如圖4所示,該設(shè)備包括虛擬機(jī)模塊40、應(yīng)用模塊41和主體模塊42;
主體模塊42包括:
啟動(dòng)子模塊420,用于在智能密鑰設(shè)備上電后啟動(dòng)虛擬機(jī)模塊40;
第一接收子模塊421,用于接收上位機(jī)下發(fā)的ccid消息,還用于接收虛擬機(jī)模塊40發(fā)送的處理結(jié)果和狀態(tài)字;
第一處理子模塊422,用于對(duì)第一接收子模塊421接收到的ccid消息進(jìn)行處理;
在本實(shí)施例中,第一處理子模塊422具體用于對(duì)第一接收子模塊422接收到的ccid消息進(jìn)行解析得到tpdu數(shù)據(jù),對(duì)tpdu數(shù)據(jù)解析得到apdu數(shù)據(jù);
封裝子模塊423,用于將第一接收子模塊421接收到的處理結(jié)果和狀態(tài)字封裝成tpdu數(shù)據(jù),將tpdu數(shù)據(jù)封裝成ccid消息;
第一發(fā)送子模塊424,用于將第一處理子模塊422解析得到的apdu數(shù)據(jù)發(fā)送給虛擬機(jī)模塊40;還用于將封裝子模塊423封裝得到的ccid消息返回給上位機(jī);
虛擬機(jī)模塊40包括:
第二接收子模塊400,用于接收主體模塊42發(fā)送的apdu數(shù)據(jù),還用于接收應(yīng)用模塊41發(fā)送的處理結(jié)果和狀態(tài)字;
第二發(fā)送子模塊401,用于將第二接收子模塊400接收到的apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用模塊41,還用于將第二接收子模塊400接收到的處理結(jié)果和狀態(tài)字發(fā)送給主體模塊42;
第一接口子模塊402,用于當(dāng)?shù)谝唤涌诒徽{(diào)用時(shí),從第一接口參數(shù)中獲取apdu緩存區(qū)地址和開始存儲(chǔ)數(shù)據(jù)的偏移地址,開始接收數(shù)據(jù)并將接收到的數(shù)據(jù)存儲(chǔ)到apdu緩存區(qū)地址中與開始存儲(chǔ)數(shù)據(jù)的偏移地址的對(duì)應(yīng)位置;
第七接口子模塊403,用于當(dāng)?shù)谄呓涌诒徽{(diào)用時(shí),設(shè)置通信方向?yàn)橄蛲?,記錄響?yīng)數(shù)據(jù)長(zhǎng)度,并將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給主體模塊42;
應(yīng)用模塊41包括:
第三接收子模塊410,用于接收虛擬機(jī)模塊40發(fā)送的apdu數(shù)據(jù);
具體的,在本實(shí)施例中,apdu數(shù)據(jù)包括指令;
第二處理子模塊411,用于對(duì)第三接收子模塊410接收到的apdu數(shù)據(jù)進(jìn)行處理;
第三發(fā)送子模塊412,用于將第二處理子模塊411的處理結(jié)果和狀態(tài)字發(fā)送給虛擬機(jī)模塊40;
調(diào)用子模塊413,用于根據(jù)第三接收子模塊410接收到的虛擬機(jī)模塊40發(fā)送的指令中的接口標(biāo)識(shí)調(diào)用相應(yīng)接口。
在本實(shí)施例中,虛擬機(jī)模塊40還包括:
第二接口子模塊,用于當(dāng)?shù)诙涌诒徽{(diào)用時(shí),從第二接口參數(shù)中獲取apdu緩存區(qū)地址和指定偏移地址,開始接收數(shù)據(jù)并將接收到的數(shù)據(jù)存儲(chǔ)到對(duì)應(yīng)于apdu緩存區(qū)地址中與指定偏移地址對(duì)應(yīng)的位置;
第三接口子模塊,用于當(dāng)?shù)谌涌诒徽{(diào)用時(shí),設(shè)置通信方向?yàn)橄蛲猓?/p>
具體的,在本實(shí)施例中,第三接口子模塊包括:
第一判斷單元,用于判斷協(xié)議類型;
第一獲取單元,用于當(dāng)?shù)谝慌袛鄦卧袛酁閠1時(shí)從apdu數(shù)據(jù)中獲取響應(yīng)數(shù)據(jù)長(zhǎng)度;
第二判斷單元,用于當(dāng)?shù)谝慌袛鄦卧袛酁閠0時(shí)判斷apdu類型;
第一轉(zhuǎn)換單元,用于當(dāng)?shù)诙袛鄦卧袛酁榈谝活愋蜁r(shí)將apdu類型轉(zhuǎn)換為第二類型,將指令頭的第五字節(jié)數(shù)據(jù)作為響應(yīng)數(shù)據(jù)長(zhǎng)度;
第二轉(zhuǎn)換單元,用于當(dāng)?shù)诙袛鄦卧袛酁榈谌愋蜁r(shí)將apdu類型轉(zhuǎn)換為第四類型,將最大數(shù)據(jù)長(zhǎng)度作為響應(yīng)數(shù)據(jù)長(zhǎng)度;
第四接口子模塊,用于當(dāng)?shù)谒慕涌诒徽{(diào)用時(shí),記錄響應(yīng)數(shù)據(jù)長(zhǎng)度;
具體的,在本實(shí)施例中,第四接口子模塊包括:
第三判斷單元,用于判斷協(xié)議類型;
第四判斷單元,用于當(dāng)?shù)谌袛鄦卧袛酁閠0時(shí)判斷apdu類型;
在本實(shí)施例中,第四判斷單元具體用于判斷當(dāng)前應(yīng)用是否調(diào)用了第一接口和第二接口,是則判斷apdu類型為第四類型,否則判斷apdu類型為第二類型;
第五判斷單元,用于當(dāng)?shù)谒呐袛鄦卧袛酁榈诙愋蜁r(shí)判斷第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度與第三接口函數(shù)中獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度是否相同,是則記錄響應(yīng)數(shù)據(jù)長(zhǎng)度;
第一設(shè)置單元,用于當(dāng)?shù)谖迮袛鄦卧袛酁榉駮r(shí)設(shè)置響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù);
設(shè)置記錄單元,用于當(dāng)?shù)谒呐袛鄦卧袛酁榈谒念愋蜁r(shí)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù),記錄第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度;
第一紀(jì)錄單元,用于當(dāng)?shù)谌袛鄦卧袛酁閠1時(shí)記錄第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度;
第二發(fā)送子模塊401,還用于將第一設(shè)置單元和設(shè)置記錄單元設(shè)置的響應(yīng)狀態(tài)碼發(fā)送給主體模塊42;
第五接口子模塊,用于當(dāng)?shù)谖褰涌诒徽{(diào)用時(shí),將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給主體模塊;
在本實(shí)施例中,第五接口子模塊有兩種實(shí)現(xiàn)方式;
(1)第五接口子模塊包括:
第六判斷單元,用于判斷協(xié)議類型;
第七判斷單元,用于當(dāng)?shù)诹袛鄦卧袛酁閠0時(shí)判斷響應(yīng)數(shù)據(jù)長(zhǎng)度是否小于apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度;
第八判斷單元,用于在第二發(fā)送子模塊402根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給主體模塊41之后判斷apdu緩存區(qū)中的數(shù)據(jù)是否發(fā)送完成;
第二設(shè)置單元,用于當(dāng)?shù)诎伺袛鄦卧袛酁榉駮r(shí)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù);
第九判斷單元,用于當(dāng)?shù)诹袛鄦卧袛酁閠1時(shí)判斷apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度是否大于ccid設(shè)備數(shù)據(jù)域大??;
第一存儲(chǔ)單元,用于當(dāng)?shù)诰排袛鄦卧袛酁榉駮r(shí)將apdu緩存區(qū)中的數(shù)據(jù)存儲(chǔ)到tpdu緩存區(qū)中;
第一分組單元,用于當(dāng)?shù)诰排袛鄦卧袛酁槭菚r(shí)根據(jù)ccid設(shè)備數(shù)據(jù)域大小對(duì)apdu緩存區(qū)中的數(shù)據(jù)進(jìn)行分組;
第十判斷單元,用于判斷是否還有未發(fā)送的數(shù)據(jù)組;
第二存儲(chǔ)單元,用于當(dāng)?shù)谑袛鄦卧袛酁槭菚r(shí)將數(shù)據(jù)組存儲(chǔ)到tpdu緩存區(qū)中;
第二發(fā)送子模塊401,還用于將第二設(shè)置單元設(shè)置的響應(yīng)狀態(tài)碼發(fā)送主體模塊42,還用于當(dāng)?shù)谄吲袛鄦卧袛酁槭菚r(shí)根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給主體模塊42,第七判斷單元判斷為否時(shí)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給主體模塊42,還用于將第一分組單元分組得到的整個(gè)數(shù)據(jù)組封裝為t1的i型數(shù)據(jù)塊發(fā)送給主體模塊42;
(2)第五接口子模塊包括:
第十一判斷單元,用于判斷協(xié)議類型;
第十二判斷單元,用于當(dāng)?shù)厥慌袛鄦卧袛酁閠0時(shí)判斷apdu類型;
第十三判斷單元,用于當(dāng)?shù)厥袛鄦卧袛酁榈诙愋蜁r(shí)判斷第四接口參數(shù)中的響應(yīng)數(shù)據(jù)長(zhǎng)度與第三接口函數(shù)中獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度是否相同;
第三設(shè)置單元,用于當(dāng)?shù)谑袛鄦卧袛酁榉駮r(shí)設(shè)置響應(yīng)狀態(tài)碼為第一預(yù)設(shè)數(shù)據(jù);
第十四判斷單元,用于當(dāng)?shù)厥袛鄦卧袛酁榈谒念愋蜁r(shí)判斷響應(yīng)數(shù)據(jù)長(zhǎng)度是否小于apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度;
第十五判斷單元,用于在第二發(fā)送子模塊402根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給主體模塊42之后判斷apdu緩存區(qū)中的數(shù)據(jù)是否全部發(fā)送完成;
第四設(shè)置單元,用于當(dāng)?shù)谑迮袛鄦卧袛酁榉駮r(shí)設(shè)置響應(yīng)狀態(tài)碼為第二預(yù)設(shè)數(shù)據(jù);
第十六判斷單元,用于當(dāng)?shù)厥慌袛鄦卧袛酁閠1時(shí)判斷apdu緩存區(qū)中的數(shù)據(jù)的長(zhǎng)度的是否大于ccid設(shè)備數(shù)據(jù)域大小;
第三存儲(chǔ)單元,用于當(dāng)?shù)谑袛鄦卧袛酁榉駮r(shí)將apdu緩存區(qū)中的數(shù)據(jù)存儲(chǔ)到tpdu緩存區(qū)中;
第二分組單元,用于當(dāng)?shù)谑袛鄦卧袛酁槭菚r(shí)根據(jù)ccid設(shè)備數(shù)據(jù)域大小對(duì)apdu緩存區(qū)中的數(shù)據(jù)進(jìn)行分組;
第十七判斷單元,還用于判斷是否還有未發(fā)送的數(shù)據(jù)組;
第四存儲(chǔ)單元,用于當(dāng)?shù)谑吲袛鄦卧袛酁槭菚r(shí)將數(shù)據(jù)組存儲(chǔ)到tpdu緩存區(qū)中;
第二發(fā)送子模塊401還用于將第三設(shè)置單元設(shè)置的響應(yīng)狀態(tài)碼和apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給主體模塊42,還用于當(dāng)?shù)谑袛鄦卧袛酁槭菚r(shí)和第十四判斷單元判斷為否時(shí)將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給主體模塊42,還用于當(dāng)?shù)谑呐袛鄦卧袛酁槭菚r(shí)根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將apdu緩存區(qū)中的對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)發(fā)送給主體模塊42,還用于將第四設(shè)置單元設(shè)置的響應(yīng)狀態(tài)碼發(fā)送給主體模塊42;還用于將第二分組單元分組得到的整個(gè)數(shù)據(jù)組封裝為t1的i型數(shù)據(jù)塊發(fā)送給主體模塊42;
第六接口子模塊,用于當(dāng)?shù)诹涌诒徽{(diào)用時(shí),將指定數(shù)組中的數(shù)據(jù)發(fā)送給主體模塊42;
在本實(shí)施例中,第六接口子模塊具體用于從第六接口中獲取指定數(shù)組,將指定數(shù)組中的數(shù)據(jù)復(fù)制到apdu緩存區(qū)中,將apdu緩存區(qū)中的數(shù)據(jù)發(fā)送給主體模塊42。
(一)如本實(shí)施例的智能密鑰設(shè)備中有多個(gè)邏輯通道,每個(gè)邏輯通道中有多個(gè)應(yīng)用,則虛擬機(jī)模塊40還包括:
第一設(shè)置子模塊,用于從第二接收子模塊接收到的apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)并將對(duì)應(yīng)的邏輯通道設(shè)置為當(dāng)前邏輯通道;
第一判斷子模塊,用于根據(jù)apdu數(shù)據(jù)的指令頭判斷指令的類型;
在本實(shí)施例中,第一判斷子模塊,具體用于判斷apdu數(shù)據(jù)的指令頭的第二字節(jié)數(shù)據(jù),如為第一數(shù)值則為邏輯通道管理指令,如為第二數(shù)值則為選擇指令,如為其他數(shù)據(jù)則為其他指令;
第一獲取子模塊,用于當(dāng)?shù)谝慌袛嘧幽K判斷指令的類型為邏輯通道管理指令時(shí)從邏輯通道管理指令的指令頭中獲取第二邏輯通道號(hào);
第二判斷子模塊,用于判斷邏輯通道的操作類型;
打開子模塊,用于當(dāng)?shù)诙袛嘧幽K判斷操作類型為打開邏輯通道時(shí)打開與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道;
關(guān)閉子模塊,用于當(dāng)?shù)诙袛嘧幽K判斷操作類型為關(guān)閉邏輯通道時(shí)關(guān)閉與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道;
第三判斷子模塊,用于當(dāng)?shù)谝慌袛嘧幽K判斷指令的類型為選擇指令時(shí)判斷選擇指令是否為應(yīng)用選擇指令;
第二獲取子模塊,用于當(dāng)?shù)谌袛嘧幽K判斷為是時(shí)從選擇指令的數(shù)據(jù)域中獲取應(yīng)用程序標(biāo)識(shí)符;
第四判斷子模塊,用于判斷根據(jù)應(yīng)用標(biāo)識(shí)符是否找到對(duì)應(yīng)的應(yīng)用;
第四發(fā)送子模塊,用于當(dāng)?shù)谒呐袛嘧幽K判斷為否時(shí)將狀態(tài)字發(fā)送給主體模塊42;
作為子模塊,用于當(dāng)?shù)谒呐袛嘧幽K判斷為是時(shí)將找到的應(yīng)用作為當(dāng)前應(yīng)用;
第二發(fā)送子模塊401還用于當(dāng)?shù)谝慌袛嘧幽K判斷指令的類型為其他指令時(shí)和第三判斷子模塊判斷為否時(shí)將apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用模塊41;
第三接收子模塊410,還用于接收虛擬機(jī)模塊40發(fā)送的apdu數(shù)據(jù);
第二處理子模塊411,還用于對(duì)第三接收子模塊410接收到的apdu數(shù)據(jù)進(jìn)行處理。
(二)如本實(shí)施例的智能密鑰設(shè)備中有多個(gè)邏輯通道,每個(gè)邏輯通道中有一個(gè)應(yīng)用,則虛擬機(jī)模塊40還包括:
第一設(shè)置子模塊,用于從第二接收子模塊接收到的apdu數(shù)據(jù)的指令頭中獲取第一邏輯通道號(hào)并將對(duì)應(yīng)的邏輯通道設(shè)置為當(dāng)前邏輯通道;
第五判斷子模塊,用于根據(jù)指令頭判斷指令的類型是否為邏輯通道管理指令;
第一獲取子模塊,用于當(dāng)?shù)谖迮袛嘧幽K判斷為是時(shí)從邏輯通道管理指令的指令頭中獲取第二邏輯通道號(hào);
第二判斷子模塊,用于判斷邏輯通道的操作類型;
打開子模塊,用于當(dāng)?shù)诙袛嘧幽K判斷操作類型為打開邏輯通道時(shí)打開與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道;
關(guān)閉子模塊,用于當(dāng)?shù)诙袛嘧幽K判斷操作類型為關(guān)閉邏輯通道時(shí)關(guān)閉與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道;
第二發(fā)送子模塊401還用于當(dāng)?shù)谖迮袛嘧幽K判斷為否時(shí)將apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用模塊41;
第三接收子模塊410,還用于接收虛擬機(jī)模塊40發(fā)送的apdu數(shù)據(jù);
第二處理子模塊411,還用于對(duì)第三接收子模塊410接收到的apdu數(shù)據(jù)進(jìn)行處理。
(三)如本實(shí)施例的智能密鑰設(shè)備中只有一個(gè)邏輯通道,該邏輯通道中有多個(gè)應(yīng)用,則虛擬機(jī)模塊40還包括:
第六判斷子模塊,用于根據(jù)apdu數(shù)據(jù)的指令頭判斷指令的類型是否為選擇指令;
第三判斷子模塊,用于當(dāng)?shù)诹袛嘧幽K判斷為是時(shí)判斷選擇指令是否為應(yīng)用選擇指令;
第二獲取子模塊,用于從當(dāng)?shù)谌袛嘧幽K判斷為是時(shí)從選擇指令的數(shù)據(jù)域中獲取應(yīng)用程序標(biāo)識(shí)符;
第四判斷子模塊,用于判斷根據(jù)應(yīng)用標(biāo)識(shí)符是否找到對(duì)應(yīng)的應(yīng)用;
第四發(fā)送子模塊,用于當(dāng)?shù)谒呐袛嘧幽K判斷為否時(shí)將狀態(tài)字發(fā)送給主體模塊42;
作為子模塊,用于當(dāng)?shù)谒呐袛嘧幽K判斷為是時(shí)將找到的應(yīng)用作為當(dāng)前應(yīng)用;
第二發(fā)送子模塊401還用于當(dāng)?shù)诹袛嘧幽K判斷和第三判斷子模塊為否時(shí)將apdu數(shù)據(jù)發(fā)送給當(dāng)前邏輯通道中的當(dāng)前應(yīng)用模塊41;
第三接收子模塊410,還用于接收虛擬機(jī)模塊40發(fā)送的apdu數(shù)據(jù);
第二處理子模塊411,還用于對(duì)第三接收子模塊410接收到的apdu數(shù)據(jù)進(jìn)行處理。
具體的,本實(shí)施例中的第一設(shè)置子模塊具體用于從指令頭的第一個(gè)字節(jié)上獲取第一邏輯通道號(hào)。
具體的,本實(shí)施例中的打開子模塊具體用于判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù),如為第三數(shù)值,則打開一個(gè)新的邏輯通道并將其作為當(dāng)前邏輯通道;如為第四數(shù)值,則打開與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道并將其作為當(dāng)前邏輯通道;
第二發(fā)送子模塊401還用于將與新的邏輯通道對(duì)應(yīng)的邏輯通道號(hào)作為響應(yīng)數(shù)據(jù)返回給主體模塊42。
具體的,本實(shí)施例中的關(guān)閉子模塊具體用于判斷邏輯通道管理指令的指令頭中第三、第四字節(jié)數(shù)據(jù),如為第五數(shù)值則關(guān)閉當(dāng)前邏輯通道;如為第六數(shù)值,則關(guān)閉與第二邏輯通道號(hào)對(duì)應(yīng)的邏輯通道。
具體的,本實(shí)施例中的第三判斷子模塊具體用于判斷apdu數(shù)據(jù)的指令頭中的第三、第四字節(jié)數(shù)據(jù)是否為第七數(shù)值,是則判斷選擇指令為應(yīng)用選擇指令,否則判斷選擇指令不為應(yīng)用選擇指令。
具體的,在本實(shí)施例中,第一處理子模塊422包括:
第十八判斷單元,用于判斷ccid消息的類型;
第一處理單元,用于當(dāng)?shù)谑伺袛鄦卧袛郼cid消息為其他消息時(shí)根據(jù)ccid規(guī)范對(duì)接收到的ccid消息進(jìn)行處理;
復(fù)位操作單元,用于當(dāng)?shù)谑伺袛鄦卧袛郼cid消息為第一消息時(shí)進(jìn)行復(fù)位操作生成復(fù)位應(yīng)答;
第二獲取單元,用于當(dāng)?shù)谑伺袛鄦卧袛郼cid消息為第二消息從ccid消息的數(shù)據(jù)域中獲取tpdu數(shù)據(jù);
第十九判斷單元,用于判斷第二獲取單元是否獲取到指定長(zhǎng)度的tpdu數(shù)據(jù);
第二十判斷單元,用于當(dāng)?shù)谑排袛鄦卧袛酁槭菚r(shí)判斷接收數(shù)據(jù)的協(xié)議類型;
第一解析單元,用于當(dāng)?shù)诙袛鄦卧袛酁閠0時(shí)對(duì)tpdu數(shù)據(jù)進(jìn)行解析得到apdu數(shù)據(jù);
第二解析單元,用于當(dāng)?shù)诙袛鄦卧袛酁閠1時(shí)對(duì)接收到的ccid消息進(jìn)行解析得到一個(gè)t1協(xié)議塊;
第二十一判斷單元,用于判斷第二解析單元得到的t1協(xié)議塊是否為t1協(xié)議信息塊,
第二處理單元,用于當(dāng)?shù)诙慌袛鄦卧袛酁榉駮r(shí)按照t1協(xié)議對(duì)獲取到的tpdu數(shù)據(jù)進(jìn)行處理;
第三獲取單元,用于當(dāng)?shù)诙慌袛鄦卧袛酁槭菚r(shí)從t1協(xié)議信息塊的信息數(shù)據(jù)域中獲取apdu數(shù)據(jù);
第二十二判斷單元,用于判斷第三獲取單元是否獲取到指定長(zhǎng)度的apdu數(shù)據(jù);
封裝子模塊,還用于將第一處理單元和第二處理單元的處理結(jié)果封裝成ccid消息,還用于將復(fù)位操作單元的復(fù)位應(yīng)答封裝成ccid消息;
第一發(fā)送子模塊還用于當(dāng)?shù)诙袛鄦卧袛酁槭菚r(shí)將第三獲取單元獲取的apdu數(shù)據(jù)發(fā)送給虛擬機(jī)模塊40。
具體的,在本實(shí)施例中,封裝子模塊423包括:
第二十三判斷單元,用于判斷處理結(jié)果的協(xié)議類型;
第二十四判斷單元,用于當(dāng)?shù)诙袛鄦卧袛酁閠0時(shí)判斷處理結(jié)果的長(zhǎng)度是否大于獲取的響應(yīng)數(shù)據(jù)長(zhǎng)度;
第一封裝單元,用于當(dāng)?shù)诙呐袛鄦卧袛酁榉駮r(shí)將處理結(jié)果和狀態(tài)字封裝成tpdu數(shù)據(jù);
第二封裝單元,用于當(dāng)?shù)诙呐袛鄦卧袛酁槭菚r(shí)根據(jù)響應(yīng)數(shù)據(jù)長(zhǎng)度將處理結(jié)果中對(duì)應(yīng)長(zhǎng)度的數(shù)據(jù)封裝成tpdu數(shù)據(jù);
第二十五判斷單元,用于在第一發(fā)送子模塊424將第七封裝單元封裝好的ccid消息返回給上位機(jī)判斷處理結(jié)果是否全部發(fā)送完成;
第三封裝單元,用于當(dāng)?shù)诙迮袛鄦卧袛酁榉駮r(shí)將處理結(jié)果中的剩余數(shù)據(jù)和狀態(tài)字封裝成tpdu數(shù)據(jù);
第二十六判斷單元,用于當(dāng)?shù)诙袛鄦卧袛酁閠1時(shí)判斷處理結(jié)果的長(zhǎng)度是否大于ccid設(shè)備數(shù)據(jù)域大?。?/p>
第一作為單元,用于當(dāng)?shù)诙袛鄦卧袛酁榉駮r(shí)將處理結(jié)果作為當(dāng)前數(shù)據(jù);
第三分組單元,用于當(dāng)?shù)诙袛鄦卧袛酁槭菚r(shí)按照ccid設(shè)備數(shù)據(jù)域大小對(duì)處理結(jié)果進(jìn)行分組;
第四封裝單元,用于分別將第三分組單元的每個(gè)完整的數(shù)據(jù)組封裝成tpdu數(shù)據(jù);
第二十七判斷單元,用于判斷最后一個(gè)數(shù)據(jù)組是否為完整的數(shù)據(jù)組;
第二作為單元,用于當(dāng)?shù)诙吲袛鄦卧袛酁榉駮r(shí)將最后一個(gè)數(shù)據(jù)組作為當(dāng)前數(shù)據(jù);
第五封裝單元,用于當(dāng)?shù)诙迮袛鄦卧袛酁槭菚r(shí)和第二十七判斷單元判斷為是時(shí)將狀態(tài)字封裝成tpdu數(shù)據(jù);
第六封裝單元,用于分別將第一作為單元和第二作為單元的當(dāng)前數(shù)據(jù)、狀態(tài)字封裝成tpdu數(shù)據(jù);
第七封裝單元,用于將第一封裝單元、第二封裝單元、第三封裝單元、第四封裝單元、第五封裝單元和第六封裝單元的tpdu數(shù)據(jù)封裝成ccid消息;
具體的,在本實(shí)施例中,第七封裝單元包括:
第一判斷子單元,用于判斷tpdu數(shù)據(jù)的長(zhǎng)度是否大于ccid消息最大長(zhǎng)度;
第一作為子單元,用于當(dāng)?shù)谝慌袛嘧訂卧袛酁榉駮r(shí)將tpdu數(shù)據(jù)作為當(dāng)前tpdu數(shù)據(jù)組;
第一分組子單元,用于當(dāng)?shù)谝慌袛嘧訂卧袛酁槭菚r(shí)根據(jù)ccid消息最大長(zhǎng)度對(duì)tpdu數(shù)據(jù)進(jìn)行分組,將第一個(gè)tpdu數(shù)據(jù)組作為當(dāng)前tpdu數(shù)據(jù)組并將其存儲(chǔ)到ccid緩存區(qū)中;
第二判斷子單元,用于在第一發(fā)送子模塊424將封裝子單元封裝好的ccid消息返回給上位機(jī)之后判斷所有tpdu數(shù)據(jù)組是否發(fā)送完成;
第二作為子單元,用于當(dāng)?shù)诙袛嘧訂卧袛酁榉駮r(shí)將下一個(gè)tpdu數(shù)據(jù)組作為當(dāng)前tpdu數(shù)據(jù)組;
第三判斷子單元,用于判斷第一作為子單元和第二作為子單元的當(dāng)前tpdu數(shù)據(jù)組是否為完整的數(shù)據(jù)組;
第一存儲(chǔ)子單元,用于當(dāng)?shù)谌袛嘧訂卧袛酁槭菚r(shí)將當(dāng)前tpdu數(shù)據(jù)組存儲(chǔ)到ccid緩存區(qū)中;
封裝子單元,用于將第一分組子單元和第一存儲(chǔ)子單元存儲(chǔ)到ccid緩存區(qū)中的數(shù)據(jù)封裝成ccid消息;
第二存儲(chǔ)子單元,用于當(dāng)?shù)谌袛嘧訂卧袛酁榉駮r(shí)將當(dāng)前tpdu數(shù)據(jù)組順序存儲(chǔ)到ccid緩存區(qū)中。
本實(shí)施例提供了一種自定義功能的智能密鑰設(shè)備,智能密鑰設(shè)備內(nèi)置java虛擬機(jī),符合globalplatform規(guī)范和java卡規(guī)范,是一種智能密鑰設(shè)備形式的java卡。支持多種算法,并提供了java卡應(yīng)用編程接口,用戶可以自行開發(fā)符合自己功能需求的java卡片應(yīng)用下載到智能密鑰設(shè)備中,同時(shí)支持多個(gè)不同功能的應(yīng)用,真正的實(shí)現(xiàn)一個(gè)密鑰設(shè)備多應(yīng)用。
以上所述,僅為本發(fā)明較佳的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明公開的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求的保護(hù)范圍為準(zhǔn)。