bitcoin/contrib/verify-commits
Wladimir J. van der Laan a90ca4087a
Merge #13448: Add linter: Make sure we explicitly open all text files using UTF-8 encoding in Python
c8176b3cc7 Add linter: Make sure we explicitly open all text files using UTF-8 or ASCII encoding in Python (practicalswift)
634bd97001 Explicitly specify encoding when opening text files in Python code (practicalswift)

Pull request description:

  Add linter: Make sure we explicitly open all text files using UTF-8 encoding in Python.

  As requested by @laanwj in #13440.

Tree-SHA512: 1651c00fe220ceb273324abd6703aee504029b96c7ef0e3029145901762c733c9b9d24927da281394fd4681a5bff774336c04eed01fafea997bb32192c334c06
2018-06-16 15:23:14 +02:00
..
allow-incorrect-sha512-commits Use python instead of slow shell script on verify-commits 2018-06-12 14:48:02 +00:00
allow-revsig-commits Add Marco-expired-key-signed-commits to allow-revsig-commits 2018-03-28 14:55:50 -04:00
allow-unclean-merge-commits Use python instead of slow shell script on verify-commits 2018-06-12 14:48:02 +00:00
gpg.sh Fix CVE-2018-12356 by hardening the regex. 2018-06-15 21:45:32 +04:00
pre-push-hook.sh Use python instead of slow shell script on verify-commits 2018-06-12 14:48:02 +00:00
README.md Use python instead of slow shell script on verify-commits 2018-06-12 14:48:02 +00:00
trusted-git-root Revert "test: Update trust git root". 2018-03-28 14:55:50 -04:00
trusted-keys Allow any subkey in verify-commits 2017-03-04 09:41:16 -05:00
trusted-sha512-root-commit Update trusted-sha512-root-commit for new bad tree hash 2017-03-09 09:53:19 -05:00
verify-commits.py Explicitly specify encoding when opening text files in Python code 2018-06-12 21:34:52 +02:00

Tooling for verification of PGP signed commits

This is an incomplete work in progress, but currently includes a pre-push hook script (pre-push-hook.sh) for maintainers to ensure that their own commits are PGP signed (nearly always merge commits), as well as a script to verify commits against a trusted keys list.

Using verify-commits.py safely

Remember that you can't use an untrusted script to verify itself. This means that checking out code, then running verify-commits.py against HEAD is not safe, because the version of verify-commits.py that you just ran could be backdoored. Instead, you need to use a trusted version of verify-commits prior to checkout to make sure you're checking out only code signed by trusted keys:

git fetch origin && \
  ./contrib/verify-commits/verify-commits.py origin/master && \
  git checkout origin/master

Note that the above isn't a good UI/UX yet, and needs significant improvements to make it more convenient and reduce the chance of errors; pull-reqs improving this process would be much appreciated.

Configuration files

  • trusted-git-root: This file should contain a single git commit hash which is the first unsigned git commit (hence it is the "root of trust").
  • trusted-sha512-root-commit: This file should contain a single git commit hash which is the first commit without a SHA512 root commitment.
  • trusted-keys: This file should contain a \n-delimited list of all PGP fingerprints of authorized commit signers (primary, not subkeys).
  • allow-revsig-commits: This file should contain a \n-delimited list of git commit hashes. See next section for more info.

Key expiry/revocation

When a key (or subkey) which has signed old commits expires or is revoked, verify-commits will start failing to verify all commits which were signed by said key. In order to avoid bumping the root-of-trust trusted-git-root file, individual commits which were signed by such a key can be added to the allow-revsig-commits file. That way, the PGP signatures are still verified but no new commits can be signed by any expired/revoked key. To easily build a list of commits which need to be added, verify-commits.py can be edited to test each commit with BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG set to both 1 and 0, and those which need it set to 1 printed.