通过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);
  }
}

参考

CANoe诊断功能——安全算法调用介绍

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐