目录
一、概述
该规范规定了软件模块加密服务管理器(CSM)的功能、API和配置。
CSM应提供同步或异步服务,以实现对所有软件模块的基本加密功能的唯一访问。CSM应提供一个抽象层,为更高级软件层提供标准化接口以访问这些功能。
软件模块所需的功能可能与其他软件模块所需的功能不同。因此,应该有可能为每个软件模块分别配置和初始化CSM提供的服务。该配置还包括选择CSM服务的同步或异步处理。
二、依赖模块
【规范】CSM应能够访问根据加密接口规范实现的加密接口(CRYIF)。
【规范】CSM模块应使用CRYIF与底层加密驱动程序(加密驱动程序)的接口来计算加密服务的结果。
三、功能描述
3.1 基本体系结构
下图描述了CSM模块AUTOSAR分层软件体系结构。基于AUTOSAR分层软件架构的CSM模块架构的描述将有助于理解以下章节中CSM模块的接口和功能的规范。
CSM是一种提供加密功能的服务,它基于依赖于软件库或硬件模块的加密驱动程序。此外,使用多个加密驱动程序的混合设置也是可能的。CSM通过CRYIF访问不同的加密驱动程序。
CSM作为一个服务层,为加密操作提供了SW-C或BSW的接口。CSM的主要任务是调度服务和优先级,并调用加密接口(CryIf)进行进一步操作。CryIf将请求调度到静态分配给此服务的加密驱动程序及其加密驱动程序对象。
CSM、CryIf和Crypto的的API有两类,分为基于作业的API和直接API。如下图所示:
3.2 通用行为
【规范】Job 是已配置的加密原语的实例。
【规范】对于每个作业,CSM每次只需处理一个实例。
【规范】CSM模块应允许并行处理不同的作业。
【规范】如果请求CSM模块的服务,并且相应的作业处于“ACTIVE”状态,则作业请求应调用CryIf_ProcessJob()并传递返回值。
【规范】如果请求了CSM模块的服务,且CSM作业需要排队,且队列已满,则应使用返回值CRYPTO_E_BUSY拒绝该作业请求。
【规范】如果配置了异步接口,CSM模块应提供一个主功能Csm_MainFunction(),它被循环地称为通过状态机控制作业的处理。
3.2.1 正常操作
【规范】为了统一单个调用函数和加密服务的流媒体方法,有一个模式参数,它决定了操作模式。此服务操作是一个标志字段,指示操作模式“START”、“UPDATE”或“FINISH”。它明确地声明应执行什么操作。这些操作模式可以混合使用,并同时执行多个操作。
下图表显示了此设计的一个作业的状态机:
【规范】CSM加密服务应支持用一次呼叫处理多个操作模式的输入。
【规范】如果设置了CRYPTO_OPERATIONMODE_START和CRYPTO_OPERATIONMODE_FINISH位,而没有设置Csm_Csm_() 函数将返回E_NOT_OK。
(1)同步作业处理
【规范】当使用同步接口时,接口功能应立即借助底层的加密堆栈模块来计算结果。
【规范】如果发出了同步作业,且优先级大于队列中可用的最高优先级,则CSM将禁用处理队列中的新作业,直到当前处理的作业完成后,主函数的下一次调用完成。
【规范】如果发出了一个同步作业,且该优先级小于队列中可用的最高优先级,则CSM应返回CRYPTO_E_BUSY。
(2)异步作业处理
【规范】如果使用异步接口,接口功能只能将必要的信息移交给底层加密堆栈模块。
【规范】当请求的加密服务通过从作业原语配置调用的回调函数被处理时,应通知CSM的用户。
3.2.2 设计说明
CSM提供两种服务:
- 加密服务本身
- 密钥管理。
(1)CSM模块启动
Csm_Init()请求不负责触发底层CRYIF的初始化。假定底层的CRYIF将由任何适当的实体初始化。
(2)加密服务
【规范】CSM crypto services shall provide a Csm_() API。
【规范】该应用程序应能够使用操作模式CRYPTO_OPERATIONMODE_START调用Csm_() 来初始化加密计算。
【规范】应用程序应能够任意调用操作模式CRYPTO_OPERATIONMODE_UPDATE的 Csm_(),但至少一次,以将输入数据提供作业的加密原语。
【规范】应用程序应能够使用操作模式CRYPTO_OPERATIONMODE_FINISH调用Csm_()来完成加密计算。
【规范】只有 HASH, MACGENERATE, MACVERIFY, ENCRYPT, DECRYPT, AEAD_ENCRYPT, AEAD_DECRYPT, SIGNATUREGENERATE, SIGNATUREVERIFY等服务操作才能支持API规定的启动、更新和完成操作模式。对于所有其他的服务操作,CSM应将操作模式设置为CRYPTO_OPERATIONMODE_SINGLECALL,即使API没有提供一个操作模式。
【规范】如果CSM向加密接口发出服务CRYPTO_MACGENERATE,CRYPTO_MACVERIFY,CRYPTO_ENCRYPT,CRYPTO_DECRYPT,CRYPTO_AEADENCRYPT,CRYPTO_AEADDECRYPT,CRYPTO_RANDOMGENERATE,CRYPTO_SIGNATUREGENERATE或CRYPTO_SIGNATUREVERIFY,它需要确保Crypto_JobType引用的jobPrimitiveInfo->cryIfKeyId。
队列实现
CSM可能有多个队列,其中作业根据其优先级排列,以处理多个加密请求。从CSM队列通过CryIf到加密驱动程序对象的路径称为通道。CSM的每个队列都被映射到一个通道,以访问加密驱动程序对象的加密原语。队列的大小可可配置。
加密驱动程序对象表示独立的加密“设备”(硬件或软件,例如AES加速器)的实例。在HSM上可能有一个快速AES和CMAC计算的通道,该通道以加密驱动程序中的本地AES计算服务结束。但也有可能,加密驱动程序对象是一种软件,例如用于RSA计算,用户可以加密、解密、签名或验证数据。
【规范】应该可以在CSM中配置的CsmQueues中对CSM作业进行排队。
【规范】CsmQueues应根据所配置的作业的优先级对作业进行排序。
【规范】只有在保证作业结构数据一致性的情况下,才能添加服务操作。当将具有相同jobID的服务添加到队列时(例如,在进行对Csm_SignatureVerify()和Csm_SaveContextJob()的后续调用时),应特别考虑到这一点。如果不能保证,则服务运行将随E_BUSY返回。
【规范】如果可以将具有相同JobID的服务添加到队列中,则这些服务的执行顺序应与传入服务操作请求的顺序对应(“先入先出”)。
队列功能实现状态如下:
(3)密钥管理
【规范】属于密钥管理的服务应仅提供Csm_() 功能。
【规范】一个秘钥由一个或多个秘钥元素组成。
秘钥元素的例子有秘钥材料本身、初始化向量、随机数生成的种子,或SHE标准的证明。
【规范】密钥,即具有由配置给出的符号名称与相应的密钥id。加密堆栈API使用CSM模块中的以下关键元素索引定义:
【规范】对于包含加密密钥材料的每个密钥元素,所提供的密钥的格式应在用于数据交换的配置中指定,例如,对于Csm_KeyElementGet()或Csm_KeyElementSet()。特定加密驱动程序支持的密钥格式是加密驱动程序附带的预配置信息的一部分。
(4)重定向加密作业的输入和/或输出
【规范】一个作业的输入和/或输出数据可以被重定向到一个秘钥元素,秘钥及其秘钥元素被重定向到的输入和输出值应在编译时进行静态配置,在运行时不得更改。
【规范】如果作业的输入或输出值被重定向到秘钥元素,并且相应的输入或输出长度值没有设置为0,则不处理作业,返回E_NOT_OK。
【规范】如果作业元素不使用输入或输出重定向,则 jobRedirectionInfoRe f应设置为NULL_PTR。如果使用重定向元件,则 jobRedirectionInfoRef 应指向Crypto_JobRedirectionInfoType的结构。
(5)作业上下文接口
【规范】在调用Csm_SaveContextJob()或Csm_RestoreContextJob()时,CSM应检查相关作业当前是否处于活动状态。如果是这样,则应按规定继续进行操作。否则(作业处于IDLE状态),该功能应立即随E_NOT_OK返回。
【规范】在调用Csm_SaveContextJob()或Csm_RestoreContextJob()时,CSM应检查相关作业当前是否正在积极处理数据,这意味着CSM已向司机安排了与该作业相关的操作,并正在等待响应。在这种情况下,该功能应立即随E_NOT_OK一起返回。
【规范】在调用Csm_RestoreContextJob()或Csm_SaveContextJob()时,CSM应检查作业是否引用原始数据、加密、加密、解密、生成、验证、签名生成或签名验证。如果是这样,则应按规定继续进行操作。否则,当CSM_E_SERVICE_TYPE检测结果正确时,不得进行操作,并向DET报告CSM_E_SERVICE_TYPE。
3.3 错误分类
3.3.1 开发错误
3.3.2 运行时错误
四、API接口
4.1 通用接口
- Csm_Init
- Csm_GetVersionInfo
4.2 加密接口
- Csm_Hash
- Csm_MacGenerate
- Csm_MacVerify
- Csm_Encrypt
- Csm_Decrypt
- Csm_AEADEncrypt
- Csm_AEADDecrypt
- Csm_SignatureGenerate
- Csm_SignatureVerify
- Csm_RandomGenerate
4.3 秘钥接口
- Csm_KeyElementSet
- Csm_KeySetValid
- Csm_KeySetInvalid
- Csm_KeyGetStatus
- Csm_KeyElementGet
- Csm_KeyElementCopy
- Csm_KeyCopy
- Csm_KeyElementCopyPartial
- Csm_RandomSeed
- Csm_KeyGenerate
- Csm_KeyDerive
- Csm_KeyExchangeCalcPubVal
- Csm_KeyExchangeCalcSecret
4.4 Job接口
- Csm_JobKeySetValid
- Csm_JobKeySetInvalid
- Csm_JobRandomSeed
- Csm_JobKeyGenerate
- Csm_JobKeyDerive
- Csm_JobKeyExchangeCalcPubVal
- Csm_JobKeyExchangeCalcSecret
- Csm_SaveContextJob
- Csm_RestoreContextJob
- Csm_CancelJob
4.5 回调接口
- Csm_CallbackNotification
4.6 调度接口
- Csm_MainFunction