对于paramSet的操作函数封装
知识总结
总体概述
1.定义了全局遍历g_validTags[]用于进行tag的检查
2.关于paramSet的初始化,数据添加,数据检查,大小更新等函数的封装和调用
3.关于内存大小这块,鸿蒙的检查和内存调度这块做的很好,在对数据结构进行任何操作比如查询、更新、删除等都会先封装一个或多个检查保证后续操作的正常进行
代码解读
1.g_validTags[]
存储了所有类型的tag作为本地的全局变量,在函数IsValidTag(uint32_t tag)中用于判断所给的tag是否在其中——在则为有效tag,不在则为无效tag
//全局变量标识tag根据tag从参数集合中取出对应的数据
enum HksTag g_validTags[] = {
HKS_TAG_ALGORITHM,
HKS_TAG_PURPOSE,
HKS_TAG_KEY_SIZE,
HKS_TAG_DIGEST,
HKS_TAG_PADDING,
HKS_TAG_BLOCK_MODE,
HKS_TAG_KEY_TYPE,
HKS_TAG_ASSOCIATED_DATA,
HKS_TAG_NONCE,
HKS_TAG_IV,
HKS_TAG_SALT,
HKS_TAG_PWD,
HKS_TAG_INFO,
HKS_TAG_ITERATION,
……
}
2.IsValidTag
判断所给tag是否在g_validTags中
3.HksCheckParamSetTag
通过二重循环进行tags的检查防止出现重复的tags
4.CheckBeforeAddParams
在对参数集合中添加新的参数前的检查
检查分为两个方面:
1.检查参数集合的size是否能够容纳
2.检查需要加入的参数数据是否存在
5.关于paramSet的更新和检查函数
这里是一些关于paramSet的初始化、更新和删除的函数
5.1BuildParamSet
根据位移量为paramSet重新分配空间,并调用HksFreshParamSet进行内部数据的更新
5.2FreshParamSet
封装函数——更新参数集合中的数据
流程:获取size和offset---->检查是否溢出和内存拷贝---->根据偏移量进行数据的写入---->对paramSetSize再一次进行检查
5.3HksFreshParamSet
通过得到的offset把数据放入合适的位置
调用HksCheckParamSet检查size是否合适---->得到size和offset,利用for循环对每个数据块进行偏移
//通过计算的offset将数据进行偏移转移
HKS_API_EXPORT int32_t HksFreshParamSet(struct HksParamSet *paramSet, bool isCopy)
{
if (paramSet == NULL) {
HKS_LOG_E("invalid NULL paramSet");
return HKS_ERROR_NULL_POINTER;
}
//再次确认size是否符合
int32_t ret = HksCheckParamSet(paramSet, paramSet->paramSetSize);
if (ret != HKS_SUCCESS) {
HKS_LOG_E("invalid fresh paramSet");
return ret;
}
uint32_t size = paramSet->paramSetSize;
uint32_t offset = sizeof(struct HksParamSet) + sizeof(struct HksParam) * paramSet->paramsCnt;
//进行数据的偏移
for (uint32_t i = 0; i < paramSet->paramsCnt; i++) {
if (offset > size) {
HKS_LOG_E("invalid param set offset!");
return HKS_ERROR_INVALID_ARGUMENT;
}
if (GetTagType(paramSet->params[i].tag) == HKS_TAG_TYPE_BYTES) {
if (IsAdditionOverflow(offset, paramSet->params[i].blob.size)) {
HKS_LOG_E("blob size overflow!");
return HKS_ERROR_INVALID_ARGUMENT;
}
if (isCopy && (memcpy_s((uint8_t *)paramSet + offset, size - offset,
paramSet->params[i].blob.data, paramSet->params[i].blob.size) != EOK)) {
HKS_LOG_E("copy param blob failed!");
return HKS_ERROR_INSUFFICIENT_MEMORY;
}
paramSet->params[i].blob.data = (uint8_t *)paramSet + offset;
//更新offset
offset += paramSet->params[i].blob.size;
}
}
if (paramSet->paramSetSize != offset) {
HKS_LOG_E("invalid param set size!");
return HKS_ERROR_INVALID_ARGUMENT;
}
return HKS_SUCCESS;
}
5.4HksCheckParamSet
对于参数集合size的检查
5.5HksInitParamSet
对于参数集合的初始化
5.6HksAddParams
参数的添加
流程:调用CheckBeforeAddParam函数进行集合容量和需要添加的参数数据的非空检查---->将一组参数params都进行添加
5.7HksBuildParamSet
封装对于paramSet的更新调整
5.7HksFreeParamSet
paramSet空间释放
5.8HksGetParam
1.在其他函数中被频繁调用
2.作为从paramSet中获取数据的重要功能函数
3.基本流程:对于paramSet进行size检查后进行paramSet数组的遍历
5.9HksGetParamSet
封装一层检查并返回copy过的paramSet
5.10HksCheckParamMatch
感谢阅读!