Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add secure thumb drive creation premisses #1446

Merged
merged 3 commits into from
Aug 28, 2023

Conversation

tlaurion
Copy link
Collaborator

@tlaurion tlaurion commented Jul 22, 2023

The idea of this PR is provide helpers needed to plug a brand new usb thumb drive into Heads and have Heads being able to create two partitions: one he will use to store key material and secrets (LUKS contained ext4 partition) and one public (exfat).

To do so this PR:

  • Disable mke2fs from busybox which is incomplete and replaces it with standard e2fsprogs
  • Adds e2fsprogs by default unless specifically deactivated in board configs
  • Adds exfat support for all boards linux configurations (all sdcards/thumbdrives comes preformated in exfat)
  • Adds exfatprogs by default unless deactivated explicitely in board configurations
  • Adds luks function helpers to support formatting partitions
  • Add thumb drive preparation helpers to wipe a dedicated USB thumb drive and prompts users for percentate of thumb drive to be formatted with LUKS partition (10%, 25%,50%,75%)
  • Adds helpers to mount-usb to deal with encrypted partitions if detected
  • prepare_thumb_drive defaults to 10% of detected added external media and prompts for luks passphrase

The logic is based on prompting the user to enter a device, a percentage of the drive to the LUKS container and a passphrase for that container through etc/luks_functions:prepare_thumb_drive(). Then mount-usb was refactored to facilitate external calling with parameters, including passing down --device --mountpoint --pass and --mode which if not specified, use old defaults: --mode ro --mountpoint /media without password, which prompts the user if many devices were found for him to select, and if the selected partition is a LUKS device, asks passphrase to unlock it and mount it. If a user tries to remount a device, it unmounts first and close the luks volume. It is also possible to mount multiple devices with different mountpoints.

Those can be parametrized to ease other callers to cache/reuse eg. passphrases and only prompt once and pass info to the mount-usb helper. The caller is responsible to cache and pass down the information, otherwise the calle will fail down and be explicit on its failing cause.

TODO:

@tlaurion tlaurion marked this pull request as draft July 22, 2023 02:06
@tlaurion
Copy link
Collaborator Author

tlaurion commented Jul 22, 2023

sizes.txt of x230-hotp-maximized artifacts on this PR at 9332883

wget -q https://output.circle-artifacts.com/output/job/2f1613fe-7b86-4884-9f18-35417b7daf18/artifacts/0/build/x86/x230-hotp-maximized/sizes.txt -O /tmp/1446

#sizes.txt of x230-hotp-maximized artifacts master at d7b4a47

wget -q https://output.circle-artifacts.com/output/job/80176d96-bbd0-4c66-9f0a-96d561f921ed/artifacts/0/build/x86/x230-hotp-maximized/sizes.txt -O /tmp/master

Let's compare them

diff -u /tmp/master /tmp/1446
--- /tmp/master	2023-07-17 14:37:34.000000000 -0400
+++ /tmp/1446	2023-07-21 18:49:48.000000000 -0400
@@ -1,4 +1,4 @@
-2023-07-17 14:28:46-04:00 d7b4a47cfe26f7e40cd995267298f5db57bfe120 clean
+2023-07-21 18:43:06-04:00 93328838c475c4d4eb06080b1b6c6d374bd7bfb9 clean
  3053888:/root/project/build/x86/x230-hotp-maximized/bzImage
   685056:/root/project/build/x86/x230-hotp-maximized/modules.cpio
 -----
@@ -9,7 +9,7 @@
    11544:./lib/modules/xhci-pci.ko
   128632:./lib/modules/usb-storage.ko
 -----
-11240448:/root/project/build/x86/x230-hotp-maximized/tools.cpio
+11712000:/root/project/build/x86/x230-hotp-maximized/tools.cpio
 -----
   596544:./lib/libc.so
   491024:./lib/libcairo.so.2
@@ -34,7 +34,7 @@
    14720:./lib/libuuid.so.1
   238208:./lib/libblkid.so.1
   108832:./lib/libz.so.1
-  515960:./bin/busybox
+  524168:./bin/busybox
   154600:./bin/kexec
    10032:./bin/totp
     5912:./bin/hotp
@@ -65,10 +65,13 @@
     1087:./bin/hotp_initialize
   652688:./bin/bash
    10064:./bin/io386
+  383864:./bin/mke2fs
+   39768:./bin/fsck.exfat
+   38912:./bin/mkfs.exfat
    35432:./bin/cbmem
      710:./etc/config
 -----
-  299008:/root/project/build/x86/x230-hotp-maximized/heads.cpio
+  305664:/root/project/build/x86/x230-hotp-maximized/heads.cpio
 -----
     1247:./.ash_history
       73:./.gnupg/gpg-agent.conf
@@ -100,7 +103,7 @@
      800:./bin/key-init
      922:./bin/lock_chip
     2744:./bin/media-scan
-    2347:./bin/mount-usb
+    3447:./bin/mount-usb
     1639:./bin/network-init-recovery
    25335:./bin/oem-factory-reset
     2345:./bin/oem-system-info-xx30
@@ -111,6 +114,7 @@
     5869:./bin/seal-hotpkey
     1839:./bin/seal-totp
      657:./bin/talos-init
+     114:./bin/test.sh
      183:./bin/tpm-reset
    23281:./bin/tpmr
      663:./bin/uefi-init
@@ -135,7 +139,8 @@
       10:./etc/group
     3703:./etc/gui_functions
       20:./etc/hosts
-    9735:./etc/luks-functions
+   13977:./etc/luks-functions
+     813:./etc/mke2fs.conf
      174:./etc/motd
       26:./etc/passwd
       27:./etc/shells
@@ -145,5 +150,5 @@
      924:./sbin/config-dhcp.sh
     1064:./sbin/insmod
 -----
- 4219904:build/x86/x230-hotp-maximized/initrd.cpio.xz
-12582912:/root/project/build/x86/x230-hotp-maximized/heads-x230-hotp-maximized-v0.2.0-1709-gd7b4a47.rom
+ 4409344:build/x86/x230-hotp-maximized/initrd.cpio.xz
+12582912:/root/project/build/x86/x230-hotp-maximized/heads-x230-hotp-maximized-v0.2.0-1711-g9332883.rom

So increase of size without tuning is observable from compressed initrd.cpio.xz mainly from changes from version bump of busybox and includion of mke2fs and exfat tools for and increase 4409344-4219904=189440 bytes. linked to the addition of :

+  383864:./bin/mke2fs
+   39768:./bin/fsck.exfat
+   38912:./bin/mkfs.exfat

Question: do we really need journalizing on the LUKS encompassed ext4 partition? We otherwise have ext2 out of the box with busybox... Might be enough. Wil ltry to tune mke2fs further, while it is to note that no legacy board build broke by lack of space!.

@tlaurion
Copy link
Collaborator Author

@JonathonHall-Purism Are we willing to increase consumed space by 189440bytes to add native support for exfat and ext4? Thoughts?

@JonathonHall-Purism
Copy link
Collaborator

@tlaurion Yes, I'm willing to trade off ~189KB for exFAT and ext4. I just had two users run into flash drive mounting problems last week, I think both were exFAT-formatted.

I haven't reviewed the changes yet, but have you enabled the option to use ext4 to mount ext2? It may reclaim some of the space cost if you haven't, since we would not need ext2 modules any more.

@tlaurion
Copy link
Collaborator Author

@JonathonHall-Purism yes, ext4 is used to mount ext2. Will review kernel modules once more, thanks for the pointer.
This was PoC for blockers on backend changes, will push other stuff in other PR, since this by itself is not that much usable.

@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch from 9332883 to 41ca197 Compare July 26, 2023 15:59
@tlaurion
Copy link
Collaborator Author

tlaurion commented Jul 26, 2023

I haven't reviewed the changes yet, but have you enabled the option to use ext4 to mount ext2? It may reclaim some of the space cost if you haven't, since we would not need ext2 modules any more.

@JonathonHall-Purism it does!

Review when you can please! test.sh will be your friend under QEMU (which passes 128mb raw file convenient to test risk free here.)

Todo

  • Make sure all boards are here
  • remove test.sh

@tlaurion tlaurion marked this pull request as ready for review July 26, 2023 16:08
@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch 2 times, most recently from d447cab to 054700e Compare August 9, 2023 19:05
@tlaurion
Copy link
Collaborator Author

tlaurion commented Aug 9, 2023

@JonathonHall-Purism ready for review!

Testable through test.sh that needs to be removed prior of merge.

@tlaurion
Copy link
Collaborator Author

tlaurion commented Aug 9, 2023

Oups. Some boards were left behind. Readding them.

@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch from 054700e to 9e19c15 Compare August 9, 2023 19:37
@tlaurion
Copy link
Collaborator Author

tlaurion commented Aug 9, 2023

Unfortunately, Talos II is linux 5.5 based, which doesn't offer EXFATFS.
Porting patches ongoing.

Copy link
Collaborator

@JonathonHall-Purism JonathonHall-Purism left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tlaurion Thanks for letting me know this was ready for review! The structure looks pretty good, I have suggested a handful of improvements for robustness/simplicity/etc.

I will try it out later too 👍

initrd/bin/mount-usb Outdated Show resolved Hide resolved

TRACE "Under /bin/mount-usb"

function usage() {
cat <<USAGE_END
usage: $0 [options...] <-mode [ro|rw]> <-device> <-mountpoint mountpoint> <-pass passhphrase>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-device should have an argument
passphrase has an extra h

initrd/bin/mount-usb Outdated Show resolved Hide resolved
mkdir /media
else
DEBUG "Cleaning /media directory"
umount /media > /dev/null 2>&1 || true
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use "$MOUNTPOINT" instead of /media

initrd/bin/mount-usb Outdated Show resolved Hide resolved
initrd/etc/luks-functions Outdated Show resolved Hide resolved
initrd/etc/luks-functions Outdated Show resolved Hide resolved
modules/e2fsprogs Outdated Show resolved Hide resolved
config/busybox.config Show resolved Hide resolved

enable_usb
enable_usb_storage
prepare_thumb_drive /dev/sda 25 "test"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this going to appear in menus anywhere or just something we suggest to do from the recovery shell for now?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JonathonHall-Purism will be used under non-default oem-factory-reset/Re-Ownership to create GPG backup thumb drive of in-memory created gpg key material under LUKS encrypted partition, where public partition used to store public key. And then Thumb drive is useable in case USB Security dongle is lost if that option was selected on Re-Ownership, until USB Security dongle replacement is received. And then another PR will enable USB thumb drive subkeys restoration on USB Security dongle received replacement. And finally, OEM Factory Reset will permit to not depend on a USB Security dongle altogether altogether. And then another PR will enable authentication in case USB thumb drive backup of GPG key material exist, which will be useable to test detach sign/verify, which will permit authentication prior of recovery shell access, flashing and USB boot.

@tlaurion
Copy link
Collaborator Author

Annnnnd.... we lack space under legacy boards again.
Shifting priority to merging #1403 first, on which this PR will need to be rebased.

@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch from 57f59c4 to eb3ac0b Compare August 10, 2023 20:48
@tlaurion
Copy link
Collaborator Author

tlaurion commented Aug 10, 2023

@JonathonHall-Purism I addressed your review! Thanks a bunch!

Tested manually from whiptail-tpm1 (removed test.sh so that its ready to merge)

env /bin/bash
. /etc/luks-functions

enable_usb
enable_usb_storage
list_luks_devices # shows list of system's LUKS devices
prepare_thumb_drive /dev/sda 25 "test"
list_luks_devices # shows list of system's LUKS devices
select_luks_container #Wil report internal selected TPM disk unlock key related configured device(s)
mount-usb --device /dev/sda1 --mountpoint /media/private --pass test
mount-usb --device /dev/sda2 --mountpoint /media/public
#remount to test cleaning logic permitting to remount same device
mount-usb --device /dev/sda1 --mountpoint /media/private --pass test
mount-usb --device /dev/sda2 --mountpoint /media/public
mount

Comment on lines 68 to 77
DEBUG "Parameters: --mode="$MODE", --device=${DEVICE:-empty}, --mountpoint="$MOUNTPOINT", --pass=${PASS:+provided}"

enable_usb
enable_usb_storage

if [ ! -d /media ]; then
mkdir /media
if [ ! -d "$MOUNTPOINT" ]; then
DEBUG "Creating "$MOUNTPOINT" directory"
mkdir -p "$MOUNTPOINT" > /dev/null 2>&1
else
DEBUG "Cleaning "$MOUNTPOINT" directory"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might be an over-application of my suggestion to "put quotes around expansions" - these expansions were already quoted since they were inside the quoted string.

The extra quotes now cause $MODE, $MOUNTPOINT, etc. to be word-split (and the quotes won't be printed around them).

If you don't want to print any quotes, just remove them: "Parameters: --mode=$MODE ..."

If you do want to print quotes, you have to escape them (or do weirder stuff mixing in single quotes): "Parameters: --mode=\"$MODE\" ..."

(The sort-of-exception to this is if you have a command expansion, then arguments to the command still need to be quoted, i.e. BLKID="$(blkid "$DEV")".)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JonathonHall-Purism I think I fixed them all

# Check if the user has specified a USB device
if [ -n "$DEVICE" ]; then
DEBUG "Checking if $DEVICE is a USB device"
if grep -q $DEVICE /tmp/usb_block_devices; then
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure why this one got flagged as "outdated" since this code has not changed - I still suggest reworking list_usb_devices and testing just the device you care about rather than the roundabout "enumerate everything and test, then check if my device was in the results" with the potential problems relating to the naïve grep

{
#generate a list of devices to choose from that contain a LUKS header
lvm vgscan||true
blkid | cut -d ':' -f 1 | while read device;do cryptsetup isLuks $device;if [ $(echo $?) == 0 ]; then echo $device;fi; done | sort
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't appear to have changed in the current version

# Check if the user has specified a USB device
if [ -n "$DEVICE" ]; then
DEBUG "Checking if "$DEVICE" is a USB device"
if grep -q "$DEVICE" /tmp/usb_block_devices; then
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Visibility comment for #1446 (comment) since I am tired of wrestling with Github's idea that it is outdated 😝

@tlaurion
Copy link
Collaborator Author

#1403 now merged. Rebasing so that no board fails packing linux suport for exfat + exfatprogs/e2fsprogs.

@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch from 1806c95 to 6cca444 Compare August 16, 2023 19:19
@tlaurion
Copy link
Collaborator Author

Will address review tomorrow, not sure what happened here but thanks for holding your point! Will be cleaner and will poke you back.

@tlaurion
Copy link
Collaborator Author

tlaurion commented Aug 16, 2023

Ok, legacy boards still have manageable amount of free space but that will most probaly be the final blow to them.

I don't even know for whom i'm maintaining those 7.5mb images.
t430-hotp-legacy shows 500kb of available CBFS "empty" space inside the BIOS region (without ME neutered which otherwise would be maximized):
https://app.circleci.com/pipelines/github/tlaurion/heads/1942/workflows/1069d0a6-4c15-4bbc-a1f6-cbdde0a35e2c/jobs/30534?invite=true#step-103-5368614_68


2023-08-16 16:08:16-04:00 DONE coreboot-4.19
touch /root/project/build/x86/coreboot-4.19/UNTESTED_t430-hotp-legacy/.build 
# Use coreboot.rom, because custom output files might not be processed by cbfstool
"/root/project/build/x86/coreboot-4.19/UNTESTED_t430-hotp-legacy/cbfstool" "/root/project/build/x86/coreboot-4.19/UNTESTED_t430-hotp-legacy/coreboot.rom" print
FMAP REGION: COREBOOT
Name                           Offset     Type           Size   Comp
cbfs_master_header             0x0        cbfs header        32 none
fallback/romstage              0x80       stage           95256 none
cpu_microcode_blob.bin         0x17540    microcode       26624 none
fallback/ramstage              0x1dd80    stage          134538 LZMA (299584 decompressed)
config                         0x3eb80    raw              3158 LZMA (10017 decompressed)
revision                       0x3f840    raw               724 none
build_info                     0x3fb40    raw               101 none
bootsplash.jpg                 0x3fc00    bootsplash      32804 none
fallback/dsdt.aml              0x47c80    raw             14516 none
vbt.bin                        0x4b580    raw              1409 LZMA (4459 decompressed)
cmos.default                   0x4bb40    cmos_default      256 none
cmos_layout.bin                0x4bc80    cmos_layout      2108 none
fallback/postcar               0x4c500    stage           40132 none
fallback/payload               0x56240    simple elf    6385535 none
(empty)                        0x66d200   null           500132 none
bootblock                      0x6e73c0   bootblock       35328 none
2023-08-16 16:08:16-04:00 INSTALL   build/x86/coreboot-4.19/UNTESTED_t430-hotp-legacy/coreboot.rom => build/x86/UNTESTED_t430-hotp-legacy/heads-UNTESTED_t430-hotp-legacy-v0.2.0-1752-g6cca444.rom

@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch 2 times, most recently from 00a5fd9 to e032852 Compare August 17, 2023 14:59
@tlaurion
Copy link
Collaborator Author

tlaurion commented Aug 17, 2023

@JonathonHall-Purism I addressed your review! Thanks a bunch!

Tested manually from whiptail-tpm1 (removed test.sh so that its ready to merge)

env /bin/bash
. /etc/luks-functions

enable_usb
enable_usb_storage
list_luks_devices # shows list of system's LUKS devices
prepare_thumb_drive /dev/sda 25 "test"
list_luks_devices # shows list of system's LUKS devices
select_luks_container #Wil report internal selected TPM disk unlock key related configured device(s) if setuped, otherwise prompting
mount-usb --device /dev/sda1 --mountpoint /media/private --pass test
mount-usb --device /dev/sda2 --mountpoint /media/public
#remount to test cleaning logic permitting to remount same device
mount-usb --device /dev/sda1 --mountpoint /media/private --pass test
mount-usb --device /dev/sda2 --mountpoint /media/public
mount

@JonathonHall-Purism updated tests

@tlaurion
Copy link
Collaborator Author

tlaurion commented Aug 17, 2023

@JonathonHall-Purism I should have addressed all your previous comments. I will let you set them as resolved this time instead of making Github confused, I guess.

@tlaurion
Copy link
Collaborator Author

@JonathonHall-Purism Corrected everything previously reviewed.

Note that under qemu, usb fb needs to be wiped to be recreated with 256mb otherwise 10% of it is not sufficient to create a LUKS container on 12mb.

Testing:

env /bin/bash
. /etc/luks-functions

#enable_usb -> added to prepare_thumb_drive
#enable_usb_storage -> added to prepare_thumb_drive
list_luks_devices # shows list of system's LUKS devices, not usb ones
prepare_thumb_drive #will default to 10%, prompt for passphrase if not provided and detect usb drive (not partitions)
# you can also play with prepare_thumb_drive --device --passphrase etc, but will be tested more on next PR.
list_luks_devices # shows list of system's LUKS devices
select_luks_container #Wil report internal selected TPM disk unlock key related configured device(s) if setuped, otherwise prompting
mount-usb --device /dev/sda1 --mountpoint /media/private --pass test
mount-usb --device /dev/sda2 --mountpoint /media/public
#remount to test cleaning logic permitting to remount same device
mount-usb --device /dev/sda1 --mountpoint /media/private --pass test
mount-usb --device /dev/sda2 --mountpoint /media/public
mount

@tlaurion
Copy link
Collaborator Author

Oups. Pushed fixes for qemu boards but forgot to pass default back to 10%

@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch from 50aee3e to b016baf Compare August 28, 2023 18:04
# List all USB storage devices, including partitions unless we received argument stating we want drives only
# The output is a list of device names, one per line.

#Ouput debug info if we received argument otherwise show "empty" instead
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: spelling of "Output"


DEBUG "DEVICE to partition: $DEVICE"
DEBUG "PERCENTAGE of device that will be used for LUKS container: $PERCENTAGE"
#Ouput provided" if passphrase is provided as parameter
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: spelling of Output and spurious quotation mark

Comment on lines 120 to 128
#Prompt for passphrase if not provided as parameter
if [ -z "$PASSPHRASE" ]; then
#If no passphrase was provided, ask user to select passphrase for LUKS container
whiptail --title 'Enter passphrase for LUKS container' --passwordbox \
"Enter passphrase for LUKS container:" 0 80 2> /tmp/passphrase \
|| die "Error: No passphrase provided"
#remove trailing newline and/or carriage return
PASSPHRASE=$(cat /tmp/passphrase | tr -d '\n' | tr -d '\r')
fi
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • I don't think fbwhiptail supports --passwordbox
  • If we have to support devices lacking whiptail/fbwhiptail, you probably need to support it here (or otherwise remove the non-whiptail fallback above)
  • Move this out of if [ -z "$DEVICE" ];, seems odd that password is only optional if device was not provided (right?)
  • The passphrase file should go in /tmp/secret, and at_exit shred "/tmp/secret/passphrase" to remove it sooner would probably be a good idea

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No more of that.

@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch 2 times, most recently from 876136a to 4a2e5f4 Compare August 28, 2023 20:14
@tlaurion
Copy link
Collaborator Author

@JonathonHall-Purism review addressed!

prepare_thumb_drive: default to creating 10% LUKS container on usb drive, prompts for passphrase is not provided and scan drives if no --device specified

NOTE: qemu usb_thumb drive of 128 mb are not big enough so that 10% of it (12mb) can be used to create thumb drive.

Adds:
- e2fsprogs to support ext4 filesystem creation through mke2fs
- add /etc/mke2fs.conf so that mke2fs knows how to handle ext2/ext3/ext4
- removes mke2fs support from busybox
- bump busybox to latest version which adds cpu accelerated hash functions (not needed per se here)
- Adds exfatprogs to have mkfs.exfat and fsck.exfat
- Adds prepare_thumb_drive /etc/luks-functions to be able to prepare a thumb drive with percentage of drive assigned to LUKS, rest to exfat
- Modify most board configs to test space requirements failing
- Talos2 linux config: add staging Exfat support
- Make e2fsprogs and exfatprogs included by default unless explicitely deactivate in board configs
- Change cryptsetup calls : luksOpen to open and luksClose to close to addresss review
- etc/luks_functions: cleanup

GOAL here is to have secure thumb drive creation which Heads will be able to use to backup/restore/use generated GPG key material in the future (next PR)
… 256MB

Otherwise 10% of 128mb (12mb) is not enough to create a LUKS container
@tlaurion tlaurion force-pushed the Add_secure_thumb_drive_premisses branch from 4a2e5f4 to d5aa0c8 Compare August 28, 2023 20:24
@JonathonHall-Purism
Copy link
Collaborator

Thanks @tlaurion , looks good to me, let's merge! 🚢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants