1

md5アルゴリズム(md5.hおよびmd5.c)のカーネルスペース実装を使用しようとしています。md5.hはmd5.cにある関数を宣言していないことが判明したため、単純にmd5.hをcファイルに含めることはできませんでした。また、md5.hを変更して関数を宣言することは避けたかったのです。これは、意図しない結果を招く可能性があるためです。カーネル空間でmd5を使用する他の方法はありますか?

4

4 に答える 4

1

独自にローリングする代わりに、CryptoAPIを使用してください。

于 2012-06-20T18:42:22.830 に答える
0
#include <crypto/hash.h>

bool md5_hash(char *result, char* data, size_t len){
    struct shash_desc *desc;
    desc = kmalloc(sizeof(*desc), GFP_KERNEL);
    desc->tfm = crypto_alloc_shash("md5", 0, CRYPTO_ALG_ASYNC);

    if(desc->tfm == NULL)
        return false;

    crypto_shash_init(desc);
    crypto_shash_update(desc, data, len);
    crypto_shash_final(desc, result);
    crypto_free_shash(desc->tfm);

    return true;
}
于 2019-01-23T08:42:04.587 に答える
0

wande chenによって投稿されたコードは、カーネルヒープの破損を引き起こすことに注意してください。

struct shash_desc * desc;

desc = kmalloc(sizeof(* desc)、GFP_KERNEL);

desc-> tfm = crypto_alloc_shash( "md5"、0、CRYPTO_ALG_ASYNC);

これは、md5エンジンがmd5コンテキストを格納するためにstructshash_descを過ぎたメモリを使用するためです。

struct shash_descを割り当てる正しい方法は、ここにあります。

* hash = crypto_alloc_shash(name、0、0);

size = sizeof(struct shash_desc)+ crypto_shash_descsize(* hash);

* sdesc = kmalloc(size、GFP_KERNEL);

于 2020-03-23T12:54:30.947 に答える
0
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;
    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;
}

static int do_md5(const unsigned char *data, unsigned char *out_digest)
{
    struct crypto_shash *alg;
    char *hash_alg_name = "md5";
    unsigned int datalen = strlen(data); // remove the null byte

    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);
    }

    unsigned char hash[32];
    calc_hash(alg, data, datalen, hash);

    // Very dirty print of 8 first bytes for comparaison with sha256sum
    printk(KERN_INFO "HASH(%s, %i): %02x%02x%02x%02x%02x%02x%02x%02x\n",
          data, datalen, hash[0] & 0xFFu, hash[1] & 0xFFu, hash[2] & 0xFFu, hash[3] & 0xFFu, hash[4] & 0xFFu, 
          hash[5] & 0xFFu, hash[6] & 0xFFu, hash[7] & 0xFFu);

    char c[3];
    for (int i = 0; i < 16; i++)
    {
        sprintf( c, "%02x", hash[i] & 0xFFu);
        memcpy(out_digest+i*2, c, 2);
    }

    crypto_free_shash(alg);
    return 0;
}

tested.
于 2021-02-05T07:58:20.300 に答える