2011-05-24 2 views
7

自分のユーザー空間プログラムでCRCチェックをしたい。そして、私はカーネルの暗号化libがすでにシステムに入っていて、SSE4.2のサポートが付いていることがわかりました。ユーザ空間プログラムでカーネルlibcrc32c(または同じ機能)を使用するには?

私は直接#include <linux/crc32c.h>に行って、-I/usr/src/linux/include/でgccを実行しました。しかし、それは動作しません。

何らかの種類のlibcrc32cを使用する方法はありますか?

答えて

9

あなたはLinux上のソケットファミリーAF_ALGを介してユーザ空間からカーネル暗号CRC32c(および他のハッシュ/暗号機能)を使用することができます。

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <sys/socket.h> 
#include <linux/if_alg.h> 
#include <sys/param.h> 
#include <string.h> 
#include <strings.h> 

int 
main (int argc, char **argv) { 

    int sds[2] = { -1, -1 }; 

    struct sockaddr_alg sa = { 
     .salg_family = AF_ALG, 
     .salg_type = "hash", 
     .salg_name = "crc32c" 
    }; 

    if ((sds[0] = socket(AF_ALG, SOCK_SEQPACKET, 0)) == -1) 
     return -1; 

    if(bind(sds[0], (struct sockaddr *) &sa, sizeof(sa)) != 0) 
     return -1; 

    if((sds[1] = accept(sds[0], NULL, 0)) == -1) 
     return -1; 

    char *s = "hello"; 
    size_t n = strlen(s); 
    if (send(sds[1], s, n, MSG_MORE) != n) 
     return -1; 

    int crc32c = 0x00000000; 
    if(read(sds[1], &crc32c, 4) != 4) 
     return -1; 

    printf("%08X\n", crc32c); 
    return 0; 
} 

をあなたがそれをスピードアップすることができ、ファイルやソケットデータをハッシュしている場合ゼロコピーアプローチを使用して、カーネル - >ユーザスペースバッファコピーを避けるために、sendfileおよび/またはspliceを使用します。

ハッピーコーディング。

関連する問題