如何在用户空间程序中使用内核libcrc32c(或相同的函数)?

时间:2011-05-24 14:19:48

标签: c kernel

我想在自己的用户空间程序中进行一些CRC检查。我发现内核加密lib已经在系统中,并且支持SSE4.2。

我尝试直接#include <linux/crc32c.h>并使用-I/usr/src/linux/include/运行gcc。但是,它不起作用。

是否可以使用某种libcrc32c

1 个答案:

答案 0 :(得分: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;
}

如果你正在散列文件或套接字数据,你可以使用零拷贝方法加速它以避免内核 - &gt;使用sendfile和/或splice的用户空间缓冲区副本。

快乐的编码。