| bmRequestType | bRequest | wValueL | wValueH | wIndex | wLength | Data |
| 00100001B($21) | Set_Report($09) | Zero | Feature($03) | Zero | 8 | KeyID |
2.3 如何設(shè)計(jì)安全鑰端新功能的USB固件
USB 固件(Firmware),就是USB安全鑰硬件上采用的單片機(jī)和其他處理器中有關(guān)USB通信的程序。這里采用Motorola公司的8位單片機(jī) MC68HC908JB8作為USB安全鑰的控制器芯片。MC68HC908JB8帶有USB接口,8K的Flash,支持USB 1.1版本中的低速(Low Speed)設(shè)備,資源有限,主要用于實(shí)現(xiàn)USB通信,價(jià)格比較低廉。因此,很適合于USB安全鑰。MC68HC908JB8中USB通信的程序模塊,包含在實(shí)現(xiàn)MC68HC908JB8所有功能的匯編程序中。
圖2是經(jīng)典的USB固件的流程圖。考慮到USB安全鑰中USB數(shù)據(jù)通信量很小,不需要考慮通信時(shí)間,采用中斷傳輸方式。整個(gè)程序就是在等待數(shù)據(jù)傳輸要求的中斷到來,從而進(jìn)入數(shù)據(jù)傳輸模塊。讀/寫數(shù)據(jù)緩沖區(qū),往USB端點(diǎn)(Endpoint)中讀/寫數(shù)據(jù),
交給USB模塊收發(fā)數(shù)據(jù)。當(dāng)USB安全鑰不需要傳輸數(shù)據(jù)時(shí),就進(jìn)入掛起狀態(tài)(Suspend)。在得到PC主機(jī)遠(yuǎn)程喚醒后啟動(dòng),繼續(xù)工作。
新增功能中,主要完成的兩個(gè)功能就是KeyID的讀取和修改,即實(shí)現(xiàn)Get_KeyID和Set_KeyID功能。程序構(gòu)思大致是:對(duì)于 Get_KeyID,在接收到PC端發(fā)來的讀取KeyID的中斷后,立即從端點(diǎn)1發(fā)送8字節(jié)的KeyID,這一段沒有什么特別之處;對(duì)于 Set_KeyID,在接收到信號(hào)后,立即轉(zhuǎn)入Set_KeyID子程序。首先將存儲(chǔ)KeyID的Flash去保護(hù),然后寄存器置位,即在硬件上給 Flash一個(gè)高電平,接著進(jìn)行擦除,再將保存于緩沖區(qū)的PC發(fā)來的新KeyID存儲(chǔ)到Flash中。最后,置Flash狀態(tài)寄存器位,給Flash加保護(hù)。
2.4 PC端新增功能的USB驅(qū)動(dòng)程序設(shè)計(jì)
Windows 98的驅(qū)動(dòng)程序從結(jié)構(gòu)上來說分為兩層:內(nèi)核層和用戶層。USB的客戶驅(qū)動(dòng)程序?qū)儆谟脩魧,而USB類驅(qū)動(dòng)程序和底層驅(qū)動(dòng)程序則屬于內(nèi)核層。目前,USB還屬于起步階段,Windows對(duì)USB的支持還不夠完善,僅支持內(nèi)核層。USB開發(fā)人員所要做的,就是開發(fā)客戶驅(qū)動(dòng)程序,直接與類驅(qū)動(dòng)程序打交道。
HID 屬于USB設(shè)備類中的一個(gè)子類,Windows對(duì)它提供了非常強(qiáng)大的支持,尤其是在用戶層提供了Hid.dll,其中包含了用戶層驅(qū)動(dòng)程序與類驅(qū)動(dòng)程序通信需要的各種功能模塊,將它們以API的形式提供給用戶函數(shù)接口。這樣,在編寫客戶驅(qū)動(dòng)程序的時(shí)候就可以直接調(diào)用這些API函數(shù)來完成諸如IN、OUT等功能,大大降低了編寫驅(qū)程序的難度。
HID客戶驅(qū)動(dòng)程序訪問HID類驅(qū)動(dòng)程序,由HID類驅(qū)動(dòng)程序完成大多數(shù)工作,而硬件交互由HID小驅(qū)動(dòng)程序HidUsb.sys處理,HID小驅(qū)動(dòng)程序調(diào)用USB底層驅(qū)動(dòng)程序USBD.sys訪問設(shè)備。
這里介紹用戶模式的HID客戶驅(qū)動(dòng)程序設(shè)計(jì)過程。它主要包括三個(gè)方面的工作:
·查找所有HID設(shè)備;
·對(duì)于查找到的每一個(gè)HID設(shè)備,檢查其功能,判斷是否為感興趣的設(shè)備;
·根據(jù)用戶需要讀取HID輸入Report(Feature)或者寫HID輸出Report(Feature)。
程序流程如下:
(1)查找USB安全鑰設(shè)備;
(2)讀取HID設(shè)備功能;
(3)具體實(shí)現(xiàn)Get_KeyID和Set_KeyID子函數(shù);
BOOL CusbKey::GetKeyID() //Get_KeyID子程序{…
result=HidD_GetFeature(HidDevice,ReadBuffer,0x09);
//調(diào)用此函數(shù),獲取從端點(diǎn)1發(fā)來的8字節(jié)KeyID的16進(jìn)制檢查代碼
for(i=0;i<8;i++)
WriteBuffer[i+1]=DataBuffer[2*i]+DataBuffer[2*i+1];
result=HidD_SetFeature(HidDevice,WriteBuffer,0x09);
return TRUE;
}
(4)程序運(yùn)行結(jié)果。
編譯連接之后,最終會(huì)生成可執(zhí)行文件KEYDEMO.exe。執(zhí)行它即可SK通信,實(shí)現(xiàn)各種功能。





