从linux中的Bio结构中哈希数据

时间:2012-06-20 22:47:16

标签: c linux encryption io

我的目标是读取存储在bio中的数据(假设它是用于写入操作)并计算其md5指纹。数据可以是任何东西。我做了几次尝试。这是我最近的尝试:

void fingerprint(struct bio * bio, unsigned char * result)
{
char * place;
char * cpy;
int total;
struct buffer_head * bh;
struct scatterlist sg;
struct hash_desc desc = {
    .tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC),
    .flags = CRYPTO_TFM_REQ_MAY_SLEEP
};
total = 0;

cpy = kmalloc(sizeof(char) * bio->bi_io_vec[i].bv_len, GFP_KERNEL);
bh = (struct buffer_head *)bio->bi_io_vec[i].bv_page->private;
    place = bh->b_data + bio->bi_io_vec[i].bv_offset;

DPRINTK("%u", bio->bi_io_vec[i].bv_offset);
DPRINTK("%u", place);

memcpy(cpy, place, bio->bi_io_vec[i].bv_len);
DPRINTK("%x", place);
DPRINTK("%x", cpy);

sg_init_one(&sg, (u8 *)cpy, bio->bi_io_vec[i].bv_len);
crypto_hash_init(&desc);
crypto_hash_update(&desc, &sg, bio->bi_io_vec[i].bv_len);
total += bio->bi_io_vec[i].bv_len;
DPRINTK("%u", bio->bi_vcnt);
DPRINTK("%u", total);

crypto_hash_final(&desc, result);
kfree(cpy);
}

哈希的结果非常相似,如果不完全相同,它们总是偶数。我打印结果的时间很长,以十六进制表示。为什么会这样?

1 个答案:

答案 0 :(得分:1)

您需要测试您的代码。将代码减少到MD5最小值,并尝试一些测试向量。

“” - > d41d8cd98f00b204e9800998ecf8427e

“快速的棕色狐狸跳过懒狗” - > 9e107d9d372bb6826bd81d3542a419d6

“快速的棕色狐狸跳过懒狗。” - > e4d909c290d0fb1ca068ffaddf22cbd0

(请注意第三个例子中的额外句号。)

一旦确定MD5正常工作,然后逐步重新引入代码的其他部分并定期重新检查。