리눅스 커널에서 해시값 연산 중에 질문이 있습니다.
글쓴이: 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 한 다음에 해시를 구하려고 하시는건가요?
감사합니다.
말씀해주신 부분이 문제였네요...
제가 주석을 달았다 지웠다하면서 꼬인부분이 생긴 것 같네요
정신이 없어서제대로 확인을 못한 것 같습니다.
감사합니다!!
댓글 달기