免责声明:本文内容仅限学习使用。若将文中内容应用于实际项目,请务必自行验证,因使用不当造成的任何损失,责任由使用者自行承担。
虚构案例声明:本文中所有涉及具体时间、地点、人物、公司、车型等描述性案例均为完全虚构,旨在通过典型场景增强阅读体验和代入感。如有个别信息与现实雷同,纯属巧合。
以下案例为完全虚构,所有时间、地点、人物、公司名称均为杜撰,旨在通过一个典型场景说明技术原理,增强阅读体验。如有雷同,纯属巧合。
场景:从“愿望清单”到“施工图纸”
2026年10月的第一个周一,ACME汽车公司电子开发部,3楼会议室。
国庆假期刚过,会议室里还残留着上周五下午茶的饼干屑。陈工提前十分钟到,擦干净白板,把国庆前最后一篇讨论的“需求树”擦掉,换上了新的标题:
6. Requirement Specification
6.1 Functional Requirements
6.1.1 Configuration
6.1.2 Initialisation
小赵推门进来,手里除了笔记本,还多了一杯热豆浆。“陈工早。国庆期间我把SRS第6章的前两节看了三遍,越看越觉得……这些需求比我想象的要‘厚’。”
“厚?”陈工笑着接过话,“你指的是信息密度?”
“对。每一条需求看起来都不长,但背后的设计考量特别多。比如SRS_SecOC_00001——就一句话‘应当可配置哪些Authentic I-PDU需要被保护’,但我在想——到底怎么配置?配置什么?配置之后怎么用?”
小林端着咖啡走进来,听到这个问题,边走边说:“你这个问题,正好是我们今天要拆解的。第6.1.1节的三条需求,看着简单,实际是SecOC整个配置体系的‘基石’。没有它们,后面所有的功能都无从谈起。”
王测最后一个进来,手里拿着一个U盘:“我把SRS第6.1.1和6.1.2节的原文整理成了一个表格,投到屏幕上大家对照看。”
陈工点头:“好,那我们正式开始。今天是SRS第6章功能需求拆解的第一篇——聚焦配置与初始化。”
第一章:配置需求总览
1.1 为什么配置是“第一需求”?
陈工在投影上打开王测整理的表格:
| SRS_SecOC_00001 | Selection of Authentic I-PDU | 应当可配置哪些Authentic I-PDU需要被保护 |
| SRS_SecOC_00002 | Range of verification retry by the receiver | 接收方验证重试范围应当可配置 |
| SRS_SecOC_00003 | Configuration of different security properties | 不同的安全属性应当可配置 |
| SRS_SecOC_00005 | Initialisation of security information | SecOC模块的安全配置应当在启动时初始化 |
“第6.1.1节叫‘Configuration’,中文翻译是‘配置’。为什么AUTOSAR要把配置放在功能需求的第一位?”陈工扫了一圈在座的人。
小赵举手:“我试着回答——因为SecOC是一个通用模块,同一份代码要跑在不同的ECU上、保护不同的PDU、使用不同的加密算法。如果没有配置,SecOC就只能写死一种行为。”
陈工点头:“方向对。但更深一层的原因是什么?你们想想,AUTOSAR的核心哲学是什么?”
小林接话:“代码通用,配置专用。 这是AUTOSAR架构设计的核心理念。SecOC模块的C代码是100%可重用的,但每个ECU需要保护的PDU不同、使用的密钥不同、需要的安全等级也不同。这些差异全部通过配置来体现。所以配置需求必须排在功能需求的最前面——它是所有其他功能的前提。”
陈工在白板上写下一行字:
配置 = 通用代码 → 专用功能的桥梁
“这就是为什么。我们接下来逐条拆解这三条配置需求。”
1.2 配置需求的“三层结构”
王测补充了一个观察:“我整理了这三条配置需求,发现它们其实构成了一个‘三层结构’。”
他在白板上画了一个金字塔:
#mermaid-svg-8P7J60WgkReQaAEr{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8P7J60WgkReQaAEr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8P7J60WgkReQaAEr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8P7J60WgkReQaAEr .error-icon{fill:#552222;}#mermaid-svg-8P7J60WgkReQaAEr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8P7J60WgkReQaAEr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8P7J60WgkReQaAEr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8P7J60WgkReQaAEr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8P7J60WgkReQaAEr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8P7J60WgkReQaAEr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8P7J60WgkReQaAEr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8P7J60WgkReQaAEr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8P7J60WgkReQaAEr .marker.cross{stroke:#333333;}#mermaid-svg-8P7J60WgkReQaAEr svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8P7J60WgkReQaAEr p{margin:0;}#mermaid-svg-8P7J60WgkReQaAEr .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-8P7J60WgkReQaAEr .cluster-label text{fill:#333;}#mermaid-svg-8P7J60WgkReQaAEr .cluster-label span{color:#333;}#mermaid-svg-8P7J60WgkReQaAEr .cluster-label span p{background-color:transparent;}#mermaid-svg-8P7J60WgkReQaAEr .label text,#mermaid-svg-8P7J60WgkReQaAEr span{fill:#333;color:#333;}#mermaid-svg-8P7J60WgkReQaAEr .node rect,#mermaid-svg-8P7J60WgkReQaAEr .node circle,#mermaid-svg-8P7J60WgkReQaAEr .node ellipse,#mermaid-svg-8P7J60WgkReQaAEr .node polygon,#mermaid-svg-8P7J60WgkReQaAEr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8P7J60WgkReQaAEr .rough-node .label text,#mermaid-svg-8P7J60WgkReQaAEr .node .label text,#mermaid-svg-8P7J60WgkReQaAEr .image-shape .label,#mermaid-svg-8P7J60WgkReQaAEr .icon-shape .label{text-anchor:middle;}#mermaid-svg-8P7J60WgkReQaAEr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8P7J60WgkReQaAEr .rough-node .label,#mermaid-svg-8P7J60WgkReQaAEr .node .label,#mermaid-svg-8P7J60WgkReQaAEr .image-shape .label,#mermaid-svg-8P7J60WgkReQaAEr .icon-shape .label{text-align:center;}#mermaid-svg-8P7J60WgkReQaAEr .node.clickable{cursor:pointer;}#mermaid-svg-8P7J60WgkReQaAEr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8P7J60WgkReQaAEr .arrowheadPath{fill:#333333;}#mermaid-svg-8P7J60WgkReQaAEr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8P7J60WgkReQaAEr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8P7J60WgkReQaAEr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8P7J60WgkReQaAEr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8P7J60WgkReQaAEr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8P7J60WgkReQaAEr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8P7J60WgkReQaAEr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8P7J60WgkReQaAEr .cluster text{fill:#333;}#mermaid-svg-8P7J60WgkReQaAEr .cluster span{color:#333;}#mermaid-svg-8P7J60WgkReQaAEr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8P7J60WgkReQaAEr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8P7J60WgkReQaAEr rect.text{fill:none;stroke-width:0;}#mermaid-svg-8P7J60WgkReQaAEr .icon-shape,#mermaid-svg-8P7J60WgkReQaAEr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8P7J60WgkReQaAEr .icon-shape p,#mermaid-svg-8P7J60WgkReQaAEr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8P7J60WgkReQaAEr .icon-shape .label rect,#mermaid-svg-8P7J60WgkReQaAEr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8P7J60WgkReQaAEr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8P7J60WgkReQaAEr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8P7J60WgkReQaAEr :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
配置需求的三层结构
SRS_SecOC_00001选择哪些PDU需要保护(范围层)
SRS_SecOC_00003配置不同的安全属性(内容层)
SRS_SecOC_00002配置验证重试范围(行为层)
“最底层是‘范围层’ ——先确定哪些PDU需要保护。中间是‘内容层’ ——为每个选中的PDU配置具体的安全属性(MAC长度、FV长度等)。最上层是‘行为层’ ——定义SecOC在运行时的行为细节(比如重试几次)。这三层从‘粗’到‘细’,逐层缩小配置的粒度。 ”
陈工说:“这个总结很到位。那我们逐层来看。”
第二章:SRS_SecOC_00001——选择需要保护的PDU
2.1 需求原文解读
小林翻开SRS文档第10页,念出需求原文:
[SRS_SecOC_00001] Selection of Authentic I-PDU
Type: Valid
Description: It shall be configurable, which Authentic I-PDU is to be secured.
Rationale: It is necessary to be able to select and configure the Authentic
I-PDUs that need to be secured.
Use Case: The SecOC configurator selects the PDU IDs that refer to I-PDUs
that shall be secured. He/she adds security related configuration
data so that a specific level of security is realized.
Dependencies: [SRS_SecOC_00003]
Supporting Material: (SRS_BRF_02035, RS_BRF_02036, RS_BRF_02037, RS_BRF_02200)
“注意Description里的关键词——SHALL。”陈工用红笔在投影上圈了一下,“这是强制需求。任何声称实现SecOC的系统,都必须提供这个配置能力。不是‘建议’,是‘必须’。”
小赵问:“那这个‘可配置’到底意味着什么?我在配置工具里看到的是一个勾选框——勾上就保护,不勾就不保护。仅此而已吗?”
小林摇摇头:“远不止。SRS_SecOC_00001的Use Case里有一句关键的话——‘He/she adds security related configuration data so that a specific level of security is realized.’——配置人员在选择PDU ID的同时,还要添加‘安全相关的配置数据’来实现特定的安全等级。这说明选择PDU只是第一步,后续还要配置安全属性。”
2.2 “选择”背后的三个设计决策
陈工在白板上写下三个关键词:
1. 范围(Scope)——哪些PDU?
2. 粒度(Granularity)——多细的控制?
3. 时机(Timing)——什么时候配置?
第一个——范围。 陈工说:“不是所有PDU都需要SecOC保护。哪些需要?哪些不需要?这是一个安全分析的结果。刹车指令、转向指令、扭矩指令——这些是安全关键数据,必须保护。车窗控制、座椅调节、灯光控制——这些不是安全关键数据,可以选择保护也可以不保护。选择范围的依据,是安全威胁分析(TARA)的结果。 ”
第二个——粒度。 小林说:“‘可配置’的粒度有多细?可以按PDU配置,也可以按信号配置。SRS文档里说的粒度是PDU级别——一个完整的Authentic I-PDU要么被保护,要么不被保护。不能只保护其中一半的信号。”
第三个——时机。 王测说:“配置是在什么时候完成的?预编译时?链接时?还是运行时?AUTOSAR支持三种配置变体——预编译(Pre-compile)、链接时(Link-time)、后构建(Post-build)。SRS_SecOC_00001没有限定具体用哪种,取决于具体实现和项目需求。”
2.3 配置示例——从“勾选框”到“配置文件”
王测把配置工具里的截图投影出来:“我们来看一个实际的配置示例。在Vector DaVinci或ETAS ISOLAR这样的配置工具里,每个PDU都有一个属性叫SecOCEnabled。当这个属性设为true时,这个PDU就会被SecOC保护。”
<!– 配置示例(简化) –>
<SecOCRxPduProcessing>
<ShortName>RxPdu_TorqueCmd</ShortName>
<!– 该PDU需要安全保护 –>
<SecOCEnabled>true</SecOCEnabled>
<SecOCDataId>0x1001</SecOCDataId>
<SecOCFreshnessValueId>0x01</SecOCFreshnessValueId>
<SecOCFreshnessValueLength>64</SecOCFreshnessValueLength>
<SecOCFreshnessValueTxLength>8</SecOCFreshnessValueTxLength>
<SecOCAuthInfoTxLength>24</SecOCAuthInfoTxLength>
</SecOCRxPduProcessing>
小林指着屏幕上的配置项:“你们注意——SecOCEnabled这个开关本身只是一行XML,但它触发的是一条完整的处理链路。当这个开关打开时,SecOC会在发送端给这条PDU添加MAC和FV,在接收端验证这条PDU的MAC和FV。当这个开关关闭时,这条PDU就像普通PDU一样直接转发。”
王测补充道:“从测试的角度看,这个开关是一个天然的‘测试点’。我们可以先把所有PDU的SecOC都关掉,验证基础通信是否正常。然后逐个打开,验证每个PDU的安全功能。这种渐进式测试策略能快速定位问题。”
2.4 常见误区:不是“越安全越好”
陈工看大家讨论得差不多了,补充了一个重要的工程观点:“我见过一些项目,出于‘安全第一’的考虑,把所有PDU都配上了SecOC。结果呢?ECU的CPU负载飙升了30%,总线带宽消耗增加了25%,而且好几条非关键报文的延迟超过了容忍阈值。”
小林接话:“这个我在代码里见过。MAC计算是计算密集型操作——每次AES-CMAC都要几百微秒。如果每条PDU都算一遍,主频200MHz的MCU根本扛不住。”
陈工在白板上画了一个权衡表:
| 只保护关键PDU | ✅ 满足安全目标 | 低 | 低 | 好 |
| 保护所有PDU | ✅ 满足安全目标(过度) | 高 | 高 | 差 |
| 不保护任何PDU | ❌ 不满足安全目标 | 无 | 无 | 好 |
“配置的意义在于‘精准’——在满足安全目标的前提下,把开销降到最低。 这就是为什么SRS_SecOC_00001强调‘可配置’,而不是‘全部保护’。”
第三章:SRS_SecOC_00003——配置不同的安全属性
3.1 需求原文解读
小林翻到SRS文档第10页的下半部分:
[SRS_SecOC_00003] Configuration of different security properties
Type: Valid
Description: Different security properties shall be configurable.
Rationale: The assessment may vary in several parameters and its security
needs. Thus the level of protection shall be configurable to
adapt to these needs by means of a set of adequate parameters.
Use Case: Security experts define the different security properties. For
every message with security protection needs, the appropriate
properties may be selected.
Dependencies: (none)
Supporting Material: (SRS_BRF_02035, RS_BRF_02036, RS_BRF_02037, RS_BRF_02200)
“注意Rationale里的关键词——‘the level of protection shall be configurable’。”陈工圈出了这句话,“这说明不同的PDU可以有不同的安全等级。刹车指令可能需要最高等级的保护,车窗控制可能只需要基础保护。”
小赵问:“那‘安全属性’到底包括哪些参数?”
小林在白板上写了一个列表:
┌─────────────────────────────────────────────────────────┐
│ 安全属性参数 │
├─────────────────────────────────────────────────────────┤
│ 1. 认证算法(CMAC/AES-128、CMAC/AES-256等) │
│ 2. 完整FV长度(SecOCFreshnessValueLength) │
│ 3. 截断FV长度(SecOCFreshnessValueTxLength) │
│ 4. 截断MAC长度(SecOCAuthInfoTxLength) │
│ 5. DataId(SecOCDataId) │
│ 6. 密钥ID(SecOCKeyId) │
└─────────────────────────────────────────────────────────┘
“这六个参数共同决定了‘安全等级’。”小林解释道,“算法决定强度——AES-128和AES-256的安全强度不同。FV长度决定防重放窗口——64位FV可以容忍更大的丢包,8位FV只能容忍小范围丢包。MAC长度决定抗伪造能力——24位MAC意味着攻击者需要尝试2^24次才能伪造成功,48位则更安全。”
3.2 安全配置文件(Profile)——预定义的“套餐”
陈工补充道:“AUTOSAR定义了几种标准的‘安全配置文件’(Security Profile),其实就是预定义的安全参数组合。你们记得吗?SWS第7.10节定义了Profile 1、Profile 2和Profile 3。”
小林说:“我记得。Profile 1是24位MAC + 8位FV,适合通用场景。Profile 2是24位MAC + 0位FV,不防重放但开销最小。Profile 3是JASPAR标准,64位FV + 4位截断,适合多计数器方案。”
陈工在白板上画了一个对比表:
| Profile 1 | CMAC/AES-128 | 用户配置 | 8位 | 24位 | 通用安全需求 |
| Profile 2 | CMAC/AES-128 | 0 | 0 | 24位 | 无同步FV的场景 |
| Profile 3 | CMAC/AES-128 | 64位 | 4位 | 28位 | JASPAR标准,CAN总线 |
“安全专家可以根据每条PDU的安全需求,从这些‘套餐’中选择合适的Profile,也可以在Profile的基础上自定义参数。”陈工说。
3.3 配置示例——为不同PDU配置不同安全等级
王测投影了一个配置示例:
<!– 高安全等级:刹车指令PDU –>
<SecOCRxPduProcessing>
<ShortName>RxPdu_BrakeCmd</ShortName>
<SecOCDataId>0x2001</SecOCDataId>
<SecOCFreshnessValueLength>64</SecOCFreshnessValueLength>
<SecOCFreshnessValueTxLength>16</SecOCFreshnessValueTxLength> <!– 更长的FV截断,更大的重放窗口 –>
<SecOCAuthInfoTxLength>48</SecOCAuthInfoTxLength> <!– 更长的MAC,更高的抗伪造能力 –>
</SecOCRxPduProcessing>
<!– 基础安全等级:车窗控制PDU –>
<SecOCRxPduProcessing>
<ShortName>RxPdu_WindowCtrl</ShortName>
<SecOCDataId>0x3001</SecOCDataId>
<SecOCFreshnessValueLength>32</SecOCFreshnessValueLength>
<SecOCFreshnessValueTxLength>4</SecOCFreshnessValueTxLength> <!– 更短的FV截断,节省带宽 –>
<SecOCAuthInfoTxLength>24</SecOCAuthInfoTxLength> <!– 标准MAC长度 –>
</SecOCRxPduProcessing>
“你们看,刹车指令用了48位MAC和16位FV截断——安全等级更高。车窗控制用了24位MAC和4位FV截断——安全等级较低但节省带宽。”王测解释道,“这就是SRS_SecOC_00003所说的‘不同安全属性可配置’的实际体现。”
小赵看着配置示例:“所以安全专家的任务,就是根据每条PDU的‘安全需求分析’,选择合适的安全参数?”
陈工点头:“正是。这就是Use Case里说的——‘Security experts define the different security properties. For every message with security protection needs, the appropriate properties may be selected.’”
3.4 常见误区:参数配置的“逻辑锁”
小林补充了一个容易踩坑的点:“这些参数不是随便配的,它们之间有‘逻辑锁’约束。”
他在白板上写下三条规则:
规则1:SecOCFreshnessValueTxLength ≤ SecOCFreshnessValueLength
规则2:SecOCAuthInfoTxLength ≤ 算法支持的最大MAC长度
规则3:SecOCAuthInfoTxLength 必须 > 0(规范4.3.1版本已修正)
“规则1——截断FV长度不能超过完整FV长度,这是逻辑约束。规则2——MAC截断长度不能超过算法输出的完整MAC长度。规则3——MAC长度不能为0,否则等于没有认证。”小林逐条解释,“配置工具通常会在生成代码时进行静态检查,但如果你手写配置文件,务必自己对照规范校验。”
王测补充道:“我在测试中遇到过一种情况——开发人员把SecOCAuthInfoTxLength配成了0,以为‘不认证’就是‘不保护’。结果配置工具报了错,因为规范要求这个参数必须大于0。这个错误在开发阶段被发现是幸运的——如果到了集成阶段才发现,修改成本会高很多。”
第四章:SRS_SecOC_00002——配置验证重试范围
4.1 需求原文解读
小林翻到SRS文档第10页:
[SRS_SecOC_00002] Range of verification retry by the receiver
Type: Valid
Description: The range of verification retry with self-updated freshness
information shall be configurable.
Rationale: When the receiver is allowed to perform verification retry over
a given message with self-updated freshness information, it is
necessary to be able to configure the number of retries which are
acceptable to match with the desired robustness of the SecOC module.
Use Case: The security expert and the system designer configure the number
of verification retries that are acceptable from a security perspective.
Dependencies: [SRS_SecOC_00007]
Supporting Material: (SRS_BRF_02035, RS_BRF_02036, RS_BRF_02037, RS_BRF_02200)
“这条需求的Description里有一个关键词——‘self-updated freshness information’。”陈工圈出了这个词组,“这是理解这条需求的关键。”
小赵问:“‘自更新新鲜度信息’是什么意思?”
小林解释道:“接收端在验证一条报文时,会从报文中提取截断FV,然后结合本地维护的高位计数器,重建完整FV。但如果发送端和接收端的计数器暂时不同步——比如中间丢了几条报文——接收端第一次重建的FV可能不正确。这时,接收端可以‘猜测’下一个可能的FV值,重新尝试验证。这个‘猜测’和‘尝试’的过程,就是‘自更新新鲜度信息’。”
陈工在白板上画了一个流程图:
#mermaid-svg-1ob34A8ELmXYMot8{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1ob34A8ELmXYMot8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1ob34A8ELmXYMot8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1ob34A8ELmXYMot8 .error-icon{fill:#552222;}#mermaid-svg-1ob34A8ELmXYMot8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1ob34A8ELmXYMot8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1ob34A8ELmXYMot8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1ob34A8ELmXYMot8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1ob34A8ELmXYMot8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1ob34A8ELmXYMot8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1ob34A8ELmXYMot8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1ob34A8ELmXYMot8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1ob34A8ELmXYMot8 .marker.cross{stroke:#333333;}#mermaid-svg-1ob34A8ELmXYMot8 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1ob34A8ELmXYMot8 p{margin:0;}#mermaid-svg-1ob34A8ELmXYMot8 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-1ob34A8ELmXYMot8 .cluster-label text{fill:#333;}#mermaid-svg-1ob34A8ELmXYMot8 .cluster-label span{color:#333;}#mermaid-svg-1ob34A8ELmXYMot8 .cluster-label span p{background-color:transparent;}#mermaid-svg-1ob34A8ELmXYMot8 .label text,#mermaid-svg-1ob34A8ELmXYMot8 span{fill:#333;color:#333;}#mermaid-svg-1ob34A8ELmXYMot8 .node rect,#mermaid-svg-1ob34A8ELmXYMot8 .node circle,#mermaid-svg-1ob34A8ELmXYMot8 .node ellipse,#mermaid-svg-1ob34A8ELmXYMot8 .node polygon,#mermaid-svg-1ob34A8ELmXYMot8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1ob34A8ELmXYMot8 .rough-node .label text,#mermaid-svg-1ob34A8ELmXYMot8 .node .label text,#mermaid-svg-1ob34A8ELmXYMot8 .image-shape .label,#mermaid-svg-1ob34A8ELmXYMot8 .icon-shape .label{text-anchor:middle;}#mermaid-svg-1ob34A8ELmXYMot8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1ob34A8ELmXYMot8 .rough-node .label,#mermaid-svg-1ob34A8ELmXYMot8 .node .label,#mermaid-svg-1ob34A8ELmXYMot8 .image-shape .label,#mermaid-svg-1ob34A8ELmXYMot8 .icon-shape .label{text-align:center;}#mermaid-svg-1ob34A8ELmXYMot8 .node.clickable{cursor:pointer;}#mermaid-svg-1ob34A8ELmXYMot8 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1ob34A8ELmXYMot8 .arrowheadPath{fill:#333333;}#mermaid-svg-1ob34A8ELmXYMot8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1ob34A8ELmXYMot8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1ob34A8ELmXYMot8 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1ob34A8ELmXYMot8 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1ob34A8ELmXYMot8 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1ob34A8ELmXYMot8 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1ob34A8ELmXYMot8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1ob34A8ELmXYMot8 .cluster text{fill:#333;}#mermaid-svg-1ob34A8ELmXYMot8 .cluster span{color:#333;}#mermaid-svg-1ob34A8ELmXYMot8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1ob34A8ELmXYMot8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1ob34A8ELmXYMot8 rect.text{fill:none;stroke-width:0;}#mermaid-svg-1ob34A8ELmXYMot8 .icon-shape,#mermaid-svg-1ob34A8ELmXYMot8 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1ob34A8ELmXYMot8 .icon-shape p,#mermaid-svg-1ob34A8ELmXYMot8 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1ob34A8ELmXYMot8 .icon-shape .label rect,#mermaid-svg-1ob34A8ELmXYMot8 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1ob34A8ELmXYMot8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1ob34A8ELmXYMot8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1ob34A8ELmXYMot8 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
是
否
超过上限
收到Secured I-PDU
首次验证使用FV_N
MAC匹配?
✅ 验证通过
尝试FV_N+1(重试1)
MAC匹配?
尝试FV_N+2(重试2)
…继续直到重试上限
❌ 丢弃报文
“SRS_SecOC_00002要配置的,就是‘重试几次’这个数字。”陈工说,“重试太少——丢包导致的FV失步会被误判为攻击。重试太多——浪费CPU资源,而且给攻击者更多尝试机会。”
4.2 重试次数的“权衡三角”
王测在白板上画了一个三角形:
#mermaid-svg-aTjsr2z76oDTYCdu{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aTjsr2z76oDTYCdu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aTjsr2z76oDTYCdu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aTjsr2z76oDTYCdu .error-icon{fill:#552222;}#mermaid-svg-aTjsr2z76oDTYCdu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aTjsr2z76oDTYCdu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aTjsr2z76oDTYCdu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aTjsr2z76oDTYCdu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aTjsr2z76oDTYCdu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aTjsr2z76oDTYCdu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aTjsr2z76oDTYCdu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aTjsr2z76oDTYCdu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aTjsr2z76oDTYCdu .marker.cross{stroke:#333333;}#mermaid-svg-aTjsr2z76oDTYCdu svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aTjsr2z76oDTYCdu p{margin:0;}#mermaid-svg-aTjsr2z76oDTYCdu .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-aTjsr2z76oDTYCdu .cluster-label text{fill:#333;}#mermaid-svg-aTjsr2z76oDTYCdu .cluster-label span{color:#333;}#mermaid-svg-aTjsr2z76oDTYCdu .cluster-label span p{background-color:transparent;}#mermaid-svg-aTjsr2z76oDTYCdu .label text,#mermaid-svg-aTjsr2z76oDTYCdu span{fill:#333;color:#333;}#mermaid-svg-aTjsr2z76oDTYCdu .node rect,#mermaid-svg-aTjsr2z76oDTYCdu .node circle,#mermaid-svg-aTjsr2z76oDTYCdu .node ellipse,#mermaid-svg-aTjsr2z76oDTYCdu .node polygon,#mermaid-svg-aTjsr2z76oDTYCdu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aTjsr2z76oDTYCdu .rough-node .label text,#mermaid-svg-aTjsr2z76oDTYCdu .node .label text,#mermaid-svg-aTjsr2z76oDTYCdu .image-shape .label,#mermaid-svg-aTjsr2z76oDTYCdu .icon-shape .label{text-anchor:middle;}#mermaid-svg-aTjsr2z76oDTYCdu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aTjsr2z76oDTYCdu .rough-node .label,#mermaid-svg-aTjsr2z76oDTYCdu .node .label,#mermaid-svg-aTjsr2z76oDTYCdu .image-shape .label,#mermaid-svg-aTjsr2z76oDTYCdu .icon-shape .label{text-align:center;}#mermaid-svg-aTjsr2z76oDTYCdu .node.clickable{cursor:pointer;}#mermaid-svg-aTjsr2z76oDTYCdu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aTjsr2z76oDTYCdu .arrowheadPath{fill:#333333;}#mermaid-svg-aTjsr2z76oDTYCdu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aTjsr2z76oDTYCdu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aTjsr2z76oDTYCdu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aTjsr2z76oDTYCdu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aTjsr2z76oDTYCdu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aTjsr2z76oDTYCdu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aTjsr2z76oDTYCdu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aTjsr2z76oDTYCdu .cluster text{fill:#333;}#mermaid-svg-aTjsr2z76oDTYCdu .cluster span{color:#333;}#mermaid-svg-aTjsr2z76oDTYCdu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aTjsr2z76oDTYCdu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aTjsr2z76oDTYCdu rect.text{fill:none;stroke-width:0;}#mermaid-svg-aTjsr2z76oDTYCdu .icon-shape,#mermaid-svg-aTjsr2z76oDTYCdu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aTjsr2z76oDTYCdu .icon-shape p,#mermaid-svg-aTjsr2z76oDTYCdu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aTjsr2z76oDTYCdu .icon-shape .label rect,#mermaid-svg-aTjsr2z76oDTYCdu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aTjsr2z76oDTYCdu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aTjsr2z76oDTYCdu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aTjsr2z76oDTYCdu :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
重试次数的权衡
安全性(重试越多,攻击窗口越大)
鲁棒性(重试越多,抗丢包能力越强)
实时性(重试越多,处理延迟越大)
“安全性——重试次数越多,攻击者尝试伪造MAC的机会就越多。虽然每次尝试的成功概率极低(24位MAC的成功率是1/2^24),但从安全理论上说,重试次数应该受限制。鲁棒性——重试次数越多,接收端从丢包中恢复的能力越强。实时性——重试意味着多次MAC验证,每次都要调用HSM,延迟会累积。”
陈工补充道:“Use Case里说得很清楚——‘The security expert and the system designer configure the number of verification retries that are acceptable from a security perspective.’——这是安全专家和系统设计师共同决定的。不是开发人员随便填一个数字。”
4.3 配置示例——不同PDU的不同重试策略
小林投影了一个配置示例:
<!– 高安全等级PDU:重试次数少,防止暴力破解 –>
<SecOCRxPduProcessing>
<ShortName>RxPdu_BrakeCmd</ShortName>
<SecOCAuthenticationVerifyAttempts>3</SecOCAuthenticationVerifyAttempts>
</SecOCRxPduProcessing>
<!– 高鲁棒性PDU:重试次数多,容忍网络丢包 –>
<SecOCRxPduProcessing>
<ShortName>RxPdu_StatusInfo</ShortName>
<SecOCAuthenticationVerifyAttempts>10</SecOCAuthenticationVerifyAttempts>
</SecOCRxPduProcessing>
“刹车指令重试3次——因为安全等级高,不能给攻击者太多机会。状态信息重试10次——因为实时性要求相对低,但网络丢包可能导致FV失步,需要更大的容忍度。”小林解释道。
王测补充:“从测试角度来说,SecOCAuthenticationVerifyAttempts是我们在测试中必须覆盖的边界条件之一。我们会测试重试0次、重试1次、重试N次(N等于配置值)、重试N+1次——看看系统行为是否符合预期。”
4.4 与SRS_SecOC_00007的关系
陈工指出:“SRS_SecOC_00002的Dependencies里引用了SRS_SecOC_00007——‘Verification retry by the receiver’。这说明这两条需求是配套的。SRS_SecOC_00007定义了‘接收端应该提供重试机制’这个功能,SRS_SecOC_00002定义了‘重试范围应该可配置’这个参数。”
小赵问:“那SRS_SecOC_00007的具体内容是什么?”
陈工说:“那是我们在下一篇——SRS-SecOC-05——要讲的内容。今天先把配置相关的内容讲完。”
第五章:SRS_SecOC_00005——安全信息的初始化
5.1 需求原文解读
小林翻到SRS文档第11页:
[SRS_SecOC_00005] Initialisation of security information
Type: Valid
Description: The SecOC module's security configuration shall get
initialised at module start-up.
Rationale: The SecOC module needs security configuration information
(Key-IDs, Freshness Values) to perform its operations. Therefore,
this information shall get recovered and configured before it
starts its processing operation.
Use Case: The SecOC loads the ID of the PDUs, the authorized authentication
retry counter and the properties that are used for the processing
of its incoming communications from upper and lower layers.
Dependencies: [SRS_SecOC_00001], [SRS_SecOC_00002], [SRS_SecOC_00003]
Supporting Material: (RS_BRF_02035, RS_BRF_02036, RS_BRF_02037, RS_BRF_02200)
“这条需求的Dependencies里同时引用了前三条配置需求。”陈工说,“这说明初始化是配置的‘落地’环节——前面配置的那些参数,在初始化时被加载到SecOC模块内部。”
小赵问:“初始化具体做什么?”
小林在白板上画了一个流程图:
#mermaid-svg-3XP4cSEHGxhhCVmp{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3XP4cSEHGxhhCVmp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3XP4cSEHGxhhCVmp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3XP4cSEHGxhhCVmp .error-icon{fill:#552222;}#mermaid-svg-3XP4cSEHGxhhCVmp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3XP4cSEHGxhhCVmp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3XP4cSEHGxhhCVmp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3XP4cSEHGxhhCVmp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3XP4cSEHGxhhCVmp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3XP4cSEHGxhhCVmp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3XP4cSEHGxhhCVmp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3XP4cSEHGxhhCVmp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3XP4cSEHGxhhCVmp .marker.cross{stroke:#333333;}#mermaid-svg-3XP4cSEHGxhhCVmp svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3XP4cSEHGxhhCVmp p{margin:0;}#mermaid-svg-3XP4cSEHGxhhCVmp .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-3XP4cSEHGxhhCVmp .cluster-label text{fill:#333;}#mermaid-svg-3XP4cSEHGxhhCVmp .cluster-label span{color:#333;}#mermaid-svg-3XP4cSEHGxhhCVmp .cluster-label span p{background-color:transparent;}#mermaid-svg-3XP4cSEHGxhhCVmp .label text,#mermaid-svg-3XP4cSEHGxhhCVmp span{fill:#333;color:#333;}#mermaid-svg-3XP4cSEHGxhhCVmp .node rect,#mermaid-svg-3XP4cSEHGxhhCVmp .node circle,#mermaid-svg-3XP4cSEHGxhhCVmp .node ellipse,#mermaid-svg-3XP4cSEHGxhhCVmp .node polygon,#mermaid-svg-3XP4cSEHGxhhCVmp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3XP4cSEHGxhhCVmp .rough-node .label text,#mermaid-svg-3XP4cSEHGxhhCVmp .node .label text,#mermaid-svg-3XP4cSEHGxhhCVmp .image-shape .label,#mermaid-svg-3XP4cSEHGxhhCVmp .icon-shape .label{text-anchor:middle;}#mermaid-svg-3XP4cSEHGxhhCVmp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3XP4cSEHGxhhCVmp .rough-node .label,#mermaid-svg-3XP4cSEHGxhhCVmp .node .label,#mermaid-svg-3XP4cSEHGxhhCVmp .image-shape .label,#mermaid-svg-3XP4cSEHGxhhCVmp .icon-shape .label{text-align:center;}#mermaid-svg-3XP4cSEHGxhhCVmp .node.clickable{cursor:pointer;}#mermaid-svg-3XP4cSEHGxhhCVmp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3XP4cSEHGxhhCVmp .arrowheadPath{fill:#333333;}#mermaid-svg-3XP4cSEHGxhhCVmp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3XP4cSEHGxhhCVmp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3XP4cSEHGxhhCVmp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3XP4cSEHGxhhCVmp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3XP4cSEHGxhhCVmp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3XP4cSEHGxhhCVmp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3XP4cSEHGxhhCVmp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3XP4cSEHGxhhCVmp .cluster text{fill:#333;}#mermaid-svg-3XP4cSEHGxhhCVmp .cluster span{color:#333;}#mermaid-svg-3XP4cSEHGxhhCVmp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3XP4cSEHGxhhCVmp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3XP4cSEHGxhhCVmp rect.text{fill:none;stroke-width:0;}#mermaid-svg-3XP4cSEHGxhhCVmp .icon-shape,#mermaid-svg-3XP4cSEHGxhhCVmp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3XP4cSEHGxhhCVmp .icon-shape p,#mermaid-svg-3XP4cSEHGxhhCVmp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3XP4cSEHGxhhCVmp .icon-shape .label rect,#mermaid-svg-3XP4cSEHGxhhCVmp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3XP4cSEHGxhhCVmp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3XP4cSEHGxhhCVmp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3XP4cSEHGxhhCVmp :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
SecOC_Init 初始化流程
SecOC_Init(ConfigPtr)
加载配置数据(PDU ID列表、安全属性)
初始化内部缓冲区(发送/接收缓冲区)
从NVM恢复安全信息(新鲜度值、计数器)
设置模块状态为SECOC_INIT
初始化完成
“初始化做四件事。第一,加载配置数据——把配置工具生成的PDU配置、安全属性加载到SecOC内部。第二,初始化缓冲区——为发送和接收的I-PDU分配内存。第三,从NVM恢复安全信息——新鲜度计数器、密钥ID等需要持久化的数据从非易失内存中恢复。第四,设置模块状态——把状态从SECOC_UNINIT切换到SECOC_INIT。”
5.2 “从NVM恢复”——为什么这么重要?
陈工在“从NVM恢复”这个步骤上画了一个红圈:“这一步是整个初始化流程中最容易被忽视但最关键的环节。”
小赵问:“为什么?”
“因为新鲜度计数器必须是单调递增的。”陈工解释道,“如果ECU断电后计数器重置为0,攻击者就可以利用这一点进行‘回滚攻击’——在车辆重启后重放之前截获的旧报文。所以,计数器必须在关停前保存到NVM,在启动时从NVM恢复。”
小林补充道:“SRS_SecOC_00005的Rationale里说——‘this information shall get recovered and configured before it starts its processing operation’——安全信息必须在处理开始之前被恢复和配置。这是一个顺序约束——初始化没完成,SecOC就不能处理任何PDU。”
王测说:“从测试角度来说,初始化测试是一个独立的测试维度。我们会测试正常初始化、NVM数据损坏时的初始化、首次启动时的初始化、初始化未完成时调用API的行为——每一种场景都有对应的测试用例。”
5.3 初始化与配置的“依赖链”
陈工指出:“SRS_SecOC_00005依赖SRS_SecOC_00001、SRS_SecOC_00002、SRS_SecOC_00003——这不是偶然的。初始化是配置的‘执行者’ ——配置定义了‘要保护哪些PDU’、‘用什么安全属性’、‘重试几次’,初始化负责把这些配置加载到运行时。”
他在白板上画了一个依赖图:
#mermaid-svg-zKkXk0VNVzhrcEWT{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zKkXk0VNVzhrcEWT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zKkXk0VNVzhrcEWT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zKkXk0VNVzhrcEWT .error-icon{fill:#552222;}#mermaid-svg-zKkXk0VNVzhrcEWT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zKkXk0VNVzhrcEWT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zKkXk0VNVzhrcEWT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zKkXk0VNVzhrcEWT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zKkXk0VNVzhrcEWT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zKkXk0VNVzhrcEWT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zKkXk0VNVzhrcEWT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zKkXk0VNVzhrcEWT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zKkXk0VNVzhrcEWT .marker.cross{stroke:#333333;}#mermaid-svg-zKkXk0VNVzhrcEWT svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zKkXk0VNVzhrcEWT p{margin:0;}#mermaid-svg-zKkXk0VNVzhrcEWT .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-zKkXk0VNVzhrcEWT .cluster-label text{fill:#333;}#mermaid-svg-zKkXk0VNVzhrcEWT .cluster-label span{color:#333;}#mermaid-svg-zKkXk0VNVzhrcEWT .cluster-label span p{background-color:transparent;}#mermaid-svg-zKkXk0VNVzhrcEWT .label text,#mermaid-svg-zKkXk0VNVzhrcEWT span{fill:#333;color:#333;}#mermaid-svg-zKkXk0VNVzhrcEWT .node rect,#mermaid-svg-zKkXk0VNVzhrcEWT .node circle,#mermaid-svg-zKkXk0VNVzhrcEWT .node ellipse,#mermaid-svg-zKkXk0VNVzhrcEWT .node polygon,#mermaid-svg-zKkXk0VNVzhrcEWT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zKkXk0VNVzhrcEWT .rough-node .label text,#mermaid-svg-zKkXk0VNVzhrcEWT .node .label text,#mermaid-svg-zKkXk0VNVzhrcEWT .image-shape .label,#mermaid-svg-zKkXk0VNVzhrcEWT .icon-shape .label{text-anchor:middle;}#mermaid-svg-zKkXk0VNVzhrcEWT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zKkXk0VNVzhrcEWT .rough-node .label,#mermaid-svg-zKkXk0VNVzhrcEWT .node .label,#mermaid-svg-zKkXk0VNVzhrcEWT .image-shape .label,#mermaid-svg-zKkXk0VNVzhrcEWT .icon-shape .label{text-align:center;}#mermaid-svg-zKkXk0VNVzhrcEWT .node.clickable{cursor:pointer;}#mermaid-svg-zKkXk0VNVzhrcEWT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zKkXk0VNVzhrcEWT .arrowheadPath{fill:#333333;}#mermaid-svg-zKkXk0VNVzhrcEWT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zKkXk0VNVzhrcEWT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zKkXk0VNVzhrcEWT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zKkXk0VNVzhrcEWT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zKkXk0VNVzhrcEWT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zKkXk0VNVzhrcEWT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zKkXk0VNVzhrcEWT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zKkXk0VNVzhrcEWT .cluster text{fill:#333;}#mermaid-svg-zKkXk0VNVzhrcEWT .cluster span{color:#333;}#mermaid-svg-zKkXk0VNVzhrcEWT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zKkXk0VNVzhrcEWT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zKkXk0VNVzhrcEWT rect.text{fill:none;stroke-width:0;}#mermaid-svg-zKkXk0VNVzhrcEWT .icon-shape,#mermaid-svg-zKkXk0VNVzhrcEWT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zKkXk0VNVzhrcEWT .icon-shape p,#mermaid-svg-zKkXk0VNVzhrcEWT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zKkXk0VNVzhrcEWT .icon-shape .label rect,#mermaid-svg-zKkXk0VNVzhrcEWT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zKkXk0VNVzhrcEWT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zKkXk0VNVzhrcEWT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zKkXk0VNVzhrcEWT :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
SRS_SecOC_00001选择PDU
SRS_SecOC_00005初始化
SRS_SecOC_00002重试范围
SRS_SecOC_00003安全属性
SecOC_MainFunctionTx发送处理
SecOC_MainFunctionRx接收处理
“配置是‘静态’的——它定义了规则。初始化是‘动态’的——它把规则加载到运行时。只有初始化完成后,SecOC才能开始执行发送和接收处理。”
5.4 初始化状态机
小林补充了一个细节:“SecOC有一个明确的状态机——SECOC_UNINIT和SECOC_INIT。在SECOC_UNINIT状态下,除了SecOC_Init和SecOC_GetVersionInfo之外,调用任何API都会返回SECOC_E_UNINIT错误。”
#mermaid-svg-BQiHBf3BTy9pdT66{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BQiHBf3BTy9pdT66 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BQiHBf3BTy9pdT66 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BQiHBf3BTy9pdT66 .error-icon{fill:#552222;}#mermaid-svg-BQiHBf3BTy9pdT66 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BQiHBf3BTy9pdT66 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BQiHBf3BTy9pdT66 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BQiHBf3BTy9pdT66 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BQiHBf3BTy9pdT66 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BQiHBf3BTy9pdT66 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BQiHBf3BTy9pdT66 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BQiHBf3BTy9pdT66 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BQiHBf3BTy9pdT66 .marker.cross{stroke:#333333;}#mermaid-svg-BQiHBf3BTy9pdT66 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BQiHBf3BTy9pdT66 p{margin:0;}#mermaid-svg-BQiHBf3BTy9pdT66 defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-BQiHBf3BTy9pdT66 g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-BQiHBf3BTy9pdT66 g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-BQiHBf3BTy9pdT66 g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-BQiHBf3BTy9pdT66 g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-BQiHBf3BTy9pdT66 g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-BQiHBf3BTy9pdT66 .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-BQiHBf3BTy9pdT66 .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-BQiHBf3BTy9pdT66 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-BQiHBf3BTy9pdT66 .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-BQiHBf3BTy9pdT66 .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-BQiHBf3BTy9pdT66 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-BQiHBf3BTy9pdT66 .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-BQiHBf3BTy9pdT66 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BQiHBf3BTy9pdT66 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BQiHBf3BTy9pdT66 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BQiHBf3BTy9pdT66 .edgeLabel .label text{fill:#333;}#mermaid-svg-BQiHBf3BTy9pdT66 .label div .edgeLabel{color:#333;}#mermaid-svg-BQiHBf3BTy9pdT66 .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-BQiHBf3BTy9pdT66 .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-BQiHBf3BTy9pdT66 .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-BQiHBf3BTy9pdT66 .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-BQiHBf3BTy9pdT66 .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-BQiHBf3BTy9pdT66 .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BQiHBf3BTy9pdT66 .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BQiHBf3BTy9pdT66 #statediagram-barbEnd{fill:#333333;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BQiHBf3BTy9pdT66 .cluster-label,#mermaid-svg-BQiHBf3BTy9pdT66 .nodeLabel{color:#131300;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-BQiHBf3BTy9pdT66 .note-edge{stroke-dasharray:5;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-note text{fill:black;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram-note .nodeLabel{color:black;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagram .edgeLabel{color:red;}#mermaid-svg-BQiHBf3BTy9pdT66 #dependencyStart,#mermaid-svg-BQiHBf3BTy9pdT66 #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-BQiHBf3BTy9pdT66 .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BQiHBf3BTy9pdT66 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
上电
SecOC_Init()
SecOC_DeInit()
调用API返回E_UNINIT
正常处理PDU
SECOC_UNINIT
SECOC_INIT
王测说:“这个状态机是我们在测试中必须验证的。我们会测试‘未初始化时调用API’的场景——确保返回的是SECOC_E_UNINIT而不是崩溃。这是AUTOSAR模块开发的基本要求。”
第六章:配置与初始化的“工程落地”
6.1 配置参数的“生命周期”
陈工在白板上画了一个从配置到运行的流程:
#mermaid-svg-onJbh4CBHENoJQ2e{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-onJbh4CBHENoJQ2e .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-onJbh4CBHENoJQ2e .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-onJbh4CBHENoJQ2e .error-icon{fill:#552222;}#mermaid-svg-onJbh4CBHENoJQ2e .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-onJbh4CBHENoJQ2e .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-onJbh4CBHENoJQ2e .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-onJbh4CBHENoJQ2e .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-onJbh4CBHENoJQ2e .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-onJbh4CBHENoJQ2e .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-onJbh4CBHENoJQ2e .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-onJbh4CBHENoJQ2e .marker{fill:#333333;stroke:#333333;}#mermaid-svg-onJbh4CBHENoJQ2e .marker.cross{stroke:#333333;}#mermaid-svg-onJbh4CBHENoJQ2e svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-onJbh4CBHENoJQ2e p{margin:0;}#mermaid-svg-onJbh4CBHENoJQ2e .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-onJbh4CBHENoJQ2e .cluster-label text{fill:#333;}#mermaid-svg-onJbh4CBHENoJQ2e .cluster-label span{color:#333;}#mermaid-svg-onJbh4CBHENoJQ2e .cluster-label span p{background-color:transparent;}#mermaid-svg-onJbh4CBHENoJQ2e .label text,#mermaid-svg-onJbh4CBHENoJQ2e span{fill:#333;color:#333;}#mermaid-svg-onJbh4CBHENoJQ2e .node rect,#mermaid-svg-onJbh4CBHENoJQ2e .node circle,#mermaid-svg-onJbh4CBHENoJQ2e .node ellipse,#mermaid-svg-onJbh4CBHENoJQ2e .node polygon,#mermaid-svg-onJbh4CBHENoJQ2e .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-onJbh4CBHENoJQ2e .rough-node .label text,#mermaid-svg-onJbh4CBHENoJQ2e .node .label text,#mermaid-svg-onJbh4CBHENoJQ2e .image-shape .label,#mermaid-svg-onJbh4CBHENoJQ2e .icon-shape .label{text-anchor:middle;}#mermaid-svg-onJbh4CBHENoJQ2e .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-onJbh4CBHENoJQ2e .rough-node .label,#mermaid-svg-onJbh4CBHENoJQ2e .node .label,#mermaid-svg-onJbh4CBHENoJQ2e .image-shape .label,#mermaid-svg-onJbh4CBHENoJQ2e .icon-shape .label{text-align:center;}#mermaid-svg-onJbh4CBHENoJQ2e .node.clickable{cursor:pointer;}#mermaid-svg-onJbh4CBHENoJQ2e .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-onJbh4CBHENoJQ2e .arrowheadPath{fill:#333333;}#mermaid-svg-onJbh4CBHENoJQ2e .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-onJbh4CBHENoJQ2e .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-onJbh4CBHENoJQ2e .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-onJbh4CBHENoJQ2e .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-onJbh4CBHENoJQ2e .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-onJbh4CBHENoJQ2e .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-onJbh4CBHENoJQ2e .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-onJbh4CBHENoJQ2e .cluster text{fill:#333;}#mermaid-svg-onJbh4CBHENoJQ2e .cluster span{color:#333;}#mermaid-svg-onJbh4CBHENoJQ2e div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-onJbh4CBHENoJQ2e .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-onJbh4CBHENoJQ2e rect.text{fill:none;stroke-width:0;}#mermaid-svg-onJbh4CBHENoJQ2e .icon-shape,#mermaid-svg-onJbh4CBHENoJQ2e .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-onJbh4CBHENoJQ2e .icon-shape p,#mermaid-svg-onJbh4CBHENoJQ2e .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-onJbh4CBHENoJQ2e .icon-shape .label rect,#mermaid-svg-onJbh4CBHENoJQ2e .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-onJbh4CBHENoJQ2e .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-onJbh4CBHENoJQ2e .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-onJbh4CBHENoJQ2e :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
运行时阶段
配置阶段
设计阶段
安全专家定义安全属性
系统设计师定义PDU保护范围
配置工具生成ARXML
代码生成器生成SecOC_Cfg.h
SecOC_Init加载配置
SecOC_MainFunction执行处理
“配置参数的生命周期从‘安全专家的设计决策’开始,经过配置工具生成ARXML,再通过代码生成器变成C语言常量,最后在运行时被SecOC_Init加载。”陈工解释道,“每一环都有明确的角色和交付物。 ”
6.2 配置错误的“三种类型”
小林补充了一个实用清单:“在实际项目中,配置错误主要分三类。”
| 语法错误 | 参数值超出范围(如FV长度设为100) | 配置工具报错,代码生成失败 | 配置阶段 |
| 逻辑错误 | SecOCFreshnessValueTxLength > SecOCFreshnessValueLength | 静态检查报错 | 代码生成阶段 |
| 语义错误 | 发送端和接收端的DataId配置不一致 | MAC验证失败,通信中断 | 集成测试阶段 |
“语法错误最容易发现——配置工具会直接报错。逻辑错误也比较容易发现——代码生成器的静态检查会捕获。语义错误最危险——它不会在编译或链接时报错,只有在集成测试或实车测试时才会暴露。”小林说。
王测补充:“语义错误是我们测试的重点。我们会专门检查发送端和接收端的配置是否对称——DataId是否一致、FreshnessValueId是否匹配、算法配置是否相同。这些检查我们会做成自动化脚本,每次配置变更时自动运行。”
6.3 一个真实的“配置惨案”
王测讲了一个他经历过的案例:“有个项目,配置工程师在配置接收端时,把SecOCFreshnessValueLength从64改成了32。他以为这只是节省内存,没想到这个参数决定了MAC计算时使用的FV长度。”
“然后呢?”小赵问。
“然后发送端用64位FV算MAC,接收端用32位FV算MAC——两边算出来的MAC完全不同。所有安全报文都被丢弃了。但因为没有触发任何DET错误,排查花了整整一周才定位到这个参数。”
陈工总结道:“这就是为什么SRS_SecOC_00005强调‘初始化’——配置参数的加载和生效是一个严肃的过程。配置不是‘填数字’,而是‘定义契约’。 每一个数字背后,都是发送端和接收端之间的约定。”
第七章:知识要点回顾与下期预告
7.1 本期知识要点
陈工在白板上写下今天的知识要点:
┌─────────────────────────────────────────────────────────┐
│ SRS-SecOC-04 知识要点 │
├─────────────────────────────────────────────────────────┤
│ 1. 配置需求的三层结构:范围层→内容层→行为层 │
│ 2. SRS_SecOC_00001:选择哪些PDU需要保护(SHALL) │
│ 3. SRS_SecOC_00003:配置不同的安全属性(SHALL) │
│ 4. SRS_SecOC_00002:配置验证重试范围(SHALL) │
│ 5. SRS_SecOC_00005:安全信息的初始化(SHALL) │
│ 6. 配置参数的“逻辑锁”约束与配置变体 │
│ 7. 配置错误的三种类型:语法/逻辑/语义 │
│ 8. 初始化状态机:SECOC_UNINIT → SECOC_INIT │
└─────────────────────────────────────────────────────────┘
7.2 小赵的笔记
小赵合上笔记本,在扉页上写下了今天的最大收获:
“配置不是‘填表格’,而是‘定义契约’。每一个配置参数,都是发送端和接收端之间的一个约定。配置错了,契约就破了,安全就没了。”
7.3 下次预告
陈工看了一眼时间:“今天就到这里。下一篇是SRS-SecOC-05:SecOC功能需求拆解(下)——运行、异常与关停。”
小林收拾电脑:“下一篇要讲的就是那些‘硬核’内容了——创建Secured I-PDU、验证接收报文、验证重试、通信安全、网关、端到端保护、PDU安全信息覆盖、关停持久化、发送/接收失败处理……”
王测接话:“对,那才是我们测试的主战场。尤其是验证重试和失败处理——这两个是安全测试的重中之重。”
陈工拿起保温杯:“下周一见。”
四人走出会议室时,走廊里已经亮起了灯。白板上那三层配置需求的图还留在那里——从“范围层”到“内容层”再到“行为层”,像一座三层小楼,稳稳地立在白板中央。
附录:本期核心配置参数速查
| SecOCEnabled | SRS_SecOC_00001 | 是否保护该PDU | true/false |
| SecOCDataId | SRS_SecOC_00003 | 数据标识符(参与MAC计算) | 0x1001 |
| SecOCFreshnessValueLength | SRS_SecOC_00003 | 完整FV长度(位) | 64 |
| SecOCFreshnessValueTxLength | SRS_SecOC_00003 | 截断FV长度(位) | 8 |
| SecOCAuthInfoTxLength | SRS_SecOC_00003 | 截断MAC长度(位) | 24 |
| SecOCAuthenticationVerifyAttempts | SRS_SecOC_00002 | 最大验证重试次数 | 3~10 |
| SecOCAuthenticationBuildAttempts | SRS_SecOC_00002 | 最大认证构建尝试次数 | 2~5 |
| SecOCMainFunctionPeriodTx | SRS_SecOC_00005 | 发送主函数周期(秒) | 0.001~0.01 |
| SecOCMainFunctionPeriodRx | SRS_SecOC_00005 | 接收主函数周期(秒) | 0.001~0.01 |
网硕互联帮助中心
![[计算机科学]计算机科学03:安全、隐私与可靠性-网硕互联帮助中心](https://www.wsisp.com/helps/wp-content/uploads/2026/09/20260911103303-6aa3d8df96ea1-220x150.png)


评论前必须登录!
注册