我最近在做密钥学习上位机时,遇到一些问题:如何用CAPL脚本实现安全访问过程?
前期准备
首先我已经有了包含安全访问算法的dll文件,并通过Diagnostics/ISO TP Configuration中加载了此dll文件,如下
CAPL脚本编写
首先在variable中增加诊断服务如下
variables{
diagRequest Test_ECU.ExtendedDiagnosticSession_Start DiagReq_StartExtenedSession;
diagRequest Test_ECU.ProgrammingSession_Start DiagReq_StartPrgrmmingSession;
diagRequest Test_ECU.RequestSeed_Level1 DiagReq_SeedLevel1;
diagRequest Test_ECU.SendKey_SecurityLevel1 DiagReq_SndKeyLevel1;
}
在on start部分,要将“ECU qualifier“作为参数,执行diagSetTarget函数
on start
{
if( 0 != diagSetTarget( "Platform_V1_0")) {
write( "Error setting target!");
}else{
write( " setting target!");
}
openPanel("TestPanel");
}
这个函数是用于设置tester从现在开始与之通信的目标ECU,并配置/建立与该ECU的通信通道。
ECU Qualifier可以通过加载cdd文件后,在如下位置找到
然后,通过代码就可以调用诊断接口去执行安全访问算法了(建立一个函数包含如下代码逻辑)
首先进入扩展线程
然后发送请求获取seed,
最后发送带有key数组的请求报文。
switch(stepName)
{
case EntrExtSession:
diagSendRequest(DiagReq_StartExtenedSession);//10 03
stepName=SecAccRqSeed;
write("Tester: 请求进入“扩展线程”(EOL)");
break;
case SecAccRqSeed:
diagSendRequest(DiagReq_SeedLevel1); //27 01
stepName=SecAccSndSeed;
write("Tester: 请求获得安全访问seed(EOL)");
break;
case SecAccSndSeed:
diagSendRequest(DiagReq_SndKeyLevel1);//27 02
stepName=ReadStat;
write("Tester: 请求发送level-1安全访问密钥(EOL)");
break;
default:
break;
}
在on diagResponse.test_ECU.RequestSeed_Level1中使用如下接口
diagGetCurrentEcu--用于获取ECU qualifier
diagGetPrimitiveByte--这个可以从ECU反馈中截取seed数组gSeedArray
DiagGenerateKeyFromSeed--用于通过ECU反馈的seed来生成key
diagSetParameterRaw(DiagReq_SndKeyLevel1,"SecurityKey",gKeyArray,elCount(gKeyArray));--将算出的key数组加入到请求报文DiagReq_SndKeyLevel1,参数”SecurityKey“是在cdd中定义的。
on diagResponse test_ECU.ExtendedDiagnosticSession_Start
{
if(diagIsPositiveResponse(this))
{
write(" ECU: 正反馈--进入扩展会话!") ;
}else{
write("ECU: 负反馈--进入扩展会话失败!") ;
}
}
on diagResponse test_ECU.RequestSeed_Level1
{
byte i = 0;
if(diagIsPositiveResponse(this))
{
write(" ECU: 正反馈--返回seed!") ;
for(i=0;i<4;i++){
gSeedArray[i] = diagGetPrimitiveByte(this,(2+i));
}
diagGetCurrentEcu(gOption,elCount(gOption));//获得当前ECU gOption用于生成安全访问密钥。
DiagGenerateKeyFromSeed (gSeedArray, elCount(gSeedArray), gSecurityLevel, gVariant, gOption, gKeyArray, gMaxKeyArraySize, gActualSizeOut);
diagSetParameterRaw(DiagReq_SndKeyLevel1,"SecurityKey",gKeyArray,elCount(gKeyArray));
}else{
write("ECU:负反馈--无法返回seed!") ;
}
}
on diagResponse test_ECU.SendKey_SecurityLevel1
{
cancelTimer(msTimer_sndReq);
if(diagIsPositiveResponse(this))
{
write(" ECU: 正反馈--收到安全访问密钥!") ;
}else{
write("ECU: 负反馈--密钥无法收到!") ;
}
}
以上就完成了使用CAPL去实现安全访问过程。
版权归原作者 大表哥汽车人 所有, 如有侵权,请联系我们删除。