聯(lián)系我們
13482583038DX8加密芯片應(yīng)用開發(fā)手冊(五)
DX8加密芯片應(yīng)用開發(fā)手冊(五)這個章節(jié)主講DX81C04防抄板加密芯片的函數(shù)使用
7.2.防抄板認證函數(shù):
防抄板認證的原理:主機發(fā)送隨機挑戰(zhàn)給DX8芯片,DX8芯片根據(jù)內(nèi)部配置的密鑰(KEYA)計算并返回結(jié)果,主機收到結(jié)果后,按照同樣的方法對挑戰(zhàn)隨機數(shù)進行計算,然后比較兩個結(jié)果,一致表示認證通過。
7.2.1. DX8芯片計算響應(yīng)
u8_x DX8_HostAuth(u8_x *challenge, u8_x len, u8_x *response);
功能描述:DX8芯片根據(jù)輸入的挑戰(zhàn)動態(tài)計算響應(yīng)
參數(shù): challenge 輸入的挑戰(zhàn)隨機數(shù)
len 挑戰(zhàn)隨機數(shù)的長度
response 返回的響應(yīng)結(jié)果,20個字節(jié)
返回值: 響應(yīng)計算成功返回0,否則返回錯誤代碼
7.2.2. 主機軟件計算響應(yīng)
void Lib_HostAuth(u8_x *challenge, u8_x len, u8_x *buf, u8_x *response);
功能描述:主機軟件根據(jù)挑戰(zhàn)計算響應(yīng)結(jié)果
參數(shù): challenge 輸入的挑戰(zhàn)隨機數(shù)
len 挑戰(zhàn)隨機數(shù)的長度
buf 輸入的16個字節(jié)KEYA
response 返回的響應(yīng)結(jié)果,20個字節(jié)
返回值: 計算成功返回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)) { // 比較響應(yīng)結(jié)果
printf(“Host Authentication Error??!\n”);
} else {
printf(“Host Authentication Passed??!\n”);
}
說明:keya_value是在使用Dx8Configuration.exe時產(chǎn)生的dx8_engineer.h中定義,需要將dx8_engineer.h包含到應(yīng)用程序中
7.3.讀寫EEPROM函數(shù)
DX81/DX82將芯片內(nèi)部的EEPROM存儲區(qū)域分成4-16個zone,需要預(yù)先通過燒寫器對每個zone的訪問模式及其密鑰進行配置,每個zone可以配置成三種訪問模式:
l 正常模式
l 認證模式
l 加密模式
若配置為認證模式和加密模式,每個zone需要獨立設(shè)定16個字節(jié)的訪問密鑰,zone密鑰驗證通過后才可對該zone進行讀或者寫,出廠所有zone默認為正常模式。具體每個zone配置好的信息在調(diào)用DX8_Reset()函數(shù)后存儲在dx8-_info的結(jié)構(gòu)體中,用戶可直接訪問:
模式 |
Read |
Write |
正常模式 |
不需要認證,傳輸線明文 |
不需要認證,傳輸線明文 |
認證模式 |
不需要認證,傳輸線明文 |
需要認證,傳輸線明文 |
加密模式 |
需要認證,傳輸線密文 |
需要認證,傳輸線密文 |
說明: 每個zone分區(qū)的地址都從0開始,正常模式時zone分區(qū)的大小為dx8_info.ZoneSize,認證模式和加密模式時zone分區(qū)的可用大小為dx8_info.ZoneSize-16,因為有16個字節(jié)用作該zone分區(qū)的密鑰空間,該密鑰空間永遠無法訪問。
7.3.1. 驗證Zone Key
u8_x DX8_VerifyZone(u8_x zone, u8_x *seed, u8_x *buf);
功能描述:對指定的Zone分區(qū)密鑰進行驗證
參數(shù): zone 指定的zone分區(qū)(0 — ZoneNum-1)
seed 輸入的32個字節(jié)的隨機數(shù),主機對DX8認證
buf 輸入指定zone的16個字節(jié)的密鑰,DX8對主機認證
返回值: 認證通過返回0,否則返回錯誤代碼
說明:若指定的zone為認證模式或者加密模式,并且該zone key驗證通過后,才能執(zhí)行對該zone的讀或者寫操作,任何出錯或者非此zone的讀寫命令,都會將此zone的認證通過標志清除,若要繼續(xù)此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時產(chǎn)生的dx8_engineer.h中定義,需要將dx8_engineer.h包含到應(yīng)用程序中
7.3.2. 寫EEPROM
u8_x DX8_WriteZone(u8_x zone, u16_x address, u16_x len, u8_x *buf);
功能描述:對指定的zone的地址空間進行數(shù)據(jù)操作
參數(shù): zone 指定的zone分區(qū)(0—(dx8_info.ZoneNum-1))
address 寫入數(shù)據(jù)的起始地址
len 寫入數(shù)據(jù)的長度
buf 要寫入的數(shù)據(jù)buffer
返回值: 寫成功返回0,否則返回錯誤代碼
說明:如該zone為認證模式或者加密模式,需要先用該zone的密鑰DX8_VerifyZone驗證成功后,才能執(zhí)行寫該zone的操作,輸入的起始地址與操作的長度之和不能超過該zone的范圍大小,否則會返回相應(yīng)錯誤代碼。
示例代碼:
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 0的0地址開始寫32個字節(jié)
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的地址空間進行數(shù)據(jù)操作
參數(shù): zone 指定的zone分區(qū)(0--(dx8_info.ZoneNum-1))
address 讀出數(shù)據(jù)的起始地址
len 讀出數(shù)據(jù)的長度
buf 返回數(shù)據(jù)buffer
返回值: 讀成功返回0,否則返回錯誤代碼
說明:如該zone為加密模式,需要先用該zone的密鑰DX8_VerifyZone驗證成功后,才能執(zhí)行讀該zone的操作,輸入的起始地址與操作的長度之和不能超過該zone的可訪問空間,否則會返回相應(yīng)錯誤代碼。
示例代碼:
u8_x rv;
u8_x buf[32];
rv = DX8_ReadZone(0,0,32,buf); // 從Zone 0的0地址開始讀取32個字節(jié)
if (rv) {
printf(“Read Zone failed, rv = 0x%.2x\n”, rv);
return rv;
}
待續(xù)......
【返回列表】相關(guān)新聞
- DX8加密芯片應(yīng)用開發(fā)手冊(六)2017-09-05
- DX8加密芯片應(yīng)用開發(fā)手冊(四)2017-09-01
- DX8加密芯片應(yīng)用開發(fā)手冊(三)2017-08-31
- DX8加密芯片應(yīng)用開發(fā)手冊(二)2017-08-30
- DX8加密芯片應(yīng)用開發(fā)手冊(一)2017-08-29