当前位置:首页 > 汽车电子 > 汽车电子
[导读]SecOC不是加密,是认证:发送端给PDU附加截断MAC+Freshness,接收端验来源和防重放。AUTOSAR CP里它夹在PduR和下层CanIf之间,对Com上层透明。


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上跑稳。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭