鸿蒙源码分析(四十三)

hks_openssl_hash.c代码分析

一、hash函数介绍

1.哈希

将数据打乱混合,通过散列算法,重新创建一个叫做散列值的指纹,通常用一个短的随机字母和数字组成的字符串表示散列值。

2.哈希算法特点

2.1 单向不可逆性

哈希(Hash)算法是一种单向密码体制,即只有加密过程,没有解密过程。

2.2 可重复性

相同输入经过同一哈希函数得到相同散列值,但并非散列值相同则输入结果相同。

哈希函数是一种无需密钥对的加密方式
无需借助任何秘钥,主要用于针对对称和非对称加密过程中需要保护的部分提供完整性、防伪造的支持。
常见的哈希函数有:MD5,SHA-1,SHA-2(SHA256\SHA384\SHA512),SHA-X(系列)

二、代码分析

代码结构简单,前两个函数主要是参数的检查,最后一个函数HksOpensslHash实现hash过程。

//检查摘要算法是否为SHA256\SHA384\SHA512
static int32_t CheckDigestAlg(uint32_t alg)
{
    
    
    switch (alg) {
    
    
        //判断是什么算法
        case HKS_DIGEST_SHA256:
        case HKS_DIGEST_SHA384:
        case HKS_DIGEST_SHA512:
            break;
        default:
            HKS_LOG_E("Unsupport HASH Type!");
            return HKS_ERROR_INVALID_DIGEST;
    }
    return HKS_SUCCESS;
}
//HASH过程检查参数
static int32_t HashCheckParam(uint32_t alg, const struct HksBlob *msg, struct HksBlob *hash)
{
    
    
    if (CheckDigestAlg(alg) != HKS_SUCCESS) {
    
    
        //检查参数前检查摘要算法
        HKS_LOG_E("Unsupport HASH Type!");
        return HKS_ERROR_INVALID_DIGEST;
    }
    if (HksOpensslCheckBlob(hash) != HKS_SUCCESS) {
    
    
        //检查hash的data域和size是否合法
        HKS_LOG_E("Invalid param hash!");
        return HKS_ERROR_INVALID_ARGUMENT;
    }
    if (HksOpensslCheckBlob(msg) != HKS_SUCCESS) {
    
    
        //检查最后存放消息的结构体
        HKS_LOG_E("Invalid param msg!");
        return HKS_ERROR_INVALID_ARGUMENT;
    }
    return HKS_SUCCESS;
}
//openssl的hash过程
int32_t HksOpensslHash(uint32_t alg, const struct HksBlob *msg, struct HksBlob *hash)
{
    
    
    int32_t ret = HashCheckParam(alg, msg, hash);
    //执行前先检查参数
    if (ret != HKS_SUCCESS) {
    
    
        HKS_LOG_E("Invalid Params!");
        return HKS_ERROR_INVALID_ARGUMENT;
    }

    const EVP_MD *opensslAlg = GetOpensslAlg(alg);
    //将选择的哈希算法写进opensslAlg中
    if (opensslAlg == NULL) {
    
    
        HKS_LOG_E("get openssl algorithm fail");
        return HKS_ERROR_CRYPTO_ENGINE_ERROR;
    }

    ret = EVP_Digest(msg->data, msg->size, hash->data, &hash->size, opensslAlg, NULL);
    //实现哈希过程,一meg为输入信息,经过hash函数输出
    if (ret != HKS_OPENSSL_SUCCESS) {
    
    
        HksLogOpensslError();
        return HKS_ERROR_CRYPTO_ENGINE_ERROR;
    }
    return HKS_SUCCESS;
}

猜你喜欢

转载自blog.csdn.net/m0_46976252/article/details/120023007