diff --git a/linuxkm/README.md b/linuxkm/README.md new file mode 100644 index 00000000000..35739a89e1c --- /dev/null +++ b/linuxkm/README.md @@ -0,0 +1,92 @@ +# wolfSSL linuxkm (linux kernel module) + +libwolfssl supports building as a linux kernel module (`libwolfssl.ko`). +When loaded, wolfCrypt and wolfSSL API are made available to the rest of +the kernel, supporting cryptography and TLS in kernel space. + +Performing cryptographic operations in kernel space has significant advantages +over user space for high throughput network (VPN, IPsec, MACsec, TLS, etc) and +filesystem (dm-crypt/LUKS, fscrypt disk encryption) IO processing, with the +added benefit that keys can be kept isolated to kernel space. Additionally, +when wolfCrypt-FIPS is used, this provides a simple recipe for FIPS-compliant +kernels. + +Supported features: +- crypto acceleration: AES-NI, AVX, etc. +- kernel crypto API registration (wolfCrypt algs appear as drivers in `/proc/crypto`.). +- `CONFIG_CRYPTO_FIPS`, and crypto-manager self-tests. +- FIPS-compliant patches to `drivers/char/random.c`, covering kernels 5.10 to + 6.15. +- Supports FIPS-compliant WireGuard (https://github.com/wolfssl/wolfguard). +- TLS 1.3 and DTLS 1.3 kernel offload. + +## Building and Installing + +Build linuxkm with: + +```sh +$ ./configure --enable-linuxkm --with-linux-source=/usr/src/linux +$ make -j module +``` + +note: replace `/usr/src/linux` with a path to your fully configured and built +target kernel source tree. + +Assuming you are targeting your native system, install with: + +```sh +$ sudo make install +$ sudo modprobe libwolfssl +``` + +### options + +| linuxkm option | description | +| :------------------------------- | :--------------------------------------- | +| --enable-linuxkm-lkcapi-register | Register wolfcrypt algs with linux kernel
crypto API. Options are 'all', 'none', or
comma separated list of algs. | +| --enable-linuxkm-pie | Enable relocatable object build of module| +| --enable-linuxkm-benchmarks | Run crypto benchmark at module load | + +## Kernel Patches + +The dir `linuxkm/patches` contains a patch to the linux kernel CRNG. The +CRNG provides the implementation for `/dev/random`, `/dev/urandom`, and +`getrandom()`. + +The patch updates these two sources +- `drivers/char/random.c` +- `include/linux/random.h` + + +to use FIPS-compliant algorithms, instead of chacha and blake2s. + +Patches are provided for several kernel versions, ranging from `5.10.x` to +`6.15`. + +### patch procedure + +1. Ensure kernel src tree is clean before patching: + +```sh +cd ~/kernelsrc/ +make mrproper +``` + +2. Verify patches will apply clean with a dry run check: + +```sh +patch -p1 --dry-run <~/wolfssl-5.8.2/linuxkm/patches/6.12/WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v12.patch +checking file drivers/char/random.c +checking file include/linux/random.h +``` + +3. Finally patch the kernel: + +```sh +patch -p1 <~/wolfssl-5.8.2/linuxkm/patches/6.12/WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v12.patch +patching file drivers/char/random.c +patching file include/linux/random.h +``` + +4. Build kernel. + diff --git a/linuxkm/include.am b/linuxkm/include.am index 2dd41b815eb..63ffc5a58b4 100644 --- a/linuxkm/include.am +++ b/linuxkm/include.am @@ -5,6 +5,7 @@ EXTRA_DIST += m4/ax_linuxkm.m4 \ linuxkm/Kbuild \ linuxkm/Makefile \ + linuxkm/README.md \ linuxkm/get_thread_size.c \ linuxkm/module_hooks.c \ linuxkm/module_exports.c.template \