리눅스 커널에서 해시값 연산 중에 질문이 있습니다.
글쓴이: fydtkadl / 작성시간: 금, 2016/11/18 - 5:41오전
리눅스 커널에서 hash값을 구하려고 합니다.
리눅스 커널에서 제공하는 crypto API를 사용하여 파일의 해시값을 구하는 커널 모듈을 구현 중 입니다.
http://stackoverflow.com/questions/16861332/how-to-compute-sha1-of-an-array-in-linux-kernel
위의 링크의 글을 참고하여 구현 중
char *plaintext = "plaintext goes here";이 아닌
커널에서 vfs_read로 파일을 읽어서 읽은 값을 연산하려고하는데
일정 크기 이하의 파일은 해시값이 일정하지 않고 계속 바뀌는 경우가 발생합니다.
무엇이 원인인지 알고싶습니다.
void md5_hash(const char *filename){
struct scatterlist sg;
struct hash_desc desc;
struct file *filp;
char bufs[500];
unsigned int fsize = 0;
char *plaintext = NULL;
int i=0;
int ret=0;
unsigned int j = 0;
mm_segment_t old_fs;
u8 hashval[20] = {0};
fsize = get_file_size(filename);
plaintext = kmalloc(fsize,GFP_KERNEL);
old_fs=get_fs();
set_fs(KERNEL_DS);
//커널에서 유저레벨의 파일 읽기
filp=filp_open(filename, O_RDONLY, 0);
if(IS_ERR(filp)){
printk("read_file open error");
return;
}
else{
printk("read_file open success\n");
//start offset
filp->f_pos=0;
//read from filp(file_struct)
do{ //파일 구조체에서 vfs_read로 읽기
// arg 1: fs 2: buffer 3:count 4:offset
memset(bufs,0,500);
ret=vfs_read(filp, bufs, 500, &(filp->f_pos));
//읽은 내용을 커널 내의 배열에 복사
memcpy(plaintext+(j*500),bufs,ret);
j++;
} while(ret != 0);
filp_close(filp, NULL);
set_fs(old_fs);
kfree(plaintext);
}
//hash 연산 부분
sg_init_one(&sg, plaintext, fsize);
desc.tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
crypto_hash_init(&desc);
crypto_hash_update(&desc, &sg, fsize);
crypto_hash_final(&desc, hashval);
for(i = 0; i<16; i++){
printk("%.2x", hashval[i]);
}
printk("\n");
crypto_free_hash(desc.tfm);
}Forums:


[bookmark 용 댓글입니다.]
[bookmark 용 댓글입니다.]
감사합니다.
저의 소스코드보다 훨씬 논리적이고 깔끔하네요
좋은 자료 감사합니다!
전반적으로 코드에 구조적인 문제가 있어보이네요...
전반적으로 코드에 구조적인 문제가 있어보이네요...
무엇보다 plaintext 를 free 한 다음에 해시를 구하려고 하시는건가요?
감사합니다.
말씀해주신 부분이 문제였네요...
제가 주석을 달았다 지웠다하면서 꼬인부분이 생긴 것 같네요
정신이 없어서제대로 확인을 못한 것 같습니다.
감사합니다!!
댓글 달기