2020-03-26 15:35:27 +00:00
# We always set GNUPGHOME, even if no usable GPG was found, as
#
# - It does not hurt, and
#
# - we cannot set global environment variables in lazy prereqs because they are
# executed in an eval'ed subshell that changes the working directory to a
# temporary one.
GNUPGHOME = " $PWD /gpghome "
export GNUPGHOME
test_lazy_prereq GPG '
gpg_version = $( gpg --version 2>& 1)
test $? != 127 || exit 1
2023-11-24 03:35:15 +00:00
# As said here: https://web.archive.org/web/20130212022238/https://www.gnupg.org/faq/gnupg-faq.html#why-does-gnupg-1.0.6-bail-out-on-keyrings-used-with-1.0.7
2020-03-26 15:35:27 +00:00
# the gpg version 1.0.6 did not parse trust packets correctly, so for
2011-09-07 17:42:39 +00:00
# that version, creation of signed tags using the generated key fails.
case " $gpg_version " in
2020-03-26 15:35:27 +00:00
"gpg (GnuPG) 1.0.6" *)
2011-09-07 17:42:39 +00:00
say "Your version of gpg (1.0.6) is too buggy for testing"
2020-03-26 15:35:27 +00:00
exit 1
2011-09-07 17:42:39 +00:00
; ;
*)
2014-12-16 08:40:05 +00:00
# Available key info:
# * Type DSA and Elgamal, size 2048 bits, no expiration date,
# name and email: C O Mitter <committer@example.com>
# * Type RSA, size 2048 bits, no expiration date,
# name and email: Eris Discordia <discord@example.net>
2011-09-07 17:42:39 +00:00
# No password given, to enable non-interactive operation.
2014-12-16 08:40:05 +00:00
# To generate new key:
# gpg --homedir /tmp/gpghome --gen-key
# To write armored exported key to keyring:
# gpg --homedir /tmp/gpghome --export-secret-keys \
# --armor 0xDEADBEEF >> lib-gpg/keyring.gpg
2015-01-29 15:43:20 +00:00
# gpg --homedir /tmp/gpghome --export \
# --armor 0xDEADBEEF >> lib-gpg/keyring.gpg
2014-12-16 08:40:05 +00:00
# To export ownertrust:
# gpg --homedir /tmp/gpghome --export-ownertrust \
# > lib-gpg/ownertrust
2020-03-26 15:35:27 +00:00
mkdir " $GNUPGHOME " &&
chmod 0700 " $GNUPGHOME " &&
t/lib-gpg: kill all gpg components, not just gpg-agent
The gpg-agent is one of several processes that newer releases of GnuPG
start automatically. Issue a kill to each of them to ensure they do not
affect separate tests. (Yes, the separate GNUPGHOME should do that
already. If we find that is case, we could drop the --kill entirely.)
In terms of compatibility, the 'all' keyword was added to the --kill &
--reload options in GnuPG 2.1.18. Debian and RHEL are often used as
indicators of how a change might affect older systems we often try to
support.
- Debian Strech (old old stable), which has limited security support
until June 2022, has GnuPG 2.1.18 (or 2.2.x in backports).
- CentOS/RHEL 7, which is supported until June 2024, has GnuPG
2.0.22, which lacks the --kill option, so the change won't have
any impact.
Signed-off-by: Todd Zullinger <tmz@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-03-04 10:25:19 +00:00
( gpgconf --kill all || : ) &&
2020-03-26 15:35:28 +00:00
gpg --homedir " ${ GNUPGHOME } " --import \
2014-12-12 20:33:56 +00:00
" $TEST_DIRECTORY " /lib-gpg/keyring.gpg &&
2020-03-26 15:35:28 +00:00
gpg --homedir " ${ GNUPGHOME } " --import-ownertrust \
2014-12-12 20:33:56 +00:00
" $TEST_DIRECTORY " /lib-gpg/ownertrust &&
2023-08-22 13:03:14 +00:00
gpg --homedir " ${ GNUPGHOME } " --update-trustdb &&
2020-03-26 15:35:28 +00:00
gpg --homedir " ${ GNUPGHOME } " </dev/null >/dev/null \
2020-03-26 15:35:27 +00:00
--sign -u committer@example.com
2011-09-07 17:42:39 +00:00
; ;
esac
2020-03-26 15:35:27 +00:00
'
2023-06-04 18:22:46 +00:00
test_lazy_prereq GPG2 '
gpg_version = $( gpg --version 2>& 1)
test $? != 127 || exit 1
case " $gpg_version " in
"gpg (GnuPG) " [ 01] .*)
say "This test requires a GPG version >= v2.0.0"
exit 1
; ;
*)
( gpgconf --kill all || : ) &&
gpg --homedir " ${ GNUPGHOME } " --import \
" $TEST_DIRECTORY " /lib-gpg/keyring.gpg &&
gpg --homedir " ${ GNUPGHOME } " --import-ownertrust \
" $TEST_DIRECTORY " /lib-gpg/ownertrust &&
gpg --homedir " ${ GNUPGHOME } " </dev/null >/dev/null \
--sign -u committer@example.com
; ;
esac
'
2020-03-26 15:35:27 +00:00
test_lazy_prereq GPGSM '
test_have_prereq GPG &&
# Available key info:
# * see t/lib-gpg/gpgsm-gen-key.in
# To generate new certificate:
# * no passphrase
# gpgsm --homedir /tmp/gpghome/ \
# -o /tmp/gpgsm.crt.user \
# --generate-key \
# --batch t/lib-gpg/gpgsm-gen-key.in
# To import certificate:
# gpgsm --homedir /tmp/gpghome/ \
# --import /tmp/gpgsm.crt.user
# To export into a .p12 we can later import:
# gpgsm --homedir /tmp/gpghome/ \
# -o t/lib-gpg/gpgsm_cert.p12 \
# --export-secret-key-p12 "committer@example.com"
2020-03-26 15:35:28 +00:00
echo | gpgsm --homedir " ${ GNUPGHOME } " \
--passphrase-fd 0 --pinentry-mode loopback \
--import " $TEST_DIRECTORY " /lib-gpg/gpgsm_cert.p12 &&
2020-03-26 15:35:27 +00:00
2022-03-04 10:25:17 +00:00
gpgsm --homedir " ${ GNUPGHOME } " -K --with-colons |
awk -F ":" "/^fpr:/ {printf \"%s S relax\\n\", \$10}" \
>" ${ GNUPGHOME } /trustlist.txt " &&
2022-03-04 10:25:18 +00:00
( gpgconf --reload all || : ) &&
2020-03-26 15:35:27 +00:00
2020-03-26 15:35:28 +00:00
echo hello | gpgsm --homedir " ${ GNUPGHOME } " >/dev/null \
-u committer@example.com -o /dev/null --sign -
2020-03-26 15:35:27 +00:00
'
2011-09-07 17:46:08 +00:00
2020-03-26 15:35:27 +00:00
test_lazy_prereq RFC1991 '
test_have_prereq GPG &&
2020-03-26 15:35:28 +00:00
echo | gpg --homedir " ${ GNUPGHOME } " -b --rfc1991 >/dev/null
2020-03-26 15:35:27 +00:00
'
2014-12-12 20:33:56 +00:00
2021-09-10 20:07:35 +00:00
GPGSSH_KEY_PRIMARY = " ${ GNUPGHOME } /ed25519_ssh_signing_key "
GPGSSH_KEY_SECONDARY = " ${ GNUPGHOME } /rsa_2048_ssh_signing_key "
GPGSSH_KEY_UNTRUSTED = " ${ GNUPGHOME } /untrusted_ssh_signing_key "
2021-12-09 08:52:44 +00:00
GPGSSH_KEY_EXPIRED = " ${ GNUPGHOME } /expired_ssh_signing_key "
GPGSSH_KEY_NOTYETVALID = " ${ GNUPGHOME } /notyetvalid_ssh_signing_key "
GPGSSH_KEY_TIMEBOXEDVALID = " ${ GNUPGHOME } /timeboxed_valid_ssh_signing_key "
GPGSSH_KEY_TIMEBOXEDINVALID = " ${ GNUPGHOME } /timeboxed_invalid_ssh_signing_key "
2021-09-10 20:07:35 +00:00
GPGSSH_KEY_WITH_PASSPHRASE = " ${ GNUPGHOME } /protected_ssh_signing_key "
2021-11-19 15:07:06 +00:00
GPGSSH_KEY_ECDSA = " ${ GNUPGHOME } /ecdsa_ssh_signing_key "
2021-09-10 20:07:35 +00:00
GPGSSH_KEY_PASSPHRASE = "super_secret"
GPGSSH_ALLOWED_SIGNERS = " ${ GNUPGHOME } /ssh.all_valid.allowedSignersFile "
GPGSSH_GOOD_SIGNATURE_TRUSTED = 'Good "git" signature for'
GPGSSH_GOOD_SIGNATURE_UNTRUSTED = 'Good "git" signature with'
GPGSSH_KEY_NOT_TRUSTED = "No principal matched"
GPGSSH_BAD_SIGNATURE = "Signature verification failed"
test_lazy_prereq GPGSSH '
ssh_version = $( ssh-keygen -Y find-principals -n "git" 2>& 1)
test $? != 127 || exit 1
echo $ssh_version | grep -q "find-principals:missing signature file"
test $? = 0 || exit 1;
2021-11-10 06:00:47 +00:00
2021-12-09 08:52:49 +00:00
# Setup some keys and an allowed signers file
2021-09-10 20:07:35 +00:00
mkdir -p " ${ GNUPGHOME } " &&
chmod 0700 " ${ GNUPGHOME } " &&
2021-11-05 19:31:06 +00:00
( setfacl -k " ${ GNUPGHOME } " 2>/dev/null || true ) &&
2021-09-10 20:07:35 +00:00
ssh-keygen -t ed25519 -N "" -C "git ed25519 key" -f " ${ GPGSSH_KEY_PRIMARY } " >/dev/null &&
ssh-keygen -t rsa -b 2048 -N "" -C "git rsa2048 key" -f " ${ GPGSSH_KEY_SECONDARY } " >/dev/null &&
ssh-keygen -t ed25519 -N " ${ GPGSSH_KEY_PASSPHRASE } " -C "git ed25519 encrypted key" -f " ${ GPGSSH_KEY_WITH_PASSPHRASE } " >/dev/null &&
2021-12-21 23:03:16 +00:00
ssh-keygen -t ecdsa -N "" -f " ${ GPGSSH_KEY_ECDSA } " >/dev/null &&
2021-12-09 08:52:49 +00:00
ssh-keygen -t ed25519 -N "" -C "git ed25519 key" -f " ${ GPGSSH_KEY_UNTRUSTED } " >/dev/null &&
cat >" ${ GPGSSH_ALLOWED_SIGNERS } " <<-EOF &&
"principal with number 1" $( cat " ${ GPGSSH_KEY_PRIMARY } .pub " ) "
"principal with number 2" $( cat " ${ GPGSSH_KEY_SECONDARY } .pub " ) "
"principal with number 3" $( cat " ${ GPGSSH_KEY_WITH_PASSPHRASE } .pub " ) "
2021-12-21 23:03:16 +00:00
"principal with number 4" $( cat " ${ GPGSSH_KEY_ECDSA } .pub " ) "
2021-12-09 08:52:49 +00:00
EOF
# Verify if at least one key and ssh-keygen works as expected
echo "testpayload" |
ssh-keygen -Y sign -n "git" -f " ${ GPGSSH_KEY_PRIMARY } " >gpgssh_prereq.sig &&
ssh-keygen -Y find-principals -f " ${ GPGSSH_ALLOWED_SIGNERS } " -s gpgssh_prereq.sig &&
echo "testpayload" |
ssh-keygen -Y verify -n "git" -f " ${ GPGSSH_ALLOWED_SIGNERS } " -I "principal with number 1" -s gpgssh_prereq.sig
2021-12-09 08:52:44 +00:00
'
test_lazy_prereq GPGSSH_VERIFYTIME '
2023-06-06 21:47:07 +00:00
test_have_prereq GPGSSH &&
2021-12-09 08:52:44 +00:00
# Check if ssh-keygen has a verify-time option by passing an invalid date to it
2023-05-25 03:10:24 +00:00
ssh-keygen -Overify-time= INVALID -Y check-novalidate -n "git" -s doesnotmatter 2>& 1 | grep -q -F "Invalid \"verify-time\"" &&
2021-12-09 08:52:49 +00:00
# Set up keys with key lifetimes
2021-12-09 08:52:44 +00:00
ssh-keygen -t ed25519 -N "" -C "timeboxed valid key" -f " ${ GPGSSH_KEY_TIMEBOXEDVALID } " >/dev/null &&
2021-12-09 08:52:49 +00:00
key_valid = $( cat " ${ GPGSSH_KEY_TIMEBOXEDVALID } .pub " ) &&
2021-12-09 08:52:44 +00:00
ssh-keygen -t ed25519 -N "" -C "timeboxed invalid key" -f " ${ GPGSSH_KEY_TIMEBOXEDINVALID } " >/dev/null &&
2021-12-09 08:52:49 +00:00
key_invalid = $( cat " ${ GPGSSH_KEY_TIMEBOXEDINVALID } .pub " ) &&
2021-12-09 08:52:44 +00:00
ssh-keygen -t ed25519 -N "" -C "expired key" -f " ${ GPGSSH_KEY_EXPIRED } " >/dev/null &&
2021-12-09 08:52:49 +00:00
key_expired = $( cat " ${ GPGSSH_KEY_EXPIRED } .pub " ) &&
2021-12-09 08:52:44 +00:00
ssh-keygen -t ed25519 -N "" -C "not yet valid key" -f " ${ GPGSSH_KEY_NOTYETVALID } " >/dev/null &&
2021-12-09 08:52:49 +00:00
key_notyetvalid = $( cat " ${ GPGSSH_KEY_NOTYETVALID } .pub " ) &&
# Timestamps outside of test_tick span
ts2005a = 20050401000000 ts2005b = 200504020000 &&
# Timestamps within test_tick span
ts2005c = 20050407000000 ts2005d = 200504100000 &&
# Definitely not yet valid / expired timestamps
ts2000 = 20000101000000 ts2999 = 29990101000000 &&
cat >>" ${ GPGSSH_ALLOWED_SIGNERS } " <<-EOF &&
"timeboxed valid key" valid-after= " $ts2005c " ,valid-before= " $ts2005d " $key_valid "
"timeboxed invalid key" valid-after= " $ts2005a " ,valid-before= " $ts2005b " $key_invalid "
"principal with expired key" valid-before= " $ts2000 " $key_expired "
"principal with not yet valid key" valid-after= " $ts2999 " $key_notyetvalid "
EOF
# and verify ssh-keygen verifies the key lifetime
echo "testpayload" |
ssh-keygen -Y sign -n "git" -f " ${ GPGSSH_KEY_EXPIRED } " >gpgssh_verifytime_prereq.sig &&
! ( ssh-keygen -Y verify -n "git" -f " ${ GPGSSH_ALLOWED_SIGNERS } " -I "principal with expired key" -s gpgssh_verifytime_prereq.sig)
2021-09-10 20:07:35 +00:00
'
2011-09-07 17:46:08 +00:00
sanitize_pgp( ) {
perl -ne '
/^-----END PGP/ and $in_pgp = 0;
print unless $in_pgp ;
/^-----BEGIN PGP/ and $in_pgp = 1;
'
}