# 加密服务的使用 (Utilization of Crypto Services) **AUTOSAR CP Release 4.4.0** > 翻译说明:本文档为 AUTOSAR 经典平台 (CP) Release 4.4.0 中 EXP 文档 602《加密服务的使用》的中文翻译版本。原始英文文档中的 AUTOSAR 方框符 `⌈⌋`、API 标识符(如 `Crypto_ProcessJob`)、模块缩写(Crypto、CryIf、Csm、KeyM 等)、加密算法名(AES、SHA、RSA、ECC 等)以及文档交叉引用均予以保留。 ## 文档标识 | 项目 | 内容 | |---|---| | 文档标题 (Document Title) | 加密服务的使用 (Utilization of Crypto Services) | | 文档所有者 (Document Owner) | AUTOSAR | | 文档责任方 (Document Responsibility) | AUTOSAR | | 文档标识号 (Document Identification No) | 602 | | 文档状态 (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 | 移除对 Crypto Abstraction Library 的引用;编辑性修订 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 编辑性修订 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 编辑性修订 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 编辑性修订 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 编辑性修订 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 初始发布 | --- ## 目录 (Table of Contents) - [1 引言](#1-引言) - [1.1 文档目的](#11-文档目的) - [1.2 文档范围](#12-文档范围) - [1.3 限制](#13-限制) - [2 缩略语和缩写](#2-缩略语和缩写) - [3 相关文档](#3-相关文档) - [3.1 输入文档](#31-输入文档) - [3.2 相关标准和规范](#32-相关标准和规范) - [4 加密栈概述](#4-加密栈概述) - [4.1 栈架构](#41-栈架构) - [4.2 加密服务管理器 (CSM)](#42-加密服务管理器-csm) - [4.3 加密接口 (CRYIF)](#43-加密接口-cryif) - [4.4 加密驱动 (CRYPTO)](#44-加密驱动-crypto) - [5 使用方面](#5-使用方面) - [5.1 作业概念](#51-作业概念) - [5.1.1 同步和异步模式](#511-同步和异步模式) - [5.1.2 队列和优先级](#512-队列和优先级) - [5.1.3 流式方法与单次调用方法](#513-流式方法与单次调用方法) - [5.2 密钥处理](#52-密钥处理) - [5.3 配置理念](#53-配置理念) - [5.3.1 加密功能注册](#531-加密功能注册) - [5.3.2 项目配置](#532-项目配置) - [6 示例](#6-示例) - [6.1 模块中的配置](#61-模块中的配置) - [6.2 涉及的 API](#62-涉及的-api) --- ## 1 引言 ### 1.1 文档目的 本文档描述了自 AUTOSAR 4.3 起开始规范的 AUTOSAR 加密功能的预期使用方法。文档的目的是向用户/集成商介绍 AUTOSAR 所支持的加密功能的基本概念。 ### 1.2 文档范围 本文档的范围是帮助加密栈的集成商和使用者理解: - AUTOSAR 加密栈的架构; - 各模块的整体表示及其相互关系; - 加密硬件与软件的集成。 ### 1.3 限制 无限制。 --- ## 2 缩略语和缩写 | 缩略语 | 描述 | |---|---| | BSW | 基础软件 (Basic Software) | | CDD | 复杂驱动 (Complex Device Driver) | | CRYIF | 加密接口 (Crypto Interface) | | CRYPTO | 加密驱动 (Crypto Driver) | | CSM | 加密服务管理器 (Crypto Service Manager) | | HSM | 硬件安全模块 (Hardware Security Module) | | NvM | 非易失性存储管理器 (NVRAM Manager) | | RTE | 运行时环境 (Runtime Environment) | | SHE | 安全硬件扩展 (Security Hardware Extension) | | SWC | 软件组件 (Software Component) | ### 2.1 术语表 | 术语 | 描述 | |---|---| | Crypto Driver Object (加密驱动对象) | 一个 Crypto Driver 实现一个或多个 Crypto Driver Object。Crypto Driver Object 可在硬件或软件中提供不同的加密原语。同一 Crypto Driver 的各 Crypto Driver Object 之间相互独立。每个 Crypto Driver Object 仅有一个工作区(即同一时刻只能执行一种加密原语)。 | | Crypto Primitive (加密原语) | 加密原语是由 Crypto Driver Object 实现的已配置加密算法的一个实例。 | | Job (作业) | 作业是已配置的加密原语以及所引用密钥的组合。 | | Key (密钥) | 密钥可由 CSM 中的作业或密钥管理功能引用。在 Crypto Driver 中,密钥引用特定的密钥类型。 | | Key Element (密钥元素) | 密钥元素用于存储数据。该数据可以是密钥材料,或 AES 加密所需的 IV 等。也可用于配置密钥管理功能的行为。 | | Key Type (密钥类型) | 密钥类型由对若干密钥元素的引用构成。密钥类型通常由 Crypto Driver 的供应商预配置。 | | Processing (处理模式) | 指示作业的处理方式。**异步 (Asynchronous)**:调用对应函数时作业不会立即被处理。通常,当作业完成时通过回调函数通知调用者。**同步 (Synchronous)**:调用对应函数时作业被立即处理。函数返回时即可获得结果。 | --- ## 3 相关文档 ### 3.1 输入文档 - [1] Specification of Crypto Driver — `AUTOSAR_SWS_CryptoDriver.pdf` - [2] Specification of Crypto Interface — `AUTOSAR_SWS_CryptoInterface.pdf` - [3] Specification of Crypto Service Manager — `AUTOSAR_SWS_CryptoServiceManager.pdf` - [4] Layered Software Architecture — `AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf` ### 3.2 相关标准和规范 无。 --- ## 4 加密栈概述 加密服务包括哈希计算、非对称签名验证、对称数据加密等。在 AUTOSAR 中,这些服务由 AUTOSAR 加密栈提供,即加密服务管理器 (CSM)、底层的加密接口 (CRYIF) 以及加密驱动 (CRYPTO)。 CSM 服务所使用的加密算法由加密软件或硬件模块实现——这两者均超出 AUTOSAR 的范围,未在 AUTOSAR 中规定。硬件实现严重依赖于目标平台所支持的功能。软件实现缺乏例如安全密钥存储等支持,必须依赖 AUTOSAR 栈所提供的内存服务。 AUTOSAR 加密栈不提供安全概念 (security concept)。它提供可用于支持和实现某种安全概念的加密服务。 ### 4.1 栈架构 AUTOSAR 加密栈跨越 AUTOSAR 分层架构 [4] 的所有层级: > **图 1:AUTOSAR 分层视图中加密栈的位置 [3]** (i) 在最低层——微控制器抽象层 (Microcontroller Abstraction Layer)——是加密驱动 (CRYPTO)。这些模块持有不同加密硬件和软件实例(例如外部 HSM)的实际实现。加密栈的一个特定特性是:可以存在多个 Crypto Driver 模块; (ii) CRYIF 模块位于硬件抽象层 (Hardware Abstraction Layer)。它为 CSM 提供到可用 Crypto Driver 模块的通用接口,并使访问与底层 Crypto Driver 无关; (iii) CSM 位于服务层 (Service Layer)。它提供一个抽象层,通过 RTE 端口机制为应用提供对加密服务的标准化访问。其他 BSW 模块和 CDD 可以使用 CSM 提供的 C-API 调用来使用加密服务。 ### 4.2 加密服务管理器 (CSM) CSM 控制一个或多个客户端对一个或多个同步/异步加密服务的并发访问。它提供优先级队列,以管理那些不能由专用 CRYPTO 直接处理的作业。CSM 所提供的功能涵盖以下领域: - 哈希计算; - 消息认证码的生成与验证; - 数字签名的生成与验证; - 使用对称或非对称算法的加密和解密; - 随机数生成; - 安全计数器; - 密钥管理操作,如密钥设置与生成。 CSM 服务是通用的,CSM 允许不同的应用使用相同的服务但采用不同的加密算法。这是可行的,因为可以单独配置和初始化服务。例如,一个应用可能需要使用哈希服务来计算 SHA-2 摘要,而另一个应用需要计算 SHA-3 摘要。 实际的加密例程由 CSM 封装。服务客户端无需关心例程是通过软件还是硬件实现,或者由哪个 CRYPTO 模块实际承担所请求的加密例程。CSM 为加密栈中所有可用的加密功能提供抽象层。 ### 4.3 加密接口 (CRYIF) CRYIF 上承 CSM,下接 CRYPTO。它接收来自 CSM 的请求,并将其映射到 CRYPTO 中相应的加密操作。CRYIF 将 CSM 给出的请求转发给特定的 CRYPTO。在请求是异步的情况下,回调通知会通报结果。 CRYIF 可以操作多个 CRYPTO 模块。例如,可以有一个对应外部加密硬件的 CRYPTO 模块,以及一个持有加密软件库的 CRYPTO 模块。CRYIF 提供通用接口,使得来自 CSM 的访问无需区分实际的 CRYPTO 实现。 ### 4.4 加密驱动 (CRYPTO) CRYPTO 通常持有实际的加密实现,并支持密钥存储、密钥配置以及针对加密服务的密钥管理。它可以具有一个或多个 Crypto Driver Object,每个都具有独立的工作区。每个 Crypto Driver Object 可提供任意数量的加密原语。加密原语是已配置加密算法的一个实例。一个 Crypto Driver Object 在同一时刻只能执行一种加密原语。 多个 CRYPTO 模块和多个 Crypto Driver Object 的概念允许对相同加密服务进行不同且并发的实现。可以存在具有不同优化目标的 CRYPTO 模块变体。例如,同一哈希算法可能在两个不同的 CRYPTO 模块中实现——一个由更快速(更昂贵)的硬件方案实现,另一个由较慢(较便宜)的软件方案实现。 以下示例描述了使用多个 CRYPTO 模块的一种可能场景:有两个由不同供应商提供的 CRYPTO 实现。一个 CRYPTO 是对硬件方案的抽象("CRYPTO_HW"),另一个 CRYPTO 是纯软件方案("CRYPTO_SW")。CRYPTO_SW 是一个加密库,提供哈希服务以及(伪)随机数生成器。为了能够并行处理这两类服务,CRYPTO_SW 具有两个 Crypto Driver Object:一个用于哈希服务("CDO_HASH"),另一个用于随机数生成器("CDO_RNG")。如果某些加密例程不应并行运行,则应将它们放入同一个 Crypto Driver Object 中。 --- ## 5 使用方面 ### 5.1 作业概念 对 CSM 的加密例程请求以作业 (job) 表示。一个作业包含将处理哪种加密例程以及将使用哪把密钥的信息。作业本身不包含实际的密钥数据,而是引用适当的密钥。密钥管理功能不作为作业处理。 #### 5.1.1 同步和异步模式 由于加密服务的计算可能非常密集,作业处理应考虑为同步或异步。当使用同步作业处理时,CSM 服务将在调用者的上下文中被立即执行。加密例程的结果在函数返回时即可直接获得。 异步作业稍后由专用 CRYPTO 在调度的主函数上下文或硬件中处理。如果特定 CRYPTO 驱动对象由于繁忙而拒绝该作业,则 CSM 将服务请求放入相应的 CSM 作业队列。CRYPTO 通过 CRYIF 的回调函数向 CRYIF 通知异步作业的完成。CRYIF 再通过 CSM 的回调函数将结果转发出去。 #### 5.1.2 队列和优先级 CSM 可以具有多个队列,在这些队列中异步作业按其优先级顺序处理。CSM 的每个队列映射到一个 Crypto Driver Object,从而可以访问所选 Crypto Driver Object 的加密原语。在 CRYPTO 因繁忙而拒绝 CSM 服务请求之后,特定作业会被放入与自身优先级相对应的 CSM 队列中。排队的作业在周期性的 `Csm_MainFunction()` 中传递给 CRYIF。CRYIF 会将作业转发给特定的 CRYPTO。可选地,Crypto Driver Object 也可以具有作业队列。这对于优化 Crypto Driver Object 的硬件使用可能有用。 每个作业的优先级由其配置定义。优先级值越高,作业的优先级越高。作业将按其优先级被处理。 参考 4.4 中引入的示例,以下为可能的场景:CSM 收到两个异步作业请求,一个用于 CDO_HASH,另一个用于 CDO_RNG。两个 Crypto Driver Object 均属于 CRYPTO_SW。CSM 对这两个 Crypto Driver Object 各有一个作业队列。由于 CDO_HASH 没有队列且正在处理另一作业,CRYPTO_SW 拒绝该作业并由 CRYIF 通知 CSM。如果相应的 CSM 队列未满,则该 CDO_HASH 的作业会按其优先级入队到 CSM。`Csm_MainFunction()` 的下一次执行将处理 CSM 队列中优先级最高的作业。当哈希作业出队时,会将其从 CSM 队列中移除,并由 CRYIF 移交给 CDO_HASH。 #### 5.1.3 流式方法与单次调用方法 加密服务的处理包含三种操作:"START"、"UPDATE" 和 "FINISH": - **"START"**(`CRYPTO_OPERATIONMODE_START`):通知特定作业的新开始,并初始化加密计算; - **"UPDATE"**(`CRYPTO_OPERATIONMODE_UPDATE`):可使用此模式提供输入数据并计算中间结果; - **"FINISH"**(`CRYPTO_OPERATIONMODE_FINISH`):指示应执行最终的加密计算。 [3],[SWS_Csm_00024] 给出基于上述操作的作业状态机的概述。所请求的操作以 operation mode 参数的形式传递给 CSM 作业。 可以通过流式方法或单次调用方法调用加密服务。流式方法对给定数据分别执行各单次操作。流式方法可通过分别针对每个操作模式调用例如 `Csm_MacGenerate()` 来使用。使用流式方法可以例如通过对服务函数多次以 "UPDATE" 操作模式进行调用来处理非常大的输入数据。 为了提高加密服务的性能,单次调用方法将多个作业操作合并到单次函数调用中。这减少了多次调用函数的开销。操作模式声明应执行哪些操作,并且这些模式可以组合。操作按 "START"、"UPDATE"、"FINISH" 的顺序执行。在上面的示例中,可以调用 `Csm_MacGenerate()`,并传入一个包含所有操作模式的 operation mode 类型。单次调用方法在处理小数据集合时尤其有益。在这种情况下,加密服务可以一次完成。 ### 5.2 密钥处理 密钥处理包括加密密钥的生成、更新、导入/导出、交换以及派生。加密密钥可以存储在加密硬件中或使用 NvM。 加密密钥通过引用某种密钥类型来创建。CRYPTO 实现的供应商会预配置适用于所提供的加密原语的密钥类型。密钥类型由一个或多个对密钥元素的引用构成。例如,密钥元素可以是 AES 加密所需的密钥材料或随机数生成的种子。加密栈使用密钥元素索引定义 [3]。例如,加密服务 MAC 具有一个强制性的密钥元素 "Key Material",其密钥元素 ID 为 "1"。密钥元素索引可由供应商扩展。一个密钥元素也可以属于多个密钥类型。 在密钥配置期间,必须指定对适当密钥类型的引用。特定 CRYPTO 为密钥类型所包含的密钥元素提供数据存储,实际的密钥数据就保存在那里。硬件 CRYPTO 实现通常使用密钥槽 (key slot)。而软件 CRYPTO 则使用 NvM 来管理密钥存储。 ### 5.3 配置理念 #### 5.3.1 加密功能注册 任意数量 CRYPTO 模块的概念使得可用的加密功能具有灵活性。这要求存在一种注册机制,使 CRYPTO 实现中实际的加密功能对 CRYIF 和 CSM 可见。否则,在 CSM 中配置和使用实际的加密功能将是不可能的。 这通过由供应商提供的预配置解决,该预配置表示每个 CRYPTO 模块的能力。预配置从底层向上层加载,即从 CRYPTO 开始,经 CRYIF,到 CSM。CRYIF 挂载每个已注册的 CRYPTO 模块,并将各加密功能集成到提供给 CSM 的通用接口中。CSM 接管已注册 CRYPTO 的可用加密功能,并推导出可供用户配置的特定加密功能。 #### 5.3.2 项目配置 加密栈的配置通常采用自顶向下的方法进行,从 CSM 开始,经 CRYIF,到 CRYPTO: (i) 在 CSM 中,用户选择并配置将由 CRYIF 和 CRYPTO 提供的加密原语和密钥。用户进一步定义作业和作业队列。 (ii) 在 CRYIF 中,用户主要定义由 CSM 请求的功能到已注册 CRYPTO 模块所提供功能的映射。 (iii) 在 CRYPTO 中,用户调整并扩展加密原语和密钥的预配置。 --- ## 6 示例 下面使用 "消息认证码" (MAC) 服务来说明加密栈的使用。 ### 6.1 模块中的配置 用户创建一个作业,引用所请求的 MAC 加密原语以及要使用的加密密钥。还需要配置作业是同步 (`CRYPTO_PROCESSING_SYNC`) 还是异步 (`CRYPTO_PROCESSING_ASYNC`) 处理。如果作业是异步的,还需要定义处理该作业的队列。 MAC 要求密钥至少引用一个密钥元素 "Key Material"(`CRYPTO_KE_MAC_KEY`)。 ### 6.2 涉及的 API 应用(即 SWC 的可运行实体)通过 RTE 端口与加密栈(即 CSM)通信。对于每个已配置的作业,RTE 生成一个名为 `{Job}_MacGenerate` 的端口,其客户端/服务器接口为 `CsmMacGenerate_{Primitive}()`。该端口具有一个端口定义参数 `Crypto_OperationModeType`,其值为 `CRYPTO_OPERATIONMODE_SINGLECALL`。因此,SWC 可以通过调用 `CsmMacGenerate_{Primitive}` 一次性向 CSM 提供执行 MAC 请求所需的全部数据来调用 MAC 服务。BSW 模块或 CDD 通过直接调用 C-API `Csm_MacGenerate()` 来使用 MAC 服务。这里,待处理的作业必须作为输入参数传入。 根据所应用作业的配置,作业的处理将是异步或同步的。在本示例中,我们假设作业必须在调用者的上下文中同步处理。CSM 通过调用 `CryIf_ProcessJob()` 将所请求的 MAC 服务分派给 CRYIF,并将作业作为输入参数传入。CRYIF 通过调用 `Crypto_ProcessJob()` 将作业的处理转移到 CRYPTO,最终执行作业参数中配置的加密原语。请注意,如果存在不同的 CRYPTO 实现,函数命名将通过使用 `vendorId (vi)` 和 `vendorApiInfix (ai)` 来区分。因此,调用将是 `Crypto___ProcessJob()`。最后,CRYPTO 将 MAC 存储在 CSM 作业中配置的内存空间中。 --- ## 翻译说明 - 本文档为 AUTOSAR EXP 602《Utilization of Crypto Services》(CP 4.4.0) 的中文翻译; - 文档标识号:602; - 文档共 13 页,已完整翻译核心内容; - 保留了所有 AUTOSAR 方框符、API 标识符、模块缩写和算法名; - 翻译以保证技术含义准确为前提,语句尽量贴近 AUTOSAR 中文术语库常用译法。