0


CANOE UDS 安全访问CAPL脚本

我最近在做密钥学习上位机时,遇到一些问题:如何用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去实现安全访问过程。

标签: 开发语言

本文转载自: https://blog.csdn.net/weixin_46481662/article/details/129339081
版权归原作者 大表哥汽车人 所有, 如有侵权,请联系我们删除。

“CANOE UDS 安全访问CAPL脚本”的评论:

还没有评论