文章目录
- 前言
- Functional specification
- Error classification
- Error detection
- API specification
- Type Definitions
- Function definitions
- General API
- CryIf_Init
- CryIf_GetVersionInfo
- Job Processing Interface
- CryIf_ProcessJob
- Dispatch Key IDs匹配KeyId
- Job Cancellation Interface
- CryIf_CancelJob
- Key Management Interface
- Key Setting Interface
- Key Extraction Interface
- Key Copying Interface
- Key Generation Interface
- Key Derivation Interface
- Key Exchange Interface
- Call-back notifications
- CryIf_CallbackNotification
- Containers and configuration parameters
- CryIf
- CryIfGeneral
- CryIfChannel
- CryIfKey
前言
之前介绍过Crypto Driver,本文接着学习Crypto上面一个模块,CryIf.
Functional specification
Crypto Interface位于Crypto Service Manager和底层Crypto drivers之间,是访问所有上层(BSW)加密操作的唯一接口。Crypto Interface也是Crypto drivers的唯一使用者,并提供独特的接口来管理不同的加密硬件和软件解决方案。抽象层封装了不同的硬件和软件访问机制,因此Crypto Interface的实现独立于底层的Crypto Drivers(可以在硬件或软件中实现)
它还确保了对crypto services的并发访问,从而使同时处理多个加密任务成为可能。
Error classification
Error detection
如果参数job->jobPrimitiveInfo->primitiveInfo->service被设置为CRYPTO_KEYSETVALID,
Crypto_RANDOMSEED,CRYPTO_KEYGENERATE, CRYPTO_KEYDERIVE,CRYPTO_KEYEXCHANGECALCPUBVAL或CRYPTO_KEYEXCHANGECALCSECRET时,检查参数job->jobPrimitiveInputOutput->cryIfKeyId及job->jobPrimitiveInputOutput->targetCryIfKeyId(如果适用)是否在有效范围内。
如果调用一个作业,并且参数job->jobPrimitiveInfo->primitiveInfo->service被设置为
CRYPTO_MACGENERATE, CRYPTO_MACVERIFY, CRYPTO_ENCRYPT,CRYPTO_DECRYPT, CRYPTO_AEADENCRYPT, CRYPTO_AEADDECRYPT,CRYPTO_SIGNATUREGENERATE或CRYPTO_SIGNATUREVERIFY时,
检查job->jobPrimitiveInfo->cryIfKeyId参数是否在有效范围内。
如果Key超出范围,它将向开发模式中的DET报告CRYPTO_E_PARAM_HANDLE,否则返回E_NOT_OK。
API specification
注意:
CRYPTO_E_KEY_NOT_AVAILABLE表示该密钥之前已被编程,但目前无法访问(例如,它暂时不可访问,例如,当密钥由于调试器连接或参数错误而被禁用时)。
CRYPTO_E_KEY_EMPTY表示所引用的密钥内容到目前为止还没有被写入,并且没有默认值(例如,在SHE 1.1中,错误代码ERC_KEY_EMPTY将返回,“如果应用程序试图使用尚未初始化的密钥”)。
Type Definitions
Function definitions
General API
CryIf_Init
配置指针configPtr当前未使用,因此应设置为空指针。
如果CRYIF模块初始化失败,CRYIF将向DET报告CRYIF_E_INIT_FAILED。
CryIf_Init()服务将初始化CRYIF的全局变量和数据结构,包括标志和缓冲区。
CryIf_GetVersionInfo
如果启用了CRYIF模块的开发错误检测:如果模块尚未初始化,则CryIf_GetVersionInfo函数将向DET报告CRYIF_E_UNINIT
如果启用了CRYIF模块的开发错误检测:如果参数versioninfo为空指针,则CryIf_GetVersionInfo函数将向DET报告CRYIF_E_PARAM_POINTER。
Job Processing Interface
CryIf_ProcessJob
为了统一单个调用函数和加密服务的流方法,有一个接口CryIf_ProcessJob()。它的Crypto_JobType作业参数包含一个Crypto_OperationModeType标志字段(job->jobPrimitiveInputOutput.mode),可以设置为" START ", " UPDATE ",“FINISH”或它们的组合。它显式声明应该执行什么操作。这些操作模式可以混合,一次执行多个操作。
如果启用了CRYIF的开发错误检测:函数CryIf_ProcessJob将向DET报告CRYIF_E_UNINIT并返回
E_NOT_OK,如果模块尚未初始化。
如果启用了CRYIF的开发错误检测:函数CryIf_ProcessJob将向DET报告CRYIF_E_PARAM_HANDLE,如果参数channelId超出范围,则返回E_NOT_OK
如果启用了CRYIF的开发错误检测:函数CryIf_ProcessJob将向DET报告CRYIF_E_PARAM_POINTER,如果参数job是空指针,则返回E_NOT_OK。
如果CRYIF没有检测到错误,则服务
CryIf_ProcessJob()将为映射到服务的驱动配置调用Crypto_<vi>_<ai>_ProcessJob()并传递返回值
如果作业处理重定向用于作业,则crypto
interface需要将传入的crypto
interface密钥引用和密钥元素引用调整为加密驱动程序各自值的相应密钥引用和密钥元素引用。
Dispatch Key IDs匹配KeyId
CryIf应使用job->jobPrimitiveInputOutput->cryIfKeyId对应的加密驱动程序的密钥ID设置job->cryptoKeyId,如果适用,还应设置 job->targetCryptoKeyId为 job->jobPrimitiveInputOutput->targetCryIfKeyId
如果 job->jobPrimitiveInfo->primitiveInfo->service配置为CRYPTO_KEYSETVALID,CRYPTO_RANDOMSEED, CRYPTO_KEYGENERATE, CRYPTO_KEYDERIVE, CRYPTO_KEYEXCHANGECALCPUBVAL or CRYPTO_KEYEXCHANGECALCSECRET,则job->cryIfKeyId必须在范围内,否则 CryIf_ProcessJob函数报告CRYPTO_E_PARAM_HANDLE给DET并返回E_NOT_OK
如果参数job->jobPrimitiveInfo->primitiveInfo->service设置为CRYPTO_KEYDERIVE,参数job->cryIfTargetKeyId必须在范围内;否则函数CryIf_ProcessJob将报告
CRYPTO_E_PARAM_HANDLE给DET并返回E_NOT_OK
CryIf使用job->jobPrimitiveInfo->cryIfKeyId对应的crypto driver的密钥ID设置job->cryptoKeyId。
Job Cancellation Interface
CryIf_CancelJob
如果启用了CRYIF的开发错误检测:函数CryIf_CancelJob将向DET报告CRYIF_E_UNINIT并返回
E_NOT_OK,如果模块尚未初始化
如果启用了CRYIF的开发错误检测:函数CryIf_CancelJob将向DET报告CRYIF_E_PARAM_HANDLE,如果参数channelId超出或超出范围,则返回E_NOT_OK
如果启用了CRYIF的开发错误检测:函数CryIf_CancelJob将向DET报告CRYIF_E_PARAM_POINTER,如果参数job是空指针,则返回E_NOT_OK。
如果CRYIF没有检测到错误,则服务
CryIf_CancelJob()将为映射到服务的驱动配置调用Crypto_<vi>_<ai>_CancelJob(),并传递返回值
Key Management Interface
Key Setting Interface
cryIfKeyId对应Crypto Driver中的Keyid
CryIf_KeyElementSet:该函数用来将指定cryIfKeyId及keyElementId的密钥值和长度
CryIf_KeySetValid:该函数用来将指定KeyIfId的密钥设置为有效
Key Extraction Interface
CryIf_KeyElementGet:提取指定cryIfKeyId及keyElementId的密钥值和长度
Key Copying Interface
CryIf_KeyElementCopy:将指定的keyElement的密钥复制到目标keyElement中
CryIf_KeyElementCopyPartial:将一个key element复制到另一个key element。keyElementOffsets和keyElementCopyLength允许将源key element的部分复制到目标key element中
CryIf_KeyCopy:将cryIfKeyId中的所有密钥拷贝到targetCryIfKeyId中
Key Generation Interface
CryIf_RandomSeed:该函数输入随机数生成的种子。
CryIf_KeyGenerate:该函数用来生成cryIfKeyId中的密钥。
Key Derivation Interface
CryIf_KeyDerive:将cryIfKeyId中的密钥派生给targetCryIfKeyId(密钥派生服务需要salt和password来派生新密钥)
Key Exchange Interface
CryIf_KeyExchangeCalcPubVal:计算密钥交换的public value
CryIf_KeyExchangeCalcSecret:计算密钥交换的共享密钥
Call-back notifications
CryIf_CallbackNotification
CryIf_CallbackNotification:Crypto Driver通知CryIf,该函数中会调用Csm_CallbackNotification并传递结果
Containers and configuration parameters
CryIf
CryIf需要配置CryIfGeneral,CryIfChannel,CryIfKey
CryIfGeneral
CryIfDevErrorDetect:是否启用开发错误检测
CryIfVersionInfoApi:是否使用CryIf_GetVersionInfo()函数
CryIfChannel
CryIfChannelId:crypto channel的ID
CryIfDriverObjectRef:配置关联的Crypto Driver Object
CryIfKey
CryIfKeyId:CryIf key的ID
CryIfKeyRef:配置关联的crypto driver key