#!/bin/bash
# sys/mok7 - Machine Owner Key (MOK) tool for signing DKMS-built kernel modules
set -e
source "/home/zwelch/src/mcf/mcsh-release/install/share/mcsh/mcsh.sh"
lib_load "mcui"
######
# Native dependencies
mok7_client_packages=( mokutil )
######
# Configuration
mok7_config_init() {
script_setting_vars mokcert mokkey
}
######
# Key Management CLI
mok7_key() { cmd_dispatch "$@"; }
mok7_key_usage() {
cat <<USAGE
<cmd>
Key Management Commands:
gen Generate a new MOK pair
import Import the MOK into EFI memory
USAGE
}
mok7_key_gen() {
run_sudo mkdir -p "$script_confdir"
run_sudo openssl req -new -x509 \
-newkey rsa:2048 -keyout "$mokkey" \
-outform DER -out "$mokcert" \
-nodes -days 36500 \
-subj "/CN=Kernel Module Signing Key/"
run_sudo chmod 600 "$mokkey"
}
mok7_key_import() {
local password="1234"
info "$mokcert: installing in EFI memory..."
local tmp
tmp=$(cmd_tempfile)
run mokutil --generate-hash="$password" >"$tmp"
run_sudo mokutil --import "$mokcert" -f "$tmp"
run rm -f "$tmp"
local mcui_title="MOK Password"
local msg1 msg2
msg1="Upon rebooting, you must enter the $package_name import password."
msg2="The import password is '$password'"
mcui_warn_details "$msg1" "$msg2"
}
######
# Key Wizard CLI
mok7_wizard() {
mok7_wizard_check || run mok7_key_gen
mok7_wizard_import
}
# mok7_wizard_check - Returns success if wizard should use existing key.
mok7_wizard_check() {
# if key does not exist, we need to generate one
[ -f "$mokkey" ]
local mcui_title="Overwrite?"
local confirm
mcui_yesno_warn confirm "$mokkey: file exists. Overwrite key file?"
local usekey=false
if [ "$confirm" != 'yes' ]; then
info "$mokkey: using existing key..."
usekey=true
fi
$usekey
}
mok7_wizard_import() {
local mcui_title="Import?"
local confirm
mcui_yesno confirm "$mokkey: import to EFI?"
[ -z "$confirm" -o "$confirm" = yes ] || return 0
mok7_key_import
mcui_title="Restart Required"
local prompt msg
prompt="Restart your computer now to complete the import process?"
msg="Before you can sign modules, you must restart your computer."
msg="$msg This allows the EFI BIOS to finish importing the new MOK."
mcui_host_restart "$prompt" "$msg"
}
######
# Module Signing
mok7_sign() {
if [ "$*" ]; then
cmd_dispatch "$@"
else
mok7_sign_all
fi
}
mok7_sign_usage() {
cat <<USAGE
<cmd> [...]>
Module Signing Commands:
all Sign all modules
module <file> Sign one module file
USAGE
}
mok7_sign_all() {
has_args 0 "$@"
local -a modules
modules=( $(dirname $(modinfo -n vboxdrv))/*.ko )
for_each mok7_sign_module "${modules[@]}"
}
mok7_sign_module() {
has_args 1 "$@"
local file=$1
info "$file: signing..."
local sign="/usr/src/linux-headers-$(uname -r)/scripts/sign-file"
run_sudo $sign sha256 "$mokkey" "$mokcert" "$file"
}
######
# Main
mok7_desc() { echo "Machine Owner Key (MOK) helper"; }
mok7_usage() {
cat <<USAGE
<cmd> ...
Machine Owner Key (MOK) Commands:
wizard Generates and installs the MOK
sign [...] Module signing commands
USAGE
}
app_run "$@"
Generated on Fri Jul 28 14:34:46 PDT 2017 by mcsh d14 v0.23.0.