2012-06-20 51 views
1

我的目標是讀取bio中存儲的數據(假設它是用於寫入操作)並計算其md5指紋。數據可以是任何東西。我做了幾次嘗試。這裏是我的最新嘗試:從linux中的生物結構散列數據

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

您需要測試您的代碼。將你的代碼減少到最小MD5,然後嘗試一些測試向量。

「」 - > d41d8cd98f00b204e9800998ecf8427e

「敏捷的棕色狐狸跳過懶狗」 - > 9e107d9d372bb6826bd81d3542a419d6

「敏捷的棕色狐狸跳過懶狗」 - > e4d909c290d0fb1ca068ffaddf22cbd0

(請注意,在第三個例子多餘的句號。)

一旦確認MD5是否正常工作,然後逐漸重新引入你的代碼的其他部分,並定期複查。

+0

所以我可以在我的打印輸出中看到這些結果的碎片,但一些字符混亂。我應該以什麼格式打印輸出? –

+0

我給出的測試向量是十六進制的。 – rossum

+0

明白了。謝謝! –