AUTOSAR E2E + SecOC 通信安全(CAN E2E and SecOC)
本质与导读
本质 CAN/CAN-FD/Ethernet 是裸的、不可信传输:位翻转、丢帧、错发、重放、伪造都会让接收方用错数据去控扭矩、刹车、电池。AUTOSAR 在同一条消息上分两层解决:E2E 用 CRC+Counter+DataID 把 ISO 26262-6 §D.2.4 列的十类通信 fault 变成 detected fault(功能安全),SecOC 用 AES-128 CMAC+Freshness Value 防有意伪造与重放(cybersecurity)。两层的威胁模型、算法、密钥体系完全正交——E2E 挡不住会算 CRC 的攻击者,SecOC 挡不住发送端自己的 SW bug,ASIL D 网联车两个都要。
主线坐标:横轨 · 诊断 / 通信(跨站) · ↑ 全景主线
1. 为什么必须做通信安全 —— fault model 是十类,不是"CRC 抓错码"
车载总线的物理层 + 链路层对应用层数据没有端到端保证:CAN 链路层 CRC 只覆盖"导线上"这一段,帧一进 Gateway 被解包重组,CRC 就被剥掉重算;COM/PduR/RTE 这些软件层的拷贝、路由、缓存,每一步都可能引入链路层 CRC 看不见的错。所以通信保护必须在应用层两端闭合,这就是"End-to-End"三个字的含义。
上图是工程直觉版的五类压缩视图;标准的完整 fault model 在 ISO 26262-6:2018 Annex D §D.2.4 "Exchange of information",一共十类,AUTOSAR E2E 规范(FO PRS E2E Protocol R23-11,以 Profile 5 的 Table 6.45 为口径)对每一类都给出了对应的检测机制:
| ISO 26262-6 §D.2.4 fault | E2E 检测机制 | 工程场景举例 |
|---|---|---|
| Repetition(重复) | Counter | 发送端 ISR 卡死重发旧帧 |
| Loss(丢失) | Counter | 总线过载、仲裁失败丢帧 |
| Delay(延迟) | Counter + timeout | 网关排队、队列溢出 |
| Insertion(插入) | DataID + CRC | 错误 PDU 被路由进本信号槽 |
| Masquerade(冒充) | DataID + CRC | 错误 ECU 发出格式正确的消息 |
| Incorrect addressing(错寻址) | DataID | 路由表配置错误 |
| Incorrect sequence(乱序) | Counter | 多路径路由、重传乱序 |
| Corruption(损坏) | CRC | EMI 位翻转、DMA 拷贝错 |
| Asymmetric information(各接收端收到不同内容) | CRC | 多播时某一端收到损坏副本 |
| Subset reception / blocking(部分接收 / 通道被堵) | Counter(loss / timeout) | 某接收端持续收不到 |
关键认知:masquerade 在两…
关键认知:masquerade 在两边都出现,但含义不同。E2E DataID 抓的是"无意冒充"——发送端 SW bug 把消息 A 的内容装进消息 B 的格式;它对有意冒充完全无效,因为攻击者可以把 CRC、Counter、DataID 全部算对。防"会算 CRC 的对手"是 SecOC 的工作(§7),这也是 ISO 26262(随机/系统性 fault)与 ISO/SAE 21434(恶意攻击)的分界线。
2. E2E Profile 全景 —— R23-11 一共 14 个
AUTOSAR R23-11 的 E2E Protocol 规范定义 10 个数据 Profile(1/2/4/5/6/7/8/11/22/44)+ 4 个 method Profile(4m/7m/8m/44m)——后四个是给 SOME/IP client/server 方法调用加的变体,在数据字段外多带 Message Type(request/response)和 Message Result(OK/ERROR)两个字段。信号类通信只需要看前十个,按"CRC 强度 / Counter 宽度 / DataID 传输方式 / 头开销"区分:
| Profile | CRC | Counter | Data ID | 线上开销 | 定位 |
|---|---|---|---|---|---|
| P01 | 8-bit(0x1D) | 4-bit | 16-bit 隐式(mode 3 为 12-bit 半显式) | ≈ 1.5-2 B | legacy,规范明言新项目改用 P11 |
| P02 | 8-bit(0x2F) | 4-bit | DataIDList:16 个 8-bit 值按 Counter 轮换 | ≈ 1.5 B | legacy CAN |
| P04 | 32-bit(0xF4ACFB13) | 16-bit | 32-bit 显式 | 12 B(含 16-bit Length) | Ethernet/SOME/IP,数据 ≤ 4 KB |
| P05 | 16-bit(0x1021) | 8-bit | 16-bit 隐式 | 3 B | CAN-FD 定长消息,ASIL D 主流 |
| P06 | 16-bit(0x1021) | 8-bit | 16-bit 隐式 | 5 B(含 16-bit Length) | CAN-FD/FlexRay 变长消息 |
| P07 | 64-bit(ECMA) | 32-bit | 32-bit 显式 | 20 B(含 32-bit Length) | Ethernet 大 PDU |
| P08 | 32-bit(0xF4ACFB13) | 32-bit | 32-bit 显式 | 16 B(含 32-bit Length) | Ethernet,长计数需求 |
| P11 | 8-bit(0x1D) | 4-bit | 16-bit 隐式或 12-bit nibble 半显式 | ≈ 2 B | CAN classic,P01 的现代替代 |
| P22 | 8-bit(0x2F) | 4-bit | DataIDList(同 P02) | ≈ 1.5 B | CAN classic,P02 的现代替代 |
| P44 | 32-bit(0xF4ACFB13) | 16-bit | 32-bit 显式 | 12 B | P04 的大数据版,数据 ≤ 64 KB |
2.1 怎么选
选择看总线类型 + 消息长度 + ASIL 等级三个维度:总线决定带宽预算(CAN classic 8 字节紧、CAN-FD 64 字节宽、Ethernet 几乎不限),消息定长还是变长决定要不要 Length 字段(P05 vs P06、P04 的 4 KB vs P44 的 64 KB),ASIL 等级决定 CRC 强度与 Counter 宽度的下限。
CAN-FD 上的 ASIL D 定长消息默认 P05:16-bit CRC + 8-bit Counter,DataID 隐式不占线上字节,每帧只花 3 字节(隐式/显式 DataID 的机制与取舍见 §5)。CAN classic 新项目选 P11 而非 P01——两者线上布局兼容,但 P11 的接收端行为对齐 P04-P07 系的"新式" check 语义,且砍掉了 P01 已废弃的 DATAID_LOW/ALT 模式。
3. CRC —— 多项式选择的证据链
E2E 的 CRC 不是 CAN 链路层的 CRC:后者由 CAN 控制器硬件生成、只保护物理段,过 Gateway 就被剥掉重算;前者由发送端软件在应用数据上计算、接收端应用重新验证,覆盖"发送 SWC 封装到接收 SWC 解封"的整条路径,中间任何软件层(COM 拷贝错、DMA 搬运错、路由错)都在保护范围内。
3.1 五个多项式和它们的 Hamming distance
E2E 各 Profile 用的 CRC 例程全部来自 AUTOSAR CRC Library(CP SWS CRC Routines),多项式是有出处的选型而不是随手挑的:
| CRC 例程 | 多项式(normal form) | Hamming distance | 用于 Profile |
|---|---|---|---|
| CRC-8 SAE J1850 | 0x1D | 规范未标注(legacy 沿用) | P01 / P11 |
| CRC-8H2F | 0x2F | HD=4 至 119 bit 数据(Koopman 2004) | P02 / P22 |
| CRC-16 CCITT-FALSE | 0x1021 | HD=4 至 32751 bit(Koopman 数据) | P05 / P06 |
| CRC-32P4 | 0xF4ACFB13 | HD=6 至 4 KB(含 CRC),规范明标 | P04 / P08 / P44 |
| CRC-64 ECMA | 0x42F0E1EBA9EA3693 | HD=4 至近 8 GB,规范明标 | P07 |
三个值得记住的细节:
- 0x2F 就是 Koopman 记法的 0x97——Koopman & Chakravarty 2004 的结论是它在 ≤ 119 bit 数据上做到 HD=4 的最优 8-bit 多项式,完整覆盖 8 字节 CAN 帧(64 bit)。
- 0xF4ACFB13(CRC-32P4)是专门为 E2E P04 选的:CRC Library 规范(SWS_Crc_00083)明写它对比 Ethernet CRC(0x04C11DB7)的优势是"HD=6 up to 4 kB"——这正好是 P04 的 MaxDataLength 上限(4096 字节),多项式与 Profile 数据上限是配套设计的。
- P01 的 CRC-8 用 start=XOR=0x00,而 CRC Library 的 SAE8 例程用 0xFF/0xFF——E2E 库内部做两次额外 XOR 0xFF 来补偿。这是刻意的:让 E2E CRC 与链路层/其他用户的同多项式 CRC 结果不同,避免"两层 CRC 恰好都算对了错误数据"的共因。
HD=N 的含义:任意 N-1 个 bit 翻转 100% 检出。超出 HD 覆盖后,随机错误漏检概率趋近 (k 为 CRC 位宽)——16-bit CRC 约 ,这个残余概率会进 FMEDA 的通信 fault DC 论证。
3.2 CRC 不抓什么
CRC 只对数据内容的随机损坏有效,三类 fault 它天然放过:重放(旧帧的 CRC 依然自洽)、错发(错误发送端把格式算对)、系统性同位错(每帧同一 bit 错,CRC 每次都"验证通过"错的数据)。前两类靠 Counter 和 DataID 兜(§4/§5),最后一类靠应用层 plausibility(如扭矩指令与车速的合理性交叉核验,见 转矩安全)。
4. Counter 与 timeout —— 时域 fault
每次发送请求 Counter +1,到最大值绕回。以 P05 为例(PRS_E2E_00397):8-bit Counter 从 0 计到 0xFF 后回 0,0xFF 不是保留值,就是普通计数——这点和某些私有协议"0xFF=invalid"的习惯不同,移植时容易踩。
接收端 check 函数比较本帧与上帧的 Counter 增量,判定结果落到规范的 check status 枚举(E2E_PXXSTATUS_*):
| Counter 增量 | Check status | 含义 |
|---|---|---|
| +1 | OK | 正常 |
| +2 ~ +MaxDeltaCounter | OKSOMELOST | 中间丢了帧,但在容忍度内 |
| 0(同一帧又来一遍) | REPEATED | 重复/stuck |
| 超过 MaxDeltaCounter 或倒退 | WRONGSEQUENCE | 丢帧超限、乱序或重放 |
| 周期到了但没有新数据 | NONEWDATA | 发送端停发(timeout 的来源) |
两个工程要点:MaxDeltaCounter 是安全参数不是舒适参数——它定义"最多容忍连续丢几帧",直接进 FTTI 预算(§9.3);timeout 检测不是独立机制,E2E Supervision 靠周期性非阻塞读 + NONEWDATA 状态实现,应用侧必须有周期任务去调 check,不调就没有 timeout 检测。8-bit Counter 在 100 Hz 消息上的绕回周期是 256 帧 = 2.56 s,远大于任何合理的 MaxDeltaCounter,绕回混叠在实践中不构成风险;4-bit Counter(P11/P22)只有 15 步,MaxDeltaCounter 必须配得更紧。
5. DataID —— 抓 masquerade,隐式还是显式是个真取舍
DataID 是每条 E2E 保护消息的系统级唯一编号,由 OEM 在整车信号数据库层面统一分配。它的作用机制:计算 CRC 时把 DataID 拼进数据,接收端用自己配置的预期 DataID 重算——如果收到的其实是别的消息(错发、错路由、插入),CRC 必然对不上。
5.1 三种注入方式
不同 Profile 的 DataID 处理方式不同,这决定带宽开销与故障表现:
| 方式 | Profile | 机制 |
|---|---|---|
| 隐式(implicit) | P05 / P06 / P01(mode 0/1/2)/ P11 | DataID 不上线,只在 CRC 计算时拼在用户数据之后(PRS_E2E_00399);零字节开销 |
| 显式(explicit) | P04 / P07 / P08 / P44 | 32-bit DataID 作为 E2E header 字段随帧传输,接收端先比对再算 CRC |
| DataIDList | P02 / P22 | 16 个 8-bit DataID 按 Counter 值轮换选用,给 4-bit Counter 变相扩展了时序保护 |
5.2 隐式 vs 显式的真实取舍
旧口径"ASIL D 一律显式"不成立——P05 的隐式 DataID 正是 CAN-FD ASIL D 的主流配置,安全强度上两者等价(都进 CRC,masquerade 检出率相同)。真正的差别在工程性:
- 隐式省带宽但故障表现隐蔽:两端 DataID 配置不一致(信号数据库版本漂移、ECU 升级后 ID 重分配)时,不会有"DataID mismatch"这种明确报错,而是 100% CRC fail——现象和总线损坏一模一样,排障时容易往硬件方向跑偏(见 §10 G2)。
- 显式占 4 字节但 debug 友好:总线 trace 里直接可读,Ethernet 带宽也不心疼,所以 P04/P07/P08/P44 全是显式。
6. E2E state machine —— 单帧 check 不等于可用性判定
check 函数只回答"这一帧对不对",但应用不能拿单帧结果直接做安全决策——总线上偶发一帧 CRC 错太正常了(EMI 瞬态),一帧就切 fail-safe 会把假阳性变成可用性事故。规范为此在 check 之上定义了 E2E state machine(E2E_SM):在一个滑动接收窗口内统计 check 结果,给应用一个经过资格审查的状态。
状态集合(PRS §6.19):DEINIT → NODATA →(收到首批有效数据)INIT →(窗口内 OK 数达标)VALID ⇄(窗口内错误数超限)INVALID。应用只允许在 VALID 状态消费数据;INIT 阶段(如刚上电、发送端刚复位)数据不可用但也不算故障。
窗口参数(WindowSizeValid / MinOkStateValid / MaxErrorStateValid 等)不是随手配的,规范直接给出了它与故障检出时间 tFD 的关系(PRS §6.19 配置提示):
即从 VALID 掉到 INVALID 的最坏耗时 =(WindowSizeValid − MinOkStateValid + 1)× 消息周期(窗口从全 OK 滑到 OkCount < MinOkStateValid 需移出 WS−MO+1 帧)。这行公式必须出现在 FTTI 预算表里——E2E_SM 配置吃掉的检测时间与硬件 SM 的 DTI 是同一性质的预算项(§9.3 有算例)。规范也允许 disableEndToEndStateMachine=TRUE 直接把裸 check 结果交给应用,此时窗口逻辑要应用自己写,安全论证责任也跟着走。
7. SecOC —— 防"会算 CRC 的对手"
E2E 的三件套对攻击者是透明的:CRC 多项式、Counter 规则、DataID 分配全在公开规范和泄露的 DBC 里,OBD 口注入或蜂窝栈渗透后伪造一帧"E2E 完全合法"的扭矩指令没有任何门槛。SecOC(CP SWS Secure Onboard Communication)的答案是在消息上加密码学认证:没有密钥就造不出合法的 MAC,重放旧帧会被 Freshness Value 拒绝。
7.1 Secured I-PDU 怎么构造
发送路径六步(SWS_SecOC_00031):准备缓冲 → 构造认证输入 → 算 Authenticator → 拼 Secured I-PDU → Freshness 计数递增 → 发送。其中两步是理解 SecOC 的关键:
- 认证输入 DataToAuthenticator = SecOC DataId(16-bit)‖ Authentic I-PDU ‖ 完整 Freshness Value(SWS_SecOC_00034,DataId 与 FV 按 Big Endian 编码)。注意进 MAC 的是完整 FV(如 64-bit),不是线上截断值——这是防重放强度的来源。
- 截断(SWS_SecOC_00036):算出的 MAC(如 CMAC 的 128-bit 输出)截取最高若干位随帧传输。截断不削弱密钥安全性,只把"单帧盲猜成功率"从 放宽到 (n 为截断位数,见 §11 C2 的数字)。
7.2 三个标准 SecOC Profile
算法与截断长度不是自由发挥,规范给了三个标准配置(SWS_SecOC_00192/00193/00194),MAC 算法统一是 AES-128 CMAC(NIST SP 800-38B)——不是 HMAC-SHA-256;车规选 CMAC 是因为 HSM 的 AES 硬件引擎可以直接复用,单帧延迟和面积都占优:
| SecOC Profile | 截断 MAC | 截断 FV | 定位 |
|---|---|---|---|
| Profile 1(24Bit-CMAC-8Bit-FV) | 24 bit(MAC 最高位) | 8 bit(FV 最低位) | 通用默认,4 字节总开销 |
| Profile 2(24Bit-CMAC-No-FV) | 24 bit | 0(不用 FV) | 无法建立同步 freshness 时的降级——不防重放 |
| Profile 3(JASPAR) | 28 bit | 4 bit | CAN 专用,FV 全长 64-bit,配 JASPAR 计数器体系 |
7.3 Freshness Value —— SecOC 真正的工程难点
MAC 本身是成熟密码学,SecOC 项目翻车几乎都翻在 freshness 同步上。规范采纳的 JASPAR 方案把 64-bit FV 拆成四段拼接:Trip Counter(点火周期计数,≤ 24 bit)‖ Reset Counter(周期性递增,≤ 24 bit)‖ Message Counter(每帧 +1,≤ 48 bit)‖ Reset Flag(≤ 2 bit,取 Reset Counter 低位),四段总长 ≤ 64 bit。FV 管理由 Freshness Value Manager(FvM)承担,master ECU 通过同步消息广播 TripCnt/ResetCnt,各节点本地维护 MsgCnt。
线上只传 FV 的低几位(Profile 1 是 8 bit),接收端用本地计数器重建完整 FV:取"比本地值大的最小候选"代入 MAC 验证,失败则在 SecOCAuthenticationVerifyAttempts 配置的次数内尝试相邻候选——验证失败递增的 verify attempt counter 正是 SecOC_GetRxFreshness 的入参,FvM 据它给出下一个 FV 候选,达上限才丢帧(SWS_SecOC_00239/00241);SecOCAuthenticationBuildAttempts 管的是 freshness 查询、CSM 返回 E_BUSY 这类可恢复错误的重建重试,两个参数配混,FV 失步容忍行为就偏离设计预期。这个设计的隐含约束:接收端失步超过截断窗口(8 bit → 256 帧)就再也重建不出正确 FV,合法帧全部验证失败,必须靠同步消息恢复(§10 G5)。
7.4 Crypto Stack 与密钥管理
SecOC 自己不碰密钥,MAC 计算逐层下沉:
| 层 | 职责 |
|---|---|
| SecOC | 挂在 PduR 侧:Authentic I-PDU 进,Secured I-PDU 出;验证失败状态上报(可送 IdsM 做入侵统计) |
| CSM(Crypto Service Manager) | 统一密码服务 API,SecOC 调它算 CMAC |
| CryIf(Crypto Interface) | 把 job 路由到具体 driver |
| Crypto Driver / HSM | 真正执行 AES;密钥槽在 HSM 内部,明文 key 永不出 HSM |
ASIL/CAL 项目的密钥纪律:per-vehicle(至少 per-ECU-pair)密钥,产线 EOL 经安全通道注入 HSM 密钥槽(Infineon AURIX HSM、NXP S32K3 HSE,均 EVITA Full 级)。反面教材是 Toyota RAV4 Prime 的 SecOC 密钥提取(icanhack.nl 公开分析,详见 ISO/SAE 21434 深度):key provisioning 实施缺陷让攻击者从量产 ECU 拿到了密钥——SecOC 的强度上限永远是密钥管理,不是 MAC 位数。
8. E2E 和 SecOC 怎么叠加
同一条消息同时要 E2E 和 SecOC 时,包裹顺序是固定的:E2E 先包(RTE 边界,离应用最近),SecOC 后包(PduR 之下,离总线最近)。发送时 E2EXf transformer 先给应用数据加 E2E header,产出的整块数据作为 Authentic I-PDU 交给 SecOC 加 MAC;接收方向反过来,SecOC 先验。
这个顺序保证了两层故障解耦:SecOC 验证失败的帧被直接丢弃,上层 E2E 看到的只是"少了一帧"(loss),由 Counter/timeout 按十类 fault 之一正常处理——SecOC 的任何行为(误拒、密钥失效、FvM 失步)对 E2E 而言都退化成它本来就要防的 loss fault,安全论证不用给 SecOC 分配 safety 需求。这也是为什么 E2E 库按 ASIL D 开发,SecOC 通常按 QM 开发:只要 FFI(freedom from interference)论证清楚"SecOC 最坏只造成丢帧",QM 的 SecOC 不污染 ASIL D 数据流。
8.1 部署判据
E2E 看 ASIL,SecOC 看攻击面(TARA 结论,ISO/SAE 21434 风险评估 + UN R155 威胁目录):
| 场景 | 配置 |
|---|---|
| 网联车 ASIL 消息(VCU ↔ 主驱扭矩链) | E2E + SecOC 都要 |
| 无外联攻击面的内部 ASIL 消息 | E2E 即可(TARA 论证攻击可行性低) |
| 非安全但可被注入利用的消息(如车门/灯控) | SecOC 即可 |
| OTA 软件包 | 数字签名 + Secure Boot 的范畴,不是 E2E/SecOC(见 ISO 21434 深度) |
9. 端到端 worked design —— VCU→主驱扭矩指令(CAN-FD,P05 + SecOC Profile 1)
本节把前八节的机制拼成一条完整设计链:需求分配 → 帧布局 → E2E/SecOC 参数 → FTTI 预算 → 失效注入验收,所有参数可逐项复核。
9.1 需求与平台
场景:VCU 每 10 ms 向主驱逆变器发扭矩指令。Safety Goal 为"避免意外扭矩"(ASIL D),整车 FTTI 50-100 ms(与 转矩安全 口径一致),本例给通信链分配 tFD + 反应 ≤ 100 ms。TARA 判定该消息经蜂窝-网关路径可达,SecOC 必配。平台:两端 MCU 均为 Infineon AURIX TC397(HSM 为 EVITA Full 级,AES-128 硬件引擎),CAN-FD 仲裁段 500 kbit/s、数据段 2 Mbit/s。
9.2 帧布局与总线负载
E2E 选 P05(定长消息、3 字节开销),SecOC 选 Profile 1(24-bit CMAC + 8-bit 截断 FV,4 字节开销),应用数据 8 字节,合计 15 字节,取 CAN-FD DLC=16:
CAN-FD frame, DLC = 16, ID 0x105 (示例)
[0..1] E2E CRC-16 (0x1021, 小端, 覆盖 payload + 隐式 DataID 0x0C05)
[2] E2E Counter (8-bit, 每帧 +1, 0xFF 后绕回)
[3..4] TorqueReq (int16, 0.1 Nm/LSB → ±3276 Nm 量程)
[5..6] TorqueGradLimit (int16, 0.1 Nm/ms/LSB)
[7] DriveMode + 状态位
[8..10] 应用保留
[11] SecOC truncated FV (64-bit FV 的低 8 bit)
[12..14] SecOC truncated MAC (AES-128 CMAC 的高 24 bit)
[15] pad
发送端顺序: E2E_P05Protect() → SecOC (CMAC over DataId|bytes[0..10]|FV64) → CanIf
接收端顺序: SecOC 验证(重建 FV, 失败丢帧) → E2E_P05Check() → E2E_SM → 应用
单帧线上时间估算:仲裁段约 30 bit @ 500 kbit/s = 60 μs,数据段(16 字节数据 + CRC 场 + 控制位,含填充)约 160 bit @ 2 Mbit/s = 80 μs,ACK/EOF 约 30 μs——合计 ≈ 170 μs,100 Hz 下占总线 ≈ 1.7%。对比:同样的保护若留在 CAN classic(8 字节),E2E+SecOC 的 7 字节开销只给应用剩 1 字节,这条消息根本装不下——见 §11 C1。
9.3 E2E 参数与 FTTI 预算
E2E 配置:DataID = 0x0C05(隐式),MaxDeltaCounter = 2(容忍单帧丢失);E2E_SM 配置 WindowSizeValid = 10、MinOkStateValid = 7、MaxErrorStateValid = 2。套 §6 的规范公式:
| 预算项 | 机制 | 时间 |
|---|---|---|
| 单帧验证 | SecOC CMAC(HSM 硬件 AES,2 个 block)+ E2E check | 每帧 μs 级,不进 ms 预算(具体值以 HSM firmware 实测为准) |
| 故障检出 tFD | E2E_SM 从 VALID 掉 INVALID | ≤ 40 ms |
| 反应 | INVALID → 扭矩指令冻结判定 → 斜坡降扭到 0 | ≤ 40 ms(斜坡由 TorqueGradLimit 域定义) |
| 合计 | ≤ 80 ms < 100 ms ✓ |
发送端停发(NONEWDATA 路径)的检出由同一窗口覆盖,但走的是另一条转移条件:NONEWDATA 不计入 E2E_SM 的错误计数——PRS_E2E_00466 规定 ErrorCount 只统计 ERROR、OkCount 只统计 OK,其余状态两边都不进。10 ms 周期任务连续读不到新数据时,是窗口里的 OK 帧被 NONEWDATA 挤出、OkCount 跌破 MinOkStateValid 才触发 INVALID:本配置下需 WindowSizeValid − MinOkStateValid + 1 = 4 帧 NONEWDATA(规范时长口径 (10 − 7 + 1) × 10 ms = 40 ms)。所以控制 timeout 检出延迟的参数是 MinOkStateValid 而非 MaxErrorStateValid——想压缩停发检出时间去调 MaxErrorStateValid 是无效的。不需要单独的 timeout 定时器,但周期任务必须无条件调 check(§10 G4)。
9.4 SecOC 参数
FV 64-bit 按 JASPAR 四段划分(一种典型配置,各段长度项目可调):TripCnt 16 bit ‖ ResetCnt 22 bit ‖ MsgCnt 24 bit ‖ ResetFlag 2 bit。截断 FV 8 bit 意味着接收端可容忍 < 256 帧的失步窗口(2.56 s @ 100 Hz),超出必须等 FvM 同步消息(TripCnt/ResetCnt 广播,典型 1 s 周期)恢复;SecOCAuthenticationVerifyAttempts = 2,验证失败帧丢弃并向 IdsM 上报计数。密钥:per-vehicle 128-bit,EOL 注入 TC397 HSM 密钥槽,诊断读不出、软件摸不到。
9.5 失效注入验收(DV)
十类 fault 每类都要有注入用例(restbus 仿真,如 CANoe 故障注入):篡改 payload 单 bit(corruption)、重发旧帧(repetition/replay)、按周期删帧(loss)、换 ID 发同格式帧(masquerade)、Counter 跳变(sequence)、停发(blocking)。验收判据统一:每类 fault 被检出 + 逆变器进入降扭/安全态的总时间 < 100 ms,并留 trace 作为 safety case 的验证证据(ISO 26262-4/-6 验证条款对接)。
10. Gotcha 链(7 条高频工程坑)
这 7 条覆盖 E2E/SecOC 项目量产前后最常见的返工来源——共同规律是"机制都上了,但配置或集成让它没真正起作用"。
G1 — 拿链路层 CRC 当端到端保护:CAN 控制器的 CRC 在每个 Gateway/Router 解包点被剥掉重算,跨段路径上软件层的任何数据损坏它都看不见。E2E CRC 必须由两端应用层(RTE/E2EXf)计算。修法:安全分析里把"链路层 CRC"归为单段机制,端到端 DC 只允许引 E2E。
G2 — 隐式 DataID 配置漂移,现象像总线坏了:P05/P06/P11 的 DataID 不上线,两端信号数据库版本不一致(ECU 单独升级、ID 重分配)时唯一症状是 100% CRC fail——排障常被引向线束/收发器方向,烧掉数天。修法:联调期先查两端 DataID/数据库版本一致性再动示波器;量产 OTA 流程把信号数据库版本纳入兼容性门。
G3 — E2E_SM/MaxDeltaCounter 配置吃穿 FTTI:WindowSizeValid 与 MinOkStateValid 拉太开(想压假阳性)会让 tFD =(WindowSizeValid − MinOkStateValid + 1)× 周期悄悄超出通信链的 FTTI 份额,SPFM 表上 DC 还是漂亮的。修法:E2E_SM 参数必须出现在 FTTI 预算表里正着算(§9.3),不允许只做"稳定性调参"。
G4 — 只处理 ERROR,不处理 NONEWDATA/REPEATED:发送端整体挂死(ISR 卡死、任务饿死)时 CRC/Counter 都不再更新,check 返回的是 NONEWDATA 或 REPEATED 而不是 ERROR——只对 ERROR 分支做 fail-safe 的应用会一直消费最后一帧旧数据。修法:按规范用 E2E_SM 的状态(非 VALID 即不可用)做消费判定,不要自己挑 status 枚举分支。
G5 — 截断 FV 失步变成可用性事故:总线风暴、接收 ECU 长时间 bus-off 或休眠唤醒后,本地 FV 落后超过截断窗口(8 bit → 256 帧),重建永远失败,合法帧全部被拒——安全层面表现为持续 loss,整条功能降级。修法:FvM 同步消息周期、VerifyAttempts、唤醒后的 FV 恢复流程要按"最坏失步时长"设计并注入验证;把"SecOC 拒帧率"做成量产监控量。
G6 — 密钥管理毁掉整个 SecOC:全车队共用一把 key、key 存 MCU flash 明文、产线注入通道不设防——任何一条成立,单台车被攻破 = 全车队的 MAC 可伪造(RAV4 Prime 密钥提取是公开案例)。修法:per-vehicle key + HSM 密钥槽 + EOL 安全注入,三者缺一不可;密钥轮换路径在 SOP 前打通。
G7 — Gateway 上 check + 重新 protect,端到端断链:网关把 E2E 校验通过的数据解出来再重新打包保护,看似"每段都有保护",实际网关内部的 RAM/软件错误落在两段之间的裸区——端到端论证不成立。修法:用规范的 Forward 功能(E2E_PXXForward,专为 signal-service translation 设计,可透传 E2E 状态)或让 DataID/保护域全程贯通,不在中途终结保护。
11. Corner 分析(3 条边界)
这 3 条是方案评审和 OEM 安全评估里常被追问、但日常开发容易绕开不想的边界。
C1 — CAN classic 上 E2E + SecOC 装不下:8 字节 payload 里,P11 约 2 字节 + SecOC Profile 1 的 4 字节 = 6 字节开销,应用只剩 2 字节;若消息本身 ≥ 3 字节就无解。实践出路:用 Profile 2(免 FV,省 1 字节但放弃防重放)、把认证信息放到独立 PDU(增加时序耦合与丢帧模式)、或者迁 CAN-FD——SecOC 是很多平台从 CAN classic 迁 CAN-FD 的隐性推手,带宽账要在网络架构定义阶段算,不能等到集成期。
C2 — 截断位数的数学:24-bit MAC 的单帧盲猜成功率是 ;以 100 帧/s 连续注入,期望约 s(近两天不间断攻击)才蒙中一帧,且每次失败都会被 IdsM 计数、接收端不提供任何"猜对了没有"的 oracle 反馈——对在线攻击够用。但要分清:截断保护的是单帧伪造概率,不是密钥;密钥一旦泄露(G6),24 bit 还是 128 bit 都无意义。反方向的取舍是带宽:28-bit MAC(Profile 3)在 CAN 上把 FV 压到 4 bit,失步窗口缩到 16 帧,同步消息要发得更勤。
C3 — safety 要可用,security 要拒绝,两者在拒帧上打架:SecOC 的正确行为(验证失败就丢)对 safety 链是主动制造 loss fault。fail-safe 功能(扭矩链)可以接受"拒帧 → E2E timeout → 降级",但 fail-operational 功能(转向冗余、AEB)不能接受 FV 失步导致的成片拒帧——此时"SecOC 误拒率"本身成为安全指标,FvM 的同步鲁棒性要按 safety 需求(而不只是 security 需求)做 DFA/注入验证。评审时问一句"FV 失步 2.56 s 会发生什么"就能暴露这类设计缺口。
核心要点
- E2E ≠ SecOC:E2E 防 ISO 26262-6 §D.2.4 的十类偶然/系统性通信 fault,SecOC 防 ISO/SAE 21434 语境的恶意伪造重放;E2E 挡不住会算 CRC 的攻击者,SecOC 挡不住发送端自己的 bug,不能互相替代
- R23-11 有 14 个 E2E Profile(10 数据 + 4 method):CAN classic 新项目用 P11/P22(P01/P02 是 legacy),CAN-FD 定长 ASIL D 主流是 P05(3 字节开销,DataID 隐式),Ethernet 用 P04/P44/P07/P08(DataID 显式)
- CRC 多项式有证据链:0x2F = Koopman 0x97(HD=4 至 119 bit),CRC-32P4 0xF4ACFB13 规范明标 HD=6 至 4 KB 且与 P04 的 MaxDataLength 配套;E2E CRC 与链路层 CRC 刻意错开 start/XOR 防共因
- 隐式 DataID 与显式安全强度等价,取舍在工程性:隐式省带宽但配置漂移时表现为 100% CRC fail(像硬件坏),显式占 4 字节但 trace 可读
- E2E_SM 才是可用性判定:应用只在 VALID 消费数据;tFD =(WindowSizeValid − MinOkStateValid + 1)× 周期,必须进 FTTI 预算
- SecOC 标准算法是 AES-128 CMAC(NIST SP 800-38B),三个标准 Profile:24-bit MAC + 8-bit FV(默认)/ 24-bit 无 FV(不防重放)/ JASPAR 28+4;认证输入 = DataId ‖ 数据 ‖ 完整 FV
- Freshness 是 SecOC 真正的工程难点:JASPAR 四段计数器拼 64-bit FV,线上只传低 8 bit,失步超 256 帧合法帧全拒——同步与恢复路径要按 safety 标准设计
- 叠加顺序固定:E2E 内(RTE 边界)、SecOC 外(PduR 下);SecOC 一切失效对 E2E 退化为 loss,E2E 库 ASIL D、SecOC 可 QM + FFI
- worked design 记忆锚:P05 + SecOC Profile 1 在 CAN-FD 16 字节帧里 = 8 字节应用 + 3 字节 E2E + 4 字节 SecOC,100 Hz 占总线 1.7%,tFD 40 ms + 反应 40 ms < FTTI 100 ms
- 7 Gotcha:链路层 CRC 冒充端到端 / 隐式 DataID 漂移 / SM 参数吃穿 FTTI / 漏处理 NONEWDATA / FV 失步全拒帧 / 密钥管理垮掉全盘 / Gateway 断开端到端
Engineering Objects
引用此页的结构化 Engineeri…
引用此页的结构化 Engineering Object(v2.0 Copilot 自动生成,不要手动编辑此段)。
- diagnostic ·
diagnostic_can_bus_health— CAN Bus Health Monitor - mechanism ·
mechanism_e2e_protection— E2E (End-to-End) Protection Profile - mechanism ·
mechanism_secoc— SecOC (Secure Onboard Communication) - mitigation ·
mitigation_can_fail_silent— CAN Fail-Silent Mode - mitigation ·
mitigation_comm_timeout_safe— Communication Timeout Safe State