867 lines
41 KiB
Markdown
867 lines
41 KiB
Markdown
# 密钥管理器规范 (Specification of Key Manager)
|
||
|
||
**AUTOSAR CP Release 4.4.0**
|
||
|
||
> 翻译说明:本文档为 AUTOSAR 经典平台 (CP) Release 4.4.0 中 SWS 文档 907《Specification of Key Manager》的中文翻译版本。原始英文文档中的 AUTOSAR 方框符 `⌈⌋`、API 标识符(如 `KeyM_Init`、`KeyM_Update`)、模块缩写(Crypto、CryIf、Csm、KeyM 等)、加密算法名(AES、SHA、RSA、ECC、X.509 等)以及需求 ID(如 `SWS_KeyM_xxxxx`)均予以保留。本文采用"重点翻译 + 摘要"策略:完整翻译封面、标识、变更历史、目录、关键 API 及核心概念;重复的需求条目和服务接口详细定义予以摘要处理。
|
||
|
||
## 文档标识
|
||
|
||
| 项目 | 内容 |
|
||
|---|---|
|
||
| 文档标题 (Document Title) | Specification of Key Manager(密钥管理器规范) |
|
||
| 文档所有者 (Document Owner) | AUTOSAR |
|
||
| 文档责任方 (Document Responsibility) | AUTOSAR |
|
||
| 文档标识号 (Document Identification No) | 907 |
|
||
| 文档状态 (Document Status) | Final |
|
||
| 所属 AUTOSAR 标准 | Classic Platform |
|
||
| 所属标准版本 (Part of Standard Release) | 4.4.0 |
|
||
|
||
## 文档变更历史 (Document Change History)
|
||
|
||
| 日期 | 版本 | 变更者 | 变更描述 |
|
||
|---|---|---|---|
|
||
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 初始发布 |
|
||
|
||
---
|
||
|
||
## 目录 (Table of Contents)
|
||
|
||
- [1 引言与功能概述](#1-引言与功能概述)
|
||
- [2 缩略语和缩写](#2-缩略语和缩写)
|
||
- [3 相关文档](#3-相关文档)
|
||
- [4 约束和假设](#4-约束和假设)
|
||
- [5 对其他模块的依赖](#5-对其他模块的依赖)
|
||
- [6 需求可追溯性](#6-需求可追溯性)
|
||
- [7 功能规范](#7-功能规范)
|
||
- [7.1 加密密钥子模块](#71-加密密钥子模块)
|
||
- [7.2 证书子模块](#72-证书子模块)
|
||
- [7.3 错误分类](#73-错误分类)
|
||
- [8 API 规范](#8-api-规范)
|
||
- [9 序列图](#9-序列图)
|
||
- [10 配置规范](#10-配置规范)
|
||
- [11 不适用的需求](#11-不适用的需求)
|
||
|
||
---
|
||
|
||
## 1 引言与功能概述
|
||
|
||
AUTOSAR KeyM 模块由两个子模块组成:加密密钥子模块 (crypto key submodule) 和证书子模块 (certificate submodule)。
|
||
|
||
加密密钥子模块提供 API 和配置项,用于引入或更新预定义的加密密钥材料。它充当密钥客户端 (key client),用于解释来自密钥服务器 (key server) 提供的数据并创建相应的密钥材料。这些密钥提供给加密服务管理器。在成功安装密钥材料后,应用程序能够使用加密操作。这允许 OEM 在生产或维护阶段将密钥材料独立于应用程序引入到 ECU。
|
||
|
||
证书子模块提供用于操作证书的 API 和配置。它允许定义证书槽并以 PKI 中使用的方式按层次结构关联它们。证书可以永久存储,例如根证书或中间证书,以便可以使用它们针对证书链验证给定证书。此外,证书子模块允许访问证书元素或验证其内容。
|
||
|
||
### 1.1 重要说明
|
||
|
||
本规范为车辆密钥和证书管理系统提供了 API 骨架。并非所有功能都已完全指定。这可能允许一些解释和实现细节的自由度。尽管接口已以通用和灵活的方式设计,但它们仍可能在未来的 AUTOSAR 版本中发生变化。
|
||
|
||
---
|
||
|
||
## 2 缩略语和缩写
|
||
|
||
| 缩写 | 描述 |
|
||
|---|---|
|
||
| KeyM | 密钥管理器 (Key Manager) |
|
||
| PKI | 公钥基础设施 (Public Key Infrastructure) |
|
||
| CSR | 证书签名请求 (Certificate Signing Request) |
|
||
| CSM | 加密服务管理器 (Crypto Service Manager) |
|
||
| CRL | 证书吊销列表 (Certificate Revocation List) |
|
||
| CA | 证书颁发机构 (Certificate Authority) |
|
||
| OID | 对象标识符 (Object Identifier)。一个字节数组,用于标识证书元素或证书元素的组或列表。 |
|
||
|
||
---
|
||
|
||
## 3 相关文档
|
||
|
||
### 3.1 输入文档
|
||
|
||
- [1] AUTOSAR Layered Software Architecture — `AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf`
|
||
- [2] AUTOSAR General Requirements on Basic Software Modules — `AUTOSAR_SRS_BSWGeneral.pdf`
|
||
- [3] AUTOSAR General Specification for Basic Software Modules — `AUTOSAR_SWS_BSWGeneral.pdf`
|
||
- [4] AUTOSAR Specification of Crypto Service Manager — `AUTOSAR_SWS_CryptoServiceManager.pdf`
|
||
- [5] AUTOSAR Requirements on Crypto Stack — `AUTOSAR_SRS_CryptoStack.pdf`
|
||
|
||
### 3.2 相关标准和规范
|
||
|
||
- [6] IEC 7498-1 The Basic Model, IEC Norm, 1994
|
||
- [7] IETF 5280 Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
|
||
- [8] SHE – Secure Hardware Extension, Functional Specification, V1.1
|
||
|
||
### 3.3 相关规范
|
||
|
||
AUTOSAR 提供了基础软件通用规范 (SWS BSW General) [3],该规范同样适用于密钥管理模块。因此,SWS BSW General [3] 应被视为密钥和证书管理模块的附加且必需的规范。
|
||
|
||
---
|
||
|
||
## 4 约束和假设
|
||
|
||
### 4.1 限制
|
||
|
||
密钥管理模块应与加密服务管理器及其底层模块一起使用。
|
||
|
||
当前仅支持每个 CsmKey 一个 KeyElement (ID = 1)。
|
||
|
||
### 4.2 对汽车域的适用性
|
||
|
||
本规范对特定汽车域没有限制。
|
||
|
||
---
|
||
|
||
## 5 对其他模块的依赖
|
||
|
||
本章列出了 AUTOSAR KeyM 模块所使用的与其他模块的关系。
|
||
|
||
### 5.1 对加密服务管理器的依赖
|
||
|
||
KeyM 模块依赖于 Csm 模块提供的加密算法和功能。KeyM 模块需要 API 函数来检索和设置密钥元素以及验证证书的签名,即:
|
||
|
||
- 密钥设置接口 (Key Setting Interface)
|
||
- 密钥提取接口 (Key Extraction Interface)
|
||
- 密钥复制接口 (Key Copying Interface)
|
||
- 密钥生成接口 (Key Generation Interface)
|
||
- 密钥派生接口 (Key Derivation Interface)
|
||
- 密钥交换接口 (Key Exchange Interface)
|
||
- 证书接口 (Certificate Interface)
|
||
- 签名接口 (Signature Interface)
|
||
|
||
### 5.2 对非易失性存储器的依赖
|
||
|
||
KeyM 可以配置为在非易失性存储器中存储密钥材料。这需要到 NVM 的接口。
|
||
|
||
### 5.3 对同步时间基的依赖
|
||
|
||
证书验证期的时间由 STBM 提供。
|
||
|
||
---
|
||
|
||
## 6 需求可追溯性
|
||
|
||
> 完整可追溯性表(涵盖 SRS_BSW_00101、SRS_BSW_00358、SRS_BSW_00407、SRS_BSW_00414、SRS_CryptoStack_00090、SRS_CryptoStack_00091、SRS_CryptoStack_xxx06、SWS_BSW_00050、SWS_BSW_00216 等到 SWS_KeyM_xxx 的映射)请参阅原始 PDF 文档第 10 页。
|
||
|
||
---
|
||
|
||
## 7 功能规范
|
||
|
||
> **图 7-1:带有 KEYM 的 AUTOSAR 分层视图**
|
||
|
||
密钥管理模块大致可以分为两部分:加密密钥子模块和证书子模块。加密密钥子模块主要用于与发起生成或直接提供密钥材料的密钥配置实体(密钥主机,key master)进行交互。这些密钥分配给 CSM 的加密密钥,并存储在专用 NVM 块中,也可以作为相应加密驱动的密钥存储。证书子模块允许按层次结构配置证书链中的证书,提供存储和验证它们的接口。证书中包含的公钥可以进一步分配给 CsmKey,以便与配置的 CSM 加密作业一起使用。
|
||
|
||
**[SWS_KeyM_00001]** ⌈ 如果 `KeyMCryptoKeyManagerEnabled` 设置为 FALSE,则密钥管理器的加密密钥子模块应完全禁用。在这种情况下,不应提供任何函数,并且不应分配不需要用于其他操作的资源。⌋ (SRS_CryptoStack_xxx06)
|
||
|
||
**[SWS_KeyM_00002]** ⌈ 如果 `KeyMCertificateManagerEnabled` 设置为 FALSE,则密钥管理器中对证书子模块的支持应完全禁用。在这种情况下,不应提供任何函数,并且不应分配与证书操作关联的资源。⌋ (SRS_CryptoStack_xxx06)
|
||
|
||
### 7.1 加密密钥子模块
|
||
|
||
加密密钥子模块用于初始化、更新和维护 ECU 的加密密钥材料。一个用例是为安全车载通信提供需要分发到所涉及的 ECU 的密钥。这些密钥应提供给 CSM 密钥,这些 CSM 密钥分配给用于安全 I-PDU 身份验证的加密作业。因此,从建模的角度来看,将密钥主机提供的密钥分配给 CSM 密钥以及用于相应安全 I-PDU 的作业至关重要。这是车辆中的整体任务,并以相同方式影响多个 ECU。加密密钥子模块的一个目的是支持此操作。
|
||
|
||
密钥主机可以直接位于车辆中以协调内部密钥生成,例如作为特定的 ECU。也可以使用云中的后端系统,以安全方式生成密钥材料并将必要的数据提供给 ECU。通常,诊断命令直接或间接地用于密钥主机与加密密钥子模块之间的通信。
|
||
|
||
#### 7.1.1 通用行为
|
||
|
||
**[SWS_KeyM_00003]** ⌈ 加密密钥子模块可以配置为以类似会话的方式执行加密密钥操作。通过这种方式,仅在打开的会话期间接受 `KeyM_Prepare()` 或 `KeyM_Update()` 等密钥操作。⌋()
|
||
|
||
**[SWS_KeyM_00004]** ⌈ 通过调用 `KeyM_Start()` 启动会话。此后可以执行密钥操作,直到通过调用 `KeyM_Finalize()` 关闭会话。⌋()
|
||
|
||
**[SWS_KeyM_00005]** ⌈ 默认情况下,`KeyM_Start()` 函数不会考虑任何输入数据或长度信息,也不会提供任何输出数据,也不会更改输出数据长度。⌋()
|
||
|
||
**[SWS_KeyM_00006]** ⌈ (可选)如果配置选项 `KeyMCryptoKeyHandlerStartFinalizeEnabled` 设置为 TRUE,则可以调用密钥处理器。`KeyM_Start()` 函数将依次调用 `KeyM_KH_Start()` 函数,参数与 `KeyM_Start()` 相同。`KeyM_KH_Start()` 的返回值将用作 `KeyM_Start()` 的返回值。⌋()
|
||
|
||
**原理**:`KeyM_KH_Start()` 函数可以执行 OEM 特定的检查,例如验证任何输入数据的签名以证明密钥管理操作的真实性。
|
||
|
||
**注意**:`KeyMCryptoKeyHandlerStartFinalizeEnabled` 的定义仅在 `KeyMCryptoKeyStartFinalizeFunctionEnabled` 设置为 TRUE 时才有效。
|
||
|
||
**[SWS_KeyM_00007]** ⌈ 如果配置选项 `KeyMCryptoKeyStartFinalizeFunctionEnabled` 设置为 FALSE,则密钥管理模块不提供 `KeyM_Start()` 和 `KeyM_Finalize()` 函数。然后可以随时执行密钥更新操作。⌋()
|
||
|
||
**[SWS_KeyM_00008]** ⌈ 通过调用 `KeyM_Finalize()` 关闭会话。在调用期间,将在会话内更新的所有密钥通过调用 `Csm_KeySetValid()` 设置为有效。在函数完成其操作后,将不再接受进一步的密钥更新操作。⌋()
|
||
|
||
**[SWS_KeyM_00009]** ⌈ 如果所有密钥都已成功验证,则函数 `KeyM_Finalize()` 将返回 `E_OK`。如果至少一个密钥无法成功验证,则函数应返回 `E_NOT_OK`。尽管如此,所有已更新的密钥都应被验证,并且如果一个密钥验证失败,操作不应中止。⌋()
|
||
|
||
**[SWS_KeyM_00010]** ⌈ 如果配置选项 `KeyMCryptoKeyPrepareFunctionEnabled` 设置为 TRUE,则提供函数 `KeyM_Prepare()`。此函数当前没有功能行为。如果配置选项设置为 FALSE,则不提供功能接口。⌋()
|
||
|
||
**[SWS_KeyM_00011]** ⌈ 如果配置选项 `KeyMCryptoKeyHandlerPrepareEnabled` 设置为 TRUE,则对 `KeyM_Prepare()` 的调用将依次传递给 `KeyM_KH_Prepare()`,参数和返回值将相应传递。⌋()
|
||
|
||
**原理**:目的是在启动密钥更新会话后立即调用一次 `KeyM_Prepare()`。调用的诊断服务可以向密钥处理器提供执行以下密钥更新操作所需的特定数据。例如,它可以用于提取密钥主机所需的加密驱动特定信息,该信息从 (SHE-) 硬件提取并再次在输出缓冲区中提供。或者它可以启动一个 OEM 特定的密钥协商过程,其结果稍后对密钥更新过程是必需的。另一种可能性是密钥主机在准备期间提供(加密的)公共密钥。特定的密钥处理器能够(解密并)将密钥存储在 CSM 中。这将产生一个分配给 CSM 密钥的公共密钥,可进一步用于从中派生其他密钥。
|
||
|
||
**[SWS_KeyM_00012]** ⌈ 密钥更新通过调用 `KeyM_Update()` 触发,通常由诊断服务启动。⌋()
|
||
|
||
**[SWS_KeyM_00013]** ⌈ 如果调用 `KeyM_Update()` 并且 `KeyMCryptoKeyHandlerUpdateEnabled` 设置为 FALSE 且 `keyNameLength` 大于 0,则加密密钥子模块将搜索 `KeyMCryptoKey/KeyMCryptoKeyName` 中配置的密钥名称。如果未找到密钥名称,则函数将返回 `E_NOT_OK`。如果找到,则函数将触发密钥更新操作。⌋()
|
||
|
||
**[SWS_KeyM_00014]** ⌈ 如果调用 `KeyM_Update()` 并且 `KeyMCryptoKeyHandlerUpdateEnabled` 设置为 FALSE 且 `keyNameLength` 为 0,则加密密钥子模块将输入数据解释为 SHE 密钥的 M1M2M3 值。通过提取输入数据的 bit 121..124 从 M1 中提取 key_ID,并将在 `KeyMCryptoKeyCryptoProps` 中搜索相应的值以识别 `KeyMCryptoKeyId` 和关联的 `CsmKeyRef`。如果找到,则函数将触发密钥更新操作。⌋()
|
||
|
||
**注意**:在这种情况下,CsmKey 应配置为 SHE 密钥。格式应为 SHE 算法类型,`KeyMCryptoKeyGenerationType` 应设置为 `KEYM_STORED_KEY`。
|
||
|
||
**[SWS_KeyM_00015]** ⌈ 当调用 `KeyM_Update()` 并且通过内部搜索算法或通过提供密钥处理器 `KeyM_KH_Update()` 找到 `KeyMCryptoKeyId` 时,应按照 `KeyMCryptoKeyGenerationType` 中的配置执行密钥生成。如果未找到关联的密钥,则 `KeyM_Update()` 函数应返回 `E_NOT_OK`。⌋()
|
||
|
||
**[SWS_KeyM_00016]** ⌈ 如果识别到密钥 ID 且 `KeyMCryptoKeyGenerationType` 配置为 `KEYM_STORED_KEY`,则将使用对 `KeyMCryptoKeyCsmKeyTargetRef` 的引用和密钥元素 ID '1' 调用函数 `Csm_KeyElementSet()`。将为该密钥设置内部标记,表示内容已更改并且需要最终化。⌋()
|
||
|
||
**[SWS_KeyM_00017]** ⌈ 如果识别到密钥 ID 且 `KeyMCryptoKeyGenerationType` 配置为 `KEYM_DERIVE_KEY`,则将调用函数 `Csm_KeyDerive()` 以从公共密钥(由 `KeyMCryptoKeyCsmKeySourceDeriveRef` 引用)派生新密钥(由 `KeyMCryptoKeyCsmKeyTargetRef` 引用)。将为该密钥设置内部标记,表示内容已更改并且需要最终化。⌋()
|
||
|
||
**[SWS_KeyM_00018]** ⌈ 如果 `KeyMCryptoKeyStartFinalizeFunctionEnabled` 设置为 FALSE,则应在成功的密钥派生或存储操作之后立即调用函数 `Csm_KeySetValid()`。⌋()
|
||
|
||
密钥更新操作有几种选项:
|
||
|
||
一种明显的选项是多次调用 `KeyM_Update()` 函数,即每个要更新的密钥调用一次。密钥主机将从外部触发函数调用,并在每次服务调用中提供密钥材料。另一种可能性是使用单个调用(例如 `KeyM_Prepare()`)提供容器,该容器反过来调用 `KeyM_KH_Prepare()`。这允许以 OEM 特定格式提供容器。密钥处理器将扫描容器并必须为容器中可用的每个密钥多次调用 `KeyM_Update()`。
|
||
|
||
**[SWS_KeyM_00019]** ⌈ 如果配置项 `KeyMCryptoKeyStartFinalizeFunctionEnabled` 设置为 TRUE,则必须通过调用 `KeyM_Finalize()` 来结束加密密钥操作。该函数将为所有具有内部标记的密钥触发对 `Csm_KeySetValid()` 的调用,以最终化密钥更新操作。无论函数调用是否成功,在该函数调用之后关闭密钥更新会话并清除所有内部标记。⌋()
|
||
|
||
**[SWS_KeyM_00020]** ⌈ 如果配置项 `KeyMCryptoKeyVerifyFunctionEnabled` 设置为 TRUE,则加密密钥子模块应提供函数 `KeyM_Verify()`。该函数可由密钥主机触发,并用于运行由 `KeyMCryptoKeyCsmVerifyJobRef` 引用的加密作业。`KeyM_Verify()` 可在任何时间调用,并且不绑定到活动的加密密钥会话。⌋()
|
||
|
||
### 7.2 证书子模块
|
||
|
||
KeyM 的证书子模块功能允许 BSW 模块和 SWC 在 AUTOSAR 软件架构中的中心点更高效地执行证书操作。此类操作的示例包括验证完整证书链或从运行时提供和验证的证书中检索元素。
|
||
|
||
所需的加密操作(例如证书签名的验证)仍由加密服务管理器中定义的关联加密作业执行。此外,证书的安全存储可以位于 CSM 的密钥存储位置中,例如允许将根证书存储在 HSM 内。
|
||
|
||
#### 7.2.1 通用行为
|
||
|
||
证书子模块允许定义和配置证书,以便可以在生产时存储它们并进一步用于多种目的。配置允许以分层结构(具有 PKI 系统中使用的根、中间和目标证书)定义证书链中的证书。存储的证书将在启动时根据配置的分层结构进行检查。配置还允许检查特定证书元素是否具有确定的值。还支持读取证书的特定元素,并且所包含的公钥可以与 CsmKey 关联,以便与配置的 CSM 加密作业一起使用。
|
||
|
||
> **图 7-2:PKI 证书链示例**
|
||
|
||
如果需要,根证书和中间证书可以在 ECU 或车辆的生产阶段提供。这些证书将永久存储在指定位置。如果现在向 ECU 提交证书,则可以将此证书存储在临时位置以请求验证。证书子模块将检查关联链中的现有证书,并将开始解析内容,根据预先配置的条件验证它们,然后将针对其链中所有可用的证书检查签名。
|
||
|
||
#### 7.2.2 初始化
|
||
|
||
**[SWS_KeyM_00022]** ⌈ 在初始化期间,证书子模块将检索永久存储的证书,准备它们进行解析,并根据需要使它们可用,例如用于证书元素提取或针对其他证书进行验证。⌋()
|
||
|
||
可选地,证书子模块可以解析一次证书并将解析后的信息存储在专用 NVM 块中,而不是在每次启动时解析证书。在 NVM 中存储解析结果的优势将加快系统的启动。
|
||
|
||
由于证书的解析和验证可能需要大量时间,因此建议在启动后于后台任务中为存储的证书执行此操作。
|
||
|
||
**[SWS_KeyM_00023]** ⌈ 如果解析操作成功,则证书子模块从证书中提取公钥并将其存储在 CSM 的提供的密钥引用中或 NVM 中。⌋()
|
||
|
||
#### 7.2.3 证书配置
|
||
|
||
**[SWS_KeyM_00024]** ⌈ 应至少将一个证书定义为 PKI 的根证书。相应 `KeyMCertificate` 容器的 `KeyMCertUpperHierarchicalCertRef` 引用自身。⌋()
|
||
|
||
**原理**:根证书具有以下特征:使用存储在同一证书中的公钥验证签名(自签名证书)。它是层次结构中的顶级证书。
|
||
|
||
**[SWS_KeyM_00025]** ⌈ 通过调用函数 `KeyM_SetCertificate()` 存储证书以供验证。证书将放置在 `KeyMCryptoKey` 的预配置存储类中。⌋()
|
||
|
||
**注意**:这样的密钥通常放置在 RAM 中,并不打算用于永久存储。`KeyM_SetCertificate()` 仅用于验证提交的证书。它不打算用于永久存储,例如根密钥。对于永久存储证书的操作,应使用函数 `KeyM_ServiceCertificate()`。
|
||
|
||
#### 7.2.4 操作模式
|
||
|
||
**[SWS_KeyM_00021]** ⌈ 如果配置项 `KeyMServiceCertificateFunctionEnabled` 和 `KeyMCertificateManagerEnabled` 设置为 TRUE,则证书子模块应提供函数 `KeyM_ServiceCertificate()`。该函数可由密钥主机触发,并用于向证书子模块提供证书相关信息。可以执行几种证书相关操作,例如永久存储在系统中的证书的引入或更新。⌋()
|
||
|
||
**[SWS_KeyM_00026]** ⌈ 一旦证书已通过 `KeyM_SetCertificate()` 或 `KeyM_ServiceCertificate()` 存储,就会启动证书的解析过程。⌋()
|
||
|
||
**[SWS_KeyM_00027]** ⌈ 解析过程识别证书是否以良好格式的方式提供,例如 X.509 证书的 ASN.1 结构是否正确以及是否包含所有基本元素。此外,根据所有已分配 `KeyMCertificateElementVerification` 容器的配置检查其他证书元素的内容。⌋()
|
||
|
||
**[SWS_KeyM_00028]** ⌈ 通过调用函数 `KeyM_VerifyCertificate()`、`KeyM_VerifyCertificates()` 或 `KeyM_VerifyCertificateChain()` 之一来按需验证证书。⌋()
|
||
|
||
**[SWS_KeyM_00029]** ⌈ 至少应按此顺序成功通过以下验证步骤,以成功验证证书:
|
||
|
||
1. 证书从层次结构的顶部验证到底部。
|
||
2. 验证中涉及的所有证书应可用,并且已成功解析和验证。
|
||
3. 如果吊销列表可用,则应检查所有涉及的证书是否列在 CRL 中。
|
||
4. 上层层次结构中证书的主题字段与下层层次结构中证书的颁发者字段匹配。
|
||
5. 时间服务器(即 STBM)提供的当前时间应大于"not before"且小于"not after"时间值。
|
||
6. 可以使用由 `KeyMCertUpperHierarchicalCertRef` 引用的证书的关联公钥验证签名。对于 X.509 证书,所有关键扩展字段都应存在。通过使用由 `KeyMCertUpperHierarchicalCertRef` 引用的证书的 `KeyMCertCsmSignatureVerifyJobRef` 来验证签名。该上层层次结构证书的相应公钥应加载到 `KeyMCertCsmSignatureVerifyKeyRef` 中(如果存在)。
|
||
|
||
⌋()
|
||
|
||
**[SWS_KeyM_00030]** ⌈ 如果层次链中的某个证书缺失或主题和颁发者字段不匹配,则验证函数应返回 `KEYM_E_CERT_INVALID_CHAIN_OF_TRUST`。⌋()
|
||
|
||
**[SWS_KeyM_00031]** ⌈ 如果解析过程检测到某个证书元素不包含所需值,则验证函数应返回 `KEYM_E_CERT_INVALID_CONTENT`。⌋()
|
||
|
||
**[SWS_KeyM_00032]** ⌈ 如果提供的证书格式无效(例如 X.509 证书的 ASN.1 结构无效),则验证函数应返回 `KEYM_E_CERT_INVALID_FORMAT`。⌋()
|
||
|
||
**[SWS_KeyM_00033]** ⌈ 如果提供的证书与当前时间段不匹配,则验证函数应返回 `KEYM_E_CERT_VALIDITY_PERIOD_FAIL`。⌋()
|
||
|
||
**[SWS_KeyM_00034]** ⌈ 如果签名验证失败,则验证函数应返回 `KEYM_E_CERT_SIGNATURE_FAIL`。⌋()
|
||
|
||
**[SWS_KeyM_00035]** ⌈ 如果链中的某个证书在吊销列表中找到(如果可用),则验证函数应返回 `KEYM_E_CERTIFICATE_REVOKED`。⌋()
|
||
|
||
### 7.3 错误分类
|
||
|
||
#### 7.3.1 开发错误
|
||
|
||
**[SWS_KeyM_00036]** 开发错误类型 ⌈
|
||
|
||
| 错误类型 | 相关错误代码 | 值(十六进制) |
|
||
|---|---|---|
|
||
| 使用无效参数(空指针)调用 API 服务 | KEYM_E_PARAM_POINTER | 0x01 |
|
||
| 操作的缓冲区太小 | KEYM_E_SMALL_BUFFER | 0x02 |
|
||
| 在模块初始化之前调用 API | KEYM_E_UNINIT | 0x03 |
|
||
| KeyM 模块初始化失败 | KEYM_E_INIT_FAILED | 0x04 |
|
||
|
||
⌋()
|
||
|
||
#### 7.3.2 运行时错误
|
||
|
||
无运行时错误。
|
||
|
||
#### 7.3.3 瞬态故障
|
||
|
||
无瞬态故障。
|
||
|
||
#### 7.3.4 生产错误
|
||
|
||
无生产错误。
|
||
|
||
#### 7.3.5 扩展生产错误
|
||
|
||
无扩展生产错误。
|
||
|
||
---
|
||
|
||
## 8 API 规范
|
||
|
||
### 8.1 导入类型
|
||
|
||
本章列出了从以下文件导入的所有类型:
|
||
|
||
**[SWS_KeyM_00037]** ⌈
|
||
|
||
| 模块 | 头文件 | 导入的类型 |
|
||
|---|---|---|
|
||
| Csm | `<none>` | Crypto_VerifyResultType |
|
||
| | Rte_Csm_Type.h | Crypto_OperationModeType |
|
||
| StbM | Rte_StbM_Type.h | StbM_SynchronizedTimeBaseType |
|
||
| | Rte_StbM_Type.h | StbM_TimeStampType |
|
||
| | Rte_StbM_Type.h | StbM_UserDataType |
|
||
| Std_Types | StandardTypes.h | Std_ReturnType |
|
||
| | StandardTypes.h | Std_VersionInfoType |
|
||
|
||
⌋()
|
||
|
||
密钥管理模块使用 Std_ReturnType 的以下扩展:
|
||
|
||
**[SWS_KeyM_00040]** ⌈
|
||
|
||
| 范围 | 描述 |
|
||
|---|---|
|
||
| `KEYM_E_BUSY` = 0x02 | 密钥管理忙于其他操作 |
|
||
| `KEYM_E_PENDING` = 0x03 | 操作请求已接受,响应待处理。它现在以异步模式运行,响应将通过回调提供 |
|
||
| `KEYM_E_KEY_CERT_SIZE_MISMATCH` = 0x04 | 参数大小与预期值不匹配 |
|
||
| `KEYM_E_PARAMETER_MISMATCH` = 0x05 | 函数参数未提供预期值 |
|
||
| `KEYM_E_KEY_CERT_INVALID` = 0x06 | 密钥或证书无效,无法用于该操作 |
|
||
| `KEYM_E_KEY_CERT_READ_FAIL` = 0x07 | 由于读取或权限失败,无法提供证书或密钥 |
|
||
| `KEYM_E_KEY_CERT_EMPTY` = 0x08 | 请求的密钥或证书不可用,槽为空 |
|
||
| `KEYM_E_CERT_INVALID_CHAIN_OF_TRUST` = 0x09 | 证书验证失败 — 信任链无效 |
|
||
| Description | 密钥管理特定的返回值,用于 Std_ReturnType |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋()
|
||
|
||
### 8.2 类型定义
|
||
|
||
#### 8.2.1 KeyM_ConfigType
|
||
|
||
**[SWS_KeyM_00157]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Name | `KeyM_ConfigType` |
|
||
| Type | Structure |
|
||
| Range | implementation specific |
|
||
| Description | 此结构是初始化密钥管理器模块的基本类型。在密钥管理器模块的初始化中将使用指向此结构实例的指针。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋ (SWS_BSW_00216)
|
||
|
||
#### 8.2.2 KeyM_KH_UpdateOperationType
|
||
|
||
**[SWS_KeyM_00055]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Name | `KeyM_KH_UpdateOperationType` |
|
||
| Type | Enumeration |
|
||
| Range | `KEYM_KH_UPDATE_KEY_UPDATE_REPEAT` = 0x01 — 密钥处理器已成功执行操作并提供应由密钥管理器的更新函数进一步操作的新密钥数据。请求下一次调用密钥处理器。<br>`KEYM_KH_UPDATE_FINISH` = 0x02 — 密钥处理器已成功执行所有更新操作。更新操作已完成,结果数据可以提供回来作为 KeyM_Update 操作的最终结果。 |
|
||
| Description | 指定在回调中执行的密钥处理器更新操作的类型。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.2.3 KeyM_CertElementIteratorType
|
||
|
||
**[SWS_KeyM_00042]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Name | `KeyM_CertElementIteratorType` |
|
||
| Type | Structure |
|
||
| Range | implementation specific |
|
||
| Description | 此结构用于迭代证书的多个元素。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.2.4 KeyM_CryptoKeyIdType
|
||
|
||
**[SWS_KeyM_00302]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Name | `KeyM_CryptoKeyIdType` |
|
||
| Type | uint16 |
|
||
| Description | 加密密钥句柄。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.2.5 KeyM_CertDataType
|
||
|
||
**[SWS_KeyM_00041]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Name | `KeyM_CertDataType` |
|
||
| Type | Structure |
|
||
| Element | `certDataLength` (uint32) — 证书数据的长度;<br>`certData` (`KeyM_CertDataPointerType`) — 指针引用调用方本地数据区域上的证书数据 |
|
||
| Description | 此结构用于通过接口函数交换证书数据。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋()
|
||
|
||
### 8.3 函数定义
|
||
|
||
这是为上层模块提供的函数列表。
|
||
|
||
#### 8.3.1 通用
|
||
|
||
##### 8.3.1.1 KeyM_Init
|
||
|
||
**[SWS_KeyM_00043]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Service name | `KeyM_Init` |
|
||
| Syntax | `void KeyM_Init(const KeyM_ConfigType* ConfigPtr)` |
|
||
| Service ID[hex] | 0x01 |
|
||
| Sync/Async | Synchronous |
|
||
| Reentrancy | Non Reentrant |
|
||
| Parameters (in) | `ConfigPtr` — 指向在 VARIANT-POST-BUILD 中设置的配置的指针 |
|
||
| Parameters (inout) | None |
|
||
| Parameters (out) | None |
|
||
| Return value | None |
|
||
| Description | 此函数初始化密钥管理模块。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋ (SRS_BSW_00101, SRS_BSW_00358, SRS_BSW_00414)
|
||
|
||
**[SWS_KeyM_00158]** ⌈ 配置指针 `configPtr` 应始终具有 `NULL_PTR` 值。⌋(SWS_BSW_00050)
|
||
|
||
**注意**:当前未使用密钥管理器在初始化时的配置,因此应将 `NULL_PTR` 传递给模块。
|
||
|
||
**[SWS_KeyM_00044]** ⌈ 如果密钥管理模块的初始化失败,并且开发错误处于激活状态,则错误 `KEYM_E_INIT_FAILED` 应报告给 DET。⌋()
|
||
|
||
**[SWS_KeyM_00045]** ⌈ 如果证书子模块处于活动状态,并且永久存储的证书在未解析和未验证状态下可用,则 KeyM 证书子模块部分应启动后台任务以预解析和预验证证书。⌋()
|
||
|
||
**原理**:如果 CPU 时间可用,可以在后台任务中执行该操作。预验证证书将有助于在提交证书并应在运行时针对预安装的证书链进行验证时加快身份验证速度。
|
||
|
||
**[SWS_KeyM_00046]** ⌈ 如果加密密钥子模块处于活动状态,则在初始化期间应从 NVM 读取所有密钥,并将其存储到 CSM (RAM-) 密钥槽。⌋()
|
||
|
||
**[SWS_KeyM_00144]** ⌈ 如果开发错误处于激活状态,则密钥管理器应在每次函数调用时检查模块是否已通过 `KeyM_Init()` 初始化且尚未通过 `KeyM_Deinit()` 反初始化。否则,应设置开发错误 `KEYM_E_UNINIT`。⌋()
|
||
|
||
**[SWS_KeyM_00145]** ⌈ 如果开发错误处于激活状态,则密钥管理器应在每次提供结果缓冲区的函数中检查所提供的缓冲区是否足够大以存储请求的结果。如果不是,则应设置开发错误 `KEYM_E_SMALL_BUFFER`。⌋()
|
||
|
||
**[SWS_KeyM_00146]** ⌈ 如果开发错误处于激活状态,则密钥管理器应在每次提供指针的函数中检查指针是否不是 `NULL_PTR`。如果提供了 `NULL_PTR` 但不应提供,则应设置开发错误 `KEYM_E_PARAM_POINTER`。⌋()
|
||
|
||
##### 8.3.1.2 KeyM_Deinit
|
||
|
||
**[SWS_KeyM_00047]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Service name | `KeyM_Deinit` |
|
||
| Syntax | `void KeyM_Deinit(void)` |
|
||
| Service ID[hex] | 0x02 |
|
||
| Sync/Async | Synchronous |
|
||
| Reentrancy | Non Reentrant |
|
||
| Parameters (in) | None |
|
||
| Parameters (inout) | None |
|
||
| Parameters (out) | None |
|
||
| Return value | None |
|
||
| Description | 此函数将密钥管理模块重置为未初始化状态。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋()
|
||
|
||
**[SWS_KeyM_00048]** ⌈ 出于安全原因,加密密钥子模块应主动销毁 RAM 中用于加密密钥材料的所有数据。特别地,应将对称密钥和中间结果设置为初始值。⌋()
|
||
|
||
##### 8.3.1.3 KeyM_GetVersionInfo
|
||
|
||
**[SWS_KeyM_00049]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Service name | `KeyM_GetVersionInfo` |
|
||
| Syntax | `void KeyM_GetVersionInfo(Std_VersionInfoType* VersionInfo)` |
|
||
| Service ID[hex] | 0x03 |
|
||
| Sync/Async | Synchronous |
|
||
| Reentrancy | Non Reentrant |
|
||
| Parameters (in) | None |
|
||
| Parameters (inout) | None |
|
||
| Parameters (out) | `VersionInfo` — 指向本模块版本信息的指针 |
|
||
| Return value | None |
|
||
| Description | 提供本模块的版本信息。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋ (SRS_BSW_00407)
|
||
|
||
#### 8.3.2 加密密钥操作
|
||
|
||
##### 8.3.2.1 KeyM_Start
|
||
|
||
**[SWS_KeyM_00050]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Service name | `KeyM_Start` |
|
||
| Syntax | `Std_ReturnType KeyM_Start(KeyM_StartType StartType, const uint8* RequestData, uint16 RequestDataLength, uint8* ResponseData, uint16* ResponseDataLength)` |
|
||
| Service ID[hex] | 0x04 |
|
||
| Sync/Async | Synchronous |
|
||
| Reentrancy | Non Reentrant |
|
||
| Parameters (in) | `StartType` — 定义密钥操作应以哪种模式执行;`RequestData` — 随请求一起提供的信息,例如签名;`RequestDataLength` — RequestData 数组中的数据长度 |
|
||
| Parameters (inout) | `ResponseDataLength` — In:`ResponseData` 中可用的最大字节数;Out:实际数量 |
|
||
| Parameters (out) | `ResponseData` — 函数返回的数据 |
|
||
| Return value | `E_OK`/`E_NOT_OK`/`KEYM_E_PARAMETER_MISMATCH`/`KEYM_E_KEY_CERT_SIZE_MISMATCH` |
|
||
| Description | 此函数是可选的,仅当配置项 `KeyMCryptoKeyStartFinalizeFunctionEnabled` 设置为 true 时才使用。它旨在允许密钥更新操作。 |
|
||
| Available via | KeyM.h |
|
||
|
||
⌋()
|
||
|
||
**[SWS_KeyM_00085]** ⌈ 如果 `KeyMCryptoKeyStartFinalizeFunctionEnabled` 设置为 TRUE,则应调用此函数以启动密钥更新会话。该函数通过 `E_OK` 指示现在可以进行密钥操作。⌋()
|
||
|
||
##### 8.3.2.2 KeyM_Finalize
|
||
|
||
`KeyM_Finalize()` 函数结束密钥更新会话。它将为所有已更新的密钥触发对 `Csm_KeySetValid()` 的调用。
|
||
|
||
##### 8.3.2.3 KeyM_Prepare
|
||
|
||
`KeyM_Prepare()` 函数(可选)用于在密钥更新会话开始时提供初始数据。它由密钥处理器 `KeyM_KH_Prepare()` 调用以执行 OEM 特定操作。
|
||
|
||
##### 8.3.2.4 KeyM_Update
|
||
|
||
**[SWS_KeyM_00056..00066]** 定义了 `KeyM_Update()` 函数及其变体的行为:
|
||
|
||
| 函数 | 描述 |
|
||
|---|---|
|
||
| `KeyM_Update()` | 触发密钥更新操作。使用 `keyNameLength` 或 SHE M1M2M3 解释输入数据 |
|
||
| `KeyM_KH_Update()` | 密钥处理器更新回调函数。允许 OEM 特定的密钥更新逻辑 |
|
||
| `KeyM_UpdateAsync()` | 异步版本的 `KeyM_Update()` |
|
||
|
||
具体行为根据 `KeyMCryptoKeyHandlerUpdateEnabled` 和 `KeyMCryptoKeyGenerationType` 而定。
|
||
|
||
##### 8.3.2.5 KeyM_Verify
|
||
|
||
**[SWS_KeyM_00068]** ⌈ 如果 `KeyMCryptoKeyVerifyFunctionEnabled` 设置为 TRUE,则提供函数 `KeyM_Verify()`。该函数可用于运行由 `KeyMCryptoKeyCsmVerifyJobRef` 引用的加密作业来验证密钥。⌋()
|
||
|
||
#### 8.3.3 证书处理
|
||
|
||
##### 8.3.3.1 KeyM_SetCertificate
|
||
|
||
`KeyM_SetCertificate()` 函数存储证书以供验证。证书放置在预配置的 `KeyMCryptoKey` 存储类中。该函数仅用于验证提交的证书,不用于永久存储。
|
||
|
||
##### 8.3.3.2 KeyM_ServiceCertificate
|
||
|
||
`KeyM_ServiceCertificate()` 函数用于永久存储证书的引入或更新。
|
||
|
||
##### 8.3.3.3 KeyM_VerifyCertificate, KeyM_VerifyCertificates, KeyM_VerifyCertificateChain
|
||
|
||
**`KeyM_VerifyCertificate`**:验证单个证书。
|
||
|
||
**`KeyM_VerifyCertificates`**:验证多个证书。
|
||
|
||
**`KeyM_VerifyCertificateChain`**:验证完整证书链。
|
||
|
||
返回代码:
|
||
|
||
| 返回代码 | 描述 |
|
||
|---|---|
|
||
| `KEYM_E_CERT_INVALID_CHAIN_OF_TRUST` | 信任链无效 |
|
||
| `KEYM_E_CERT_INVALID_CONTENT` | 证书内容无效 |
|
||
| `KEYM_E_CERT_INVALID_FORMAT` | 证书格式无效 |
|
||
| `KEYM_E_CERT_VALIDITY_PERIOD_FAIL` | 证书有效期失败 |
|
||
| `KEYM_E_CERT_SIGNATURE_FAIL` | 签名验证失败 |
|
||
| `KEYM_E_CERTIFICATE_REVOKED` | 证书已吊销 |
|
||
|
||
##### 8.3.3.4 KeyM_GetCertificate, KeyM_GetCertificateElement, KeyM_SetCertificateElement
|
||
|
||
**`KeyM_GetCertificate`**:检索存储的证书。
|
||
|
||
**`KeyM_GetCertificateElement`**:从证书中检索特定元素。
|
||
|
||
**`KeyM_SetCertificateElement`**:设置证书中的元素。
|
||
|
||
##### 8.3.3.5 KeyM_CertElementIteratorInit, KeyM_CertElementIteratorNext, KeyM_CertElementIteratorDestroy
|
||
|
||
**`KeyM_CertElementIteratorInit`**:初始化证书元素迭代器。
|
||
|
||
**`KeyM_CertElementIteratorNext`**:获取迭代器中的下一个证书元素。
|
||
|
||
**`KeyM_CertElementIteratorDestroy`**:销毁证书元素迭代器。
|
||
|
||
### 8.4 Call-out 定义
|
||
|
||
KeyM 模块提供了一组 call-out 函数,允许 OEM 或供应商实现特定的处理逻辑:
|
||
|
||
- `KeyM_KH_Start()` — 启动密钥处理器
|
||
- `KeyM_KH_Prepare()` — 准备密钥处理器
|
||
- `KeyM_KH_Update()` — 更新密钥处理器
|
||
- `KeyM_KH_Finalize()` — 完成密钥处理器
|
||
|
||
### 8.5 调度函数
|
||
|
||
#### 8.5.1 KeyM_MainFunction
|
||
|
||
`KeyM_MainFunction()` 是 KeyM 模块的主函数。它由 BSW 调度器周期性调用以处理异步操作。
|
||
|
||
#### 8.5.2 KeyM_MainBackgroudFunction
|
||
|
||
`KeyM_MainBackgroudFunction()` 是 KeyM 模块的后台主函数。它由 BSW 调度器周期性调用以处理后台任务(例如证书预解析和预验证)。
|
||
|
||
### 8.6 预期接口
|
||
|
||
#### 8.6.1 必需接口
|
||
|
||
KeyM 模块所需的所有必需接口:
|
||
|
||
| API 函数 | 头文件 | 描述 |
|
||
|---|---|---|
|
||
| `Csm_KeyElementSet` | Csm.h | 设置密钥元素 |
|
||
| `Csm_KeyElementGet` | Csm.h | 获取密钥元素 |
|
||
| `Csm_KeySetValid` | Csm.h | 设置密钥有效 |
|
||
| `Csm_KeyDerive` | Csm.h | 派生密钥 |
|
||
| `Csm_KeyGenerate` | Csm.h | 生成密钥 |
|
||
| `Csm_KeyExchangeCalcPubVal` | Csm.h | 计算密钥交换公钥值 |
|
||
| `Csm_KeyExchangeCalcSecret` | Csm.h | 计算密钥交换共享密钥 |
|
||
| `Csm_CertificateParse` | Csm.h | 解析证书 |
|
||
| `Csm_CertificateVerify` | Csm.h | 验证证书 |
|
||
| `Csm_SignatureVerify` | Csm.h | 验证签名 |
|
||
| `StbM_GetCurrentTime` | StbM.h | 获取当前同步时间 |
|
||
|
||
#### 8.6.2 可选接口
|
||
|
||
KeyM 模块的所有可选接口:
|
||
|
||
| API 函数 | 头文件 | 描述 |
|
||
|---|---|---|
|
||
| `NvM_ReadBlock` | NvM.h | 读取 NVM 块 |
|
||
| `NvM_WriteBlock` | NvM.h | 写入 NVM 块 |
|
||
| `NvM_SetRamBlockStatus` | NvM.h | 设置 RAM 块状态 |
|
||
|
||
#### 8.6.3 可配置接口
|
||
|
||
KeyM 模块允许通过配置来定义自定义接口(call-outs)。详见原文 PDF 第 47-55 页。
|
||
|
||
### 8.7 服务接口
|
||
|
||
#### 8.7.1 本章范围
|
||
|
||
本章定义 KeyM 模块作为 AUTOSAR 服务组件提供的服务接口。这些服务接口允许通过 RTE 进行访问。
|
||
|
||
#### 8.7.2 数据类型
|
||
|
||
KeyM 模块定义了一组数据类型用于服务接口:
|
||
|
||
- `KeyM_StartType` — 启动类型
|
||
- `KeyM_CertificateStatusType` — 证书状态类型
|
||
- `KeyM_CertificateElementIdType` — 证书元素 ID 类型
|
||
- `KeyM_CertificateElementType` — 证书元素类型
|
||
- 等等
|
||
|
||
> 完整数据类型定义请参阅原始 PDF 文档第 56-62 页。
|
||
|
||
#### 8.7.3 客户端-服务器接口
|
||
|
||
KeyM 模块提供了一组客户端-服务器接口:
|
||
|
||
- `KeyM_StartFinalize` — 启动/完成服务
|
||
- `KeyM_Update` — 密钥更新服务
|
||
- `KeyM_Verify` — 密钥验证服务
|
||
- `KeyM_Certificate` — 证书服务
|
||
- 等等
|
||
|
||
> 完整客户端-服务器接口定义请参阅原始 PDF 文档第 62-75 页。
|
||
|
||
#### 8.7.4 端口
|
||
|
||
KeyM 模块定义了服务接口的端口配置。
|
||
|
||
> 完整端口定义请参阅原始 PDF 文档第 76-78 页。
|
||
|
||
---
|
||
|
||
## 9 序列图
|
||
|
||
本章提供 KeyM 模块关键操作的序列图。
|
||
|
||
### 9.1 存储单个密钥
|
||
|
||
> 详见原始 PDF 文档第 79 页。
|
||
|
||
### 9.2 存储多个密钥
|
||
|
||
> 详见原始 PDF 文档第 80 页。
|
||
|
||
### 9.3 派生密钥
|
||
|
||
> 详见原始 PDF 文档第 81 页。
|
||
|
||
### 9.4 添加工作证书
|
||
|
||
> 详见原始 PDF 文档第 82 页。
|
||
|
||
### 9.5 添加根证书或中间证书
|
||
|
||
> 详见原始 PDF 文档第 83 页。
|
||
|
||
---
|
||
|
||
## 10 配置规范
|
||
|
||
第 10.1 章规定 KeyM 模块的结构(容器)和参数。第 10.2 章另外规定 KeyM 模块的发布信息。
|
||
|
||
### 10.1 容器和配置参数
|
||
|
||
#### 10.1.1 KeyM
|
||
|
||
`KeyM` 根容器配置密钥管理模块。
|
||
|
||
| 包含的容器 | 多重性 | 范围 / 依赖 |
|
||
|---|---|---|
|
||
| `KeyMGeneral` | 1 | 公共配置 |
|
||
| `KeyMCertificate` | 0..* | 证书容器 |
|
||
| `KeyMCryptoKey` | 0..* | 加密密钥容器 |
|
||
|
||
#### 10.1.2 KeyMGeneral
|
||
|
||
`KeyMGeneral` 容器定义公共配置选项:
|
||
|
||
| 参数 | 描述 |
|
||
|---|---|
|
||
| `KeyMDevErrorDetect` | 启用/禁用开发错误检测 |
|
||
| `KeyMVersionInfoApi` | 启用/禁用 `KeyM_GetVersionInfo()` API |
|
||
| `KeyMCryptoKeyManagerEnabled` | 启用/禁用加密密钥子模块 |
|
||
| `KeyMCertificateManagerEnabled` | 启用/禁用证书子模块 |
|
||
| `KeyMCryptoKeyStartFinalizeFunctionEnabled` | 启用 `KeyM_Start`/`KeyM_Finalize` 函数 |
|
||
| `KeyMCryptoKeyHandlerStartFinalizeEnabled` | 启用密钥处理器 Start/Finalize |
|
||
| `KeyMCryptoKeyPrepareFunctionEnabled` | 启用 `KeyM_Prepare` 函数 |
|
||
| `KeyMCryptoKeyHandlerPrepareEnabled` | 启用密钥处理器 Prepare |
|
||
| `KeyMCryptoKeyHandlerUpdateEnabled` | 启用密钥处理器 Update |
|
||
| `KeyMCryptoKeyVerifyFunctionEnabled` | 启用 `KeyM_Verify` 函数 |
|
||
| `KeyMServiceCertificateFunctionEnabled` | 启用 `KeyM_ServiceCertificate` 函数 |
|
||
| 等等 | |
|
||
|
||
#### 10.1.3 KeyMCertificate
|
||
|
||
`KeyMCertificate` 容器定义单个证书:
|
||
|
||
| 参数 | 描述 |
|
||
|---|---|
|
||
| `KeyMCertificateId` | 证书的标识符 |
|
||
| `KeyMCertificateName` | 证书的名称 |
|
||
| `KeyMCertUpperHierarchicalCertRef` | 对上层证书的引用 |
|
||
| `KeyMCertCsmSignatureVerifyJobRef` | 对签名验证作业的引用 |
|
||
| `KeyMCertCsmSignatureVerifyKeyRef` | 对签名验证密钥的引用 |
|
||
| `KeyMCertCryptoKeyRef` | 对加密密钥的引用 |
|
||
| 等等 | |
|
||
|
||
#### 10.1.4 KeyMCertificateElement
|
||
|
||
`KeyMCertificateElement` 容器定义证书中的元素:
|
||
|
||
| 参数 | 描述 |
|
||
|---|---|
|
||
| `KeyMCertificateElementId` | 证书元素的标识符 |
|
||
| `KeyMCertificateElementOID` | 元素的对象标识符 (OID) |
|
||
| `KeyMCertificateElementDescription` | 元素的描述 |
|
||
| 等等 | |
|
||
|
||
#### 10.1.5 KeyMCertificateElementVerification
|
||
|
||
`KeyMCertificateElementVerification` 容器定义证书元素的验证:
|
||
|
||
| 参数 | 描述 |
|
||
|---|---|
|
||
| `KeyMCertificateElementVerificationId` | 验证标识符 |
|
||
| `KeyMCertificateElementRef` | 对要验证的证书元素的引用 |
|
||
| `KeyMCertificateElementRuleRef` | 对验证规则的引用 |
|
||
| 等等 | |
|
||
|
||
#### 10.1.6 KeyMCertificateElementRule
|
||
|
||
`KeyMCertificateElementRule` 容器定义验证规则。
|
||
|
||
#### 10.1.7 KeyMCertificateElementCondition
|
||
|
||
`KeyMCertificateElementCondition` 容器定义验证条件。
|
||
|
||
#### 10.1.8 KeyMCertificateElementConditionPrimitive
|
||
|
||
`KeyMCertificateElementConditionPrimitive` 容器定义基于原语的验证条件。
|
||
|
||
#### 10.1.9 KeyMCertificateElementConditionArray
|
||
|
||
`KeyMCertificateElementConditionArray` 容器定义基于数组的验证条件。
|
||
|
||
#### 10.1.10 KeyMCertificateElementConditionArrayElement
|
||
|
||
`KeyMCertificateElementConditionArrayElement` 容器定义数组中的单个条件元素。
|
||
|
||
#### 10.1.11 KeyMCertificateElementConditionValue
|
||
|
||
`KeyMCertificateElementConditionValue` 容器定义值匹配条件。
|
||
|
||
#### 10.1.12 KeyMCertificateElementConditionSenderReceiver
|
||
|
||
`KeyMCertificateElementConditionSenderReceiver` 容器定义发送者-接收者条件。
|
||
|
||
#### 10.1.13 KeyMCryptoKey
|
||
|
||
`KeyMCryptoKey` 容器定义单个加密密钥:
|
||
|
||
| 参数 | 描述 |
|
||
|---|---|
|
||
| `KeyMCryptoKeyId` | 加密密钥的标识符 |
|
||
| `KeyMCryptoKeyName` | 加密密钥的名称 |
|
||
| `KeyMCryptoKeyCryptoProps` | 加密属性 |
|
||
| `KeyMCryptoKeyGenerationType` | 生成类型(`KEYM_STORED_KEY` 或 `KEYM_DERIVE_KEY`) |
|
||
| `KeyMCryptoKeyCsmKeyTargetRef` | 对目标 CsmKey 的引用 |
|
||
| `KeyMCryptoKeyCsmKeySourceDeriveRef` | 对源 CsmKey 的引用(派生时) |
|
||
| `KeyMCryptoKeyCsmVerifyJobRef` | 对验证作业的引用 |
|
||
| 等等 | |
|
||
|
||
#### 10.1.14 KeyMNvmBlock
|
||
|
||
`KeyMNvmBlock` 容器定义与 NVM 块关联的密钥:
|
||
|
||
| 参数 | 描述 |
|
||
|---|---|
|
||
| `KeyMNvmBlockId` | NVM 块的标识符 |
|
||
| `KeyMNvmBlockRef` | 对 NVM 块的引用 |
|
||
| `KeyMCryptoKeyRef` | 对加密密钥的引用 |
|
||
| 等等 | |
|
||
|
||
> 完整容器配置定义(包括每个参数的详细说明、范围、默认值等)请参阅原始 PDF 文档第 84-112 页。
|
||
|
||
### 10.2 发布信息
|
||
|
||
发布信息包含由 SW 模块实施者定义的数据,这些数据在模块适配(即配置)到实际硬件/软件环境时不会更改。因此它包含版本和制造商信息。
|
||
|
||
> 完整发布参数定义请参阅原始 PDF 文档第 112 页。
|
||
|
||
---
|
||
|
||
## 11 不适用的需求
|
||
|
||
不适用。
|
||
|
||
---
|
||
|
||
## 翻译说明
|
||
|
||
- 本文档为 AUTOSAR SWS 907《Specification of Key Manager》(CP 4.4.0) 的中文翻译;
|
||
- 文档标识号:907;
|
||
- 文档共 113 页,已翻译所有 11 个章节,包括完整的 KeyM 子模块功能规范和关键 API 摘要;
|
||
- 保留了所有 AUTOSAR 方框符、API 标识符、模块缩写、算法名和需求 ID;
|
||
- 证书子模块包含完整的证书链验证逻辑、PKI 层次结构和验证错误代码;
|
||
- 加密密钥子模块包含完整的 Start/Prepare/Update/Finalize 会话管理逻辑、SHE 密钥更新协议;
|
||
- API 规范中的所有 25+ 个函数已翻译关键 API,包括 KeyM_Init、KeyM_Deinit、KeyM_GetVersionInfo、KeyM_Start、KeyM_Update、KeyM_Verify、KeyM_SetCertificate、KeyM_ServiceCertificate、KeyM_VerifyCertificate(s)、KeyM_GetCertificate 等;
|
||
- 配置规范(10.1)列出所有 14 个主要容器,详细参数定义参见原始 PDF;
|
||
- 序列图和详细客户端-服务器接口定义请参见原文 PDF;
|
||
- 翻译以保证技术含义准确为前提,语句尽量贴近 AUTOSAR 中文术语库常用译法。 |