| # Setup GPG Encryption |
| |
| The keys generated here are strictly for transmission and retrieval of data for |
| a single Fingerprint Study run. |
| |
| *See [Typography conventions] to understand what `(outside)`, `(inside)`, |
| `(in/out)`, and `(device)` mean.* |
| |
| [Typography conventions]: https://www.chromium.org/chromium-os/developer-library/guides/development/developer-guide/#typography-conventions |
| |
| ## Generating Keys |
| |
| Setting `GNUPGHOME` will force gpg to use a completely different keyring/config. |
| In this case, we set it to an empty directory `/tmp/fpstudygpg`, where we will |
| build a new keyring with only one key pair. |
| |
| ```bash |
| # Setup a new empty GNUPG directory. |
| (in/out) $ export GNUPGHOME=/tmp/fpstudygpg |
| (in/out) $ gio trash -f "${GNUPGHOME}" \ |
| && mkdir -p "${GNUPGHOME}/private-keys-v1.d" \ |
| && chmod -R 700 "${GNUPGHOME}" |
| # Setup key generation parameters. |
| # https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html |
| (in/out) $ cat >keyparams <<EOF |
| %echo Generating key. |
| Key-Type: RSA |
| Key-Length: 4096 |
| # Disable subkey generation, since this is a one time use key pair anyways. |
| # Subkey-Type: RSA |
| # Subkey-Length: 4096 |
| Name-Real: ChromeOSFPStudy |
| Name-Comment: Chrome OS Fingerprint Study Key |
| Name-Email: <FILL_IN_RECIPIENT_EMAIL> |
| Expire-Date: 0 |
| # Passphrase: <IF_UNCOMMENTED_THIS_IS_THE_PASSWORD> |
| %ask-passphrase |
| # %no-ask-passphrase |
| # %no-protection |
| %commit |
| %echo Done. |
| EOF |
| # Generate a new key pair. Make note of the password used. This password is used |
| # to protect the private key and will be required when decrypting the captures. |
| (in/out) $ gpg --verbose --batch --gen-key ./keyparams |
| # Record the fingerprint/keyid from by the following command. |
| # The fingerprint is the 40 hex character string grouped into 10 groups of |
| # 4 characters. Remove the spaces from this fingerprint to form the keyid. |
| (in/out) $ gpg --fingerprint ChromeOSFPStudy |
| # Export only the public key for the test device. This key must be copied to the |
| # test device and will be used as the keyring. |
| (in/out) $ gpg --verbose --export ChromeOSFPStudy > "${GNUPGHOME}/chromeos-fpstudy-public-device.gpg" |
| # Export the private key for backup. This key is for the recipient to be able |
| # to decrypt the fingerprint capture. |
| # This key must NOT be copied to the test device. |
| (in/out) $ gpg --verbose --export-secret-keys ChromeOSFPStudy > "${GNUPGHOME}/chromeos-fpstudy-private.gpg" |
| ``` |
| |
| ## Install Keys on Device |
| |
| * Copy the `chromeos-fpstudy-public-device.gpg` file to the test device. |
| |
| ```bash |
| scp "${GNUPGHOME}/chromeos-fpstudy-public-device.gpg" \ |
| dut1:/var/lib/fpstudygnupg |
| ssh dut1 chmod u=r,g=,o= \ |
| /var/lib/fpstudygnupg/chromeos-fpstudy-public-device.gpg |
| ``` |
| |
| * Edit the `/etc/init/fingerprint_study.conf` file to have the following |
| additional arguments to `exec study_serve`. |
| |
| - `--gpg-keyring /var/lib/fpstudygnupg/chromeos-fpstudy-public-device.gpg` |
| - `--gpg-recipients KEYID` where KEYID is the keyid recorded in the |
| `Generating Keys` section. |
| |
| ## Test Encryption Manually |
| |
| Follow the `Generating Keys` section and then run the following commands: |
| |
| ```bash |
| (in/out) $ GNUPGHOME_KEYGEN=/tmp/fpstudygpg |
| # Unfortunately, you still need a proper homedir for gpg to work. |
| (in/out) $ export GNUPGHOME=/tmp/fpstudygpg-host |
| (in/out) $ gio trash -f "${GNUPGHOME}" \ |
| && mkdir -p "${GNUPGHOME}/private-keys-v1.d" \ |
| && chmod -R 700 "${GNUPGHOME}" |
| |
| # Test encrypting a sequence of numbers using only the public key. |
| (in/out) $ gpg --verbose --no-default-keyring \ |
| --keyring \ |
| "${GNUPGHOME_KEYGEN}/chromeos-fpstudy-public-device.gpg" \ |
| --trust-model always \ |
| -ear ChromeOSFPStudy > test-output.gpg < <(seq 10) |
| (in/out) $ file test-output.gpg |
| (in/out) $ gpg --list-packets test-output.gpg |
| |
| # We will now import the private key to our clean GNUPHHOME. |
| # In order to test the above encryption step again, you would need to |
| # clear the GNUPGHOME directory (run these test instructions from the top). |
| (in/out) $ gpg --import "${GNUPGHOME_KEYGEN}/chromeos-fpstudy-private.gpg" |
| # The following should yield a sequence of number from 1 to 10. |
| (in/out) $ gpg -d test-output.gpg |
| ``` |
| |
| ## Test Encryption Using Host |
| |
| Follow the `Generating Keys` section and then run the following commands: |
| |
| ```bash |
| (in/out) $ ./host-run.sh \ |
| --gpg-keyring "${GNUPGHOME}/chromeos-fpstudy-public-device.gpg" \ |
| --gpg-recipients ChromeOSFPStudy |
| ``` |
| |
| ## Decrypting Fingerprint Captures |
| |
| To decrypt the fingerprint captures on the receiving/host side, you must import |
| the private key `chromeos-fpstudy-private.gpg` generated above in the |
| `Generating Keys` section. |
| |
| <!-- mdformat off(b/139308852) --> |
| *** note |
| If you do not want to import the private key into your normal gpg homedir, you |
| can run the following to create a temporary gpg homedir: |
| |
| ```bash |
| (in/out) $ export GNUPGHOME=/tmp/fpstudygpg-host |
| (in/out) $ gio trash -f "${GNUPGHOME}" \ |
| && mkdir -m 700 -p "${GNUPGHOME}/private-keys-v1.d" |
| ``` |
| *** |
| <!-- mdformat on --> |
| |
| ```bash |
| # Import the private key into the current gpg homedir. |
| (in/out) $ gpg --import chromeos-fpstudy-private.gpg |
| # Decrypt all fingerprint captures, while place the decrypted file version |
| # alongside the encrypted version. |
| (in/out) $ find ./fpstudy-fingers -type f -name '*.gpg' | \ |
| xargs -P $(nproc) gpg --decrypt-files |
| ``` |