security_huks/frameworks/huks_standard/common/hks_param.c解读

知识总结

总体概述

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

在这里插入图片描述
感谢阅读!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国家一级假勤奋研究牲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值