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

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의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.