Linux内核中使用crypto进行sha1方法

编写Linux驱动时,编写内核模块无法使用很多用户空间方法进行内核空间数据的hash计算。不过Linux自身提供了Crypto API,可用于内核模块中的加密和签名操作,文中以sha1为例,还提及在4.15内核下编译加载通过及测试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编写Linux驱动的时候常常需要对内核空间的某些数据进行hash计算,而在编写内核模块的时候很多用户空间的方法不能使用,例如Openssl(理论上可以,但是我没成功过)。但是Linux自身提供了一个Crypto API对数据进行各种加密计算,使用这个API就能够在内核模块中进行一些加密和签名操作,下面以sha1位例子。

在4.15内核下编译加载通过。
头文件需要包含:

#include <crypto/hash.h>
#include <crypto/skcipher.h>
#include <linux/crypto.h>
struct sdesc {
    struct shash_desc shash;
    char ctx[];
};

static struct sdesc *init_sdesc(struct crypto_shash *alg)
{
    struct sdesc *sdesc;
    int size;

    size = sizeof(struct shash_desc) + crypto_shash_descsize(alg);
    sdesc = kmalloc(size, GFP_KERNEL);
    if (!sdesc)
        return ERR_PTR(-ENOMEM);
    sdesc->shash.tfm = alg;
    sdesc->shash.flags = 0x0;
    return sdesc;
}

static int calc_hash(struct crypto_shash *alg,
             const unsigned char *data, unsigned int datalen,
             unsigned char *digest)
{
    struct sdesc *sdesc;
    int ret;

    sdesc = init_sdesc(alg);
    if (IS_ERR(sdesc)) {
        pr_info("can't alloc sdesc\n");
        return PTR_ERR(sdesc);
    }

    ret = crypto_shash_digest(&sdesc->shash, data, datalen, digest);
    kfree(sdesc);
    return ret;
}

/*
测试函数,data是进行hash的数据,datalen为数据长度,digest为sha1结果(是一个 out变量)
*/
static int test_hash(const unsigned char *data, unsigned int datalen,
             unsigned char *digest)
{
    struct crypto_shash *alg;
    char *hash_alg_name = "sha1";
    int ret;

    alg = crypto_alloc_shash(hash_alg_name, 0, 0);
    if (IS_ERR(alg)) {
            pr_info("can't alloc alg %s\n", hash_alg_name);
            return PTR_ERR(alg);
    }
    ret = calc_hash(alg, data, datalen, digest);
    crypto_free_shash(alg);
    return ret;
}

进行测试时,只需要将hash的数据按照对应的参数传入test_hash中即可。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值