#!/bin/sh
# This will generate a disk encryption key and seal / ecncrypt
# with the current PCRs and then store it in the TPM NVRAM.
# It will then need to be bundled into initrd that is booted with Qubes.

TPM_INDEX=3
TPM_SIZE=312
KEY_FILE=/tmp/secret.key

die() { echo >&2 "$@"; exit 1; }
warn() { echo >&2 "$@"; }

read -s -p "New key password: " key_password
echo
read -s -p "Repeat password: " key_password2
echo

if [ "$key_password" -ne "$key_password2" ]; then
	die "Key passwords do not match"
fi

dd \
	if=/dev/urandom \
	of="$KEY_FILE" \
	bs=1 \
	count=128 \
	2>/dev/null \
|| die "Unable to generate 128 random bytes"


# Use the current values of the PCRs, which will be read
# from the TPM as part of the sealing ("X").
# should this read the storage root key?
sealfile2 \
	-if "$KEY_FILE" \
	-of /tmp/sealed \
	-pwdd "$key_password" \
	-hk 40000000 \
	-ix 0 X \
	-ix 1 X \
	-ix 2 X \
	-ix 3 X \
	-ix 4 X \
|| die "Unable to seal secret"

rm "$KEY_FILE"


# to create an nvram space we need the TPM owner password
# and the TPM physical presence must be asserted.
#
# The permissions are 0 since there is nothing special
# about the sealed file
physicalpresence -s \
|| warn "Warning: Unable to assert physical presence"

read -s -p "TPM Owner password: " tpm_password
echo

nv_definespace \
	-in $TPM_INDEX \
	-sz $TPM_SIZE \
	-pwdo "$tpm_password" \
	-per 0 \
|| die "Warning: Unable to define NVRAM space; trying anyway"


nv_writevalue \
	-in $TPM_INDEX \
	-if /tmp/sealed \
|| die "Unable to write sealed secret to NVRAM"

rm /tmp/sealed

