<nav id="46scu"></nav>
<menu id="46scu"><strong id="46scu"></strong></menu>
  • <menu id="46scu"></menu>
  • <xmp id="46scu"><xmp id="46scu">
    上海動信微電子科技有限公司

    聯系我們

    13482583038

    技術資料

    您的當前位置:首頁 > 新聞中心 > 技術資料

    DX8加密芯片應用開發手冊(五)

    發布時間:2017-09-03瀏覽次數:載入中...來源:www.mode-pour-hommes.com


    DX8加密芯片應用開發手冊(五)這個章節主講DX81C04防抄板加密芯片的函數使用


    7.2.防抄板認證函數:


    防抄板認證的原理:主機發送隨機挑戰給DX8芯片,DX8芯片根據內部配置的密鑰(KEYA)計算并返回結果,主機收到結果后,按照同樣的方法對挑戰隨機數進行計算,然后比較兩個結果,一致表示認證通過。


    7.2.1. DX8芯片計算響應


    u8_x DX8_HostAuth(u8_x  *challenge, u8_x  len, u8_x  *response);

    功能描述:DX8芯片根據輸入的挑戰動態計算響應

    參數:    challenge  輸入的挑戰隨機數

                  len        挑戰隨機數的長度

                  response  返回的響應結果,20個字節

    返回值:  響應計算成功返回0,否則返回錯誤代碼


    7.2.2. 主機軟件計算響應


    void Lib_HostAuth(u8_x *challenge, u8_x len, u8_x *buf, u8_x *response);

    功能描述:主機軟件根據挑戰計算響應結果

    參數:    challenge  輸入的挑戰隨機數

              len        挑戰隨機數的長度

              buf        輸入的16個字節KEYA

              response  返回的響應結果,20個字節

    返回值:  計算成功返回0,否則返回錯誤代碼

    示例代碼:

    u8_x rv;

    u8_x challenge[32],reponse_1[20],response_2[20];

    GetSoftRandom(challenge,32);

    rv = DX8_HostAuth (challenge, 32,response_1);  //DX8芯片計算

    if (rv) {

       printf(“HostAuth calculation failed, rv = 0x%.2x\n”, rv);

       return rv;

    }

    Lib_HostAuth(chanllenge, 32, keya_value, reponse_2); //主機軟件計算

    if (memcmp(reponse1, response_2)) {  // 比較響應結果

       printf(“Host Authentication Error??!\n”);

    } else {

       printf(“Host Authentication Passed??!\n”);

    }

    說明:keya_value是在使用Dx8Configuration.exe時產生的dx8_engineer.h中定義,需要將dx8_engineer.h包含到應用程序中


    7.3.讀寫EEPROM函數


    DX81/DX82將芯片內部的EEPROM存儲區域分成4-16zone,需要預先通過燒寫器對每個zone的訪問模式及其密鑰進行配置,每個zone可以配置成三種訪問模式:

    l  正常模式

    l  認證模式

    l  加密模式

    若配置為認證模式和加密模式,每個zone需要獨立設定16個字節的訪問密鑰,zone密鑰驗證通過后才可對該zone進行讀或者寫,出廠所有zone默認為正常模式。具體每個zone配置好的信息在調用DX8_Reset()函數后存儲在dx8-_info的結構體中,用戶可直接訪問:

     

    模式

    Read

    Write

    正常模式

    不需要認證,傳輸線明文

    不需要認證,傳輸線明文

    認證模式

    不需要認證,傳輸線明文

    需要認證,傳輸線明文

    加密模式

    需要認證,傳輸線密文

    需要認證,傳輸線密文

     

    說明: 每個zone分區的地址都從0開始,正常模式時zone分區的大小為dx8_info.ZoneSize,認證模式和加密模式時zone分區的可用大小為dx8_info.ZoneSize-16,因為有16個字節用作該zone分區的密鑰空間,該密鑰空間永遠無法訪問。


    7.3.1. 驗證Zone Key


    u8_x DX8_VerifyZone(u8_x zone, u8_x *seed, u8_x *buf);

    功能描述:對指定的Zone分區密鑰進行驗證

    參數:    zone   指定的zone分區(0 — ZoneNum-1)

              seed   輸入的32個字節的隨機數,主機對DX8認證

              buf    輸入指定zone16個字節的密鑰,DX8對主機認證

    返回值:  認證通過返回0,否則返回錯誤代碼

    說明:若指定的zone為認證模式或者加密模式,并且該zone key驗證通過后,才能執行對該zone的讀或者寫操作,任何出錯或者非此zone的讀寫命令,都會將此zone的認證通過標志清除,若要繼續此zone讀或者寫,需要重新對此zone key進行驗證。

    示例代碼(以驗證zone0為例)

    u8_x rv;

    u8_x seed[32];

    GetSoftRandom(seed,32);

    rv = DX8_VerifyZone(0, seed, zkey_0);  // 驗證Zone0

    if (rv) {

       printf(“Verify PIN failed, rv = 0x%.2x\n”, rv);

       return rv;

    }

    說明:zkey_0是在使用Dx8Configuration.exe時產生的dx8_engineer.h中定義,需要將dx8_engineer.h包含到應用程序中


    7.3.2. EEPROM


    u8_x DX8_WriteZone(u8_x zone, u16_x address, u16_x len, u8_x *buf);

    功能描述:對指定的zone的地址空間進行數據操作

    參數:    zone      指定的zone分區(0—(dx8_info.ZoneNum-1))

              address   寫入數據的起始地址

              len        寫入數據的長度

              buf        要寫入的數據buffer

    返回值:  寫成功返回0,否則返回錯誤代碼

    說明:如該zone為認證模式或者加密模式,需要先用該zone的密鑰DX8_VerifyZone驗證成功后,才能執行寫該zone的操作,輸入的起始地址與操作的長度之和不能超過該zone的范圍大小,否則會返回相應錯誤代碼。

    示例代碼:

    u8_x rv;

    u8_x buf[32];

    for (int i=0;i<32;i++) buf[i] = i;

    rv = DX8_WriteZone(0,0,32,buf); // Zone 00地址開始寫32個字節

    if (rv) {

       printf(“Write Zone failed, rv = 0x%.2x\n”, rv);

       return rv;

    }


    7.3.3. EEPROM


    u8_x DX8_ReadZone (u8_x zone, u16_x address, u16_x len, u8_x *buf);

    功能描述:對指定的zone的地址空間進行數據操作

    參數:    zone      指定的zone分區(0--(dx8_info.ZoneNum-1))

              address   讀出數據的起始地址

              len        讀出數據的長度

              buf        返回數據buffer

    返回值:  讀成功返回0,否則返回錯誤代碼

    說明:如該zone為加密模式,需要先用該zone的密鑰DX8_VerifyZone驗證成功后,才能執行讀該zone的操作,輸入的起始地址與操作的長度之和不能超過該zone的可訪問空間,否則會返回相應錯誤代碼。

    示例代碼:

    u8_x rv;

    u8_x buf[32];

    rv = DX8_ReadZone(0,0,32,buf); // Zone 00地址開始讀取32個字節

    if (rv) {

       printf(“Read Zone failed, rv = 0x%.2x\n”, rv);

       return rv;



    待續......

    【返回列表】
    FgU/eHDH6K1H0U0iWhF7NGqB9B021S0kZ8v+3BksXP9eNwWAqj7CyPXvjx4gir+fn2RUFVv3ntFBFkEKscPnyW26UV8vfSC020l/FRswnB6JLyOcBP9x2toJ5+w0Gk1o
    pc加拿大开奖