“在阅读本文之前,请先了解SecOC流程,可参见AUTOSAR SecOC Introduction”
FVM (Freshness Management) 的主要功能负责管理Freshness Value,正如在SecOC 一文中介绍因为CMAC 授权码是基于对称加密算法而产生,那么也就意味着对于相同内容的Secured I-PDU,所产生的CMAC 也是一致的, 因此对于“攻击者“来说即使不知道密钥(KEY)的情况下,只要模拟发送这个固定内容的Secured I-PDU 也一样可以起到”攻击“的效果,因此我们需要尽可能的让每一帧报文的CMAC 都不一样,进而推理出需要保证每一帧报文对应的Secured I-PDU 都不一样, 根据Secured I-PDU 结构,只有Freshness Value是可能动态变化的。因此一个好的FVM 设计对于Secure onboard communication起到至关重要的作用
FVM 设计时需要考虑的
在AUTOSAR SecOC Spec 中提供了一种Master/Slave FVM 可以完美解决以上设计时的问题,因此本文将结合JASPAR 和 SecOC Spec ,对Master/Slave FVM进行介绍
Master ECU: 负责发送同步报文(Synchronization Message)
Sender ECU: 负责发送带有MAC的加密报文(Encryption Message)
Receiver ECU: 负责校验带有MAC的加密报文(Encryption Message)
每一个Sender ECU 同时也是Master ECU, 也就是说Master ECU/ Sender ECU 要负责发送同步报文和加密报文
Receiver ECU: 负责校验带有MAC的加密报文(Encryption Message)
同步报文由Trip Counter 和 Reset Counter 构成,其周期地由Master 发送给Slave,起到定期同步Slave 端Trip Counter 和 Reset Counter的作用, 也就说当Sender/Receiver 出现FV 不同步的情况导致CMAC 校验失败, 持续时间最长一个同步报文周期
Note: Sender / Receiver 在生成/校验 带有MAC的message需要基于Master 端发送来的Counter 和 Reset Counter
根据Trip Counter 和 Reset Counter 构成Message Format 分为2种:
1.Trip Counter/Reset Counter 可以在同一个message
2.Trip Counter/Reset Counter 在不同的message 中
Increment condition |
Initial value |
Counter length |
- When the FV management master ECU starts - On wakeup - On reset - When the power status changes: "IGOFF⇒IG ON" |
1 |
TripCntLength Max 24 bit |
Note :当Trip Cnt 达到最大值时, Trip Counter / Reset Counter都应该回到初始值
Increment condition |
Initializing conditions |
Initial value |
Counter length |
Incremented by 1 at regular time intervals (ResetCycle) |
Trip Counter incremented, or Trip Counter initialized |
1 |
ResetCntLength Max 24bit |
Note: 当Trip Counter发生变化时, Reset Counter 需要恢复至初始值(1)
当Reset Counter达到最大值时,因维持最大值进行发送
Freshness Value 的使用分为2种方式
Note: Freshness Value 只有Slave 会使用
Init Value 是0,当接收到Synchronization Message 之后 随后Slave Trip Counter 需要更新为Synchronization Message 中的Slave Counter
Init Value 是0. 当接收到Synchronization Message 之后 随后Slave Reset Counter 需要更新为Synchronization Message 中的Reset Counter
Init Value 是0,每次message 发送+1, 当Reset Counter 发生变化时, Message Counter 变为0
Note:当Counter 达到最大值时,应该维持最大值进行发送
其时Reset Counter 的最低有效位的(1 or 2 )bits
主要负责周期的发送Synchronization Frame ,用于Slave 中Trip Counter/Reset Counter 同步
详细内容见 Synchronization Message Format
正如前面介绍, Slave ECU 分为Sender ECU 和Receiver ECU, 每个Slave 都要验证来自Master 的同步报文
验证 收到的Synchronization Message , 如果验证成功则用收到的 Trip Counter 和 Reset Counter去参与计算接下来的 encryption message 的MAC .(见 Freshness Value Format)
这里需要介绍2个概念
Previous Transmitted Value & Latest Value
在Master ECU 和Slave ECU 都会维护一份Trip Counter/ Reset Counter, 当Slave ECU 验证成功Synchronization Message 且 Received Counter (Trip Counter/ Reset Counter)和Slave Local Counter(Trip Counter/ Reset Counter) 不一致 , 会将Slave Local Counter的值更新为收到Received Counter。
因此,用一段代码 进行介绍
Previous Transmitted Value = Slave Local Counter
Latest Value = Received Counter
if (Has calculate the MAC with latest Value)
Previous Transmitted Value= Latest Value;
基于Reset Counter / Trip Counter 构建FV(见Freshness Value Format), 然后参与MAC的计算,规则如下
如果Previous Transmitted Value 和Latest Value相同,则使用Previous Transmitted Value 构建FV
如果Previous Transmitted Value 和Latest Value不相同,则使用Latest Value构建FV,每次变化都会导致Message Counter 恢复至初始值
对于构建用于验证CMAC 的FV(见Freshness Value Format),流程稍微复杂一些,步骤如下
Reset flag comparison and Get X Value
Trip counter and reset counter comparison
Message counter (lower end) comparison
No Present Carry Flag : Previous Received Value < latest Value
Present Carry Flag : Previous Received Value >= latest Value
Lookup the table to build FV
Note: