리눅스 커널에서 해시값 연산 중에 질문이 있습니다.

fydtkadl의 이미지

리눅스 커널에서 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);
 
}
bushi의 이미지

[bookmark 용 댓글입니다.]

댓글 첨부 파일: 
첨부파일 크기
Plain text icon m5.c.txt5.23 KB
fydtkadl의 이미지

저의 소스코드보다 훨씬 논리적이고 깔끔하네요
좋은 자료 감사합니다!

Anti-Lock의 이미지

전반적으로 코드에 구조적인 문제가 있어보이네요...
무엇보다 plaintext 를 free 한 다음에 해시를 구하려고 하시는건가요?

fydtkadl의 이미지

말씀해주신 부분이 문제였네요...
제가 주석을 달았다 지웠다하면서 꼬인부분이 생긴 것 같네요
정신이 없어서제대로 확인을 못한 것 같습니다.
감사합니다!!