1 Stack Architecture
The Crypto Service Manager (CSM)
CSM控制一个或者多个Client对一个或者多个同步或异步加密服务。它提供了优先级队列来管理专用CRYPTO不能直接处理的作业
CSM的功能如下:
● HASH计算;
● 消息认证码的生成和校验;
● 数字签名的生成和校验
● 对称和非对称加解密计算
● 随机数生成
● 安全计数器
● 密钥管理操作,例如密钥设置和生成
CSM服务是通用的,CSM允许不同的应用程序使用不同的加密算法来使用相同的服务。可以单独配置和初始化服务。例如,一个应用程序可能需要HASH服务来计算SHA-2,而另一个应用程序可能需要HASH服务来计算SHA-3。
实际的加密例程由CSM封装。Client端不需要关心例程是在软件还是硬件中实现的,也不需要关心哪个CRYPTO模块实际维护所请求的加密例程。CSM为加密堆栈中所有可用的加密特性提供了一个抽象层。
The Crypto Interface (CRYIF)
CRYIF在上层CSM和下层CRYPTO中间。接收来自CSM的请求,并将它们映射到CRYPTO中进行适当的加密操作。CRYIF将CSM发出的请求转发给特定的CRYPTO。如果请求是异步的,回调通知将报告结果。
CRYIF可以操作多个CRYPTO模块。例如,可以有一个用于外部加密硬件模块的CRYPTO模块和一个用于软件加密软件库的CRYPTO模块。CRYIF提供了一个通用接口,因此来自CSM的访问不需要区分实际CRYPTO是如何实现的。
The Crypto Driver (CRYPTO)
CRYPTO实现实际的加密服务,并支持加密服务的密钥存储、密钥配置和密钥管理。它可以有一个或多个Crypto Driver Objects(CDO)加密驱动程序对象,每个CDO有单独的工作空间。每个CDO可以提供任意多个加密原语。加密原语是已配置的加密算法的实例。一个CDO同时只能执行一个加密原语。
多个CRYPTO模块和多个CRYPTO驱动程序对象的概念允许相同加密服务可以有不同和并发实现。可能存在具有不同优化目标的CRYPTO模块的变体。例如,相同的哈希算法可以在两个不同的CRYPTO模块中实现,一个通过更快(更昂贵)的硬件解决方案实现,另一个通过更慢(更便宜)的软件解决方案实现。
下面的示例描述了使用几个CRYPTO模块的可能场景:
两家不同的供应商提供了两种CRYPTO实现。一个CRYPTO是硬件解决方案的抽象(“CRYPTO_HW”),另一个CRYPTO是纯软件解决方案(“CRYPTO_SW”),CRYPTO_SW是一个软件加密库,提供HASH服务和(伪)随机数生成器。
为了使两个服务并行处理,CRYPTO_SW有两个加密驱动程序对象,一个用于哈希服务(“CDO_HASH”),另一个用于随机数生成器(“CDO_RNG”)。如果一些加密例程不能并行运行,那么它们应该放在同一个加密驱动程序对象中。
2 Job Concept
请求CSM进行加密操作的例程表示为Job,Job包含加密例程和引用密钥操作,但是不包含实际的密钥,密钥管理处理不是以Job方式处理
Synchronous and Asynchronous Mode
Synchronous mode: CSM服务Job在调用方的上下文中立即执行,函数返回结果直接可用
Asynchronous mode: 异步作业稍后由专用CRYPTO在预先安排的主函数上下文中或硬件中处理。如果特定的CRYPTO驱动程序对象因为繁忙而拒绝该作业,CSM将服务请求放在相应的CSM作业队列中。CRYPTO使用CRYIF的回调函数通知CRYIF异步作业的完成。CRYIF通过CSM的回调函数转发结果。
Queuing and Priorities
CSM Job可能有多个队列,每个队列映射到一个单独的加密驱动对象Crypto Driver Object(CDO),从而可以访问CDO的加密原语crypto primitives,CRYPTO因为繁忙拒绝了CSM的服务请求后,特定的Job会根据其优先级放入相应的CSM队列中, 在Csm_MainFunction()循环调用期间,排队的Job被传递给CRYIF。CRYIF将把Job转发给特定的CRYPTO。 为了优化CDO的硬件使用CDO也可以有选择的有Job Queuing。
每个Job的优先级根据其配置决定其优先级,优先级值越高,优先级越高,Job将根据其优先级执行。
Streaming Approach vs Single Call Approach.(流方法和单调用方法)
加密服务的处理包含“START”、“UPDATE”和“FINISH”操作:
● “START”(CRYPTO_OPERATIONMODE_START)表示Job的新开始,并初始化加密计算;
● 输入数据可以使用“UPDATE”模式(CRYPTO_OPERATIONMODE_UPDATE),并计算中间结果;
● “FINISH”(CRYPTO_OPERATIONMODE_FINISH)表示将执行最后的计算。
[ SWS_Csm_00024] Job State
加密服务可以使用流或单个调用方法
流方法对给定的数据分别执行单个操作,例如,使用流方法可以通过多次调用具有“UPDATE”操作模式的服务函数来处理非常庞大的输入数据。
3 Key Handling
密钥处理包括加密密钥的生成、更新、导入/导出、交换和派生。加密密钥可以存储在加密硬件中或使用NvM。
加密密钥是根据特定密钥类型创建的。CRYPTO供应商实现预先配置适应所提供的加密原语使用的密钥类型。密钥类型由一个或多个对密钥元素的引用组成。例如,密钥元素可以是AES加密所需的密钥材料,也可以是随机数生成的种子。
在密钥配置期间,必须指定对适当密钥类型的引用。特定的CRYPTO为密钥类型中包含的密钥元素提供数据存储,其中实际的密钥数据实际保存在其中。HW CRYPTO实现通常会使用密钥槽。而SW CRYPTO将使用NvM来管理密钥存储。
4 Configuration Philosophy
Registration of Crypto Functionality
多样的CRYPTO模块的概念使可用的加密特性具有灵活性。为使CRYIF和CSM知道CRYPTO实现中的实际加密特性,需要一种注册机制。否则,就不可能在CSM中配置和使用实际的加密特性。
此方案可以通过供应商预配置来解决,该配置表示每个CRYPTO模块的功能。预配置从下到上加载,即从CRYPTO over CRYIF到CSM。CRYIF挂载每个已注册的CRYPTO模块,并将特定的加密特性集成到提供给CSM的通用接口中。CSM接收已注册CRYPTO的可用加密特性,并给出特定的加密特性供用户配置。
Project Configuration
加密堆栈的配置通常使用自顶向下的方法进行,从CRYIF上的CSM开始到CRYPTO:
(i) 在CSM中,用户选择和配置由CRYIF和CRYPTO提供的要使用的密码原语和密钥。用户进一步定义作业和作业队列。
(ii) 在CRYIF中,用户主要定义了将CSM请求的特性映射到已注册的CRYPTO模块所提供的特性。
(iii) 在CRYPTO中,用户调整和扩展加密原语和密钥的预配置。
示例
下面使用“消息验证码”(MAC)服务概述了加密堆栈的使用。
用户创建一个作业,引用所请求的MAC加密原语和要使用的加密密钥。然后进一步配置作业是同步处理(CRYPTO_PROCESSING_SYNC)还是异步处理(CRYPTO_PROCESSING_ASYNC)。如果作业是异步的,他还定义了处理该作业的队列。
MAC需要一个密钥,至少引用密钥元素“key Material”(CRYPTO_KE_MAC_KEY)。
5 APIs involved
应用程序(即SWC的可运行程序)通过RTE端口与加密堆栈(即CSM)通信。对于每个配置的作业,RTE生成一个带有客户端/服务器接口的名为{job}MacGenerate的端口CsmMacGenerate{Primitive}().该端口有一个端口定义的参数值Crypto_OperationModeType和值CRYPTO_OPERATIONMODE_SINGLECALL。因此,SWC可以通过调用CsmMacGenerate_{Primitive}来调用MAC服务,并在对CSM的一次调用中提供执行MAC请求所需的所有数据。BSW模块或CDD通过直接调用C-API Csm_MacGenerate()来使用MAC服务。在这里,要处理的作业必须作为输入参数传递。
根据应用作业的配置,作业的处理是异步的还是同步的。在本例中,我们假设作业必须在调用者的上下文中同步处理。CSM通过调用CryIf_ProcessJob()将请求的MAC服务分派给CRYIF,并将作业作为输入参数传递。CRYIF通过调用Crypto_ProcessJob()将作业的处理传递给CRYPTO, cryp_processjob()最终执行作业参数中配置的加密原语。注意,如果有不同的CRYPTO实现,函数命名将使用vendorId (vi)和vendorApiInfix (ai)进行区分。因此,调用将是Crypto___ProcessJob()。最后,CRYPTO将MAC存储在CSM作业中配置的内存空间中。