《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業界動態 > U盤唯一性標識信息的構建與識別方法

U盤唯一性標識信息的構建與識別方法

2009-06-26
作者:李俊艷1,2, 高 楊2,3,

??? 摘? 要: 根據涉密存儲介質保密管理的要求,以U盤為例,提出一種新穎的、以USB協議和大容量存儲類協議為基礎的移動存儲介質管理架構。存儲介質的唯一性標識由VID、PID和硬件序列號組成。同時還提出了基于CY7C67300嵌入式主機控制器的USB總線介質管理方案。通過USB總線枚舉方式,逐一識別介質唯一性標識并通過超級終端顯示。測試結果證明,該標識和識別方法可以用于移動存儲介質安全管理系統,從而使涉密移動存儲介質處于實時監控狀態下,大大減少了泄密風險。?

??? 關鍵詞: 信息安全; 移動存儲介質; 唯一性標識; 嵌入式USB主機控制器; USB總線枚舉

?

??? 按照保密管理規定,涉密單位職工使用完U盤等移動存儲介質必須當天按時歸還保密員,并存儲在密碼文件柜中(如部隊的槍支入架)。保密文件柜由保密員人工管理,涉及借出、歸還、監督、提醒等事項,難免疏漏。若個別人員違規(未經審批許可)攜帶涉密U盤外出,可能導致涉密U盤丟失或涉密數據失竊,泄漏國家或商業秘密,造成巨大的損失。因此,涉密U盤的保密管理,需要依靠創新的技術手段,保障保密管理規章制度的貫徹落實。為了實現涉密U盤保密管理的智能化“機控”,需要為每個U盤定義一個可查詢、不易修改的唯一性標識(Unique identifier),且該標識應很容易與使用者綁定,從而使涉密U盤的保密管理責任到人,以減少泄密隱患。?

??? 本文以通用串行總線USB1.0、USB2.0協議為基礎,采用CY7C67300單芯片實現嵌入式USB主機控制器,完成該控制器對U盤的控制以及讀取U盤唯一性標識信息的功能。?

1 工作原理?

1.1 唯一性標識的構建?

??? USB控制/批量/中斷CBI(Control/Bulk/Interrupt)傳輸協議和USB Bulk-Only協議中規定,U盤等符合大容量存儲類MSC(Mass Storage Class)協議的設備,如果其序列號索引值不為0,則U盤內必定含有一個唯一的序列號與之匹配[1-2]。如表1所示,在其設備描述符中偏移值為16的字段只規定了其序列號的索引值,如果其索引值為0,則說明此設備不含序列號,反之,設備必定含有一個唯一的序列號。序列號的格式如表2所示,表中,第一項為序列號的長度,其最小值為26;第二項為序列號的類型,其值為3,說明序列號為字符串描述符;第三至第n×2項為序列號的內容。USB CBI 和Bulk-Only協議中規定序列號至少由12個有效的數字字符組成,這些數字字符的有效范圍為:數字0~9,字符A~F。?

?

?

?

??? 本文采用16 bit VID(設備描述符偏移量為8)+16 bit PID(設備描述符偏移量為10)+序列號構成GUID(全球唯一ID)作為U盤的唯一性標識。?

1.2 唯一性標識的識別?

??? 如前所述,獲取U盤唯一性標識就是獲取設備描述符中的VID、PID和字符串描述符中的序列號。本文采用USB總線枚舉方式獲得U盤的唯一性標識。?

??? 總線枚舉是指對總線上接入的USB設備進行識別和尋址操作。當USB主機發現有設備連接時,立刻通過默認的地址0發送讀取設備描述符的命令,然后利用控制傳輸的標準命令為其動態配置設備地址,再通過該地址繼續讀取有關設備、配置、接口以及字符串描述符,并建立有關信息的資料區[3]。這些信息主要包括VID、PID和端點信息等。其中,VID、PID的獲取是通過Get_descriptor( )標準請求命令實現的。字符串描述符信息的獲取沒有明確的定義,需要開發一種用于獲取字符串信息的命令請求。?

??? 本文利用嵌入式控制器完成USB主機功能,通過USB主機實現總線枚舉、控制傳輸以及獲取設備描述符的標準請求命令和獲取字符串描述符的請求命令,從而實現U盤唯一性標識信息識別裝置的設計。?

2? 裝置設計?

2.1 硬件結構?

??? U盤唯一性標識識別裝置的硬件結構框圖如圖1所示。采用CY7C67300作為核心處理器,CY16工作在獨立模式下,控制CY7C67300芯片內部的USB串行接口引擎SIE(Serial Interface Engine)完成USB主機的功能,控制LTC3186芯片進行電平轉換,完成異步串行收發器UART可以用來調試。通過I2C接口控制EEPROM以下載程序。通過外部存儲器接口控制外部存儲器以擴展代碼和數據存儲空間。?

?

?

??? 核心處理芯片CY7C67300是CYPRESS公司的嵌入式主機/外設控制器,其內部結構如圖2所示。主機部分包括高性能16位48 MHz RISC微處理器CY16,該處理器可以獨立工作(獨立模式),也可以與其他處理器協同工作(協處理器模式);2個SIE,每個可單獨配置,有2個端口USB-A、USB-B;可配置的I/O電路模塊能連接眾多標準接口,高達16位可編雙向數據I/O,多達32位通用I/O;4 K×16 bit內部掩模板ROM,內有基本輸入輸出系統BIOS,支持I2C、EEPROM,外部ROM、UART、USB等外設端口通信就緒狀態;8 K×16 bit內部RAM能由用戶配置;具有外接SRAM,DRAM和ROM存儲器接口,芯片外部可以擴展512 KB存儲空間;芯片內部集成有定時器和看門狗電路;工作電壓3.3 V,100引腳TQFP封裝。?

?

?

2.2 嵌入式USB主機設計?

??? 采用CY7C67300芯片實現嵌入式USB主機,嵌入式主機結構如圖3所示。?

?

?

??? 嵌入式主機由BIOS、框架結構(Frameworks)和應用驅動層(AppDrive)三部分組成。其工作原理為:Frameworks發現有新的設備連接時,創建一個device object(設備列表)并查詢是否與USB大容量存儲類驅動USB MSC Driver匹配,如果匹配,Frameworks則調用設備驅動程序中的start-device()函數;如果不匹配,則返回繼續監測是否有新的設備連接。在嵌入式主機結構中,應用程序和設備驅動程序并未完全分開,而是集成在一起稱之為AppDrive,當AppDrive開始運行時,它會創建USB請求塊URBs(USB Requst Block)給Frameworks去處理。當URB處理完成后,Frameworks調用由AppDrive指定的回調函數。Frameworks利用在通用主機控制器接口UHCI(Universal Host Controller Interface)標準中定義的調度算法建立傳輸描述列表TD-List(Transfer Descriptor List)并將TD-List傳輸給EZ-HOST的BIOS去處理,BIOS返回一個新的TD-List狀態信息給Frameworks,并將TD-List內容傳給USB總線。Frameworks開始創建下一幀的TD-List,TD_List結構體定義[4]如下:?

??? typedef struct TD?

{ ? void??? *address;? ?

??? uint16? length;???? ?

??? uint16? port_num;?? ?

??? uint16? ep;????????? ?

??? uint16? pid;?????? ?

??? uint16? dev_address ; ?

??? uint8?? control;?

??? uint8?? status;?

??? uint16? retry_cnt; ?

??? uint16? retry_xfer_type;?

??? uint16? retry_active;?

??? uint16? unused_3;?

??? uint16? residue;? ?

??? struct TD?? *next_TD;?????????? ?

??? } TD;?

??? 該結構體包含數據緩存的基地址、數據長度和端口號以及傳輸的包標識pid(packet identifier)、主機給設備分配的地址、控制位和狀態位、重傳次數、傳輸類型以及傳輸是否有效等成員變量。?

2.2.1 嵌入式USB主機 BIOS?

??? USB主機BIOS包含HUSB-SIE1-INIT-INT, HUSB-SIE2-INIT-INT和HUSB-RESET-INT3個軟件中斷,其中,HUSB-SIEx-INIT-INT(x=1,2)用于執行TD-List,主要實現以下功能:設置SIE為主機并執行初始化,檢測是否有等待傳輸的TD-List,如果有,繼續進行TD-List的傳輸;通過USB傳輸所有的TD 數據;更新TD狀態并對錯誤進行處理。HUSB-RESET-INT執行以下3個功能:USB 復位;速度檢測;幀開始SOF(Start of Frame)和包結束EOP(End of Packet)產生。?

2.2.2 USB主機控制器 Frameworks?

??? 自主開發USB主機固件任務相當艱巨,而CYPRESS公司提供了大量的USB主機固件程序,系統在此基礎上可進行修改,節約了大量的開發時間,提高了系統完成的效率。?

??? 當系統上電時,Frameworks會不斷地查詢是否有新的設備連接,如果發現有新的設備,Frameworks會建立如下所示的設備對象。?

??? typedef struct USB_DEVICE?

??? {???uint8??? sie;?

  ????uint8??? port;?

  ????uint8??? address;?

???   uint8??? hub_port;?

  ??? uint8??? speed;?

  ??? uint8??? EP0_max_pkt;?

  ??? uint8??? enum_state;?

  ??? uint8??? otg_attributes;? ?

??? USB_DEVICE_DESCRIPTOR?? dev_descr;?

??? STRING_DESCRIPTOR_NODE?? dev_string_descr;?

??? uint8??? cfg_descr[];?

??? uint8??? setup_packet_buffer[]?

??? USB_INTERFACE_DESCRIPTOR? *inf_descr;?

??? USB_HUB_DESCRIPTOR????? hub_descr;?

??? void??????????????????? *hub_context;?

??? void??????????????????? *msc_context;?

??? bool??? ???????????????????? idleCheck;?

???   } USB_DEVICE;?

??? 如果該設備對象與設備驅動程序匹配,則開始填充該設備對象的信息,包括設備所在的端口、地址或集線器接口、速度、設備描述符、字符串描述符等[4]。Frameworks利用URB獲取新設備的信息,通過URB建立1個或多個TD,通過BIOS與USB總線交換信息。?

2.2.3 MSC驅動?

??? Frameworks發現有設備連接時,根據應用驅動程序發出的URB獲得設備信息。U盤屬于MSC(Mass Storage Class)設備,所以必須開發MSC驅動。驅動實現結構圖如圖4所示,分三層任務:初始化任務Init_Task,閑置任務Idle_Task,回調任務CallBack_Tasks。其中,Init_Task負責設置Idle_Task和任何一個CallBack_Tasks、Init_Task只運行一次,執行完Init_Task后必須釋放其占用的內存,把控制權交還給調用者。?

??? 每個Idle_Task建立一個Idle_Chain與上一層即應用層(Applycation)的Idle_Task相連接,負責尋找要做的工作。?

??? CallBack_Tasks負責執行Idle_Task尋找的工作,執行后導致某些事件發生,這些事件包括硬件中斷、軟件中斷或在Idle_Task中建立的處理過程。?

??? MSC驅動是通過實現CLASS-DRIVE結構體定義的成員變量函數:mscdrvr_init( )、mscdrvr_start( )、mscdrvr_stop( )、mscdrvr_run( )、mscdrvr_ioctl( )實現的。其中CLASS_DRIVER類型mscdrvr_driver結構體成員賦值如下:?

??? CLASS_DRIVER??? mscdrvr_driver =?

??? {?

??? 0x08,????????? /* uint8?? class;?????? */?

??? 0x00,????????? /* uint8?? subclass;??? */?

??? 0x50,????????? /* uint8? ?protocol;??? */?

??? 0x0000,??????? /* uint16? vendor_ID;?? */?

??? 0x0000,??????? /* uint16? product_ID;? */?

??? mscdrvr_init,? /* void?? (*init)( void ); */ mscdrvr_start,?

?????????????????? /*uint16 (*start)( USB_DEVICE *dev ); */?

??? mscdrvr_stop,? /* uint16 (*stop)(void);? */?

??? mscdrvr_run,???/* void?? (*run)(void);? ?

??? mscdrvr_ioctl, /* uint16 (*ioctl)( USB_DEVICE *, uint16,uint16, uint16 ); */?

??? };?

2.3 USB主機對設備的總線枚舉以及請求命令實現?

??? 在以CY7C67300芯片為核心實現的USB主機控制器中,USB總線枚舉過程如下:Frameworks通過一系列的URBs枚舉設備:包括GetDescriptor()、UsbSetConfig()、UsbSetInterface()等USB標準請求命令,建立TD_List,實現控制傳輸,利用控制傳輸把請求命令傳給BIOS,通過BIOS與USB總線進行通信,取得設備一系列信息。?

2.3.1 控制傳輸的實現?

??? 控制傳輸較為復雜,分為 3 個步驟:初始設置、可選數據和狀態信息步驟[5]。在初始設置中需要發送 8 字節的請求命令,創建請求命令的結構體如下:

??? typedef struct USB_DEVICE_REQUEST?

??? {?

??????? uint8?? bmRequestType;?

  ??? uint8?? bRequest??????? ?

  ??? uint16? wValue????????? ?

??? ??? uint16? wIndex????????? ?

??? ??? uint16? wLength???????? ?

??? } USB_DEVICE_REQUEST;?

??? 請求命令的各個字段分別為請求類型、請求命令、數值和索引以及獲取的數據長度。?

??? (1) 初始設置的實現?

??? 初始設置的任務就是要發送建立的 8 字節請求命令,控制傳輸的設置信息通過端點0進行傳輸。因此,設置USB_DEVICE_REQUEST指向USB_DEVICE結構體中的setup_packet_buffer[0],設置TD結構體的PID為PID_SETUP,端點號為端點0,TD地址為&setup_packet_buffer[0],發送內容即為setup_packet_buffer[0]中的請求命令。?

??? (2) 可選數據的實現?

??? 請求命令的 wLength 字段指明了需要交換的數據長度,當值為0時表示沒有可選數據;當值不為0時,設置TD結構體中的pid為PID_IN(數據傳輸方向為設備到主機)及PID_OUT(主機到設備)。length為傳輸數據的長度,address為&setup_packet_buffer[0],發送的內容即為setup_packet_buffer[0]中的數據。?

??? (3) 狀態信息的實現?

??? 在這個步驟中,主機發送控制傳輸的狀態信息,實現過程如下:設置TD結構體中的PID為PID_OUT,端點地址為0,發送setup_packet_buffer[0]中的狀態信息。?

2.3.2請求命令實現?

??? 表3為獲取設備描述符和字符串描述符的設備請求命令封裝,其中設備描述符、語言ID和字符串描述符請求命令的bmRequestType字段為1 000 000,其D7=1說明數據傳輸的方向是設備至主機,D6..5=00表示為標準請求,D4..0=00 000表示為請求命令的接收端為設備。bRequest字段的內容都為Get_Descriptor,因為設備描述符中含有語言ID和字符串描述符的索引,所以字符串描述符和語言ID的獲取都是通過獲取設備描述符實現的。Get_Descriptor命令的wValue字段為0100,01代表描述符類型為設備描述符,00為描述符索引。wIndex字段為0,wLength為設備描述符結構體的長度。Get_LanguageID命令的wValue為0300,03代表描述符類型為字符串描述符,00為描述符索引;wIndex為0,wLength為字符串描述符長度。這個命令是獲取U盤的語言ID,使語言ID作為獲取字符串描述符命令的wIndex字段值,Get_Str_Descriptor命令的wValue為0303,descriptor_type為03代表該描述符為字符串描述符,descriptor_index為03說明獲取U盤序列號的索引值為03,獲取的字符串描述符的長度wLength為字符串描述符長度。?

?

?

???? 系統根據請求命令封裝,分別實現Get_Descriptor()、Get_LanguageID()、Get_Str_Descriptor()函數,利用這些函數的返回值得到U盤的唯一性標識信息。?

3 調試結果?

??? 采用CYPRESS公司提供的軟件工具GNUPro作為調試工具。UART串口與PC主機的超級終端連接,當U盤插入系統時,超級終端上會自動輸出該U盤的VID、PID和iSerialNumber。?

??? 獲取U盤的唯一性標識的4個示例結果如下:?

??? vid=0x066f?

??? pid=0x8000?

??? Serialn==3?

??? LanguageID=0x0409?

??? descriptorlength=0x0022?

??? iserialnumber=0002F68C2AC54D98?

??? ?

??? vid=0x0204?

??? pid=0x6025?

??? serialn==3?

??? LanguageID | =0x0409?

??? descriptorlength=0x0022?

??? iserialnumber=05185200BA923502?

??? vid=0x0951?

??? pid=0x160b?

??? serialn==3?

??? LanguageID = 0x0409?

??? descriptorlength=0x0032?

??? iserialnumber=0014780F99515C8718080051?

??? vid=0x090c?

??? pid=0x1000?

??? serialn==3?

??? LanguageID = 0x0409?

??? descriptorlength=0x0022?

??? iserialnumber=AA04012700007705?

??? 本文提出了一種U盤唯一性標識的構建和識別方法;設計了以CY7C67300為核心芯片的USB主機控制器,利用該主機控制器可完成USB總線枚舉、控制傳輸和請求命令,根據請求命令對U盤唯一性標識進行識別。利用U盤的唯一性標識,可以實現涉密存儲介質的網絡化管理,遠程監控中心可實時監控U盤的狀態(借出、歸還),結合相關的保密管理規定,就可以及時發現涉密U盤管理、使用的違規行為后及時報警。這種新穎的U盤唯一性標識信息的構建與識別方法,為涉密U盤的網絡化、智能化保密管理奠定了基礎。?

參考文獻?

[1] Universal serial bus mass storage class control/bulk/interrupt (CBI) transport revision 1.1[S]. 2003-06-23. ?

[2] Universal serial bus mass storage class bulk-only transport specification revision1.0[S].http://www.usb.org/developers/docs, 1999-09-31.?

[3] 劉思久,李文文,段天明.嵌入式通用USB-Host控制器[J].電測與儀表,2006,43(7):63-66.?

[4] HYDE J. USB multi-role device design by example[M].CYPRESS, 2003.?

[5] 譚剛. 基于MCF5249的USB主機的設計與實現[D].成都:電子科技大學,2005.

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 日韩一级大片 | 亚洲成a人片在线播放观看国产 | 黄色免费看网站 | 超薄全透明无内肉色丝袜 | 国产成人综合高清在线观看 | 又长又深又硬又黄又猛又爽 | 国产精品人成在线播放新网站 | 国产男女猛烈无遮档免费视频网站 | 日韩精品区 | 黄色按摩视频 | 日日狠狠久久偷偷四色综合免费 | 波多野结衣国产精品 | 国产精品成人在线播放 | 最近2019好看的中文字幕 | 日韩欧美亚洲每日更新网 | 国产一区二区三区免费观看 | 欧美成人免费tv在线播放 | 小明网址| 天天艹 | 亚洲欧美天堂网 | 99re国产| 日本人真淫视频一区二区三区 | 一级在线毛片 | 亚洲精品福利网站 | 丁香激情六月 | 成年视频xxxxx免费播放软件 | 亚洲欧洲免费 | 国产欧美日韩一区 | 中文字幕在线免费播放 | 99视频精品全部国产盗摄视频 | 美女视频黄频免费大全软件 | 国产99热在线观看 | 成人精品视频 | 久久亚| 六月丁香婷婷网 | 久久久噜噜噜久久网 | 香蕉大伊亚洲人在线观看 | 欧美在线视频免费 | 99热在线国产 | 欧美人成网站在线看 | 国产99视频精品免费观看7 |