SCST and kernel module signing
==============================

Introduction
------------

The purpose of kernel module signatures is to only allow those kernel modules
to be loaded that have been signed with an approved key. A signed kernel
module is a kernel module with a digital signature embedded into the module
stating the owner of the signature created that kernel module. This is a
security mechanism that was introduced in kernel v3.7. If this mechanism is
enabled the signature of a kernel module is verified against the public keys
embedded in the kernel and also against the UEFI public keys. This mechanism
restricts kernel module loading such that only kernel modules signed with
certain keys can be loaded.

Module Signing and SCST
-----------------------
There are two options when using SCST in combination with a kernel that has
signed kernel modules:

* Disable the signature verification mechanism by adding module.sig_enforce=0
  at the end of GRUB_CMDLINE_LINUX in /etc/default/grub, by updating grub.cfg
  and by rebooting. grub.cfg can be updated by running e.g. the following
  command:

  update-bootloader || update-grub || grub2-mkconfig -o /boot/grub2/grub.cfg

* Enable the signature verification mechanism and load the public key that
  was generated during the SCST build process into the UEFI keyring.

Signing SCST Kernel Modules
---------------------------
Build and install SCST as usual. During the build process a public/private
key pair will be generated in the scst/src/certs directory:

ls -l scst/src/certs/scst_module_key*
-rw-------. 1 bart users 1325 Sep 28 16:42 scst/src/certs/scst_module_key.der
-rw-------. 1 bart users 3272 Sep 28 16:42 scst/src/certs/scst_module_key.priv

Start the process of importing the public key into the UEFI key repository
as follows:

mokutil --import scst/src/certs/scst_module_key.der

The mokutil software will ask which password should be used for this key
during the import process. Since this password will be short-lived, any
simple password works. Next, verify with mokutil --list-new whether the
import process has been started. If this is the case, reboot. The bootloader
will start the EFI MOK manager. Use the menus on the screen to activate the
SCST kernel module key. After booting has finished, verify whether loading
and unloading of the main SCST kernel module works:

modprobe scst && modprobe -r scst

See Also
--------
* Linux Kernel Module Signing Documentation, kernel.org
  https://www.kernel.org/doc/html/latest/admin-guide/module-signing.html

* Signed kernel module support, Gentoo Wiki
  https://wiki.gentoo.org/wiki/Signed_kernel_module_support

* Build and install signed Kvaser driver modules
  https://www.kvaser.com/developer-blog/build-install-signed-kvaser-driver-modules/
