CAPL-UDS 27服务 通过cdd和dll实现key自动计算
通过配置cdd和dll文件,结合CANoe内置函数diagGenerateKeyFromSeed,即可实现安全解锁。
·
通过cdd和dll自动计算key
通过配置cdd和dll文件,结合CANoe内置函数diagGenerateKeyFromSeed,即可实现安全解锁。
CANoe加载cdd和dll文件


CAPL实现
void SecurityAccess()
{
byte gSeedArray[6];
byte ResData[10];
byte lRes[200];
int i,j;
int gSeedArraySize = 4;
int gSecurityLevel = 0x07;
char gVariant[200] = "Variant1";//不影响计算结果
char gOption[200] = "";//OEM附加定义
byte gKeyArray[4];
int gMaxKeyArraySize = 4;
dword gActualSizeOut = 4;
diagRequest TEST_ecu1.SeedLevel2_Request gSeedReq;
diagResponse TEST_ecu1.SeedLevel2_Request gSeedResp;
diagRequest TEST_ecu1.KeyLevel2_Send gKeyReq;
diagResponse * lResp;
if( 0 != diagSetTarget( "TEST_ecu1"))//设定诊断目标ECU
write( "Error setting target!");
//Request seed from ECU
diagSendRequest(gSeedReq);
//Wait until request has been sent completely
testWaitForDiagRequestSent(gSeedReq, 1000);
//Wait for response and write seed from response parameter to array
testWaitForDiagResponse(gSeedReq, 1000);
diagGetLastResponse (gSeedReq, gSeedResp);
diagGetPrimitiveData(gSeedResp, ResData , elcount(ResData));
for(i=0;i<4;i++)
{
gSeedArray[i]=ResData[i+2];
}
write("SeedArray:%x %x %x %x.",gSeedArray[0],gSeedArray[1],gSeedArray[2],gSeedArray[3]);
//Calculate key
if( 0 == diagGenerateKeyFromSeed (gSeedArray, gSeedArraySize, gSecurityLevel, gVariant, gOption, gKeyArray, gMaxKeyArraySize, gActualSizeOut))
{
write("KeyArray:%x %x %x %x.",gKeyArray[0],gKeyArray[1],gKeyArray[2],gKeyArray[3]);
//Send Key to unlock ECU
diagSetPrimitiveByte(gKeyReq, 1, 0x08);//reply subfunction
diagSetPrimitiveByte(gKeyReq, 2, gKeyArray[0]);
diagSetPrimitiveByte(gKeyReq, 3, gKeyArray[1]);
diagSetPrimitiveByte(gKeyReq, 4, gKeyArray[2]);
diagSetPrimitiveByte(gKeyReq, 5, gKeyArray[3]);
diagSendRequest(gKeyReq);
testWaitForDiagResponse(gKeyReq,1000);
}
}
参考
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)