You can use kernel crypto CRC32c (and other hash / encryption functions) from user space through the AF_ALG socket family on Linux:
#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; }
If you hash files or socket data, you can speed them up using a zero copy approach to avoid copying a kernel β user-space instance using sendfile and / or splice .
Happy coding.
Mirek Rusin Jun 22 '12 at 12:20 2012-06-22 12:20
source share