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