CANoe_UDS-boorloader 自动化测试系列(五)基本功能:CAPL实现#27服务安全解锁

#你是如何克服编程学习中的挫折感的?#

目录

一、前言

 二、服务介绍

1.服务请求

#请求种子 

#请求密钥 

2.子功能

3.服务响应

#肯定响应

#否定响应 

三、CAPL实现#0x27

四、总结


一、前言

hello,大家好,我是小鸟鹏。

今天给大家介绍一下CAPL中如何一键通过#0x27安全访问,要注意的是安全解锁的算法我没有做成链接库,而是把算法直接写在CAPL脚本里面,这个可以根据自己需求自行决定,我是嫌麻烦所以没有做。

 

 二、服务介绍

1.服务请求

服务请求的基本格式:

<SID> + <Sub-function> + <Parameter>

<SID> + <Parameter>

#请求种子 

#请求密钥 

 

2.子功能

不同安全级别的请求种子和发送密钥是一一对应的,相邻的一对奇偶数对应一种安全级别,其中奇数代表请求种子,偶数代表发送密钥。

比如:

【0x01】与【0x02】是一对组合,0x01是请求种子,0x02是请求密钥;

【0x11】与【0x12】是一对组合,0x11是请求种子,0x12是请求密钥;

3.服务响应

#肯定响应

基本格式:

<SID + 0x40> + <Sub-function> + <Parameter>

<SID + 0x40> + <Parameter>

#否定响应 

基本格式:

<0x7F> + <SID> + <NRC>

看起来比较简单,格式比较固定,只要是Negative Response,第一字节就是0x7F,第二字节照抄原来的SID,第三个字节是错误响应码,具体响应码对应的错误信息如下图:

需要注意的是:0x7Fxx0x78这个特殊的响应码。

 

三、CAPL实现#0x27

#0x27服务

void SID27_SecurityAccess(byte responsecode,long id ,byte subfunction,struct CANTP_INFO_ST data)
{
    byte i;
    byte TempData[256];
    byte TempLen;
  
    TempLen = 0;
    TempData[TempLen++]= 0x27;
    TempData[TempLen++]= subfunction;
  
    if(0 != data.TpSduLength)
    {
        for(i = 0; i < data.TpSduLength; i++)
        {
            TempData[TempLen++] = data.TpSduDataBuf[i];
        }
    }
  
    DiagnosticServiceSend(responsecode,id,TempLen,TempData);//发送函数
}

#一键通过安全访问 

void Access_Unclock(void)
{
    dword AccKey;
    dword Seed4Byte;
    
    struct CANTP_INFO_ST stData;
    stData.TpSduLength = 0;
  
    Seed4Byte = 0;
  
    SID27_SecurityAccess(0x67,PHYSICS_ID_DEFAULT,0x11,stData);
  
    if(0x67 == g_stTpRxInfo.TpSduDataBuf[0])
    {
        if (0x11 == g_stTpRxInfo.TpSduDataBuf[1])
        {        
            Seed4Byte |= (((dword)g_stTpRxInfo.TpSduDataBuf[2]) << 24) + (((dword)g_stTpRxInfo.TpSduDataBuf[3]) << 16) + 
                         (((dword)g_stTpRxInfo.TpSduDataBuf[4]) << 8) + ((dword)g_stTpRxInfo.TpSduDataBuf[5]);
        }
        else
        {
            
        }       
        AccKey = SecM_AccessKeyGet(Seed4Byte);
        
        stData.TpSduDataBuf[0] = (AccKey >> 24) & 0xFF;
        stData.TpSduDataBuf[1] = (AccKey >> 16) & 0xFF;
        stData.TpSduDataBuf[2] = (AccKey >> 8)  & 0xFF;
        stData.TpSduDataBuf[3] = (AccKey) & 0xFF;
        stData.TpSduLength = 4;
        
        SID27_SecurityAccess(0x67,PHYSICS_ID_DEFAULT,0x12,stData);
    }    
}

 

四、总结

这篇文章简单介绍了#0x27服务的知识,以及通过CAPL实现#0x27服务。利用这几篇文章的知识,搭建一个基本的UDS测试框架做一些基本的测试是完全没问题的。下一篇我打算介绍CAPL如何结合面板组件加载和解析.bin文件,码字不易,求个三连。

下一篇:

CANoe_UDS-booroader 自动测试系列(六)基本功能:CAPL实现bin文件数据解析

 

如果这篇博客对你有帮助请 “点赞” “评论”“收藏”一键三连 哦码字不易,大家的支持就是我坚持下去的动力

作者:小鸟鹏

联系方式:

邮箱:502756962@qq.com

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值