Как использовать libcrc32c ядра (или те же функции) в программах пользовательского пространства?

Я хочу выполнить некоторую проверку CRC в моей собственной программе пользовательского пространства. И я обнаружил, что ядро crypto lib уже находится в системе, и поставляется с поддержкой SSE4.2.

Я попытался напрямую #include <linux/crc32c.h> и запустить gcc с -I/usr/src/linux/include/. Однако это не работает.

Есть ли способ использовать какой-нибудь libcrc32c?

Решение

Вы можете использовать криптографию ядра CRC32c (и другие функции хэша/шифра) из пользовательского пространства через семейство сокетов AF_ALG в Linux:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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;
}

Если вы хэшируете файлы или данные сокета, вы можете ускорить процесс, используя подход zero-copy, чтобы избежать копирования буфера ядра -> из пространства пользователя с помощью sendfile и/или splice.

Удачного кодирования.

Комментарии (0)