用C语言实现CAN FD安全通信:AUTOSAR OS下的SecOC协议落地细节
SecOC不是加密,是认证:发送端给PDU附加截断MAC+Freshness,接收端验来源和防重放。AUTOSAR CP里它夹在PduR和下层CanIf之间,对Com上层透明。
一、CAN FD给SecOC留出空间
经典CAN 8字节里,FV截断+N位MAC一扣,业务载荷只剩3~4字节;CAN FD 64字节后典型配法是「载荷56B + FV 1B + MAC 7B」,不用再拆多条报文重组。
但注意CAN FD的L-PDU可能有bus-specific padding,Secured I-PDU里FV/MAC位置不一定永远在末尾,解析时用SecOC配的偏移,别硬写「len-8」。
二、发送端:拼认证数据+调CSM
发送流:
PduR给Authentic I-PDU
SecOC拷到内部缓冲(规范强制,避免TriggerTransmit期间被覆盖)
从FVM取完整Freshness
拼 DataId + Payload + Freshness
Csm_MacGenerate算AES-128-CMAC
截断MAC+截断FV接到尾部
发完FV自增
/* 发送主函数内伪代码 */
Buf tx; memcpy(tx.payload, authetic_pdu, len);
Fv fv = Fvm_GetTx(SecOCDataId);
uint8_t auth[256]; int n=0;
PUT_BE16(auth,&n, SecOCDataId);
memcpy(auth+n, tx.payload, len); n+=len;
PutFullFV(auth,&n, fv); /* 大端对齐 */
Csm_MacGenerate(job, key, auth, n, full_mac);
/* 截断:MAC取前N字节,FV取MessageCounter低字节 */
AppendTx(&tx, fv.msg_low, full_mac, trunc_len);
PduR_IfTransmit(secured_pdu_id, &tx);
Fvm_Inc(SecOCDataId);
DataId必须大端拼,大小端不一致是量产常见坑:两边CMAC对不上,全报验证失败。
三、接收端:先FV后MAC
RxIndication里别直接算MAC,只把Secured I-PDU拷进缓冲、置pending;真正验证放SecOC_MainFunction(OS任务周期跑)。
void SecOC_RxIndication(PduIdType id, const PduInfo* p){
copy_to_buf(id, p); set_pending(id);
}
void SecOC_MainFunction(void){
for_each_pending(id){
parse_secured(&authentic, &fv_rx, &mac_rx);
Fv local = Fvm_GetVerify(id, fv_rx);
if(!fv_in_window(local, fv_rx)){ drop(id); report_ids(); continue; }
uint8_t auth[256]; int n=0;
PUT_BE16(auth,&n,SecOCDataId);
memcpy(auth+n, authentic.data, authentic.len); n+=authentic.len;
PutFullFV(auth,&n, local);
if(Csm_MacVerify(job,key,auth,n,mac_rx,trunc_len)==E_OK){
PduR_RxIndication(authentic_id, &authentic);
Fvm_Confirm(id, fv_rx); /* 同步本地计数器 */
}else{
drop(id); IdsM_SetSecurityEvent(...); /* 连续失败上报DEM */
}
}
}
FV先校验能挡掉大多数重放帧,不用每次都跑HSM;只有FV在窗口内才验MAC。
四、AUTOSAR OS任务安排
CanIf_RxIndication→PduR→SecOC_RxIndication:中断/回调上下文,只拷贝+置标志,禁止调CSM
SecOC_MainFunction:放独立BSW任务,周期1~5ms,优先级高于Com但低于调度关键任务
CSM若走HSM异步job,MainFunction里轮询Csm_MacVerifyFinished或走Crypto_Job_Result回调
Tx侧SecOC_IfTransmit可同步返回E_OK,MAC在MainFunction补算;实时性紧的报文用同步CSM调用
OS ExecutionBudget留余量:HSM单次CMAC几微秒到几十微秒,别把任务时限卡到边界
五、工程落坑清单
密钥别进RAM明文:走Crypto KeyStore/HSM,CSM只拿key handle
FV复位不同步:ECU睡醒/总线OFF恢复后必须从NvM或主节点同步报文拉Trip/Reset Counter,否则合法帧全丢
MAC截断别太短:24bit(3字节)伪造概率1/2^24,安全相关报文建议≥32bit
缓冲区分离:Authentic和Secured I-PDU各开缓冲,上层更新新数据不能冲掉正在发的Secured帧
只保护关键PDU:SecOC配白名单,普通诊断/标定报文不过SecOC,省HSM算力
大小端:DataId、FV、Payload拼接统一大端,HSM和软件栈两边都对齐
CAN FD上SecOC落地本质是「PduR透明接入 + FVM计数同步 + CSM/HSM算MAC + MainFunction做验证」。C层代码不碰加密算法本身,只管拼数据、管缓冲、管FV窗口和任务时序;算法、密钥、硬件加速全委托CSM。配合HSM和FV主从同步,关键控制报文防伪造/防重放就能在CAN FD上跑稳。





