综述
该头文件主要用于对密钥相关的格式进行结构体包装。很多的hks模块都基于这个头文件来定义,比如framework文件下的hks_access.c与interface文件下的hks_client.c。
结构体
二进制存储地址
struct HksBlob {
uint32_t size;//数据大小
uint8_t *data;//数据地址
};
hks参数
struct HksParam {
uint32_t tag;
union {
bool boolParam;
int32_t int32Param;
uint32_t uint32Param;
uint64_t uint64Param;
struct HksBlob blob;
};
};
hks参数设置
参数列表大小
参数列表内的参数总数
存储参数列表的结构体数组
struct HksParamSet {
uint32_t paramSetSize;
uint32_t paramsCnt;
struct HksParam params[];
};
证书链
证书链表
证书总数
struct HksCertChain {
struct HksBlob *certs;
uint32_t certsCount;
};
密钥信息
密钥别名
密钥参数列表
struct HksKeyInfo {
struct HksBlob alias;
struct HksParamSet *paramSet;
};
公钥信息
struct HksPubKeyInfo {
enum HksKeyAlg keyAlg;
uint32_t keySize;
uint32_t nOrXSize;
uint32_t eOrYSize;
uint32_t placeHolder;
};
#define HKS_DERIVE_DEFAULT_SALT_LEN 16//派生默认加盐值长度
#define HKS_HMAC_DIGEST_SHA512_LEN 64
#define HKS_DEFAULT_RANDOM_LEN 16//默认随机数长度
#define HKS_MAX_KEY_AUTH_ID_LEN 64//最大密钥授权id
#define HKS_KEY_MATERIAL_NUM 3
#define HKS_MAX_KEY_LEN (HKS_KEY_BYTES(HKS_RSA_KEY_SIZE_4096) * HKS_KEY_MATERIAL_NUM)
#define HKS_MAX_KEY_MATERIAL_LEN (sizeof(struct HksPubKeyInfo) + HKS_MAX_KEY_LEN + HKS_AE_TAG_LEN)
存储头文件信息
struct HksStoreHeaderInfo {
uint16_t version;//版本
uint16_t keyCount;//密钥总数
uint32_t totalLen; /* key buffer total len *///密钥所占总长度
uint32_t sealingAlg;//封盖地址信息组
uint8_t salt[HKS_DERIVE_DEFAULT_SALT_LEN];//加盐值的数组
uint8_t hmac[HKS_HMAC_DIGEST_SHA512_LEN];//哈希运算消息认证码
};
存储密钥信息
struct HksStoreKeyInfo {
uint16_t keyInfoLen; /* current keyinfo len */
uint16_t keySize; /* keySize of key from crypto hal after encrypted */
uint8_t random[HKS_DEFAULT_RANDOM_LEN];
uint8_t flag; //标志:导入/生成
uint8_t keyAlg;//密钥地址信息组
uint8_t keyMode;//密钥模式
uint8_t digest;//摘要
uint8_t padding;//密钥填充
uint8_t rsv;//储存
uint16_t keyLen; //密钥长度
uint32_t purpose;//密钥目的
uint32_t role;//密钥作用
uint16_t domain;//定义域
uint8_t aliasSize;//别名大小
uint8_t authIdSize;//授权id大小
};
密钥对,公钥私钥大小
struct Hks25519KeyPair {
uint32_t publicBufferSize;
uint32_t privateBufferSize;
};
静态函数声明
判断是否溢出
//功能:内联函数,判断a+b是否超过uint32_t最大可表示范围,超过则返回1,否则返回0
//传参:两个uint32_t类型的变量
//返回值:超过则返回1,否则返回0
static inline bool IsAdditionOverflow(uint32_t a, uint32_t b)
{
return (UINT32_MAX - a) < b;
}
判断长度是否无效
//功能:判断长度是否无效,长度为零或大于最大的存放二进制的地址范围,无效则返回1,否则返回0
//传参:uint32_t类型的标识长度的值
//返回值:无效则返回1,否则返回0
static inline bool IsInvalidLength(uint32_t length)
{
return (length == 0) || (length > MAX_OUT_BLOB_SIZE);
}
判断地址是否有效
//传参:HksBlob类型的地址
//返回值:宏定义的有效标志
static inline int32_t CheckBlob(const struct HksBlob *blob)
{
if ((blob == NULL) || (blob->data == NULL) || (blob->size == 0)) {
return HKS_ERROR_INVALID_ARGUMENT;
}
return HKS_SUCCESS;
//检查该指针不为空,地址内的数据不为空,地址大小不为零,返回有效
}