UDS_SecurityAccess(0x27)服务

一、服务功能:

根据ISO14119-1标准中所述,诊断服务27应用场合主要是用于Server数据上传或者下载,重要信息传递,功能安全等实施的过程中。该服务的目的是为那些限制访问,以及和排放、安全相关的一些服务和数据提供一些访问权限来保护数据。

执行步骤

具体过程可分为以下四个阶段:

  ①Client向Server请求种子

  ②Server向Client发送随机种子;

  ③Client基于接收到来自Server的随机种子计算出对应的Key并发送给到Server;

  ④Server接受来自Client算出来的Key并与内部算出的Key比较,如果一致则解锁成功,否则解锁不成功;

请求Seed的子功能发送的参数一定是奇数,而应答发送Seed的子功能参数则是这个奇数+1。只有当前请求的Seed所在安全等级的功能才可以被激活,其他安全等级的会被上锁。(这里所说的参数不是指的是sub-function之后带有的参数,而是指sub-function, 且sub-function(Request Seed) + 1 = sub-function(Send Key)。

二、应用场景:

一般而言,对于27诊断服务,主要应用场景为以下场合:

①:在针对Server重新编程时,需要首先通过27安全解锁才能够进行后续的重编程操作,否则将对Server造成极大的安全风险;

②:在产线写入较为重要的版本或者标定等信息过程中,则首先需要使用27服务才能够使用写操作的诊断指令,如2E服务

③:一般而言,如果需要往Flash中写入相关数据时都需要优先执行27安全解锁之后才能够进行安全写入;

④:执行十分重要的31 Routine时,也需要优先执行27安全解锁之后才能够执行对应的routine;

简而言之,需要安全访问的应用:

2E服务、2D服务(WriteMemoryByAddress)、2F服务(InputOutputContorIByIdentifier)、31服务。

三、服务请求:

请求Seed格式:

SecurityAccess Request SID:27为Server ID,表示安全访问请求ID

SubFunction:请求Seed子服务,必须为奇数,值可为:01,03,05,07 to 7D

securityAccessDataRecord:Client发送给到Server的标识信息,可选,一般不用;值可为00-FF

发送Key格式:

SecurityAccess Request SID:27为Server ID,表示安全访问请求ID

SubFunction:发送Key子服务,必须为偶数,值可为:02,04,06,08 to 7E

securityAccessDataRecord:Client向Server发送的具体Key值

Note:虽然27服务也支持抑制正响应,但是由于27服务需要通过正响应或者负响应来判断是否成功解锁,所以一般情况下针对27服务我们一般不使能抑制正响应位。

subfunction取值定义说明:

四、服务响应:

正响应格式:

Response ID:该参数固定为SID+0x40 = 0x67;

SubFunction:该参数为request seed(如01)或者Send Key(02)的取值;

securitySeed:该参数仅针对subfunction为Request Seed时才会回复该参数,其他情况下,Server仅会回复前两个字节(response SID + SubFunction),其取值范围只能为0x00-0x7F;

五、支持的NRC:

六、问题学习:

1、27服务的Seed,何时可以返回全0?

答:如果Server已经处于解锁状态(Unlock),在此会话下,再次收到Client的种子请求,可以返回0,以此告知上位机,当前会话已经解锁。

2、非默认会话再次跳转相同非默认会话,需要重新解锁吗?

答:需要重新安全解锁,即:重新执行0x27服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/@!Encoding:936/ includes { } variables { char panelTitle[50] = "UDSFlash"; long txMsgCount; long total; dword diagPysicalAddress; // Pysical Address dword diagFunctionAddress; // Function Address dword diagResponseAddress = 0x777; // Response Address dword diagMessageDLC = 8; // diag dlc dword item_name; // item name dword item_type; // item type dword cycle; // whether the cycle dword cycle_interval; // cycle interval // UDS transport layer type const byte UDS_TP_SF = 0x00; // Single Frame const byte UDS_TP_FF = 0x01; // First Frame const byte UDS_TP_CF = 0x02; // Consecutive Frame const byte UDS_TP_FC = 0x03; // Flow Control Frame struct diagRxDataStruct { dword index; word dataLenth; byte data[1024]; }; struct diagRxDataStruct diagRxData; char waitForResponseTextEvent[20] = "response received!"; byte udsCfSn = 1; byte udsFcFs = 0; byte udsFcBs = 0; byte udsFcStmin = 0; long handle; // TP time word udsP2Server = 3000; word udsP2StarServer = 5000; long udsAs = 25; long udsBs = 75; long udsAr = 25; long udsCr = 150; char buffer[4096]; char var[5][100]; long i=0; long len; char configFilePath[100]="./bin/uds_flash.ini"; // Configuration file path } /* Create CAN connection */ void create_connection() { handle = CanTpCreateConnection(0); CanTpSetRxIdentifier(handle, diagResponseAddress); write("handle %x", handle); if (diagMessageDLC > 7) { create_canfd_connection(); // Enable CANFD } CanTpSetTimeoutAs(handle, udsAs); CanTpSetTimeoutBs(handle, udsBs); CanTpSetTimeoutAr(handle, udsAr); CanTpSetTimeoutCr(handle, udsCr); CanTpSetPadding(handle, 0x00); CanTpSetBlockSize(handle, 0); } /* Create CANFD connection */ void create_canfd_connection() { dword maxCANFDFrameLength; maxCANFDFrameLength = diagMessageDLC; CanTpSetBitRateSwitch(handle, 1); CanTpSetMaxCANFDFrameLength(handle, maxCANFDFrameLength); } MainTest() { create_connection(); } 解释一下,这段代码,每一行都在做什么
07-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值