Merge pull request #761 from Nitrokey/hotp-neutral

Fix branding issue with HOTP USB Security Dongles
This commit is contained in:
tlaurion 2020-07-23 15:05:13 -04:00 committed by GitHub
commit 7ea13ee000
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 99 additions and 140 deletions

View File

@ -8,13 +8,13 @@ stages:
build: build:
stage: build stage: build
retry: 2 retry: 1
cache: cache:
paths: paths:
- packages - packages
- crossgcc - crossgcc
- build - build
key: "heads-$GITLAB_USER_LOGIN" key: "heads-$GITLAB_USER_LOGIN-2"
script: script:
- dnf install -y @development-tools gcc-c++ gcc-gnat zlib-devel perl-Digest-MD5 perl-Digest-SHA uuid-devel pcsc-tools ncurses-devel lbzip2 libuuid-devel lzma elfutils-libelf-devel bc bzip2 bison flex git gnupg iasl m4 nasm patch python wget libusb-devel cmake automake pv bsdiff autoconf libtool cpio texinfo - dnf install -y @development-tools gcc-c++ gcc-gnat zlib-devel perl-Digest-MD5 perl-Digest-SHA uuid-devel pcsc-tools ncurses-devel lbzip2 libuuid-devel lzma elfutils-libelf-devel bc bzip2 bison flex git gnupg iasl m4 nasm patch python wget libusb-devel cmake automake pv bsdiff autoconf libtool cpio texinfo
- git fetch origin - git fetch origin
@ -75,6 +75,8 @@ build:
- cat ./build/qemu-coreboot/hashes.txt - cat ./build/qemu-coreboot/hashes.txt
- echo "Archiving qemu-coreboot logs..." - echo "Archiving qemu-coreboot logs..."
- tar zcvf ./build/qemu-coreboot/logs.tar.gz ./build/log/* - tar zcvf ./build/qemu-coreboot/logs.tar.gz ./build/log/*
- echo "Calculate used space for cache"
- du -shc packages crossgcc build
artifacts: artifacts:
paths: paths:
- ./build/qemu-coreboot - ./build/qemu-coreboot

View File

@ -428,7 +428,7 @@ bin_modules-$(CONFIG_FLASHTOOLS) += flashtools
bin_modules-$(CONFIG_NEWT) += newt bin_modules-$(CONFIG_NEWT) += newt
bin_modules-$(CONFIG_CAIRO) += cairo bin_modules-$(CONFIG_CAIRO) += cairo
bin_modules-$(CONFIG_FBWHIPTAIL) += fbwhiptail bin_modules-$(CONFIG_FBWHIPTAIL) += fbwhiptail
bin_modules-$(CONFIG_LIBREMKEY) += libremkey-hotp-verification bin_modules-$(CONFIG_HOTPKEY) += hotp-verification
bin_modules-$(CONFIG_MSRTOOLS) += msrtools bin_modules-$(CONFIG_MSRTOOLS) += msrtools
$(foreach m, $(bin_modules-y), \ $(foreach m, $(bin_modules-y), \

View File

@ -22,7 +22,7 @@ CONFIG_TPMTOTP=y
#CONFIG_NEWT=y #CONFIG_NEWT=y
CONFIG_CAIRO=y CONFIG_CAIRO=y
CONFIG_FBWHIPTAIL=y CONFIG_FBWHIPTAIL=y
CONFIG_LIBREMKEY=y CONFIG_HOTPKEY=y
CONFIG_LINUX_USB=y CONFIG_LINUX_USB=y

View File

@ -22,7 +22,7 @@ CONFIG_TPMTOTP=y
#CONFIG_NEWT=y #CONFIG_NEWT=y
CONFIG_CAIRO=y CONFIG_CAIRO=y
CONFIG_FBWHIPTAIL=y CONFIG_FBWHIPTAIL=y
CONFIG_LIBREMKEY=y CONFIG_HOTPKEY=y
CONFIG_LINUX_USB=y CONFIG_LINUX_USB=y

View File

@ -24,7 +24,7 @@ CONFIG_TPMTOTP=y
#CONFIG_NEWT=y #CONFIG_NEWT=y
CONFIG_CAIRO=y CONFIG_CAIRO=y
CONFIG_FBWHIPTAIL=y CONFIG_FBWHIPTAIL=y
CONFIG_LIBREMKEY=y CONFIG_HOTPKEY=y
CONFIG_LINUX_USB=y CONFIG_LINUX_USB=y

View File

@ -24,7 +24,7 @@ CONFIG_TPMTOTP=y
#CONFIG_NEWT=y #CONFIG_NEWT=y
CONFIG_CAIRO=y CONFIG_CAIRO=y
CONFIG_FBWHIPTAIL=y CONFIG_FBWHIPTAIL=y
CONFIG_LIBREMKEY=y CONFIG_HOTPKEY=y
CONFIG_LINUX_USB=y CONFIG_LINUX_USB=y

View File

@ -24,7 +24,7 @@ CONFIG_DROPBEAR=y
#CONFIG_NEWT=y #CONFIG_NEWT=y
CONFIG_CAIRO=y CONFIG_CAIRO=y
CONFIG_FBWHIPTAIL=y CONFIG_FBWHIPTAIL=y
CONFIG_LIBREMKEY=y CONFIG_HOTPKEY=y
CONFIG_LINUX_USB=y CONFIG_LINUX_USB=y
CONFIG_LINUX_E1000E=y CONFIG_LINUX_E1000E=y

View File

@ -92,10 +92,10 @@ update_totp()
{ {
echo "Scan the QR code to add the new TOTP secret" echo "Scan the QR code to add the new TOTP secret"
/bin/seal-totp /bin/seal-totp
if [ -x /bin/libremkey_hotp_verification ]; then if [ -x /bin/hotp_verification ]; then
echo "Once you have scanned the QR code, hit Enter to configure your Librem Key" echo "Once you have scanned the QR code, hit Enter to configure your HOTP USB Security Dongle (e.g. Librem Key or Nitrokey)"
read read
/bin/seal-libremkey /bin/seal-hotpkey
else else
echo "Once you have scanned the QR code, hit Enter to continue" echo "Once you have scanned the QR code, hit Enter to continue"
read read
@ -118,7 +118,7 @@ clean_boot_check()
[ $GPG_KEY_COUNT -ne 0 ] && return [ $GPG_KEY_COUNT -ne 0 ] && return
# check for USB security token # check for USB security token
if [ "$CONFIG_LIBREMKEY" = "y" ]; then if [ "$CONFIG_HOTPKEY" = "y" ]; then
enable_usb enable_usb
if ! gpg --card-status > /dev/null ; then if ! gpg --card-status > /dev/null ; then
return return
@ -140,6 +140,13 @@ else
mount_boot mount_boot
fi fi
# Use stored HOTP key branding
if [ -r /boot/kexec_hotp_key ]; then
HOTPKEY_BRANDING="$(cat /boot/kexec_hotp_key)"
else
HOTPKEY_BRANDING="HOTP USB Security Dongle"
fi
last_half=X last_half=X
while true; do while true; do
MAIN_MENU_OPTIONS="" MAIN_MENU_OPTIONS=""
@ -188,14 +195,16 @@ while true; do
fi fi
if [ "$totp_confirm" = "i" -o -z "$totp_confirm" ]; then if [ "$totp_confirm" = "i" -o -z "$totp_confirm" ]; then
if [ -x /bin/libremkey_hotp_verification ]; then if [ -x /bin/hotp_verification ]; then
HOTP=`unseal-hotp` HOTP=`unseal-hotp`
enable_usb enable_usb
if ! libremkey_hotp_verification info ; then if ! hotp_verification info ; then
whiptail $CONFIG_WARNING_BG_COLOR --clear --title 'WARNING: Please Insert Your Librem Key' --msgbox "Your Librem Key was not detected.\n\nPlease insert your Librem Key" 30 90 whiptail $CONFIG_WARNING_BG_COLOR --clear \
--title "WARNING: Please Insert Your $HOTPKEY_BRANDING" \
--msgbox "Your $HOTPKEY_BRANDING was not detected.\n\nPlease insert your $HOTPKEY_BRANDING" 30 90
fi fi
# Don't output HOTP codes to screen, so as to make replay attacks harder # Don't output HOTP codes to screen, so as to make replay attacks harder
libremkey_hotp_verification check $HOTP hotp_verification check $HOTP
case "$?" in case "$?" in
0 ) 0 )
HOTP="Success" HOTP="Success"
@ -205,7 +214,7 @@ while true; do
MAIN_MENU_BG_COLOR=$CONFIG_ERROR_BG_COLOR MAIN_MENU_BG_COLOR=$CONFIG_ERROR_BG_COLOR
;; ;;
* ) * )
HOTP="Error checking code, Insert Librem Key and retry" HOTP="Error checking code, Insert $HOTPKEY_BRANDING and retry"
MAIN_MENU_BG_COLOR=$CONFIG_WARNING_BG_COLOR MAIN_MENU_BG_COLOR=$CONFIG_WARNING_BG_COLOR
;; ;;
esac esac

View File

@ -84,9 +84,9 @@ cat "$KEY_DEVICES" | cut -d\ -f1 | xargs /bin/qubes-measure-luks \
|| die "Unable to measure the LUKS headers" || die "Unable to measure the LUKS headers"
luks_pcr=`tpm calcfuturepcr -ix 16 -if /tmp/luksDump.txt` luks_pcr=`tpm calcfuturepcr -ix 16 -if /tmp/luksDump.txt`
# Librem Key loads USB modules which changes PCR5. # HOTP USB Secrity Dongle loads USB modules which changes PCR5.
# In the event Librem Key is enabled, skip verification of PCR5 # In the event HOTP USB Security Dongle is enabled, skip verification of PCR5
if [ -x /bin/libremkey_hotp_verification ]; then if [ -x /bin/hotp_verification ]; then
pcr_5="X" pcr_5="X"
else else
pcr_5="0000000000000000000000000000000000000000" pcr_5="0000000000000000000000000000000000000000"

View File

@ -1,11 +1,12 @@
#!/bin/sh #!/bin/sh
# Retrieve the sealed TOTP secret and initialize a Librem Key with it # Retrieve the sealed TOTP secret and initialize a USB Security dongle with it
. /etc/functions . /etc/functions
HOTP_SEALED="/tmp/secret/hotp.sealed" HOTP_SEALED="/tmp/secret/hotp.sealed"
HOTP_SECRET="/tmp/secret/hotp.key" HOTP_SECRET="/tmp/secret/hotp.key"
HOTP_COUNTER="/boot/kexec_hotp_counter" HOTP_COUNTER="/boot/kexec_hotp_counter"
HOTP_KEY="/boot/kexec_hotp_key"
mount_boot() mount_boot()
{ {
@ -16,6 +17,13 @@ mount_boot()
fi fi
} }
# Use stored HOTP key branding (this might be useful after OEM reset)
if [ -r /boot/kexec_hotp_key ]; then
HOTPKEY_BRANDING="$(cat /boot/kexec_hotp_key)"
else
HOTPKEY_BRANDING="HOTP USB Security Dongle"
fi
tpm nv_readvalue \ tpm nv_readvalue \
-in 4d47 \ -in 4d47 \
-sz 312 \ -sz 312 \
@ -49,26 +57,35 @@ mount_boot
counter_value=1 counter_value=1
enable_usb enable_usb
if ! libremkey_hotp_verification info ; then if ! hotp_verification info ; then
echo "Insert your Librem Key and press Enter to configure it" echo "Insert your $HOTPKEY_BRANDING and press Enter to configure it"
read read
if ! libremkey_hotp_verification info ; then if ! hotp_verification info ; then
# don't leak key on failure # don't leak key on failure
shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null
die "Unable to find Librem Key" die "Unable to find $HOTPKEY_BRANDING"
fi fi
fi fi
# Set HOTP USB Security Dongle branding based on VID
if [ ! $(lsusb | grep -q "20a0:") ]; then
HOTPKEY_BRANDING="Nitrokey"
elif [ ! $(lsusb | grep -q "316d:") ]; then
HOTPKEY_BRANDING="Librem Key"
else
HOTPKEY_BRANDING="HOTP USB Security Dongle"
fi
echo -e "" echo -e ""
read -s -p "Enter your Librem Key Admin PIN: " admin_pin read -s -p "Enter your $HOTPKEY_BRANDING Admin PIN: " admin_pin
echo -e "\n" echo -e "\n"
libremkey_hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo -e "\n" echo -e "\n"
read -s -p "Error setting HOTP secret, re-enter Admin PIN and try again: " admin_pin read -s -p "Error setting HOTP secret, re-enter Admin PIN and try again: " admin_pin
echo -e "\n" echo -e "\n"
if ! libremkey_hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value ; then if ! hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING" ; then
# don't leak key on failure # don't leak key on failure
shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null shred -n 10 -z -u "$HOTP_SECRET" 2> /dev/null
die "Setting HOTP secret failed" die "Setting HOTP secret failed"
@ -90,11 +107,15 @@ counter_value=`expr $counter_value + 1`
echo $counter_value > $HOTP_COUNTER \ echo $counter_value > $HOTP_COUNTER \
|| die "Unable to create hotp counter file" || die "Unable to create hotp counter file"
# Store/overwrite HOTP USB Security Dongle branding found out beforehand
echo $HOTPKEY_BRANDING > $HOTP_KEY \
|| die "Unable to store hotp key file"
#sha256sum /tmp/counter-$counter > $HOTP_COUNTER \ #sha256sum /tmp/counter-$counter > $HOTP_COUNTER \
#|| die "Unable to create hotp counter file" #|| die "Unable to create hotp counter file"
mount -o remount,ro /boot mount -o remount,ro /boot
echo -e "\nLibrem Key initialized successfully. Press Enter to continue." echo -e "\n$HOTPKEY_BRANDING initialized successfully. Press Enter to continue."
read read
exit 0 exit 0

View File

@ -1,2 +1,2 @@
# empty placeholder file # empty placeholder file
# This submodule is defined in modules/libremkey-hotp-verification # This submodule is defined in modules/hotp-verification

37
modules/hotp-verification Normal file
View File

@ -0,0 +1,37 @@
modules-$(CONFIG_HOTPKEY) += hotp-verification
hotp-verification_depends := libusb $(musl_dep)
hotp-verification_version := 5fb260e631b237a298b6dcca47bbd728f2c5ac3a
hotp-verification_dir := hotp-verification-$(hotp-verification_version)
hotp-verification_tar := nitrokey-hotp-verification-$(hotp-verification_version).tar.gz
hotp-verification_url := https://github.com/Nitrokey/nitrokey-hotp-verification/archive/$(hotp-verification_version).tar.gz
hotp-verification_hash := 5d98d158ba97fb970061d68e2c6f41582395e687b7752efb1a8038762b0e7b79
hotp-verification_target := \
$(MAKE_JOBS) \
$(CROSS_TOOLS) \
hotp-verification_output := \
hotp_verification \
hotp_initialize
hotp-verification_configure := \
INSTALL="$(INSTALL)" \
CROSS="$(CROSS)" \
$(CROSS_TOOLS) $(MAKE) LDFLAGS="$(INSTALL)/lib/libusb-1.0.so" GITVERSION="" LIBUSB_FLAGS="-I/usr/include/libusb-1.0" PKGCONFIG="" && $(MAKE) install INSTALL="$(INSTALL)"
hotp-verification_depends += hidapi
modules-y += hidapi
hidapi_version := e5ae0d30a523c565595bdfba3d5f2e9e1faf0bd0
hidapi_dir := hotp-verification-$(hotp-verification_version)/hidapi
hidapi_tar := hidapi-$(hidapi_version).tar.xz
hidapi_url := https://github.com/Nitrokey/hidapi/archive/$(hidapi_version).tar.gz
hidapi_hash := acc2a5089a8917085c2b3ebe9446065a21c760ba7e13cb54917043c4122188e0
## hidapi will be built as part of hotp-verification
## so nothing to do here (but need make to be happy)
hidapi_output := .built
hidapi_configure := echo -e 'all:\n\ttouch .built' > Makefile

View File

@ -1,37 +0,0 @@
modules-$(CONFIG_LIBREMKEY) += libremkey-hotp-verification
libremkey-hotp-verification_depends := libusb $(musl_dep)
libremkey-hotp-verification_version := 809953b9b4bef97a4cffaa20d675bd7fe9d8da53
libremkey-hotp-verification_dir := libremkey-hotp-verification-$(libremkey-hotp-verification_version)
libremkey-hotp-verification_tar := nitrokey-hotp-verification-$(libremkey-hotp-verification_version).tar.gz
libremkey-hotp-verification_url := https://github.com/Nitrokey/nitrokey-hotp-verification/archive/$(libremkey-hotp-verification_version).tar.gz
libremkey-hotp-verification_hash := 251e5cef74e4e45eeddc49e4a1da1e22d1de774cd32cb0451a9030579ae958ba
libremkey-hotp-verification_target := \
$(MAKE_JOBS) \
$(CROSS_TOOLS) \
libremkey-hotp-verification_output := \
libremkey_hotp_verification \
libremkey_hotp_initialize
libremkey-hotp-verification_configure := \
INSTALL="$(INSTALL)" \
CROSS="$(CROSS)" \
$(CROSS_TOOLS) $(MAKE) LDFLAGS="$(INSTALL)/lib/libusb-1.0.so" && $(MAKE) install INSTALL="$(INSTALL)"
libremkey-hotp-verification_depends += hidapi
modules-y += hidapi
hidapi_version := e5ae0d30a523c565595bdfba3d5f2e9e1faf0bd0
hidapi_dir := libremkey-hotp-verification-$(libremkey-hotp-verification_version)/hidapi
hidapi_tar := hidapi-$(hidapi_version).tar.xz
hidapi_url := https://github.com/Nitrokey/hidapi/archive/$(hidapi_version).tar.gz
hidapi_hash := acc2a5089a8917085c2b3ebe9446065a21c760ba7e13cb54917043c4122188e0
## hidapi will be built as part of libremkey-hotp-verification
## so nothing to do here (but need make to be happy)
hidapi_output := .built
hidapi_configure := echo -e 'all:\n\ttouch .built' > Makefile

View File

@ -1,73 +0,0 @@
--- nitrokey-hotp-verification-a/Toolchain-heads.cmake 2018-05-22 09:55:46.907209235 -0700
+++ nitrokey-hotp-verification-b/Toolchain-heads.cmake 2018-05-22 09:55:26.659371966 -0700
@@ -0,0 +1,27 @@
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_VERSION 1)
+
+# Specify the cross compiler
+SET(CMAKE_C_COMPILER $ENV{CROSS}gcc)
+SET(CMAKE_CXX_COMPILER $ENV{CROSS}gcc)
+
+#sysroot location
+set(MYSYSROOT $ENV{INSTALL})
+
+# compiler/linker flags
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
+set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
+set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
+
+# Where is the target environment
+SET(CMAKE_FIND_ROOT_PATH "${MYSYSROOT}")
+
+# Search for programs only in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# Search for libraries and headers only in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+INCLUDE_DIRECTORIES(hidapi)
--- libremkey-hotp-verification/device.c 2018-06-20 16:13:36.417804210 -0700
+++ libremkey-hotp-verification-b/device.c 2018-06-20 16:14:34.532367723 -0700
@@ -34,7 +34,7 @@
const unsigned short m_vid = 0x20a0;
const unsigned short m_pid = 0x4108;
-static const int CONNECTION_ATTEMPTS_COUNT = 80;
+static const int CONNECTION_ATTEMPTS_COUNT = 2;
static const int CONNECTION_ATTEMPT_DELAY_MICRO_SECONDS = 1000*1000/2;
--- libremkey-hotp-verification/libremkey_hotp_initialize
+++ libremkey-hotp-verification-b/libremkey_hotp_initialize
@@ -14,9 +14,9 @@ fi
PIN=$1
SECRET=$2
COUNTER=$3
-SECRET_B32=$(echo -n $SECRET | base32)
+SECRET_B32=$(cat $SECRET | base32)
-libremkey_hotp_verification set $SECRET_B32 $PIN
+libremkey_hotp_verification set $SECRET_B32 "$PIN"
if [ $? -ne 0 ]; then
echo "ERROR: Setting HOTP secret on Librem Key failed!"
exit 1
@@ -25,7 +25,7 @@ fi
i=9
while [ "$i" -lt "$COUNTER" ]; do
echo "Updating counter to $i"
- HOTP_CODE=$(echo $SECRET | hotp $i)
+ HOTP_CODE=$(hotp $i < $SECRET)
libremkey_hotp_verification check $HOTP_CODE > /dev/null
if [ $? -ne 0 ]; then
echo "HOTP check failed for counter=$i, code=$HOTP_CODE"
@@ -34,7 +34,7 @@ while [ "$i" -lt "$COUNTER" ]; do
let "i += 10"
done
-HOTP_CODE=$(echo $SECRET | hotp $COUNTER)
+HOTP_CODE=$(hotp $COUNTER < $SECRET)
libremkey_hotp_verification check $HOTP_CODE > /dev/null
if [ $? -ne 0 ]; then
echo "HOTP check failed for counter=$COUNTER, code=$HOTP_CODE"