56 KiB
加密接口规范 (Specification of Crypto Interface)
AUTOSAR CP Release 4.4.0
翻译说明:本文档为 AUTOSAR 经典平台 (CP) Release 4.4.0 中 SWS 文档 806《Specification of Crypto Interface》的中文翻译版本。原始英文文档中的 AUTOSAR 方框符
⌈⌋、API 标识符(如CryIf_ProcessJob)、模块缩写(Crypto、CryIf、Csm、KeyM 等)、加密算法名(AES、SHA、RSA、ECC 等)以及需求 ID(如SWS_CryIf_xxxxx)均予以保留。
文档标识
| 项目 | 内容 |
|---|---|
| 文档标题 (Document Title) | Specification of Crypto Interface(加密接口规范) |
| 文档所有者 (Document Owner) | AUTOSAR |
| 文档责任方 (Document Responsibility) | AUTOSAR |
| 文档标识号 (Document Identification No) | 806 |
| 文档状态 (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 | 移除安全计数器;对齐接口函数的返回值;支持加密驱动内加密操作的源缓冲区和目标缓冲区;支持异步模式下的密钥管理操作 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 小修正、澄清和编辑性修订;详细信息请参阅 ChangeDocumentation |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 初始发布 |
目录 (Table of Contents)
1 引言与功能概述
本规范规定了 AUTOSAR 基础软件模块 Crypto Interface (CRYIF) 的功能、API 和配置。
Crypto Interface 模块位于低层加密解决方案(Crypto Driver [4] 和基于软件的 CDD)与上层服务层(Crypto Service Manager [5])之间。它表示上层服务层到 Crypto Driver 服务的接口。AUTOSAR 分层视图见图 7.1。
Crypto Interface 模块提供一个统一的接口来管理不同的加密硬件和软件解决方案,如 HSM、SHE 或基于软件的 CDD。因此,多个底层内部和外部加密硬件以及软件解决方案可由 Crypto Service Manager 模块基于 Crypto Interface 维护的映射方案加以使用。
2 缩略语和缩写
下表包含 AUTOSAR 术语表 [7] 中未涉及的、但与 Crypto Interface 模块相关的缩略语和缩写:
| 缩写 | 描述 |
|---|---|
| CDD | 复杂驱动 (Complex Device Driver) |
| CSM | 加密服务管理器 (Crypto Service Manager) |
| CRYIF | 加密接口 (Crypto Interface) |
| CRYPTO | 加密驱动 (Crypto Driver) |
| DET | 默认错误追踪器 (Default Error Tracer) |
| HSM | 硬件安全模块 (Hardware Security Module) |
| HW | 硬件 (Hardware) |
| SHE | 安全硬件扩展 (Security Hardware Extension) |
| SW | 软件 (Software) |
2.1 术语表
| 术语 | 描述 |
|---|---|
| Crypto Driver Object (加密驱动对象) | Crypto Driver Object 是加密模块(硬件或软件)的一个实例,能够执行一种或多种不同的加密操作。 |
| Key (密钥) | 密钥可由 CSM 中的作业引用。在 Crypto Driver 中,密钥引用特定的密钥类型。 |
| Key Type (密钥类型) | 密钥类型由对若干密钥元素的引用构成。密钥类型通常由 Crypto Driver 的供应商预配置。 |
| Key Element (密钥元素) | 密钥元素用于存储数据。该数据可以是例如密钥材料,或 AES 加密所需的 IV。它也可用于配置密钥管理功能的行为。 |
| Channel (通道) | 通道是从 CSM 队列经 Crypto Interface 到特定 Crypto Driver Object 的路径。 |
| Job (作业) | 作业是已配置的加密原语的一个实例。 |
| Crypto Primitive (加密原语) | 加密原语是已配置加密算法的一个实例。 |
| Operation (操作) | 加密原语的操作声明应执行该加密原语的哪一部分。有三种不同的操作: START:表示加密原语的全新请求,并应取消之前的所有请求; UPDATE:表示加密原语期望输入数据; FINISH:表示在此部分之后所有数据均已完全送入,加密原语可以完成计算。也可以通过将 operation mode 参数的对应位串接在一起,一次执行多个操作。 |
| Priority (优先级) | 作业的优先级定义其重要性。优先级越高(值越大),作业被越立即地执行。加密作业的优先级是配置的一部分。 |
| Processing (处理模式) | 指示作业的处理方式。 异步 (Asynchronous):调用对应函数时作业不会立即被处理。通常,当作业完成时通过回调函数通知调用者。 同步 (Synchronous):调用对应函数时作业被立即处理。函数返回时即可获得结果。 |
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 Driver —
AUTOSAR_SWS_CryptoDriver.pdf - [5] AUTOSAR Specification of Crypto Service Manager —
AUTOSAR_SWS_CryptoServiceManager.pdf - [6] AUTOSAR Requirements on Crypto Modules —
AUTOSAR_SRS_CryptoStack.pdf - [7] Glossary —
AUTOSAR_TR_Glossary
3.2 相关标准和规范
- [8] IEC 7498-1 The Basic Model, IEC Norm, 1994
3.3 相关规范
AUTOSAR 提供了基础软件通用规范 (SWS BSW General) [3],该规范同样适用于 Crypto Interface。因此,SWS BSW General [3] 应被视为 Crypto Interface 的附加且必需的规范。
4 约束和假设
4.1 限制
Crypto Interface 被专门设计为可与一个或多个底层 Crypto Driver 一起工作。覆盖不同硬件处理单元或核心的若干 Crypto Driver 模块仅由 Crypto Driver 规范 [4] 中规定的通用接口表示。任何基于软件的 Crypto Driver 都应实现为具有相同接口的 CDD。
4.2 对汽车域的适用性
Crypto Interface 可在需要使用安全功能的所有域应用中使用。
5 对其他模块的依赖
[SWS_CryIf_00001] ⌈ Crypto Interface (CRYIF) 应能够由 Crypto Service Manager (CSM) 调用,并将其服务请求转发到底层 Crypto Driver。⌋()
[SWS_CryIf_00002] ⌈ CRYIF 应能够访问底层 Crypto Driver,以使用其加密服务计算结果。这些结果应由 CRYIF 返回给 CSM。⌋()
5.1 文件结构
5.1.1 代码文件结构
[SWS_CryIf_00003] ⌈ 代码文件结构不应在本规范中完整定义。⌋()
[SWS_CryIf_00004] ⌈ 代码文件结构应包含一个源文件 CryIf.c,其中包含整个 CRYIF 代码。⌋()
6 需求可追溯性
完整可追溯性表(涵盖 SRS_BSW_00101、SRS_BSW_00358、SRS_BSW_00359、SRS_BSW_00360、SRS_BSW_00407、SRS_BSW_00414、SRS_CryptoStack_00034、SRS_CryptoStack_00086、SWS_BSW_00050、SWS_BSW_00216 等到 SWS_CryIf_xxx 的映射)请参阅原始 PDF 文档第 11-12 页。
7 功能规范
Crypto Interface 位于 Crypto Service Manager 与底层加密驱动之间,是所有上层 (BSW) 访问加密操作的唯一接口。Crypto Interface 也是加密驱动的唯一使用者,并提供统一的接口来管理不同的加密硬件和软件解决方案。抽象层封装了不同的硬件和软件访问机制,因此 Crypto Interface 的实现独立于底层可由硬件或软件实现的 Crypto Driver。
它还确保对加密服务的并发访问,以使同时处理多个加密任务成为可能。
图 7.1:AUTOSAR 分层视图中加密接口的位置
7.1 错误分类
7.1.1 开发错误
[SWS_CryIf_00009] 开发错误类型 ⌈
| 错误类型 | 相关错误代码 | 值(十六进制) |
|---|---|---|
| 在 CRYIF 模块初始化之前调用 API 请求 | CRYIF_E_UNINIT | 0x00 |
| CRYIF 模块初始化失败 | CRYIF_E_INIT_FAILED | 0x01 |
| 使用无效参数(空指针)调用 API 请求 | CRYIF_E_PARAM_POINTER | 0x02 |
| 使用无效参数(超出范围)调用 API 请求 | CRYIF_E_PARAM_HANDLE | 0x03 |
| 使用无效参数(无效值)调用 API 请求 | CRYIF_E_PARAM_VALUE | 0x04 |
| 源密钥元素大小与目标密钥元素大小不匹配 | CRYIF_E_KEY_SIZE_MISMATCH | 0x05 |
⌋ (SRS_CryptoStack_00086)
7.1.2 运行时错误
无运行时错误。
7.1.3 瞬态故障
无瞬态故障。
7.1.4 生产错误
无生产错误。
7.1.5 扩展生产错误
无扩展生产错误。
8 API 规范
8.1 导入类型
[SWS_CryIf_00011] ⌈ 导入的类型
| 模块 | 头文件 | 导入的类型 |
|---|---|---|
| Csm | <none> |
Crypto_JobType |
<none> |
Crypto_VerifyResultType | |
| Rte_Csm_Type.h | Csm_ResultType | |
| Std_Types | StandardTypes.h | Std_ReturnType |
| StandardTypes.h | Std_VersionInfoType |
⌋()
加密栈 API 使用 Std_ReturnType 的以下扩展:
[SWS_CryIf_00012] ⌈
| 范围 | 描述 |
|---|---|
CRYPTO_E_BUSY = 0x02 |
服务请求失败,因为服务仍然繁忙 |
CRYPTO_E_SMALL_BUFFER = 0x03 |
服务请求失败,因为提供的缓冲区太小,无法存储结果 |
CRYPTO_E_ENTROPY_EXHAUSTION = 0x04 |
服务请求失败,因为随机数生成器的熵已用尽 |
CRYPTO_E_QUEUE_FULL = 0x05 |
服务请求失败,因为队列已满 |
CRYPTO_E_KEY_READ_FAIL = 0x06 |
服务请求失败,因为不允许提取密钥元素 |
CRYPTO_E_KEY_WRITE_FAIL = 0x07 |
服务请求失败,因为写入访问失败 |
CRYPTO_E_KEY_NOT_AVAILABLE = 0x08 |
服务请求失败,因为密钥不可用 |
CRYPTO_E_KEY_NOT_VALID = 0x09 |
服务请求失败,因为密钥无效 |
CRYPTO_E_KEY_SIZE_MISMATCH = 0x0A |
服务请求失败,因为密钥大小不匹配 |
CRYPTO_E_JOB_CANCELED = 0x0C |
服务请求失败,因为作业已被取消 |
CRYPTO_E_KEY_EMPTY = 0x0D |
服务请求失败,因为源密钥元素未初始化 |
| Description | -- |
| Available via | CryIf.h |
⌋()
加密栈 API 使用 CSM 模块中的密钥元素索引定义。
8.2 类型定义
[SWS_CryIf_91118] ⌈
| 字段 | 内容 |
|---|---|
| Name | CryIf_ConfigType |
| Type | Structure |
| Range | implementation specific — 配置数据结构的内容是实现特定的 |
| Description | CryIf 模块的配置数据结构 |
| Available via | CryIf.h |
⌋ (SWS_BSW_00216)
没有其他类型定义。
8.3 函数定义
这是为上层模块提供的函数列表。
8.3.1 通用 API
8.3.1.1 CryIf_Init
[SWS_CryIf_91000] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_Init |
| Syntax | void CryIf_Init(const CryIf_ConfigType* configPtr) |
| Service ID[hex] | 0x00 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | configPtr — 指向所选配置结构的指针 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | None |
| Description | 初始化 CRYIF 模块。 |
| Available via | CryIf.h |
⌋ (SRS_BSW_00101, SRS_BSW_00358, SRS_BSW_00414)
[SWS_CryIf_91019] ⌈ 配置指针 configPtr 应始终为空指针值。⌋ (SWS_BSW_00050)
配置指针 configPtr 当前未使用,因此应设置为空指针值。
[SWS_CryIf_00014] ⌈ 如果 CRYIF 模块的初始化失败,CRYIF 应向 DET 报告 CRYIF_E_INIT_FAILED。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00015] ⌈ 服务 CryIf_Init() 应初始化 CRYIF 的全局变量和数据结构,包括标志和缓冲区。⌋()
8.3.1.2 CryIf_GetVersionInfo
[SWS_CryIf_91001] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_GetVersionInfo |
| Syntax | void CryIf_GetVersionInfo(Std_VersionInfoType* versioninfo) |
| Service ID[hex] | 0x01 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | versioninfo — 指向存储本模块版本信息的位置的指针 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | void — -- |
| Description | 返回本模块的版本信息。 |
| Available via | CryIf.h |
⌋ (SRS_BSW_00407)
[SWS_CryIf_00016] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_GetVersionInfo 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00017] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_GetVersionInfo 应在参数 versioninfo 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER。⌋ (SRS_CryptoStack_00034)
8.3.2 作业处理接口
8.3.2.1 CryIf_ProcessJob
为了统一单次调用函数和加密服务的流式方法,存在一个接口 CryIf_ProcessJob()。其 Crypto_JobType job 参数包含 Crypto_OperationModeType 标志字段(job->jobPrimitiveInputOutput.mode),可设置为 "START"、"UPDATE"、"FINISH" 或其组合。它显式声明应执行哪些操作。这些操作模式可以混合,并可一次执行多个操作。
要使用 Crypto_ProcessJob() 一次调用处理加密服务,操作模式是 3 种模式 "START|UPDATE|FINISH" 的析取。
[SWS_CryIf_91003] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_ProcessJob |
| Syntax | Std_ReturnType CryIf_ProcessJob(uint32 channelId, Crypto_JobType* job) |
| Service ID[hex] | 0x03 |
| Sync/Async | Sync 或 Async,取决于配置 |
| Reentrancy | Reentrant |
| Parameters (in) | channelId — 保存加密通道的标识符 |
| Parameters (inout) | job — 指向作业配置的指针。包含与用户和原语相关信息的结构。 |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;CRYPTO_E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_KEY_NOT_VALID:请求失败,密钥无效;CRYPTO_E_KEY_SIZE_MISMATCH:请求失败,密钥元素大小错误;CRYPTO_E_QUEUE_FULL:请求失败,队列已满;CRYPTO_E_KEY_READ_FAIL:服务请求失败,因为不允许提取密钥元素;CRYPTO_E_KEY_WRITE_FAIL:服务请求失败,因为写入访问失败;CRYPTO_E_KEY_NOT_AVAILABLE:服务请求失败,因为密钥不可用;CRYPTO_E_SMALL_BUFFER:提供的缓冲区太小,无法存储结果;CRYPTO_E_JOB_CANCELED:服务请求失败,因为同步作业已被取消;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此接口将接收到的作业分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00027] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_ProcessJob 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00028] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_ProcessJob 应在参数 channelId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00029] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_ProcessJob 应在参数 job 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00044] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_ProcessJob() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_ProcessJob() 并传递返回值。⌋()
[SWS_CryIf_00136] ⌈ 如果对某个作业使用了作业处理重定向,则 Crypto Interface 需要将传入的 Crypto Interface 密钥引用和密钥元素引用调整为相应 Crypto Driver 的对应密钥引用和密钥元素引用。⌋()
8.3.2.2 分派密钥 ID
[SWS_CryIf_00133] ⌈ 如果参数 job->jobPrimitiveInfo->primitiveInfo->service 设置为 CRYPTO_KEYSETVALID、CRYPTO_RANDOMSEED、CRYPTO_KEYGENERATE、CRYPTO_KEYDERIVE、CRYPTO_KEYEXCHANGECALCPUBVAL、CRYPTO_KEYEXCHANGECALCSECRET、CRYPTO_CERTIFICATEPARSE 或 CRYPTO_CERTIFICATEVERIFY 之一,则必须设置参数 job->cryptoKeyId,并在适用的情况下设置 job->targetCryptoKeyId。⌋()
[SWS_CryIf_00134] ⌈ 如果参数 job->jobPrimitiveInfo->primitiveInfo->service 设置为 CRYPTO_KEYSETVALID、CRYPTO_RANDOMSEED、CRYPTO_KEYGENERATE、CRYPTO_KEYDERIVE、CRYPTO_KEYEXCHANGECALCPUBVAL、CRYPTO_KEYEXCHANGECALCSECRET、CRYPTO_CERTIFICATEPARSE 或 CRYPTO_CERTIFICATEVERIFY 之一,则参数 job->cryIfKeyId 必须处于范围内;否则函数 CryIf_ProcessJob 应向 DET 报告 CRYPTO_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋()
[SWS_CryIf_00135] ⌈ 如果参数 job->jobPrimitiveInfo->primitiveInfo->service 设置为 CRYPTO_KEYDERIVE 或 CRYPTO_CERTIFICATEVERIFY 之一,则参数 job->cryIfTargetKeyId 必须处于范围内;否则函数 CryIf_ProcessJob 应向 DET 报告 CRYPTO_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋()
8.3.3 作业取消接口
8.3.3.1 CryIf_CancelJob
[SWS_CryIf_91014] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_CancelJob |
| Syntax | Std_ReturnType CryIf_CancelJob(uint32 channelId, Crypto_JobType* job) |
| Service ID[hex] | 0x0e |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | channelId — 保存加密通道的标识符 |
| Parameters (inout) | job — 指向作业配置的指针。包含与用户和原语相关信息的结构。 |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功,作业已被移除;E_NOT_OK:请求失败,无法移除作业 |
| Description | 此接口将作业取消功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00129] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_CancelJob 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00130] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_CancelJob 应在参数 channelId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00131] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_CancelJob 应在参数 job 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00132] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_CancelJob() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_CancelJob() 并传递返回值。⌋()
8.3.4 密钥管理接口
8.3.4.1 密钥设置接口
8.3.4.1.1 CryIf_KeyElementSet
[SWS_CryIf_91004] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyElementSet |
| Syntax | Std_ReturnType CryIf_KeyElementSet(uint32 cryIfKeyId, uint32 keyElementId, const uint8* keyPtr, uint32 keyLength) |
| Service ID[hex] | 0x04 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | cryIfKeyId — 保存要设置其密钥元素的密钥的标识符;keyElementId — 保存要设置的密钥元素的标识符;keyPtr — 保存要设置为密钥元素的密钥数据的指针;keyLength — 包含密钥元素的字节长度 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;CRYPTO_E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_KEY_WRITE_FAIL:请求失败,因为写入访问被拒绝;CRYPTO_E_KEY_NOT_AVAILABLE:请求失败,因为密钥不可用;CRYPTO_E_KEY_SIZE_MISMATCH:请求失败,密钥元素大小与所提供数据的大小不匹配 |
| Description | 此函数应将设置密钥元素功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00049] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyElementSet 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00050] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyElementSet 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00052] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyElementSet 应在参数 keyPtr 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00053] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_KeyElementSet 应在 keyLength 为零时向 DET 报告 CRYIF_E_PARAM_VALUE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00055] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_KeyElementSet() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyElementSet() 并传递返回值。⌋()
8.3.4.1.2 CryIf_KeySetValid
[SWS_CryIf_91005] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeySetValid |
| Syntax | Std_ReturnType CryIf_KeySetValid(uint32 cryIfKeyId) |
| Service ID[hex] | 0x05 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | cryIfKeyId — 保存其密钥元素应设置为有效的密钥的标识符 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;CRYPTO_E_BUSY:请求失败,Crypto Driver Object 繁忙 |
| Description | 此函数应将设置密钥有效功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00056] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeySetValid 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00057] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeySetValid 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00058] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_KeySetValid() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeySetValid() 并传递返回值。⌋()
8.3.4.2 密钥提取接口
8.3.4.2.1 CryIf_KeyElementGet
[SWS_CryIf_91006] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyElementGet |
| Syntax | Std_ReturnType CryIf_KeyElementGet(uint32 cryIfKeyId, uint32 keyElementId, uint8* resultPtr, uint32* resultLengthPtr) |
| Service ID[hex] | 0x06 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | cryIfKeyId — 保存要返回其密钥元素的密钥的标识符;keyElementId — 保存要返回的密钥元素的标识符 |
| Parameters (inout) | resultLengthPtr — 指向存储长度信息的内存位置的指针。调用此函数时,此参数应包含 resultPtr 提供的缓冲区大小。如果密钥元素被配置为允许部分访问,则此参数包含要从密钥元素读取的数据量。大小可能不再等于提供的缓冲区的大小。请求完成后,应存储已存储的数据量。 |
| Parameters (out) | resultPtr — 指向用于返回密钥元素的缓冲区的指针 |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;CRYPTO_E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_KEY_NOT_AVAILABLE:请求失败,请求的密钥元素不可用;CRYPTO_E_KEY_READ_FAIL:请求失败,因为读取访问被拒绝;CRYPTO_E_SMALL_BUFFER:提供的缓冲区太小,无法存储结果;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此函数应将获取密钥元素功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00059] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyElementGet 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00060] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyElementGet 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00062] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyElementGet 应在参数 resultPtr 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00063] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyElementGet 应在参数 resultLengthPtr 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00064] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyElementGet 应在由 resultLengthPtr 指向的值为零时向 DET 报告 CRYIF_E_PARAM_VALUE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00065] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_KeyElementGet() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyElementGet() 并传递返回值。⌋()
8.3.4.3 密钥复制接口
8.3.4.3.1 CryIf_KeyElementCopy
[SWS_CryIf_91015] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyElementCopy |
| Syntax | Std_ReturnType CryIf_KeyElementCopy(uint32 cryIfKeyId, uint32 keyElementId, uint32 targetCryIfKeyId, uint32 targetKeyElementId) |
| Service ID[hex] | 0x0f |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant, but not for the same cryIfKeyId |
| Parameters (in) | cryIfKeyId — 保存要作为源元素的密钥的标识符;keyElementId — 保存要用作复制操作源的密钥元素的标识符;targetCryIfKeyId — 保存要作为目标元素的密钥的标识符;targetKeyElementId — 保存要用作复制操作目标的密钥元素的标识符 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;CRYPTO_E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_KEY_NOT_AVAILABLE:请求失败,请求的密钥元素不可用;CRYPTO_E_KEY_READ_FAIL:请求失败,不允许提取密钥元素;CRYPTO_E_KEY_WRITE_FAIL:请求失败,不允许写入密钥元素;CRYPTO_E_KEY_SIZE_MISMATCH:请求失败,密钥元素大小不兼容;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此函数应将一个密钥的元素复制到目标密钥。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00110] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_KeyElementCopy 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00111] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_KeyElementCopy 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00112] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_KeyElementCopy 应在参数 targetCryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00113] ⌈ 如果 CRYIF 未检测到错误,并且 cryIfKeyId 和 targetCryIfKeyId 位于同一 Crypto Driver 中,则服务 CryIf_KeyElementCopy() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyElementCopy() 并传递返回值。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00114] ⌈ 如果 CRYIF 未检测到错误,并且 cryIfKeyId 和 targetCryIfKeyId 位于不同的 Crypto Driver 中,则服务 CryIf_KeyElementCopy() 应通过使用 Crypto_<vi>_<ai>_KeyElementGet() 获取元素并通过 Crypto_<vi>_<ai>_KeyElementSet() 设置目标密钥元素来复制所提供的密钥元素。⌋()
[SWS_CryIf_00115] ⌈ 如果为 CRYIF 启用了开发错误检测:如果 cryIfKeyId 请求的密钥元素在 targetCryIfKeyId 中可用,并且源元素大小与目标密钥元素大小不匹配,则 CryIf_KeyElementCopy() 应向 DET 报告 CRYIF_E_KEY_SIZE_MISMATCH。⌋ (SRS_CryptoStack_00034)
8.3.4.3.2 CryIf_KeyElementCopyPartial
[SWS_CryIf_91018] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyElementCopyPartial |
| Syntax | Std_ReturnType CryIf_KeyElementCopyPartial(uint32 cryIfKeyId, uint32 keyElementId, uint32 keyElementSourceOffset, uint32 keyElementTargetOffset, uint32 keyElementCopyLength, uint32 targetCryIfKeyId, uint32 targetKeyElementId) |
| Service ID[hex] | 0x12 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant, but not for the same cryIfKeyId |
| Parameters (in) | cryIfKeyId — 保存要作为源元素的密钥的标识符;keyElementId — 保存要用作复制操作源的密钥元素的标识符;keyElementSourceOffset — 源密钥元素的偏移量,指示复制操作的起始索引;keyElementTargetOffset — 目标密钥元素的偏移量,指示复制操作的起始索引;keyElementCopyLength — 指定应复制的字节数;targetCryIfKeyId — 保存要作为目标元素的密钥的标识符;targetKeyElementId — 保存要用作复制操作目标的密钥元素的标识符 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_KEY_NOT_AVAILABLE:请求失败,请求的密钥元素不可用;CRYPTO_E_KEY_READ_FAIL:请求失败,不允许提取密钥元素;CRYPTO_E_KEY_WRITE_FAIL:请求失败,不允许写入密钥元素;CRYPTO_E_KEY_SIZE_MISMATCH:请求失败,密钥元素大小不兼容;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 将一个密钥元素复制到另一个密钥元素。keyElementOffsets 和 keyElementCopyLength 允许仅将源密钥元素的一部分复制到目标密钥元素。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00137] ⌈ 如果 Crypto Interface 尚未初始化,并且为 Crypto Interface 启用了开发错误检测,则函数 CryIf_KeyElementCopyPartial 应向 DET 报告 CRYPTO_E_UNINIT 并返回 E_NOT_OK。⌋()
[SWS_CryIf_00138] ⌈ 如果 cryIfKeyId、keyElementId、targetKeyElementId 或 targetCryIfKeyId 超出范围,并且为 Crypto Interface 启用了开发错误检测,则函数 CryIf_KeyElementCopyPartial 应向 DET 报告 CRYPTO_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋()
[SWS_CryIf_00139] ⌈ 如果 CRYIF 未检测到错误,并且 cryIfKeyId 和 targetCryIfKeyId 位于同一 Crypto Driver 中,则服务 CryIf_KeyElementCopyPartial() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyElementCopyPartial() 并传递返回值。⌋(SRS_CryptoStack_00034)
[SWS_CryIf_00140] ⌈ 如果 CRYIF 未检测到错误,并且 cryIfKeyId 和 targetCryIfKeyId 位于不同的 Crypto Driver 中,则服务 CryIf_KeyElementCopyPartial() 应通过使用 Crypto_<vi>_<ai>_KeyElementGet() 获取元素、将部分数据复制到目标,然后通过 Crypto_<vi>_<ai>_KeyElementSet() 设置目标密钥元素来复制所提供的密钥元素。⌋()
8.3.4.3.3 CryIf_KeyCopy
[SWS_CryIf_91016] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyCopy |
| Syntax | Std_ReturnType CryIf_KeyCopy(uint32 cryIfKeyId, uint32 targetCryIfKeyId) |
| Service ID[hex] | 0x10 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant, but not for the same cryIfKeyId |
| Parameters (in) | cryIfKeyId — 保存要作为源元素的密钥的标识符;targetCryIfKeyId — 保存要作为目标元素的密钥的标识符 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_KEY_NOT_AVAILABLE:请求失败,请求的密钥元素不可用;CRYPTO_E_KEY_READ_FAIL:请求失败,不允许提取密钥元素;CRYPTO_E_KEY_WRITE_FAIL:请求失败,不允许写入密钥元素;CRYPTO_E_KEY_SIZE_MISMATCH:请求失败,密钥元素大小不兼容;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此函数应将源密钥的所有密钥元素复制到目标密钥。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00116] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_KeyCopy 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00117] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_KeyCopy 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00118] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_KeyCopy 应在参数 targetCryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00119] ⌈ 如果 CRYIF 未检测到错误,并且 cryIfKeyId 和 targetCryIfKeyId 位于同一 Crypto Driver 中,则服务 CryIf_KeyCopy() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyCopy() 并传递返回值。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00120] ⌈ 如果 CRYIF 未检测到错误,并且 cryIfKeyId 和 targetCryIfKeyId 位于不同的 Crypto Driver 中,则服务 CryIf_KeyCopy() 应通过使用 Crypto_<vi>_<ai>_KeyElementGet() 获取元素并通过 Crypto_<vi>_<ai>_KeyElementSet() 设置目标密钥元素来复制所提供的密钥元素。⌋()
[SWS_CryIf_00121] ⌈ 如果为 CRYIF 启用了开发错误检测:对于 cryIfKeyId 中所有在 targetCryIfKeyId 中可用的密钥元素,如果源元素大小与目标密钥元素大小不匹配,则 CryIf_KeyCopy() 应向 DET 报告 CRYIF_E_KEY_SIZE_MISMATCH。⌋ (SRS_CryptoStack_00034)
8.3.4.4 密钥生成接口
8.3.4.4.1 CryIf_RandomSeed
[SWS_CryIf_91007] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_RandomSeed |
| Syntax | Std_ReturnType CryIf_RandomSeed(uint32 cryIfKeyId, const uint8* seedPtr, uint32 seedLength) |
| Service ID[hex] | 0x07 |
| Sync/Async | Sync 或 Async,取决于配置 |
| Reentrancy | Reentrant |
| Parameters (in) | cryIfKeyId — 保存应为其生成新种子的密钥的标识符;seedPtr — 保存指向包含用于喂入种子的数据的内存位置的指针;seedLength — 包含种子的字节长度 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败 |
| Description | 此函数应将随机种子功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00068] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_RandomSeed 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00069] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_RandomSeed 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00070] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_RandomSeed 应在参数 seedPtr 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00071] ⌈ 如果为 CRYIF 启用了开发错误检测:函数 CryIf_RandomSeed 应在 seedLength 为零时向 DET 报告 CRYIF_E_PARAM_VALUE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00072] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_RandomSeed() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_RandomSeed() 并传递返回值。⌋()
8.3.4.4.2 CryIf_KeyGenerate
[SWS_CryIf_91008] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyGenerate |
| Syntax | Std_ReturnType CryIf_KeyGenerate(uint32 cryIfKeyId) |
| Service ID[hex] | 0x08 |
| Sync/Async | Sync 或 Async,取决于配置 |
| Reentrancy | Reentrant |
| Parameters (in) | cryIfKeyId — 保存应使用生成值更新的密钥的标识符 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此函数应将密钥生成功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00073] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyGenerate 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00074] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyGenerate 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00075] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_KeyGenerate() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyGenerate() 并传递返回值。⌋()
8.3.4.5 密钥派生接口
8.3.4.5.1 CryIf_KeyDerive
[SWS_CryIf_91009] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyDerive |
| Syntax | Std_ReturnType CryIf_KeyDerive(uint32 cryIfKeyId, uint32 targetCryIfKeyId) |
| Service ID[hex] | 0x09 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | cryIfKeyId — 保存用于密钥派生的密钥的标识符;targetCryIfKeyId — 保存用于存储派生密钥的密钥的标识符 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此函数应将密钥派生功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00076] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyDerive 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00077] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyDerive 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00122] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyDerive 应在参数 targetCryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00081] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_KeyDerive() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyDerive() 并传递返回值。⌋()
密钥派生服务需要 salt 和 password 来派生新密钥。因此,salt 和 password 作为密钥元素存储在由 cryIfKeyId 引用的密钥中。
8.3.4.6 密钥交换接口
8.3.4.6.1 CryIf_KeyExchangeCalcPubVal
[SWS_CryIf_91010] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyExchangeCalcPubVal |
| Syntax | Std_ReturnType CryIf_KeyExchangeCalcPubVal(uint32 cryIfKeyId, uint8* publicValuePtr, uint32* publicValueLengthPtr) |
| Service ID[hex] | 0x0a |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | cryIfKeyId — 保存应用于密钥交换协议的密钥的标识符 |
| Parameters (inout) | publicValueLengthPtr — 指向存储公钥长度信息的内存位置的指针。调用此函数时,此参数应包含 publicValuePtr 提供的缓冲区大小。请求完成后,应存储返回值的实际长度。 |
| Parameters (out) | publicValuePtr — 包含指向应存储公钥的数据的指针 |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_SMALL_BUFFER:提供的缓冲区太小,无法存储结果;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此函数应将密钥交换公钥值计算功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00082] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcPubVal 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00083] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcPubVal 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00084] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcPubVal 应在参数 publicValuePtr 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00085] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcPubVal 应在参数 pubValueLengthPtr 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00086] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcPubVal 应在由 pubValueLengthPtr 指向的值为零时向 DET 报告 CRYIF_E_PARAM_VALUE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00087] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_KeyExchangeCalcPubVal() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyExchangeCalcPubVal() 并传递返回值。⌋()
8.3.4.6.2 CryIf_KeyExchangeCalcSecret
[SWS_CryIf_91011] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_KeyExchangeCalcSecret |
| Syntax | Std_ReturnType CryIf_KeyExchangeCalcSecret(uint32 cryIfKeyId, const uint8* partnerPublicValuePtr, uint32 partnerPublicValueLength) |
| Service ID[hex] | 0x0b |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | cryIfKeyId — 保存应用于密钥交换协议的密钥的标识符;partnerPublicValuePtr — 保存指向包含对方公钥的内存位置的指针;partnerPublicValueLength — 包含对方公钥的字节长度 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_SMALL_BUFFER:提供的缓冲区太小,无法存储结果;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此函数应将密钥交换共享密钥计算功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00090] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcSecret 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00091] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcSecret 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00092] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcSecret 应在参数 partnerPublicValuePtr 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00094] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_KeyExchangeCalcSecret 应在 partnerPubValueLength 为零时向 DET 报告 CRYIF_E_PARAM_VALUE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00095] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_KeyExchangeCalcSecret() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_KeyExchangeCalcSecret() 并传递返回值。⌋()
8.3.4.7 证书接口
8.3.4.7.1 CryIf_CertificateParse
[SWS_CryIf_91012] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_CertificateParse |
| Syntax | Std_ReturnType CryIf_CertificateParse(uint32 cryIfKeyId) |
| Service ID[hex] | 0x0c |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | cryIfKeyId — 保存应解析的密钥的标识符 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;E_BUSY:请求失败,Crypto Driver Object 繁忙;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 此函数应将证书解析功能分派给已配置的 Crypto Driver Object。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00098] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CertificateParse 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00099] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CertificateParse 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00104] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_CertificateParse() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_CertificateParse() 并传递返回值。⌋ (SRS_CryptoStack_00034)
8.3.4.7.2 CryIf_CertificateVerify
[SWS_CryIf_91017] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_CertificateVerify |
| Syntax | Std_ReturnType CryIf_CertificateVerify(uint32 cryIfKeyId, uint32 verifyCryIfKeyId, Crypto_VerifyResultType* verifyPtr) |
| Service ID[hex] | 0x11 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant, but not for the same cryIfKeyId |
| Parameters (in) | cryIfKeyId — 保存用于验证证书的密钥的标识符;verifyCryIfKeyId — 保存包含待验证证书的密钥的标识符 |
| Parameters (inout) | None |
| Parameters (out) | verifyPtr — 保存指向将包含证书验证结果的内存位置的指针 |
| Return value | Std_ReturnType — E_OK:请求成功;E_NOT_OK:请求失败;CRYPTO_E_KEY_EMPTY:由于源密钥元素未初始化而请求失败 |
| Description | 使用由 cryIfKeyId 引用的密钥存储的证书验证由 verifyCryIfKeyId 引用的密钥存储的证书。 |
| Available via | CryIf.h |
⌋()
[SWS_CryIf_00123] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CertificateVerify 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00124] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CertificateVerify 应在参数 cryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00125] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CertificateVerify 应在参数 validateCryIfKeyId 超出范围时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00126] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CertificateVerify 应在由 validateCryIfKeyId 和 cryIfKeyId 标识的密钥不在同一 Crypto Driver 中时向 DET 报告 CRYIF_E_PARAM_HANDLE 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00127] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CertificateVerify 应在参数 verifyPtr 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER 并返回 E_NOT_OK。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00128] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_CertificateVerify() 应调用映射到该服务的驱动配置的 Crypto_<vi>_<ai>_CertificateVerify() 并传递返回值。⌋()
8.4 回调通知
这是为其他模块提供的函数列表。
8.4.1 CryIf_CallbackNotification
[SWS_CryIf_91013] ⌈
| 字段 | 内容 |
|---|---|
| Service name | CryIf_CallbackNotification |
| Syntax | void CryIf_CallbackNotification(Crypto_JobType* job, Std_ReturnType result) |
| Service ID[hex] | 0x0d |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | job — 指向已完成作业的信息结构。它包含一个 callbackID 用于标识已完成的作业;result — 包含加密操作的结果 |
| Parameters (inout) | None |
| Parameters (out) | None |
| Return value | void -- |
| Description | 通知 CRYIF 关于带加密操作结果的请求的完成。 |
| Available via | CryIf.h |
⌋ (SRS_BSW_00359, SRS_BSW_00360)
[SWS_CryIf_00107] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CallbackNotification 应在模块尚未初始化时向 DET 报告 CRYIF_E_UNINIT。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00108] ⌈ 如果为 CRYIF 模块启用了开发错误检测:函数 CryIf_CallbackNotification 应在参数 job 为空指针时向 DET 报告 CRYIF_E_PARAM_POINTER。⌋ (SRS_CryptoStack_00034)
[SWS_CryIf_00109] ⌈ 如果 CRYIF 未检测到错误,服务 CryIf_CallbackNotification() 应调用 Csm_CallbackNotification() 并传递结果。⌋()
8.5 预期接口
8.5.1 必需接口
本章定义了满足 CryIf 模块核心功能所需的所有接口。
| API 函数 | 头文件 | 描述 |
|---|---|---|
Csm_CallbackNotification |
Csm.h |
通知 CSM 一个作业已完成。此函数由底层 (CRYIF) 使用。 |
变体: {ecuc(Csm/CsmJob/CsmJobUsePort == false)} && {ecuc(Csm/CsmJobs/CsmJob.CsmJobPrimitiveRef->CsmPrimitives/{Primitive}Config/{Primitive}Processing == CRYPTO_PROCESSING_ASYNC)} |
8.5.2 可选接口
本章定义了满足 CryIf 模块可选功能所需的所有接口。
无。
9 序列图
无。
10 配置规范
第 10.1 章规定 CRYIF 模块的结构(容器)和参数。第 10.2 章另外规定 CRYIF 模块的发布信息。
10.1 容器和配置参数
以下各章总结了所有配置参数。参数的详细含义在第 7 章和第 8 章中描述。
注意:配置容器中的 ID 应是连续的、无间隔的,并应从零开始。
10.1.1 变体
有关详细信息,请参阅 SWS_BSWGeneral 中的第 10.1.2 章"变体"。
10.1.2 CryIf
| SWS Item | ECUC_CryIf_00001 |
|---|---|
| Module Name | CryIf |
| Module Description | 加密接口的配置 |
| Post-Build Variant Support | false |
| 包含的容器 | 多重性 | 范围 / 依赖 |
|---|---|---|
CryIfChannel |
0..* | 用于纳入 CryIfChannel 的容器 |
CryIfGeneral |
1 | 用于纳入 CryIfGeneral 的容器 |
CryIfKey |
0..* | 用于纳入 CryIfKey 的容器 |
10.1.3 CryIfGeneral
| SWS Item | ECUC_CryIf_00009 |
|---|---|
| Container Name | CryIfGeneral |
| Description | 用于纳入 CryIfGeneral 的容器 |
配置参数
ECUC_CryIf_00010:
| 字段 | 内容 |
|---|---|
| Name | CryIfDevErrorDetect |
| Parent Container | CryIfGeneral |
| Description | 启用或禁用开发错误检测和通知。true:启用检测和通知;false:禁用检测和通知 |
| Multiplicity | 1 |
| Type | EcucBooleanParamDef |
| Default value | false |
| Scope / Dependency | scope: local |
ECUC_CryIf_00011:
| 字段 | 内容 |
|---|---|
| Name | CryIfVersionInfoApi |
| Parent Container | CryIfGeneral |
| Description | 启用和禁用 API CryIf_GetVersionInfo() 可用性的预处理开关。true:API CryIf_GetVersionInfo() 可用;false:API CryIf_GetVersionInfo() 不可用 |
| Multiplicity | 1 |
| Type | EcucBooleanParamDef |
| Default value | false |
| Scope / Dependency | scope: local |
不包含子容器。
10.1.4 CryIfChannel
| SWS Item | ECUC_CryIf_00002 |
|---|---|
| Container Name | CryIfChannel |
| Description | 用于纳入 CryIfChannel 的容器 |
配置参数
ECUC_CryIf_00004:
| 字段 | 内容 |
|---|---|
| Name | CryIfChannelId |
| Parent Container | CryIfChannel |
| Description | 加密通道的标识符。指定 CSM 队列连接到哪个加密通道。 |
| Multiplicity | 1 |
| Type | EcucIntegerParamDef(为此参数生成的符号名称) |
| Range | 0 .. 4294967295 |
| Default value | -- |
| Post-Build Variant Multiplicity | false |
| Post-Build Variant Value | false |
| Scope / Dependency | scope: local |
ECUC_CryIf_00005:
| 字段 | 内容 |
|---|---|
| Name | CryIfDriverObjectRef |
| Parent Container | CryIfChannel |
| Description | 此参数引用一个 Crypto Driver Object。指定加密通道连接到哪个 Crypto Driver Object。 |
| Multiplicity | 1 |
| Type | 对 [CryptoDriverObject] 的符号名称引用 |
| Post-Build Variant Multiplicity | false |
| Post-Build Variant Value | false |
| Scope / Dependency | scope: local |
不包含子容器。
10.1.5 CryIfKey
| SWS Item | ECUC_CryIf_00003 |
|---|---|
| Container Name | CryIfKey |
| Description | 用于纳入 CryIfKey 的容器 |
配置参数
ECUC_CryIf_00007:
| 字段 | 内容 |
|---|---|
| Name | CryIfKeyId |
| Parent Container | CryIfKey |
| Description | CryIf 密钥的标识符。指定 CSM 密钥映射到哪个 CryIf 密钥。 |
| Multiplicity | 1 |
| Type | EcucIntegerParamDef(为此参数生成的符号名称) |
| Range | 0 .. 4294967295 |
| Default value | -- |
| Post-Build Variant Value | false |
| Scope / Dependency | scope: local |
ECUC_CryIf_00008:
| 字段 | 内容 |
|---|---|
| Name | CryIfKeyRef |
| Parent Container | CryIfKey |
| Description | 此参数引用 Crypto Driver 密钥。指定 CryIf 密钥映射到哪个 Crypto Driver 密钥。 |
| Multiplicity | 1 |
| Type | 对 [CryptoKey] 的符号名称引用 |
| Post-Build Variant Value | false |
| Scope / Dependency | scope: local |
不包含子容器。
10.2 发布信息
发布信息包含由 SW 模块实施者定义的数据,这些数据在模块适配(即配置)到实际硬件/软件环境时不会更改。因此它包含版本和制造商信息。
如适用,下面列出了其他模块特定的发布参数。
无。
翻译说明
- 本文档为 AUTOSAR SWS 806《Specification of Crypto Interface》(CP 4.4.0) 的中文翻译;
- 文档标识号:806;
- 文档共 41 页,已翻译所有 10 个章节,包括完整的 API 规范、所有函数声明以及配置规范;
- 保留了所有 AUTOSAR 方框符、API 标识符、模块缩写、算法名和需求 ID;
- 翻译以保证技术含义准确为前提,语句尽量贴近 AUTOSAR 中文术语库常用译法。