Compare commits

...

953 Commits

Author SHA1 Message Date
7863a1282c update Readme 2023-09-04 08:45:00 -05:00
de71b41d63 update marginal signatures to masterkeys 2023-09-03 18:08:40 -05:00
d2e3b83a9f update maintainers keys 2023-09-03 12:54:49 -05:00
45658a9db5 update maintainers keys 2023-09-03 12:50:54 -05:00
0a187b2533 Add new signing subkey for dvzrv
This adds the signing subkey `62CC73F884E52957B2FDD8839B7A287D9A2EC608`
which never expires (unless the root key expires).
2023-08-12 20:43:10 +02:00
471d73afd8 Extend artafinde's key expiry
Signed-off-by: Leonidas Spyropoulos <artafinde@archlinux.org>
2023-07-19 11:36:49 +01:00
3365f8607c feat: Replace sq-keyring-linter with sq >= 0.31.0 2023-07-09 15:56:34 +02:00
f3d2c171e7 fix: Adapt to changes in sequoia-sq 0.31.0.
With sequoia-sq 0.31.0 the `--export` parameter for `sq key generate`
has been replaced by the generalized `--output`.
2023-07-09 15:56:12 +02:00
3c78104904 Bump daurnimator's key expiry 2023-07-02 15:20:54 +10:00
8110793ec5 Add signature for torxed from anthraxx 2023-06-29 09:49:51 +02:00
a81f0055bc Add signature from Bluewind for torxed
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2023-06-29 09:49:51 +02:00
7821bc0a04 Add signature from demize for torxed
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-06-29 09:49:51 +02:00
6cd0966516 Add signature for torxed from dvzrv
Add signature for UserID "Anton Hvornum <torxed@archlinux.org>"
on 8AA2213C8464C82D879C8127D4B58E897A929F2E using
2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.
2023-06-29 09:49:51 +02:00
7ca9c84a64 Adding torxed 2023-06-29 09:49:51 +02:00
0bca06709b Update hashworks subkeys, adjust UIDs
Subkeys have been extended to 2025-06-27.

Resolves #225.
2023-06-28 23:19:35 +02:00
71b9f30441 Revoke signature from Bluewind for spupykin
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2023-06-28 18:20:50 +02:00
0132e25fbc Extend expiry for yan12125's key 2023-06-28 18:08:11 +02:00
5e8fae90db Extend expiry for alerque's key 2023-06-22 12:27:14 +03:00
c4a758e434 update expiry of freswa's key 2023-05-31 21:39:21 +02:00
62646e219b Add revocation for dvzrv
Add revocation certificate for C7E7849466FE2358343588377258734B41C31549.
2023-05-29 13:33:19 +02:00
68dbb8014a Switch advertized key for dvzrv
Switch advertized key from C7E7849466FE2358343588377258734B41C31549 to
991F6E3F0765CF6295888586139B09DA5BF0D338, as the latter superseded the
former.
2023-05-29 13:33:14 +02:00
a6c89532b1 Add authentication subkey for dvzrv
Add authentication subkey 57B71EE573F78CBEA83284B0D0B9A7F0EFEC1108 for
C7E7849466FE2358343588377258734B41C31549.
2023-05-29 13:33:10 +02:00
75b363ac6c Add certification from dvzrv for dvzrv
Add signature by 991F6E3F0765CF6295888586139B09DA5BF0D338
on C7E7849466FE2358343588377258734B41C31549 for
"David Runge <dvzrv@archlinux.org>".
2023-05-29 13:33:05 +02:00
f4ad2ed61a Add signature from Foxboron for dvzrv 2023-05-29 13:32:56 +02:00
ddc037fa33 Simplify trust_color() using match statement 2023-05-29 13:32:50 +02:00
f6d2b35318 Fix issue with Trust Enum values
As `auto()` was not used for `Trust.unknown` it led to wrong data being
returned from `trust_color()`.
2023-05-29 13:18:51 +02:00
cd9536f76a Revoke signature by demize for allan
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-05-11 10:29:36 +02:00
f7749fd39c Add signature from anthraxx for gromit
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-02 21:14:05 +02:00
fcbb3d5586 Add signature from Bluewind for gromit
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2023-05-02 12:13:45 +02:00
35ad10dd01 Add signature from dvzrv for gromit 2023-05-01 13:44:42 +02:00
771c202291 Add signature from demize for gromit
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-05-01 13:34:10 +02:00
4bab3c715d add packager key for gromit
Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-04-30 17:36:41 +02:00
29d9caa9dc Collect failed keys and print them at the end
Since !180, all keys are tried. This can indeed be useful but buries
the offending key in a long output log.

This stores a message containing the key and UID during processing and
prints them all at the end.
2023-03-20 16:24:49 +01:00
a7877fc189 Revoke signature by dvzrv for allan
Revoke signature for allan@archlinux.org by
2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E on
6645B0A8C7005E78DB1D7864F99FFE0FEAE999BD.
2023-03-20 16:22:18 +01:00
ac5f7eaeff Remove extra forward slash from archlinux-keyring-wkd-sync.service
Signed-off-by: Leonidas Spyropoulos <artafinde@archlinux.org>
2023-03-20 14:28:13 +01:00
d70b7059d0 Add signature from demize for raster
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-03-20 09:16:30 +01:00
299928461d Add signature from demize for orhun
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-03-20 09:16:27 +01:00
f3544fcdf5 Add signature from demize for bastelfreak
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-03-20 09:16:23 +01:00
388ec9850a Add signature from demize for alerque
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-03-20 09:16:16 +01:00
79d3fa3bcc Add signature from demize for lfleischer
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-03-20 09:12:24 +01:00
33fe23aecf Replace keyserver upload requirement with keys.openpgp.org
The MIT keyserver is frequently unavailable for uploads so it no longer
make sense to block new keys based on its availability.

Once we have main-key signing tooling built into `keyringctl` this
requirement will no longer be necessary since the tooling will be able
to be run from branches already containing the necessary keys.

Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-03-14 17:45:03 +01:00
8cb0c6d8a0 wkd_sync: Ignore keys with SHA-1 self-signature
wkd_sync/archlinux-keyring-wkd-sync:
Ignore keys with SHA-1 self-signature (by hardcoding them in a readonly
array) so that they will not be synced from WKD.
The Arch Linux WKD setup does not contain keys with SHA-1
self-signatures anymore.
2023-02-25 16:18:37 +01:00
cb1054f841 Fix formatting in tests
Apply black to tests.
2023-02-25 16:18:34 +01:00
d21d14176e Add signature from anthraxx for antiz 2023-02-22 14:47:20 +01:00
0a7508ede5 Add signature from Bluewind for antiz
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2023-02-22 14:47:20 +01:00
5da50cea03 Add signature from dvzrv for antiz 2023-02-22 14:47:20 +01:00
44c0af2b9a Add signature from demize for antiz
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-02-22 14:47:20 +01:00
103e00a856 Add Antiz packager key 2023-02-22 14:47:15 +01:00
67b8e024a9 extent key life time for nicohood 2023-01-31 18:56:34 +01:00
5c85f4b953 Consolidate reviewers and assignees in templates
.gitlab/issue_templates/*:
Remove pierre from list of main keys.

.gitlab/merge_request_templates/*:
Use group of main key holders when assigning reviewers, instead of
listing them all separately.
2023-01-29 15:56:20 +01:00
93bd502b4c Revoke pierre's main key 2023-01-28 18:19:26 +01:00
a4962f3e76 Add signature for alucryd from demize
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-01-02 16:25:44 +01:00
f7240fcf00 Add signature for xyne from demize
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-01-01 14:02:10 +01:00
79a2104803 Add signature for juergen from demize
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2023-01-01 14:01:57 +01:00
d9d9510b98 Add signature from demize for jelle
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-19 17:56:28 +01:00
2e54656f9a Add signature from demize for hashworks
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-19 17:54:17 +01:00
539555c4ac Add signature from demize for nicohood
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-19 17:53:58 +01:00
312e382e23 Add signature from demize for bgyorgy
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-19 17:53:58 +01:00
afb991fdc3 Add signature from demize for ainola
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-19 17:53:58 +01:00
ea27f824ff Revoke signature from Bluewind for heftig
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-12-19 09:58:49 +01:00
242a10fd27 Add signature from Bluewind for nicohood
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-12-19 09:58:45 +01:00
ba11484fb5 Add signature from Bluewind for bgyorgy
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-12-19 09:58:35 +01:00
631c3000a5 Add signature from Bluewind for tpkessler
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-12-18 14:51:27 +01:00
eac6247ecd Add signature from demize for tpkessler
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-16 21:32:08 +01:00
2ef2cc6c74 Add signature of dvzrv for tpkessler
keyring/packager/tpkessler/04CF0CD6F6EE93AE1896F58407D06351CA5B31BE/uid/Torsten_Kessler__tpkessler@archlinux.org_535cde49/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature by dvzrv (2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E) for tpkessler (04CF0CD6F6EE93AE1896F58407D06351CA5B31BE).
2022-12-16 19:33:15 +01:00
168d6915d1 Add packager key for tpkessler 2022-12-16 19:33:04 +01:00
0c4eb6c977 Add signature from anthraxx to nicohood 2022-12-16 01:00:59 +01:00
c1cc3a118b Add signature from anthraxx to jlichtblau 2022-12-16 01:00:45 +01:00
718bb5c844 Add signature from anthraxx to alex19ep 2022-12-16 01:00:24 +01:00
7dbfe97f2d Add signature from anthraxx to FFY00 2022-12-16 01:00:01 +01:00
df74a3810b Add dvzrv signature for bgyorgy
keyring/packager/bgyorgy/14E46FE5FD69F2E287E244DB632C3CC0D1C9CAF6/uid/Ballo_Gyorgy__bgyorgy@archlinux.org_9cece270/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature of dvzrv
(2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E) for bgyorgy
(14E46FE5FD69F2E287E244DB632C3CC0D1C9CAF6).
2022-12-13 22:34:57 +01:00
3846dd67f9 Update Seblu packager key 2022-12-13 21:33:27 +01:00
3e8a0ea621 Revoke @yan12125's old key 2022-12-13 20:31:50 +01:00
7a9915b245 Add new key for bgyorgy 2022-12-13 20:14:09 +01:00
af47f5a20f Add signature from demize for yan12125
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:13 +01:00
e74b1c885e Add signature from demize for polyzen
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:11 +01:00
b53064c155 Add signature from demize for pierre
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:10 +01:00
3fecae7fde Add signature from demize for muflone
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:08 +01:00
69b441ae64 Add signature from demize for maximbaz
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:07 +01:00
3b9a2aeb77 Add signature from demize for foxboron
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:06 +01:00
538343ac44 Add signature from demize for escondida
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:05 +01:00
e33375ca5d Add signature from demize for bluewind
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:04 +01:00
6932924764 Add signature from demize for arojas
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:03 +01:00
0b8c61ba70 Add signature from demize for allan
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-13 20:09:01 +01:00
16f7acac87 Add signature from Bluewind for pierre
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-12-11 10:16:26 +01:00
fc13666e73 Add dvzrv revcert for alucryd's key
keyring/packager/alucryd/9437DD3815A7A9169E3D3946AFF5D95098BC6FF5/uid/Maxime_Gauduin__alucryd@archlinux.org_2606bf1f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc
Add revocation for certificate by dvzrv
(2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E) on alucryd's key
(9437DD3815A7A9169E3D3946AFF5D95098BC6FF5).
2022-12-05 13:20:31 +01:00
f6aa92e078 Merge branch 'merge-requests/193' 2022-12-04 22:49:27 +01:00
07b18c0810 Add signature from Bluewind for thomas
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-12-04 10:21:36 +01:00
0306d410f0 Revoke signature from Bluewind for thomas
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-12-04 10:21:30 +01:00
16fd8188b5 Add signature from demize for shibumi
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-03 16:43:49 +01:00
eac6fa752f Add signature from demize for serebit
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-03 16:43:49 +01:00
837d7d0c12 Add signature from demize for rgacogne
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-03 16:43:49 +01:00
753938be0b Add signature from demize for dbermond
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-03 16:43:49 +01:00
9a137e8e41 Add signature from demize for sangy
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-03 16:43:49 +01:00
8dfa4f413e Add signature from demize for jsteel
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-03 16:43:49 +01:00
055c0a10a7 Add signature from demize for cbehan
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-03 16:43:49 +01:00
17d53dd81a Add signature from demize for andrewSC
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-12-03 16:43:49 +01:00
abe47ec3bb make my @archlinux.org uid primary 2022-12-02 09:31:59 +01:00
85530a6d3c extend key lifetime for alex19ep
Found on Ubuntu key server... 😝

Closes #208
2022-12-02 09:30:29 +01:00
2bfeaf4593 Add signature from demize for wild
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 22:09:35 +01:00
b2d25b033f Add signature from demize for mtorromeo
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 22:09:15 +01:00
8f22dc50e9 Add signature from demize for segaja
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 19:21:18 +01:00
00f1dfa1a7 Add signature from demize for FFY00
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 19:20:48 +01:00
cb9ae854b6 Add signature from demize for tpowa
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 18:04:34 +01:00
715f425527 Add signature from demize for spupykin
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 17:59:59 +01:00
4c88727871 Add signature from demize for lcarlier
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 17:59:43 +01:00
6a734cc46f Add signature from demize for idevolder
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 17:59:21 +01:00
9996e16c43 Add signature from demize for heftig
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 17:59:09 +01:00
440ac923d5 Add signature from demize for foutrelis
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 17:58:55 +01:00
8a23d4a59c Add signature from demize for felixonmars
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 17:58:41 +01:00
b82f81f7ca Add signature from demize for artafinde
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-30 17:58:30 +01:00
c0b84bfd4d Update key for Jerome Leclanche 2022-11-30 07:10:14 +01:00
988ec73a84 Add signature from demize for jlichtblau
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 23:16:07 +01:00
183d87bfa8 Add signature from demize for foxxx0
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 23:01:35 +01:00
4a556ee1c4 Add signature from demize for eworm
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 23:01:35 +01:00
bcac30eb7a Add signature from demize for svenstaro
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 23:01:32 +01:00
1ad1342ac4 Add signature from demize for freswa
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 22:38:52 +01:00
e3e19b325e Add signature from demize for dvzrv
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 22:38:41 +01:00
b9c72f776d Add signature from demize for kyrias
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 22:14:28 +01:00
6c0bc537a9 Add signature from demize for alex19ep
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 21:52:38 +01:00
769eeda592 Add signature from demize for archange
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 21:27:42 +01:00
ea5436fef7 Add signature from demize for andyrtr
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 21:24:12 +01:00
dab0c5867b Add signature from demize for anatolik
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 21:08:10 +01:00
0dbc3c3e85 Add signature from demize for blakkheim
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 21:08:07 +01:00
4b5fa39622 Add signature from demize for anthraxx
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-29 20:58:32 +01:00
1c296bf292 restart wkd sync on failure...
... but with a reasonable delay of five minutes, and limited to three
invocations per hour. After that the service goes into failed state.

This should mitigate service failure caused by intermittent network
issues or server reboot on our side.
2022-11-28 11:42:57 +01:00
594009f981 Add main key signature of dvzrv for pierre
keyring/packager/pierre/3E80CA1A8B89F69CBA57D98A76A5EF9054449A5C/uid/Pierre_Schmitz__pierre@archlinux.org_e7e0700e/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature of dvzrv
(2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E) for pierre
(3E80CA1A8B89F69CBA57D98A76A5EF9054449A5C).
2022-11-23 20:01:06 +01:00
a2e0301536 add @demize in issue templates
Added in !178
2022-11-23 09:08:23 +01:00
9beb0b5f9b remove @grazzolini from issue templates
Revoked in !183
2022-11-23 09:08:00 +01:00
271b03dc92 use @archlinux/teams/main-key-holders for assignment in issue templates 2022-11-22 23:27:55 +01:00
42afef9fdb Revoke grazzolini's master key 2022-11-22 20:37:46 +01:00
2281a7a869 Update expiry of polyzen's key 2022-11-10 14:11:29 -05:00
03649fa4fc Update expiry of rgacogne's key 2022-11-10 15:05:43 +00:00
30b8fa1653 try all keys, fail at the end for wkd sync
This makes sure all keys are tried at least, instead of failing with the
first error.

Fixes #202
2022-11-10 15:56:09 +01:00
14e5f42c38 Add new main key of demize
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-11-10 14:49:53 +00:00
4d019d5bc1 Merge remote-tracking branch 'merge-requests/177' 2022-11-04 12:08:21 +01:00
3496a50d0a update expiry of freswa's key 2022-11-03 22:28:13 +01:00
69a00fd116 Add new key for pierre 2022-10-31 11:33:47 +01:00
c4ea00b0d3 Add signature from anthraxx for blakkheim 2022-09-26 23:59:01 +02:00
e347a820c6 increase random delay for wkd sync
Most systems run this in the same 12 hours... Stop DDOS'ing ourselves
and spread over the whole week.

Fixes #198
2022-09-21 14:50:49 +02:00
a8784b9ac4 Add signature from Bluewind for blakkheim
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-09-18 11:24:06 +02:00
7fa672586a Merge branch 'merge-requests/173' 2022-09-12 09:58:20 +02:00
335a31dcf6 Hardcode using bash as make's shell
On Debian/Ubuntu the default shell is dash, and builds are done with
SHELL overridden to dash. Since archlinux-keyring now has Bash-isms in
the install and uninstall targets (for {} expansion), and rewriting it
to drop this is inconvenient (because we'll have to repeat the path
prefixes), hardcode the use of Bash instead.

Use /bin/bash to be compatible with distros that have not finished the
/bin -> /usr/bin migration yet.

Signed-off-by: Michel Alexandre Salim <michel@michel-slm.name>
2022-09-12 09:34:26 +02:00
eb12f06550 Add signature of dvzrv for blakkheim
keyring/packager/blakkheim/54C1FD273361EA514A237793F296BDE50368C6CE/uid/T.J._Townsend__blakkheim@archlinux.org_476bd08f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature of dvzrv
(2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E) for blakkheim
(54C1FD273361EA514A237793F296BDE50368C6CE).
2022-09-11 21:18:47 +02:00
3eb5037a48 Merge remote-tracking branch 'blakkheim/master'
* blakkheim/master:
  Add packager key for new Trusted User blakkheim
2022-09-11 13:48:39 +02:00
375d4bff87 Add packager key for new Trusted User blakkheim
Application: https://lists.archlinux.org/pipermail/aur-general/2022-August/036930.html
Voting result: https://lists.archlinux.org/pipermail/aur-general/2022-September/036964.html
2022-09-10 10:35:21 -04:00
33e8374d12 Add signature from Bluewind for serebit
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-09-04 10:01:52 +02:00
7b331e8a7d Rename wkd_build to pages
.gitlab-ci.yml:
Rename wkd_build to pages, as that is apparently what gitlab needs.
2022-09-02 19:04:02 +02:00
05f17ee267 Copy WKD dir to public directly
.gitlab-ci.yml:
Copy the WKD dir to a public dir (used by gitlab pages) directly instead
of creating the public dir and copying into it, as that is brittle.
2022-09-02 18:31:38 +02:00
75b7394377 Force symlinking of systemd unit for activation
Makefile:
Force symlinking of systemd unit for activation. If the service is
already installed and activated (symlinked) on the target system, a
non-forced symlink would fail otherwise.
2022-09-02 13:26:29 +02:00
a6f2a84baa Add gitlab-ci integration to build WKD dir on tag
.gitlab-ci.yml:
Add gitlab-ci integration to build WKD dir on tag using the `make wkd`
target per FQDN used by Arch Linux. Builds only happen on a secure
runner, the job is running in its own stage after the tests and only
runs in pipelines for tags.
2022-08-31 11:41:45 +02:00
85dc87d167 Adapt Makefile to build wkd dir and inspect it
Makefile:
Change the Makefile to build WKD dirs based on a given WKD_FQDN and add
them to WKD_BUILD_DIR.
2022-08-31 11:19:57 +02:00
0a6ff56c80 Merge branch 'merge-requests/165' 2022-08-31 09:35:24 +02:00
d0bea7ad8a Add signature from anthraxx for yan12125 2022-08-31 01:34:29 +02:00
0f217bd222 Add signature from Bluewind for yan12125
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-08-31 01:06:53 +02:00
fae9b09614 Merge branch 'merge-requests/162' 2022-08-29 22:51:43 +02:00
1e57a3038e Add signature from anthraxx for serebit 2022-08-28 22:50:59 +02:00
8f787824c1 Add main key signature by dvzrv for serebit
keyring/packager/serebit/CAAE0C97533C35D3A0C6C34066E60E5F785A6824/uid/Campbell_Jones__for_package_signing_only___serebit@archlinux.org_55f6fd2b/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature by dvzrv
(2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E) for serebit
(CAAE0C97533C35D3A0C6C34066E60E5F785A6824).
2022-08-28 20:01:07 +02:00
25d07327d6 Add main key signature by dvzrv for yan12125
keyring/packager/yan12125/E62545315B012B69C8C94A1D56EC201BFC794362/uid/Chih-Hsuan_Yen__yan12125@archlinux.org_fea86268/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature by dvzrv
(2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E) for yan12125
(E62545315B012B69C8C94A1D56EC201BFC794362).
2022-08-28 19:59:45 +02:00
f0200aba0d Update expiry of kpcyrd key 2022-08-19 15:01:36 +02:00
f235233372 Add signature from diabonas for yan12125 2022-08-19 10:53:25 +02:00
7854fefc9f Merge branch 'merge-requests/156' 2022-08-19 10:00:18 +02:00
48a4282873 Merge branch 'merge-requests/158' 2022-08-19 09:55:56 +02:00
da16cd7c6b Merge branch 'merge-requests/145' 2022-08-19 09:50:46 +02:00
79c81cbe6a Merge branch 'merge-requests/157' 2022-08-19 09:45:52 +02:00
b01b1f77dc Revoke signature from diabonas for tensor5
Trusted User resignation:
https://lists.archlinux.org/archives/list/arch-dev-public@lists.archlinux.org/thread/TZWGYQY3AGNVVTIV4QB5CIJP4PI5JM4T/
2022-08-18 16:15:50 +02:00
4c6fbc3779 Add signature from diabonas for serebit 2022-08-18 14:20:06 +02:00
378e0ed4f3 Add packager key for new Trusted User serebit
Application: https://lists.archlinux.org/pipermail/aur-general/2022-January/036781.html
Voting results: https://lists.archlinux.org/pipermail/aur-general/2022-March/036842.html
2022-08-17 21:02:39 +02:00
1352aa782b Revoke @tensor5’s key 2022-08-14 22:11:08 +09:00
498a19d0c6 Add yan12125's new key
There are some other changes with my current key:

* Actually revoke an unused uid

As per RFC 4880 [1], a revocation signature (sigclass 0x30) "should
have a later creation date than that certificate." However, somehow in
my keyring I have certificates newer than the previous revocation
signature. As a result, that uid is not marked as revoked by gpg. I
created a new revocation signature to fix that.

* Make @archlinux.org the primary UID

[1] https://datatracker.ietf.org/doc/html/rfc4880
2022-08-13 23:49:22 +08:00
8b336741d1 Add signature from diabonas for sangy 2022-08-09 08:48:38 +02:00
7217c34c04 Add signature from diabonas for foxxx0 2022-08-09 08:48:32 +02:00
8036719a2e Allow overriding the script location in WKD sync service
wkd_sync/archlinux-keyring-wkd-sync.service.in:
Replace use of explicit script location (i.e. /usr/bin) with
SCRIPT_TARGET_DIR placeholder.

Makefile:
Create WKD sync service file from input file, replacing the
SCRIPT_TARGET_DIR placeholder with $SCRIPT_TARGET_DIR.
2022-08-04 12:59:24 +02:00
b3279eafcf Rename WKD sync service file to an input file
wkd_sync/archlinux-keyring-wkd-sync.service -> wkd_sync/archlinux-keyring-wkd-sync.service.in:
This allows using the file as input file, where overriding keywords can
be done using sed.
2022-08-04 12:57:46 +02:00
1dfc921a87 Make install locations more configurable and clean up
Makefile:
Change Makefile to allow installation of keyring data, systemd units and
scripts more configurable.
This allows user provided overrides via KEYRING_TARGET_DIR,
SCRIPT_TARGET_DIR, SYSTEMD_SYSTEM_UNIT_DIR.
Instead of relying on wildcards, rely on specifically named files, as
this can be reused also in the uninstall target without issue and
provides a clearer overview of what will be installed/uninstalled.
Specifically only make use of DESTDIR in the install and uninstall
targets, which allows easier overrides.
Extend uninstall target to also remove WKD sync related script and
systemd units.
2022-08-04 12:41:23 +02:00
3e24dfe0a0 Add signature from diabonas for maximbaz 2022-08-04 09:03:54 +02:00
e82a4e99db Add signature from diabonas for anthraxx 2022-08-03 09:01:26 +02:00
6c2b081c1e Add main signature of anthraxx for dvzrv
keyring/packager/dvzrv/991F6E3F0765CF6295888586139B09DA5BF0D338/uid/David_Runge__dvzrv@archlinux.org_d2ad250f/certification/D8AFDDA07A5B6EDFA7D8CCDAD6D055F927843F1C.asc:
Add main key signature by anthraxx for dvzrv on key 991F6E3F0765CF6295888586139B09DA5BF0D338.
2022-08-02 19:44:47 +02:00
427fe46040 Add signature from diabonas for alerque 2022-08-01 16:24:09 +02:00
3d342e48ab Merge branch 'sha1die_jelle' 2022-08-01 16:10:45 +02:00
baeb0c0a44 Remove reference to AUTHORS file
This file no longer exists in the repository, drop the mention.

Signed-off-by: Michel Alexandre Salim <michel@michel-slm.name>
2022-07-31 22:55:33 +02:00
3a43867e1c Fix the permission of keyring files
These are non-executables, they should be installed 644 rather than 755.

Signed-off-by: Michel Alexandre Salim <michel@michel-slm.name>
2022-07-31 22:55:28 +02:00
c14acdfef7 Replace SHA-1 usage for jelle
Signed-off-by: Jelle van der Waa <jelle@archlinux.org>
2022-07-31 17:36:37 +02:00
76c59984a0 Revoke signature on muflone's key
keyring/packager/muflone/CAA1D2323A05219AA2F01AA4E642299183ED727E/*:
Revoke signature on muflone@archlinux.org for
CAA1D2323A05219AA2F01AA4E642299183ED727E.
2022-07-31 08:32:16 +02:00
4ef129ebd8 Extend contributing guidelines for WKD
CONTRIBUTING.md:
Extend contributing guidelines by a section about which data is released
to the Web Key Directory.
2022-07-29 14:37:24 +02:00
470f854942 Add additional build dependencies pkgconf and systemd
README.md:
As we are dynamically deriving the target systemd system unit dir, we
require pkgconf and systemd during build time.
2022-07-29 14:37:20 +02:00
87b1a4ab72 Install WKD update script/service/timer with Makefile
Makefile:
Extend install target to also install the WKD update script and the
systemd service and timer.
Vendor enable the systemd timer.
2022-07-29 14:37:12 +02:00
9f8c58f340 Add pkgconf and systemd before building/ installing
.gitlab-ci.yml:
Add pkgconf and systemd to the list of packages, that are installed
before executing the build and install targets. They are required to
retrieve the correct path for systemd's system units.
2022-07-29 14:37:08 +02:00
ad8698e96c Add timer to regularly refresh PGP keys
wkd_sync/archlinux-keyring-wkd-sync.timer:
Add timer which triggers archlinux-keyring-wkd-sync.service to
persistently refresh existing PGP keys of archlinux-keyring weekly with
up to 12h of randomized delay.
2022-07-29 14:37:04 +02:00
8436229ea6 Add hardened systemd service to run WKD sync
wkd_sync/archlinux-keyring-wkd-sync.service:
Add hardened systemd service to run WKD sync using
`archlinux-keyring-wkd-sync`.
2022-07-29 14:36:59 +02:00
e5a2665a4c Script to refresh existing keys of archlinux-keyring
wkd_sync/archlinux-keyring-wkd-sync:
Add script to refresh existing keys of archlinux-keyring on user
systems based on the state of the distribution's Web Key Directory
(WKD).
Invalid or revoked keys are ignored.
2022-07-29 14:36:51 +02:00
11c500a186 Use spaces instead of tabs in files
.editorconfig:
Use spaces instead of tabs in files.
Add section for Makefile using tabs.
2022-07-29 14:36:46 +02:00
fa02de4c0c Add signature from diabonas for lfleischer 2022-07-29 14:20:08 +02:00
22046c3c2d Add signature from diabonas for kpcyrd 2022-07-29 14:20:04 +02:00
fa5c5845d1 Upgrade signatures for lfleischer to SHA-2
Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
2022-07-29 14:17:17 +02:00
d1276ba49a This is the signature for svenstaro from grazzolini master key. 2022-07-28 12:04:50 -03:00
22ac6fb976 Add signature from diabonas for bluewind 2022-07-26 11:39:32 +02:00
db472fd30e Update self-signatures of bluewind's packager key from SHA-1 to SHA-2 2022-07-26 11:39:30 +02:00
21a59b2369 Add signature from diabonas for alucryd 2022-07-26 11:39:25 +02:00
5fefe1c75a Add signature from diabonas for remy 2022-07-26 11:37:35 +02:00
a77f7d713b Add signature from diabonas for shibumi 2022-07-26 11:37:33 +02:00
7b94aa7604 Add signature from diabonas for morganamilo 2022-07-26 11:37:30 +02:00
923ef2c429 Add signature from diabonas for escondida 2022-07-26 11:37:25 +02:00
9a83b10110 Add signature from Bluewind for muflone
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-07-24 13:44:01 +02:00
bcad513404 Update self-signatures of remy's packager key from SHA-1 to SHA-2 2022-07-23 19:56:41 +02:00
0cee060429 update shibumi's key 2022-07-23 03:55:03 +02:00
c34e8cca5c Add signature from diabonas for arojas 2022-07-20 23:09:01 +02:00
58def93247 Update arojas key 2022-07-20 23:08:55 +02:00
099df52a04 feature(keyringctl): support query expressions for packet field selection
Instead of simply string matching a line, we now traverse the packet as
a tree and match the path based on a depth first search.

While traversing, we support logical OR and current depth * wildcard
processed as a component based query expression.

Callee's are adjusted to specifically select the appropriate Issuer at
the correct depth.

Fixes #185
2022-07-20 21:34:37 +02:00
9d4c7057f4 add signature from anthraxx for svenstaro 2022-07-19 21:17:40 +02:00
81d336c253 Add signature from diabonas for raster 2022-07-19 17:25:54 +02:00
d67abf5710 add signature from anthraxx for jsteel 2022-07-19 01:02:56 +02:00
9808e897c4 Add signature from diabonas for spupykin 2022-07-18 08:51:34 +02:00
c5e7b0e90e Add signature from diabonas for juergen 2022-07-18 08:51:29 +02:00
06f326172a Add signature from Bluewind for svenstaro
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-07-17 10:56:57 +02:00
f40f4ef9cc Add signature from diabonas for FFY00 2022-07-17 07:37:14 +02:00
14d72780a4 Add signature from diabonas for felixonmars 2022-07-17 07:37:07 +02:00
174e30e368 Add signature from diabonas for jsteel 2022-07-16 10:55:03 +02:00
c084dc6d0d Add signature from diabonas for heftig 2022-07-16 10:54:58 +02:00
0982b66a80 Add signature from diabonas for kgizdov 2022-07-15 08:34:51 +02:00
d3a4a8a8c3 Add signature from diabonas for arodseth 2022-07-15 08:34:45 +02:00
faafeb906e Add signature from diabonas for orhun 2022-07-14 10:26:02 +02:00
ec25f7e422 Add signature from diabonas for cbehan 2022-07-14 10:25:56 +02:00
9350fe91ba Add signature from diabonas for xyne 2022-07-13 10:20:16 +02:00
71bd8f673e Add signature from diabonas for lcarlier 2022-07-13 10:20:14 +02:00
79e83916f9 Add signature from diabonas for andrewSC 2022-07-13 10:20:07 +02:00
046d79bb31 add signature from anthraxx for coderobe 2022-07-13 00:40:53 +02:00
5b97930c9d Add signature from diabonas for svenstaro 2022-07-12 10:38:56 +02:00
0fe42a1992 Add signature from diabonas for idevolder 2022-07-12 10:38:54 +02:00
65993cbd55 Add signature from diabonas for hashworks 2022-07-12 10:38:52 +02:00
d705b30119 Add signature from diabonas for bastelfreak 2022-07-12 10:38:50 +02:00
3f16ab5637 Add signature from diabonas for andyrtr 2022-07-12 10:38:44 +02:00
af810015e1 Merge remote-tracking branch 'hashworks/hashworks-subkey-update-2022-07-11'
* hashworks/hashworks-subkey-update-2022-07-11:
  Update hashworks subkeys
2022-07-11 19:51:31 +02:00
bfb00f008d Update hashworks subkeys
Expiration date was extended to 2023-07-11.
2022-07-11 19:14:51 +02:00
06a27fdef2 Update AndyRTR's key to fix SHA-1 signing issue 2022-07-11 16:21:15 +02:00
be7e836d73 Add signature from diabonas for nicohood 2022-07-11 10:59:04 +02:00
a6256a6941 Add signature from diabonas for rgacogne 2022-07-11 10:59:02 +02:00
2fdc5fae43 Add signature from diabonas for grawlinson 2022-07-11 10:59:00 +02:00
fcc0fab5d6 Add signature from diabonas for foxboron 2022-07-11 10:58:58 +02:00
71bb0aec52 Add signature from diabonas for anatolik 2022-07-11 10:58:55 +02:00
3dbf7d369e Add signature from diabonas for ainola 2022-07-11 10:58:51 +02:00
cbf4afaa5c fix: use of SHA1 in sangy's key 2022-07-10 18:08:55 -04:00
4018084f6c Add signature from dvzrv for muflone
keyring/packager/muflone/42DFAFB7C03B2E4E7BBDBA69930B82BFC2BDA011/uid/Fabio_Castelli__Muflone___Arch_Linux___muflone@archlinux.org_3db85507/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature by `2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E` for
`muflone@archlinux.org` on `42DFAFB7C03B2E4E7BBDBA69930B82BFC2BDA011`.
2022-07-10 12:44:53 +02:00
4c0fef3878 Add signature from diabonas for yan12125 2022-07-10 12:35:34 +02:00
671af82a33 Add signature from diabonas for wild 2022-07-10 12:35:32 +02:00
c0bec2db19 Add signature from diabonas for tpowa 2022-07-10 12:35:30 +02:00
1ab7e99da2 Add signature from diabonas for tensor5 2022-07-10 12:35:25 +02:00
9f4483e798 Add signature from diabonas for polyzen 2022-07-10 12:35:23 +02:00
45ae60f62a Add signature from diabonas for muflone 2022-07-10 12:35:19 +02:00
7b60515668 Add signature from diabonas for mtorromeo 2022-07-10 12:35:16 +02:00
2c832f7327 Add signature from diabonas for kyrias 2022-07-10 12:35:14 +02:00
aa0d36cd12 Add signature from diabonas for jlichtblau 2022-07-10 12:35:12 +02:00
9d355d890a Add signature from diabonas for freswa 2022-07-10 12:35:11 +02:00
6a9fb0b2c4 Add signature from diabonas for foutrelis 2022-07-10 12:35:09 +02:00
48fc785dd9 Add signature from diabonas for eworm 2022-07-10 12:35:07 +02:00
07856a9c9f Add signature from diabonas for allan 2022-07-10 12:35:00 +02:00
edbb9c494f Merge remote-tracking branch 'ainola/master'
* ainola/master:
  Update Brett Cornwall GPG key
2022-07-10 12:00:17 +02:00
2b1e9adcc1 Update Brett Cornwall GPG key 2022-07-10 00:59:42 -07:00
582367f5c0 Merge branch 'merge-requests/115' 2022-07-09 19:43:52 +02:00
7b64ed9058 Merge branch 'merge-requests/114' 2022-07-09 19:42:54 +02:00
2b01a2de7a update tpowa key 2022-07-09 19:41:00 +02:00
a734c2a3cf Merge branch 'merge-requests/112' 2022-07-09 19:39:55 +02:00
5487627d6f Merge branch 'merge-requests/111' 2022-07-09 19:38:57 +02:00
462078551c Merge branch 'merge-requests/110' 2022-07-09 19:37:28 +02:00
b0c734dc15 Update Allan's key to fix SHA-1 signing issue
Signed-off-by: Allan McRae <allan@archlinux.org>
2022-07-09 19:30:53 +02:00
47eb4a11af Merge branch 'eworm' 2022-07-09 19:29:43 +02:00
10bbb50af5 Add new packager key for sudoforge: 0x00E16349
Closes: #174
2022-07-09 19:23:57 +02:00
42beb5f1c7 Update self-signatures of jsteel's packager key from SHA-1 to SHA-2 2022-07-09 19:15:16 +02:00
4200504b86 Fix old SHA1 sigs 2022-07-09 18:59:05 +02:00
49aced6785 Update self-signatures of felixonmars' packager key from SHA-1 to SHA-2 2022-07-09 16:18:40 +03:00
37f46c3905 Update lordheavy's key to fix SHA-1 signing issue 2022-07-09 14:01:40 +02:00
c5d77fdc73 Fixed self-sigs
Signed-off-by: Morten Linderud <morten@linderud.pw>
2022-07-09 13:51:19 +02:00
2eb6d95834 Update self-signatures of foutrelis' packager key
Going from SHA-1 to SHA-2.
2022-07-09 14:42:03 +03:00
9d482bb11f Update self-signatures of eworm's packager key from SHA-1 to SHA-2 2022-07-09 13:03:11 +02:00
8377c47b18 Add signature from diabonas for segaja 2022-07-09 11:09:04 +02:00
96be3a7c7f Add signature from diabonas for jleclanche 2022-07-09 11:09:02 +02:00
e3e642f460 Add signature from diabonas for farseerfc 2022-07-09 11:09:00 +02:00
bf05031682 Add signature from diabonas for dvzrv 2022-07-09 11:08:58 +02:00
6e6b123573 Add signature from diabonas for dbermond 2022-07-09 11:08:55 +02:00
ad48acc9dd Add signature from diabonas for artafinde 2022-07-09 11:08:53 +02:00
31423733b7 Add signature from diabonas for archange 2022-07-09 11:08:50 +02:00
167d06e3e2 Add signature from diabonas for alex19ep 2022-07-09 11:08:45 +02:00
0093c4c522 Add signature from diabonas for coderobe 2022-07-08 14:15:23 +02:00
f7525f8de8 Add diabonas to issue and merge request templates 2022-07-07 23:09:18 +02:00
fd9a589b20 Add main signature of diabonas for diabonas's packager key 2022-07-07 16:29:21 +02:00
dcdc48d872 Extend expiration date of diabonas's packager key
The key currently expires on 2023-01-28, extend it by two years until
2024-06-29.
2022-07-07 16:29:09 +02:00
881806606d Add new packager key for muflone 2022-07-07 16:11:58 +02:00
94b1ce3da2 Merge remote-tracking branch 'yan12125/yan12125-update-key'
* yan12125/yan12125-update-key:
  Extend expiry for yan12125's key & add a new authentication subkey
2022-07-07 15:49:47 +02:00
56de6a8451 Extend expiry for yan12125's key & add a new authentication subkey 2022-07-07 18:20:23 +08:00
42ca7f2c5e Add new main key of diabonas 2022-07-07 00:55:39 +02:00
f698f6673f Add main signature of dvzrv for xyproto
keyring/packager/arodseth/8A9BC5819C54FEB3DC2A9B48C32217F6F13FF192/uid/Alexander_F._Rodseth__xyproto@archlinux.org_0d098e0d/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature of dvzrv for xyproto's key with the ID 8A9BC5819C54FEB3DC2A9B48C32217F6F13FF192.
2022-06-26 13:14:41 +02:00
7f315fd937 Add signature from Bluewind for arodseth
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-06-26 10:46:47 +02:00
a511e5a91a Add signature from Bluewind for dvzrv
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-06-09 00:17:23 +02:00
51f6fa81ac Merge remote-tracking branch 'arodseth/add_8A9BC5819C54FEB3DC2A9B48C32217F6F13FF192'
* arodseth/add_8A9BC5819C54FEB3DC2A9B48C32217F6F13FF192:
  Add new packager key for arodseth
2022-06-08 23:17:43 +02:00
a3e6e88f5b Add new packager key for arodseth 2022-06-08 13:58:30 +00:00
02e137e933 keyringctl: use python3 in shebang
Signed-off-by: Morten Linderud <morten@linderud.pw>
2022-06-08 15:42:08 +02:00
c173a8b009 Fix coverage reporting with gitlab CI
.gitlab-ci.yml:
Remove legacy keyword 'cobertura' and use the gitlab >= 15 based
`coverage_report` which is used to specify format and path to coverage
XML.
2022-06-08 14:42:07 +02:00
eab15c07ef Add signature of dvzrv for farseerfc
keyring/packager/farseerfc/CE536327AED18EABC3B99A17F4AA4E0ED2568E87/uid/Jiachen_YANG__Arch_Linux_Packager_Signing_Key___farseerfc@archlinux.org_30efed36/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for `CE536327AED18EABC3B99A17F4AA4E0ED2568E87`.
2022-05-20 22:03:53 +02:00
a691b00605 Add signature for dvzrv
keyring/packager/dvzrv/991F6E3F0765CF6295888586139B09DA5BF0D338/uid/David_Runge__dvzrv@archlinux.org_d2ad250f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for PGP key with ID
`991F6E3F0765CF6295888586139B09DA5BF0D338`.
2022-05-20 01:14:12 +02:00
9ac4e77af5 Add new packager key for dvzrv
keyring/packager/dvzrv/991F6E3F0765CF6295888586139B09DA5BF0D338/:
Add new packager key `991F6E3F0765CF6295888586139B09DA5BF0D338` for
dvzrv.
2022-05-20 01:06:21 +02:00
f3b1e9e5f6 Revoke main key for Allan
Signed-off-by: Allan McRae <allan@archlinux.org>
2022-05-12 18:26:51 +02:00
57efde6f46 keyring: add signature from anthraxx for muflone 2022-05-11 20:45:08 +02:00
dabd5d1f19 keyring: add signature from anthraxx for maximbaz 2022-05-11 20:45:06 +02:00
11099ca589 keyring: add signature from anthraxx for juergen 2022-05-11 20:45:03 +02:00
b9b5064850 keyring: add signature from anthraxx for escondida 2022-05-11 20:45:01 +02:00
75667b9a57 keyring: add signature from anthraxx for cbehan 2022-05-11 20:44:59 +02:00
4c249460cd keyring: add signature from anthraxx for alucryd 2022-05-11 20:44:56 +02:00
db84e8208d fix(util): support shells passing subshell fd as /dev/fd
This adds support orthogonal to shells that pass subshell fd as
/proc/self/fd.
2022-05-11 20:28:23 +02:00
9f0db89a0a Add revocations for expired key
keyring/packager/dvzrv/91BD8815FE0040FA7FF5D68754C28F4FF5A1A949/*:
Add revocations for expired key.
2022-05-11 20:08:11 +02:00
acc37609f9 Add signature from Bluewind for farseerfc
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-05-11 19:58:30 +02:00
576c4eced7 Add new key CE536327AED18EABC3B99A17F4AA4E0ED2568E87 for farseerfc 2022-05-08 01:52:32 +09:00
c1e08e6a61 readme: add list of all keyring maintainers that could issue releases
This declares a list of all legitimate keys.
2022-04-24 22:21:35 +02:00
5f7147a8c6 Add pierre's master key signature for archange #160 2022-04-24 12:06:34 +00:00
af20138f4c Add pierre's master key signature for alucryd #147 2022-04-24 13:49:25 +02:00
6af9d54a1f Add main key signature from dvzrv for archange
keyring/packager/archange/69DA34D78FE0EFD596AC6D049D893EC4DAAF9129/uid/Bruno_Pagani__archange@archlinux.org_4d5b885f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature from dvzrv for archange.
2022-04-23 00:53:00 +02:00
7b31683733 Update FFY00's keys
Signed-off-by: Filipe Laíns <lains@riseup.net>
2022-04-22 22:22:17 +01:00
2e3dfd80ec Merge remote-tracking branch 'archange/mr-for-160'
* archange/mr-for-160:
  Add new uid for archange@archlinux.org
2022-04-21 14:27:38 +02:00
80c31e8e8b Add new uid for archange@archlinux.org 2022-04-17 14:17:45 +00:00
29dc5d228d Import Iterable and Iterator depending on Python version
libkeyringctl/{keyring,sequoia,util}.py:
As Iterable and Iterator are only used for type hints, switch to using
typing.{Iterable,Iterator} instead of
collections.abc.{Iterable,Iterator} for Python < 3.9.0, as older Python
interpreters will otherwise raise TypeError.
2022-04-14 16:59:22 +02:00
67d898d12f Add signature from Bluewind for alucryd
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-03-27 11:12:29 +02:00
6e23b78671 Update issue templates
.gitlab/issue_templates/*:
Replace allan with grazzolini when assigning tickets or when addressing
main key holders.
Streamline the checkbox system, by relying on less interaction from the
main key holders side if possible (e.g. checks on new keys are done
automatically in a merge request, so have contributors open the merge
request).
Add more documentation on what needs to be edited and how to provide
data exactly (e.g. keyid format, clearsigned document).
2022-03-17 18:46:31 +01:00
845dba12d5 dvzrv main key signature for alucryd
keyring/packager/alucryd/95220BE99CE6FF778AE0DC670F65C7D881506130/uid/Maxime_Gauduin__alucryd@archlinux.org_2606bf1f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Main key signature by dvzrv for alucryd (95220BE99CE6FF778AE0DC670F65C7D88150613).
2022-03-07 16:32:47 +01:00
9d07b1a210 Merge remote-tracking branch 'alucryd/new-pk-alucryd'
* alucryd/new-pk-alucryd:
  Add a new packager key for alucryd
2022-03-07 16:18:56 +01:00
ceecf32819 Add a new packager key for alucryd 2022-03-06 13:53:41 +00:00
f908838822 fix(trust): do not count revoked main keys for packager trust
If a main key is revoked we do not want to use those keys to count
the required trust threshold.
2022-02-25 21:36:35 +01:00
bae4859fd8 Merge new main key by Giancarlo Razzolini
keyring/main/grazzolini/*:
Add new main key with ID `159F3A43AEB246C5746C033814BC4F30B3B92EBA` by
Giancarlo Razzolini.

* new-mk-grazzolini:
  New Master Key of Giancarlo Razzolini
2022-02-24 18:14:56 +01:00
135960eec4 New Master Key of Giancarlo Razzolini 2022-02-13 10:26:38 -03:00
137db492d8 Add signature from Bluewind for pierre
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-02-06 14:05:47 +01:00
f6060a04f6 Add signature from Bluewind for eworm
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-02-06 14:05:47 +01:00
75f8cc54e3 Add pierre's master key signature for tensor5 #129 2022-01-27 18:26:21 +01:00
4df58a4d70 Revoke signature from Bluewind for zorun
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-01-23 11:16:28 +01:00
4a29d276c3 Add signature from Bluewind for xyne
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-01-23 11:16:28 +01:00
9fbe5c8504 Revoke signature from Bluewind for thestinger
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-01-23 11:16:28 +01:00
a343cbce6a Add signature from Bluewind for tensor5
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-01-23 11:16:27 +01:00
c9955429fc Revoke signature from Bluewind for schuay
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-01-23 11:16:27 +01:00
8c8f75e3e8 Add signature from Bluewind for jleclanche
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-01-23 11:16:27 +01:00
5b7326e615 Add signature from Bluewind for cbehan
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-01-23 11:16:27 +01:00
c37c4f20c9 Add signature from Bluewind for anatolik
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2022-01-23 11:16:27 +01:00
98ee77f1b6 Add pierre's master key signature for eworm #144 2022-01-22 16:02:24 +01:00
ba09c31dd6 Merge remote-tracking branch 'ainola/add-florian-certification-to-ainola'
* ainola/add-florian-certification-to-ainola:
  ainola: Add bluewind certification
2022-01-17 21:38:16 +01:00
8808c16c4e ainola: Add bluewind certification 2022-01-17 08:43:32 -08:00
b800c36d82 Add dvzrv main key signature for pierre
keyring/packager/pierre/4AA4767BBC9C4B1D18AE28B77F2D434B9741E8AC/uid/Pierre_Schmitz__pierre@archlinux.org_e7e0700e/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add dvzrv main key signature for pierre.

Relates to #143
2022-01-16 16:49:26 +01:00
8b704ce222 Merge remote-tracking branch 'origin/issues/140/pierre'
* origin/issues/140/pierre:
  Revoke pierre's master key signature for dvzrv 2nd key #140
2022-01-16 08:59:41 +01:00
d1f8751881 Revoke pierre's master key signature for dvzrv 2nd key #140 2022-01-16 07:49:28 +00:00
ecc0d7fb50 Merge remote-tracking branch 'origin/issues/139/pierre'
* origin/issues/139/pierre:
  Revoke pierre's master key signature for schuay #139
2022-01-16 08:49:00 +01:00
0b5ebb554f Revoke pierre's master key signature for schuay #139 2022-01-15 22:08:06 +00:00
08dbec2534 Merge remote-tracking branch 'origin/dvzrv_daurnimator_signature'
* origin/dvzrv_daurnimator_signature:
  Add dvzrv main key signature for daurnimator
2022-01-15 23:07:21 +01:00
2d5e55f0d9 Add dvzrv main key signature for daurnimator
keyring/packager/daurnimator/954A3772D62EF90E4B31FBC6C91A9911192C187A/uid/Daurnimator__daurnimator@archlinux.org_2baa8b1a/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add dvzrv main key signature for daurnimator
2022-01-15 22:06:18 +00:00
d179ff8de0 Merge remote-tracking branch 'origin/issues/130/pierre'
* origin/issues/130/pierre:
  Revoke pierre's master key signature for eschwartz #130
2022-01-15 23:05:43 +01:00
ce4d481d17 Revoke pierre's master key signature for eschwartz #130 2022-01-15 22:03:52 +00:00
b7f245738a Merge remote-tracking branch 'origin/issues/138/pierre'
* origin/issues/138/pierre:
  Add pierre's master key signature for segaja #138
2022-01-15 23:02:50 +01:00
cd6b2e83bb Add pierre's master key signature for segaja #138 2022-01-15 22:01:52 +00:00
0d8f66374f Merge remote-tracking branch 'origin/issues/137/pierre'
* origin/issues/137/pierre:
  Add pierre's master key signature for anatolik #137
2022-01-15 23:01:13 +01:00
ebe7f3e118 Add pierre's master key signature for anatolik #137 2022-01-15 22:00:04 +00:00
11656e6c2f Merge remote-tracking branch 'origin/issues/135/pierre'
* origin/issues/135/pierre:
  Add pierre's master key signature for artafinde #135
2022-01-15 22:59:05 +01:00
673158f80d Add pierre's master key signature for artafinde #135 2022-01-15 21:50:09 +00:00
f5345fa9f4 Merge remote-tracking branch 'origin/issues/134/pierre'
* origin/issues/134/pierre:
  Add pierre's master key signature for cbehan #134
2022-01-15 22:49:20 +01:00
62a0dc127a Add pierre's master key signature for cbehan #134 2022-01-15 21:44:26 +00:00
e2ef3746fb Merge remote-tracking branch 'origin/issues/133/pierre'
* origin/issues/133/pierre:
  Add pierre's master key signature for ainola #133
2022-01-15 22:43:33 +01:00
d9784c6f38 Add pierre's master key signature for ainola #133 2022-01-15 21:38:18 +00:00
dd92d81214 Merge remote-tracking branch 'origin/issues/132'
* origin/issues/132:
  Add pierre's master key signature for xyne #132
2022-01-15 22:36:31 +01:00
4eeadc92bf Add pierre's master key signature for xyne #132 2022-01-15 20:58:36 +00:00
0cffe098f4 Add pierre's master key signature for escondida
References #131
2022-01-15 14:08:47 +01:00
4ed3645f1e Add dvzrv main key signature for muflone
keyring/packager/muflone/CAA1D2323A05219AA2F01AA4E642299183ED727E/uid/Fabio_Castelli__Muflone___Arch_Linux___muflone@archlinux.org_3db85507/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add dvzrv main key signature for muflone.

Relates to #114
2022-01-14 21:19:25 +01:00
d77a60a0b6 keyring: Update foxboron@archlinux.org
Added master signature from Anthraxx

Signed-off-by: Morten Linderud <morten@linderud.pw>
2022-01-14 10:24:40 +01:00
e5556e5492 Add signatures for artafinde 2022-01-13 21:41:16 +00:00
a477336707 #138 / add packager key for segaja 2022-01-13 20:17:58 +00:00
2d0ccd069c gitlab: invoke ci target for advanced checks on new keys
This invokes the dedicated ci keyringctl command that is responsible
to check with sq-keyring-linter and hokey when completely unknown
new keys are added to the keyring.
2022-01-13 21:10:51 +01:00
6495c0db92 add signatures for eworm 2022-01-13 16:44:28 +01:00
ab44436c3a Cleanup old superseded workflow, script and key material 2022-01-12 20:51:30 +01:00
7a18f4393c Add revocation certificate for bpiotrowski's main key
keyring/main/bpiotrowski/DDB867B92AA789C165EEFA799B729B06A680C281/revocation/DDB867B92AA789C165EEFA799B729B06A680C281.asc:
Add revocation certificate for DDB867B92AA789C165EEFA799B729B06A680C281.
2022-01-11 23:39:04 +01:00
8f08f113b9 README: fix formatting
Gitlab gets this right, but let's fix it for other markdown
implementations.
2022-01-11 13:19:24 +01:00
8e9d0d0cf0 Merge remote-tracking branch 'demize/kyrias-expiry-2022'
* demize/kyrias-expiry-2022:
  Extend expiry of packager key for demize (kyrias)
2022-01-11 11:39:15 +01:00
484f57f57c Extend expiry of packager key for demize (kyrias)
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2022-01-11 10:37:51 +00:00
a2f4f1a56f Merge remote-tracking branch 'felixonmars/felixonmars-rename'
* felixonmars/felixonmars-rename:
  Rename username for felixonmars
2022-01-11 11:36:24 +01:00
a3f2b52744 Rename username for felixonmars 2022-01-11 10:34:44 +00:00
7e8fccac05 Merge remote-tracking branch 'alex19ep/renew/alex19EP'
* alex19ep/renew/alex19EP:
  extend alex19EP's key
2022-01-11 11:31:45 +01:00
79e700ff4e extend alex19EP's key 2022-01-11 10:20:29 +00:00
5f32eb3c90 Include files for coverage instead of omitting others
pyproject.toml:
Use specific include for files to use in the coverage report instead of
relying on a list of omitted files (which may grow over time and not
cover all use-cases).
2022-01-11 11:04:43 +01:00
6db2d0d201 dvzrv signature for anatolik
keyring/packager/anatolik/8E1992167465DB5FB045557CB02854ED753E0F1F/uid/Anatol_Pomozov__Arch_Linux_developer_account___anatolik@archlinux.org_00db9eb5/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for anatolik.

https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/issues/137
2021-12-21 02:25:14 +01:00
783f1e6368 dvzrv signature for jleclanche
keyring/packager/jleclanche/169704C6FB490C6892C7F23C37E0AF1FDA48F373/uid/Jerome_Leclanche__jleclanche@archlinux.org_11de0d03/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for jleclanche.

https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/issues/123
2021-12-18 22:13:52 +01:00
64b1d6d249 dvzrv signature for dvzrv
keyring/packager/dvzrv/C7E7849466FE2358343588377258734B41C31549/uid/David_Runge__dvzrv@archlinux.org_d2ad250f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc
Add main key signature for dvzrv.
2021-12-09 23:15:02 +01:00
db1e19d71d dvzrv signature for artafinde
keyring/packager/artafinde/B4B759625D4633430B74877059E43E106B247368/uid/Leonidas_Spyropoulos__artafinde@archlinux.org_60c8c94e/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for artafinde.
2021-12-09 23:10:15 +01:00
5c805411c7 Add packager key B4B759625D4633430B74877059E43E106B247368 for artafinde
keyring/packager/artafinde/B4B759625D4633430B74877059E43E106B247368/*:
Add packager key B4B759625D4633430B74877059E43E106B247368 for artafinde.

https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/issues/135
2021-12-09 23:09:11 +01:00
661d82d40e dvzrv signature for nicohood
keyring/packager/nicohood/97312D5EB9D7AE7D0BD4307351DAE9B7C1AE9161/uid/NicoHood__nicohood@archlinux.org_bad775c3/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for nicohood.
2021-12-09 23:05:45 +01:00
15fb876f83 dvzrv signature for cbehan
keyring/packager/cbehan/25ACE777F62C5E5ACBF2C0474E532176DBAD6F47/uid/Connor_Behan__cbehan@archlinux.org_f24a7748/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for cbehan.
2021-12-09 23:03:50 +01:00
e6752fc57b Add new packager key 25ACE777F62C5E5ACBF2C0474E532176DBAD6F47 for cbehan
keyring/packager/cbehan/25ACE777F62C5E5ACBF2C0474E532176DBAD6F47/*:
Add a new packager key for cbehan.

https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/issues/134
2021-12-09 23:02:45 +01:00
802f6630cf dvzrv signature for ainola
keyring/packager/ainola/BE2DBCF2B1E3E588AC325AEAA06B49470F8E620A/uid/Brett_Cornwall__ainola@archlinux.org_90fec327/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for ainola.
2021-12-09 23:00:01 +01:00
eb81996675 dvzrv signature for coderobe
keyring/packager/coderobe/54EB4D6DB209862C8945CACCED84945B35B2555C/uid/Robin_Broda__Arch_Linux___coderobe@archlinux.org_6ce6c858/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signatuer for coderobe.
2021-12-09 22:58:19 +01:00
eee0eddab5 dvzrv signature for xyne
keyring/packager/xyne/D89FAAEB4CECAFD199A2F5E612C6F735F7A9A519/uid/Xyne.__Replaces_EC3CBE7F607D11E663149E811D1F0DC78F173680.___xyne@archlinux.org_7b075f4f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signatuer for xyne.
2021-12-09 22:57:03 +01:00
eb6eb7d24e dvzrv signature for seblu
keyring/packager/seblu/B81B051F2D7FC867AAFF35A58DBD63B82072D77A/uid/Sebastien_Luttringer__seblu@archlinux.org_2339bc81/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for seblu.
2021-12-09 22:56:02 +01:00
0be7cb1eea dvzrv signature for tensor5
keyring/packager/tensor5/A667E8A1B61D07A50FC430DF69DF1F2EB44B05BE/uid/Nicola_Squartini__tensor5@archlinux.org_42ff807f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for tensor5.
2021-12-09 22:54:45 +01:00
7ba600523e Add new packager key A667E8A1B61D07A50FC430DF69DF1F2EB44B05BE for tensor5
keyring/packager/tensor5/A667E8A1B61D07A50FC430DF69DF1F2EB44B05BE/*
Add new packager key for tensor5.

https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/issues/129
2021-12-09 22:53:04 +01:00
ea969c5f2b dvzrv signature for dbermond
keyring/packager/dbermond/80247D99EABD3A4D1E3A1836E85B8683EB48BC95/uid/Daniel_Bermond__dbermond@archlinux.org_b01455c5/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for dbermond.
2021-12-09 22:47:36 +01:00
8d60c13086 dvzrv signature for jlichtblau
keyring/packager/jlichtblau/38EDD1886756924E1224E49524E4CDB0013C2580/uid/Jaroslav_Lichtblau__svetlemodry@archlinux.org_12feb151/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for jlichtblau.
2021-12-09 22:47:30 +01:00
f756815d54 dvzrv signature for lfleischer
keyring/packager/lfleischer/2E36D8620221482FC45CB7F2A91764759326B440/uid/Lukas_Fleischer__Arch_Linux___lfleischer@archlinux.org_876710fa/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for lfleischer.
2021-12-09 22:47:26 +01:00
3f9798a4fb dvzrv signature for juergen
keyring/packager/juergen/209A36D43CE2E87DA861FC58539DFD48135182EF/uid/Jurgen_Hotzel__Arch_Linux_Developer_Key___juergen@archlinux.org_ab80fc95/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for juergen.
2021-12-09 22:47:23 +01:00
b57cb8b095 dvzrv signature for lcarlier
keyring/packager/lcarlier/535F8C0339450F054A4D282706096A6AD1CEDDAC/uid/Laurent_Carlier__lordheavym@archlinux.org_a72d7b01/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for lcarlier.
2021-12-09 22:47:20 +01:00
e335d8b7b1 dvzrv signature for kpcyrd
keyring/packager/kpcyrd/64B13F7117D6E07D661BBCE0FE763A64F5E54FD6/uid/kpcyrd__kpcyrd@archlinux.org_05f09dd3/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for kpcyrd.
2021-12-09 22:47:18 +01:00
5a36293cfe dvzrv signature for andrewSC
keyring/packager/andrewSC/601F20F1D1BBBF4A78CF5B6DF6B1610B3ECDBC9F/uid/Andrew_Crerar__crerar@archlinux.org_1627868e/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for andrewSC.
2021-12-09 22:47:15 +01:00
50f969e6fe dvzrv signature for sangy
keyring/packager/sangy/903BAB73640EB6D65533EFF3468F122CE8162295/uid/Santiago_Torres-Arias__santiago@archlinux.org_6c66fb1a/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for sangy.
2021-12-09 22:47:12 +01:00
ac276fd9e7 dvzrv signature for polyzen
keyring/packager/polyzen/04DC3FB1445FECA813C27EFAEA4F7B321A906AD9/uid/Daniel_M._Capella__polyzen@archlinux.org_baf25f25/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for polyzen.
2021-12-09 22:47:10 +01:00
35e9a0dccc dvzrv signature for rgacogne
keyring/packager/rgacogne/A4CBEA7974898599195E4FEC46EC46F39F3E2EF1/uid/Remi_Gacogne__rgacogne@archlinux.org_56f61a3b/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for rgacogne.
2021-12-09 22:47:08 +01:00
d024f98fe4 dvzrv signature for kgizdov
keyring/packager/kgizdov/0A9DDABB64B993D82AD45E4F32EAB0A976938292/uid/Konstantin_Gizdov__Arch_Linux___kgizdov@archlinux.org_0b9ef17d/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for kgizdov.
2021-12-09 22:47:05 +01:00
59464eecb2 dvzrv signature for tpowa
keyring/packager/tpowa/5B7E3FB71B7F10329A1C03AB771DF6627EDF681F/uid/Tobias_Powalowski__tpowa@archlinux.org_9a5dc15f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for tpowa.
2021-12-09 22:47:03 +01:00
9d992908c7 dvzrv signature for grazzolini
keyring/packager/grazzolini/ECCAC84C1BA08A6CC8E63FBBF22FB1D78A77AEAB/uid/Giancarlo_Razzolini__grazzolini___grazzolini@archlinux.org_c1113025/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for grazzolini.
2021-12-09 22:47:00 +01:00
db8bca5d09 dvzrv signature for shibumi
keyring/packager/shibumi/6DAF7B808F9DF25139620000D21461E3DFE2060D/uid/Christian_Rebischke__Arch_Linux_Security_Team-Member___Chris.Rebischke@archlinux.org_7d9474e2/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for shibumi.
2021-12-09 22:46:58 +01:00
337de5fa0f dvzrv signature for remy
keyring/packager/remy/44EA62ACDBC81B6A0D1FD267206CBC892D1493D2/uid/Remy_Oudompheng__remy@archlinux.org_05dc492d/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for remy.
2021-12-09 22:46:55 +01:00
fd81af2744 dvzrv signature for raster
keyring/packager/raster/04F7A0E31E08D3E08D39AFEBD147F94364295E8C/uid/Carsten_Haitzler__raster@archlinux.org_02b5c9a5/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for raster.
2021-12-09 22:46:52 +01:00
9ede953bb4 dvzrv signature for foxboron
keyring/packager/foxboron/C100346676634E80C940FB9E9C02FF419FECBE16/uid/Morten_Linderud__foxboron@archlinux.org_52506fee/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for foxboron.
2021-12-09 22:46:49 +01:00
76dbce7fc1 dvzrv signature for bluewind
keyring/packager/bluewind/CFA6AF15E5C74149FC1D8C086D1655C14CE1C13E/uid/Florian_Pritz__bluewind@archlinux.org_02e4c8b2/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for bluewind.
2021-12-09 22:46:46 +01:00
2bd1b98e0a dvzrv signature for arojas
keyring/packager/arojas/9D74DF6F91B7BDABD5815CA84AC5588F941C2A25/uid/Antonio_Rojas__arojas@archlinux.org_0857f6fd/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for arojas.
2021-12-09 22:46:43 +01:00
3b4c7e46dd dvzrv signature for alucryd
keyring/packager/alucryd/9437DD3815A7A9169E3D3946AFF5D95098BC6FF5/uid/Maxime_Gauduin__alucryd@archlinux.org_2606bf1f/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for alucryd.
2021-12-09 22:46:40 +01:00
3faa412869 dvzrv signature for jsteel
keyring/packager/jsteel/8742F7535E7B394A1B048163332C9C40F40D2072/uid/Jonathan_Steel__jsteel@archlinux.org_f62ee297/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for jsteel.
2021-12-09 22:46:33 +01:00
a45b7afe34 dvzrv signature for jelle
keyring/packager/jelle/E499C79F53C96A54E572FEE1C06086337C50773E/uid/Jelle_van_der_Waa__jelle@archlinux.org_b484b992/certification/C7E7849466FE2358343588377258734B41C31549.asc:
Add packager signature for jelle.
2021-12-09 22:45:42 +01:00
c44bfa2b78 dvzrv signature for jelle
keyring/packager/jelle/E499C79F53C96A54E572FEE1C06086337C50773E/uid/Jelle_van_der_Waa__jelle@archlinux.org_b484b992/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for jelle.
2021-12-09 22:45:16 +01:00
80ec6d02e3 dvzrv signature for andyrtr
keyring/packager/andyrtr/ADC8A1FCC15E01D45310419E94657AB20F2A092B/uid/Andreas_Radke__andyrtr@archlinux.org_c12ef6dc/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for andyrtr.
2021-12-09 22:45:14 +01:00
b8d005ab7c dvzrv signature for FFYOO
keyring/packager/FFY00/3DCE51D60930EBA47858BA4146F633CBB0EB4BF2/uid/Filipe_Lains__FFY00___lains@archlinux.org_dbd13ab3/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for FFY00.
2021-12-09 22:45:11 +01:00
585293130c dvzrv signature for heftig
keyring/packager/heftig/A2FF3A36AAA56654109064AB19802F8B0D70FC30/uid/Jan_Alexander_Steffens__heftig___heftig@archlinux.org_85a5903b/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main signture for heftig.
2021-12-09 22:45:08 +01:00
7429088c3c dvzrv signature for fyan
keyring/packager/fyan/B5971F2C5C10A9A08C60030F786C63F330D7CB92/uid/Felix_Yan__felixonmars@archlinux.org_659e86de/certification/2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E.asc:
Add main key signature for fyan.
2021-12-09 22:45:05 +01:00
02c996deb9 keyring: add packager key: zorun (initial import) 2021-12-09 22:42:27 +01:00
3b723e8196 keyring: add packager key: yan12125 (initial import) 2021-12-09 22:42:27 +01:00
fa994f5679 keyring: add packager key: xyne (initial import) 2021-12-09 22:42:27 +01:00
867f9b8bc5 keyring: add packager key: wild (initial import) 2021-12-09 22:42:27 +01:00
16d6ae063b keyring: add packager key: vesa (initial import) 2021-12-09 22:42:27 +01:00
83c55ec3bf keyring: add packager key: ttopper (initial import) 2021-12-09 22:42:26 +01:00
f1cf246390 keyring: add packager key: tredaelli (initial import) 2021-12-09 22:42:26 +01:00
f58e0ce6a3 keyring: add packager key: tpowa (initial import) 2021-12-09 22:42:26 +01:00
375027abd8 keyring: add packager key: tomegun (initial import) 2021-12-09 22:42:26 +01:00
aa840376b7 keyring: add packager key: thomas (initial import) 2021-12-09 22:42:26 +01:00
999171b278 keyring: add packager key: thestinger (initial import) 2021-12-09 22:42:26 +01:00
2cc51317d6 keyring: add packager key: tensor5 (initial import) 2021-12-09 22:42:26 +01:00
0ec63f2fac keyring: add packager key: td123 (initial import) 2021-12-09 22:42:26 +01:00
2f68ced72c keyring: add packager key: svenstaro (initial import) 2021-12-09 22:42:25 +01:00
7574ac78f0 keyring: add packager key: stephane (initial import) 2021-12-09 22:42:25 +01:00
6f64479c79 keyring: add packager key: stativ (initial import) 2021-12-09 22:42:25 +01:00
63944c056d keyring: add packager key: spupykin (initial import) 2021-12-09 22:42:25 +01:00
dc02c65522 keyring: add packager key: speps (initial import) 2021-12-09 22:42:25 +01:00
1c9db5ba2f keyring: add packager key: shibumi (initial import) 2021-12-09 22:42:25 +01:00
edbe4446b7 keyring: add packager key: seblu (initial import) 2021-12-09 22:42:25 +01:00
a8a33c7f51 keyring: add packager key: schuay (initial import) 2021-12-09 22:42:25 +01:00
5b06e383fd keyring: add packager key: schiv (initial import) 2021-12-09 22:42:24 +01:00
ba396094d7 keyring: add packager key: sangy (initial import) 2021-12-09 22:42:24 +01:00
7c5ac278be keyring: add packager key: ronald (initial import) 2021-12-09 22:42:24 +01:00
687463a3a6 keyring: add packager key: romashka (initial import) 2021-12-09 22:42:24 +01:00
a1e173374d keyring: add packager key: rgacogne (initial import) 2021-12-09 22:42:24 +01:00
3c1125b5b5 keyring: add packager key: remy (initial import) 2021-12-09 22:42:24 +01:00
33d8c57c31 keyring: add packager key: raster (initial import) 2021-12-09 22:42:24 +01:00
142f905938 keyring: add packager key: polyzen (initial import) 2021-12-09 22:42:23 +01:00
8c0d26fc57 keyring: add packager key: plewis (initial import) 2021-12-09 22:42:23 +01:00
a25fdbfb01 keyring: add packager key: pierre (initial import) 2021-12-09 22:42:23 +01:00
93e6a62c79 keyring: add packager key: orhun (initial import) 2021-12-09 22:42:23 +01:00
1ab7fc8057 keyring: add packager key: nicohood (initial import) 2021-12-09 22:42:23 +01:00
1e7b7ee999 keyring: add packager key: muflone (initial import) 2021-12-09 22:42:23 +01:00
065a7b2fc5 keyring: add packager key: mtorromeo (initial import) 2021-12-09 22:42:23 +01:00
07661a308d keyring: add packager key: morganamilo (initial import) 2021-12-09 22:42:23 +01:00
11f6c94d80 keyring: add packager key: maximbaz (initial import) 2021-12-09 22:42:22 +01:00
2ed4e1c5a6 keyring: add packager key: lfleischer (initial import) 2021-12-09 22:42:22 +01:00
531457fa12 keyring: add packager key: lcarlier (initial import) 2021-12-09 22:42:22 +01:00
238e162428 keyring: add packager key: kyrias (initial import) 2021-12-09 22:42:22 +01:00
a58cd59350 keyring: add packager key: kpcyrd (initial import) 2021-12-09 22:42:22 +01:00
5905169574 keyring: add packager key: kkeen (initial import) 2021-12-09 22:42:22 +01:00
4c52fd457a keyring: add packager key: kgizdov (initial import) 2021-12-09 22:42:22 +01:00
5f29065ffb keyring: add packager key: kchen (initial import) 2021-12-09 22:42:22 +01:00
a4152bf1e6 keyring: add packager key: juster (initial import) 2021-12-09 22:42:21 +01:00
aa29b4a6a9 keyring: add packager key: juergen (initial import) 2021-12-09 22:42:21 +01:00
c3c214f072 keyring: add packager key: jsteel (initial import) 2021-12-09 22:42:21 +01:00
c81d490759 keyring: add packager key: jlichtblau (initial import) 2021-12-09 22:42:21 +01:00
9454ea65b1 keyring: add packager key: jleclanche (initial import) 2021-12-09 22:42:21 +01:00
4eba456c63 keyring: add packager key: jgc (initial import) 2021-12-09 22:42:21 +01:00
131bf8d1be keyring: add packager key: jelle (initial import) 2021-12-09 22:42:21 +01:00
28b7b55939 keyring: add packager key: jconder (initial import) 2021-12-09 22:42:21 +01:00
aa70ebdba4 keyring: add packager key: idevolder (initial import) 2021-12-09 22:42:21 +01:00
519bd36f7e keyring: add packager key: ibiru (initial import) 2021-12-09 22:42:20 +01:00
21290dba24 keyring: add packager key: heftig (initial import) 2021-12-09 22:42:20 +01:00
b1f8358196 keyring: add packager key: hashworks (initial import) 2021-12-09 22:42:20 +01:00
3d62530828 keyring: add packager key: guillaume (initial import) 2021-12-09 22:42:20 +01:00
3d6b6a4365 keyring: add packager key: grazzolini (initial import) 2021-12-09 22:42:20 +01:00
5768a46625 keyring: add packager key: grawlinson (initial import) 2021-12-09 22:42:20 +01:00
3126869a25 keyring: add packager key: giovanni (initial import) 2021-12-09 22:42:20 +01:00
39112165c9 keyring: add packager key: fyan (initial import) 2021-12-09 22:42:20 +01:00
e37cf85d08 keyring: add packager key: freswa (initial import) 2021-12-09 22:42:19 +01:00
3f6ce5224b keyring: add packager key: foxxx0 (initial import) 2021-12-09 22:42:19 +01:00
9c5c34ba00 keyring: add packager key: foxboron (initial import) 2021-12-09 22:42:19 +01:00
6f7ed8dbfe keyring: add packager key: foutrelis (initial import) 2021-12-09 22:42:19 +01:00
27461c9354 keyring: add packager key: flexiondotorg (initial import) 2021-12-09 22:42:19 +01:00
879b59e818 keyring: add packager key: FFY00 (initial import) 2021-12-09 22:42:19 +01:00
cbbeef2e54 keyring: add packager key: farseerfc (initial import) 2021-12-09 22:42:19 +01:00
cbef9a1238 keyring: add packager key: faidoc (initial import) 2021-12-09 22:42:19 +01:00
a2b3f39d9e keyring: add packager key: eworm (initial import) 2021-12-09 22:42:19 +01:00
fc42035a81 keyring: add packager key: escondida (initial import) 2021-12-09 22:42:18 +01:00
9986e3423e keyring: add packager key: eschwartz (initial import) 2021-12-09 22:42:18 +01:00
7cead56332 keyring: add packager key: eric (initial import) 2021-12-09 22:42:18 +01:00
5e08f478ca keyring: add packager key: dwallace (initial import) 2021-12-09 22:42:18 +01:00
9c8cfd8ef5 keyring: add packager key: dvzrv (initial import) 2021-12-09 22:42:18 +01:00
55317ee81a keyring: add packager key: dreisner (initial import) 2021-12-09 22:42:18 +01:00
4e8655642b keyring: add packager key: djgera (initial import) 2021-12-09 22:42:18 +01:00
695fd90f1b keyring: add packager key: dieter (initial import) 2021-12-09 22:42:18 +01:00
a845c58f83 keyring: add packager key: dicebot (initial import) 2021-12-09 22:42:17 +01:00
e7c018b892 keyring: add packager key: diabonas (initial import) 2021-12-09 22:42:17 +01:00
35084cba68 keyring: add packager key: dbermond (initial import) 2021-12-09 22:42:17 +01:00
9cac133ecc keyring: add packager key: daurnimator (initial import) 2021-12-09 22:42:17 +01:00
5812a227a7 keyring: add packager key: daniel (initial import) 2021-12-09 22:42:17 +01:00
36ddcd936e keyring: add packager key: dan (initial import) 2021-12-09 22:42:17 +01:00
75a1e9e748 keyring: add packager key: daenyth (initial import) 2021-12-09 22:42:17 +01:00
0ccacc08ed keyring: add packager key: coderobe (initial import) 2021-12-09 22:42:17 +01:00
3a0e759f65 keyring: add packager key: cinelli (initial import) 2021-12-09 22:42:17 +01:00
ab48f2c3d2 keyring: add packager key: cesura (initial import) 2021-12-09 22:42:17 +01:00
6033085177 keyring: add packager key: cbrannon (initial import) 2021-12-09 22:42:16 +01:00
b47dfa41cd keyring: add packager key: cbehan (initial import) 2021-12-09 22:42:16 +01:00
e70bffd458 keyring: add packager key: bpiotrowski (initial import) 2021-12-09 22:42:16 +01:00
1e78031a81 keyring: add packager key: bluewind (initial import) 2021-12-09 22:42:16 +01:00
cc3821e353 keyring: add packager key: bisson (initial import) 2021-12-09 22:42:16 +01:00
f57d79f5ed keyring: add packager key: bgyorgy (initial import) 2021-12-09 22:42:16 +01:00
8dd825d6ff keyring: add packager key: bastelfreak (initial import) 2021-12-09 22:42:16 +01:00
8d7eee3605 keyring: add packager key: arojas (initial import) 2021-12-09 22:42:16 +01:00
eb1e18c440 keyring: add packager key: arodseth (initial import) 2021-12-09 22:42:16 +01:00
c2e3eef85f keyring: add packager key: archange (initial import) 2021-12-09 22:42:15 +01:00
4648ed2ca2 keyring: add packager key: arcanis (initial import) 2021-12-09 22:42:15 +01:00
1feef5c54a keyring: add packager key: anthraxx (initial import) 2021-12-09 22:42:15 +01:00
67b90b96a3 keyring: add packager key: angvp (initial import) 2021-12-09 22:42:15 +01:00
ca7124c9b4 keyring: add packager key: andyrtr (initial import) 2021-12-09 22:42:15 +01:00
5bdd6448d1 keyring: add packager key: andrewSC (initial import) 2021-12-09 22:42:15 +01:00
a6cbb72a18 keyring: add packager key: andrea (initial import) 2021-12-09 22:42:15 +01:00
1a8d660678 keyring: add packager key: anatolik (initial import) 2021-12-09 22:42:15 +01:00
d5b5e69fa5 keyring: add packager key: ambrevar (initial import) 2021-12-09 22:42:15 +01:00
263613c91a keyring: add packager key: alucryd (initial import) 2021-12-09 22:42:15 +01:00
7f7522811d keyring: add packager key: allan (initial import) 2021-12-09 22:42:14 +01:00
4e1eed483a keyring: add packager key: alex19ep (initial import) 2021-12-09 22:42:14 +01:00
39bd07f34e keyring: add packager key: alerque (initial import) 2021-12-09 22:42:14 +01:00
abb89f65e7 keyring: add packager key: alad (initial import) 2021-12-09 22:42:14 +01:00
dca954a9b1 keyring: add packager key: ainola (initial import) 2021-12-09 22:42:14 +01:00
d7f47192b7 keyring: add packager key: aginiewicz (initial import) 2021-12-09 22:42:14 +01:00
28fcfc50f4 keyring: add main key: thomas (initial import) 2021-12-09 22:42:14 +01:00
64aabc08c1 keyring: add main key: pierre (initial import) 2021-12-09 22:42:14 +01:00
7b74d90df9 keyring: add main key: ibiru (initial import) 2021-12-09 22:42:14 +01:00
5f5e744b75 keyring: add main key: florian (initial import) 2021-12-09 22:42:13 +01:00
9ee625acd8 keyring: add main key: dvzrv (initial import) 2021-12-09 22:42:13 +01:00
f93ce2137e keyring: add main key: dan (initial import) 2021-12-09 22:42:13 +01:00
508cd13ad3 keyring: add main key: bpiotrowski (initial import) 2021-12-09 22:42:13 +01:00
b060ecaa53 keyring: add main key: anthraxx (initial import) 2021-12-09 22:42:13 +01:00
9cc0e0cf00 keyring: add main key: allan (initial import) 2021-12-09 22:42:07 +01:00
37ad62d6e5 feature(keyringctl): add clean functionality to match import-clean
De-duplicate not needed certifications by cleaning the keyring after
import to remove old files when processing revocations. This basically
adds the functionality compared to import-clean.
2021-12-08 20:50:45 +01:00
d0ea790c6a fix(make): use proper dependency tracking for the build output
Declare the whole keyring data as well as the code as input dependency
for the build target. This way we can properly depend on the build
target for installation without forcing rebuilding on every invocation.

A rebuild will be triggered if either the keyring or the source code
creating the build output changes.

The directories are added to the source dependencies on purpose to
guarantee that changes like deleted files will result in a rebuild.

The mtime of the build directory is force updated on every run to allow
make to track the output artifacts mtime compared against the
dependencies.
2021-11-30 22:54:17 +01:00
0ceb6c743e fix(keyringctl): avoid simplified uid collisions using a hash
Add a postfix hash of the raw uid data to the filenames to avoid
collisions with the simplified uid.
2021-11-30 22:54:17 +01:00
4821087b2b feature(keyringctl): mark main keys bold during inspect highlight 2021-11-30 22:54:17 +01:00
b32c37bec1 feature(keyringctl): raise exception on duplicate uid data 2021-11-30 22:54:17 +01:00
b653edfcdc feature(keyringctl): add trust and colors to inspect output 2021-11-30 22:54:17 +01:00
c651bdc61e feature(keyringctl): add option to filter listing by trust 2021-11-30 22:54:17 +01:00
e9dc04df32 feature(keyringctl): split direct key packets into own directory 2021-11-30 22:54:16 +01:00
31a49c89a3 Fail test target under 100% test coverage
Makefile:
Fail coverage report below 100% test coverage.
2021-11-30 22:54:16 +01:00
e43a28f4a7 Simplify libkeyringctl.keyring.convert_certificate
libkeyringctl/keyring.py:
Simplify `convert_certificate()` by splitting out the conversion of
signature packets to `convert_signature_packet()` and the persistence of
packet material to `persist_key_material()`.
Add `convert_pubkey_signature_packet()`,
`convert_uid_signature_packet()` and
`convert_subkey_signature_packet()` to deal with the conversion of
public key signatures, UID signatures and subkey signatures
(respectively).

tests/test_keyring.py:
Add tests for `convert_certificate()`, `convert_signature_packet()`,
`convert_{pubkey,uid,subkey}_signature_packet()` and
`persist_subkey_revocations()`.
2021-11-30 22:54:16 +01:00
bb30e3d2fd Add tests for list and inspect functions
tests/test_keyring.py:
Add tests for `list_keyring()` and `inspect_keyring()`.
2021-11-30 22:54:16 +01:00
743d2bb3bb Add tests for introspection and export
libkeyringctl/keyring.py:
Change `get_packets_from_path()` to use full conditional statements
which is easier to cover in tests.

tests/test_keyring.py:
Add simple tests for `get_packets_from_path()`,
`get_packets_from_listing()`, `export()` and `build()`.
2021-11-30 22:54:16 +01:00
8689995b69 feature(keyringctl): yell and abort if processing private key data 2021-11-30 22:54:16 +01:00
5a83a7b6c1 feature(keyringctl): skip user attribute packets as none relevant 2021-11-30 22:54:16 +01:00
3d8e88dfaf Add tests for convert and export functionality
tests/test_keyring.py:
Add basic tests for `convert()`, `export_ownertrust()` and
`export_revoked()`.
2021-11-30 22:54:16 +01:00
e8fb9d17b3 chore(keyringctl): add test for simplify_ascii 2021-11-30 22:54:16 +01:00
83a345a1b8 feature(keyringctl): rework ci module to execute full lint for new certs 2021-11-30 22:54:16 +01:00
bce5bc550e feature(keyringctl): rework str simplification for printable uids 2021-11-30 22:54:16 +01:00
2030de06a0 fix(keyringctl): set HOME, PATH, LANG required for hokey
This effectively requires en_US.UTF-8 to be an available lang, which is
a relative fair requirement and mandatory to set for hokey.
2021-11-30 22:54:15 +01:00
f74a1be1ac chore(keyringctl): add integrity checks for binding/revocation sigs 2021-11-30 22:54:15 +01:00
9741ada9ef fix(keyringctl): put subkey revocations into the correct subkey dirs 2021-11-30 22:54:15 +01:00
17d27e2274 Add unit test for libkeyringctl.sequoia.packet_kinds
tests/test_sequoia.py:
Add unit test for libkeyringctl.sequoia.packet_kinds.
2021-11-30 22:54:15 +01:00
5f36beff90 feature(ci): run keyring integrity check if keyring or code changes 2021-11-30 22:54:15 +01:00
0456e9a5f8 fix(tests): use working dir via fixture instead of cluttering cwd 2021-11-30 22:54:15 +01:00
ddf19a4362 Add first unit tests for libkeyringctl.keyring
tests/test_keyring.py:
Add tests for `is_pgp_fingerprint()`,
`transform_{fingerprint,username}_to_keyring_path()`,
`derive_username_from_fingerprint()` and get_fingerprints_from_paths()`.
2021-11-30 22:54:15 +01:00
16bed8ac4a Add fixtures for valid and invalid fingerprints
tests/conftest.py:
Add `valid_fingerprint()` and `valid_subkey_fingerprint()` fixtures to
produce a generic "valid" PGP fingerprint string.
Add the `invalid_fingerprint()` fixture to generate a set of "invalid"
fingerprint strings.
2021-11-30 22:54:15 +01:00
e42a895889 fix(keyringctl): add missing python-toml for coverage run 2021-11-30 22:54:15 +01:00
e55042e45b feature(keyringctl): verify file structure integrity and packets
This moves all verify code to an own module and adds support to check
all packet files in the structure for integrity. This is done by parsing
assumptions like packet kind, type, issuer and location etc.
2021-11-30 22:54:15 +01:00
d9e9453d84 feature(keyringctl): write all packet files with full issuer fingerprint
This avoids collision between same issuer using key-id and full
fingerprint in different versions of a packet, like signature.
2021-11-30 22:54:15 +01:00
279765b22a fix(keyringctl): fix system stderr case due to wrongly written test
CalledProcessError returns bytes for our invocations, the fix that
decoded bytes of stdout was purely to make the mocked test happy while
breaking the actual usage. Restore the behavior and fix the wrong mocked
data.
2021-11-30 22:54:14 +01:00
cd585f4be2 chore(keyringctl): increase test coverage and fix trust expectations 2021-11-30 22:54:14 +01:00
7513e71b3f chore(keyringctl): add key revocation trust tests 2021-11-30 22:54:14 +01:00
a25c267f26 Add more specific coverage configuration
pyproject.toml:
Set specific source for `toolscoverage.paths` (as we only provide one
module).
Set `tools.coverage.run.relative_files` to true (although it is still
bug riddled and does not seem to work as advertized in regards to xml
output: https://github.com/nedbat/coveragepy/issues/963,
https://github.com/nedbat/coveragepy/issues/1147).
Set `tool.coverage.xml.output`, so we don't have to provide it on the
commandline.

Makefile:
Do not provide an output file to the coverage xml call, as we do that in
configuration now.
2021-11-30 22:54:14 +01:00
86eb172ac3 chore(keyringctl): add missing type annotations for tests 2021-11-30 22:54:14 +01:00
c807a81a57 feature(ci): add testing and coverage data to gitlab ci artifacts 2021-11-30 22:54:14 +01:00
b9bbe3f1d4 Also trigger tests and linting on changes to CI
.gitlab-ci.yml:
Also trigger tests and linting on changes to .gitlab-ci.yml.
2021-11-30 22:54:14 +01:00
c75c3ee7ee .gitignore: Add coverage and pycache
.gitignore:
Add .coverage and __pycache__ dirs to ignore.
2021-11-30 22:54:14 +01:00
358e840f8f Add unit tests for util functions
tests/test_util.py:
Add tests for `cwd()`, `natural_sort_path()`, `system()`,
`absolute_path()`, `transform_fd_to_tmpfile()`, `get_cert_paths()`,
`get_parent_cert_paths()` and `contains_fingerprint()`.
2021-11-30 22:54:14 +01:00
c1f59488e5 Add unit tests for code calling sequoia
tests/test_sequoia.py:
Add unit tests for `keyring_split()`, `keyring_merge()`,
`packet_split()`, `packet_join()`, `inspect()`, `packet_dump()`,
`packet_dump_field()`, `packet_signature_creation_time()`, and
`latest_certification()`.
2021-11-30 22:54:14 +01:00
52e0936524 Add unit test for git integration
tests/test_git.py:
Add unit test for `git_changed_files()`.
2021-11-30 22:54:14 +01:00
d969587bf7 Add python-coverage as dependency for contributing
CONTRIBUTING.md:
Add python-coverage to the list of dependencies for testing.
2021-11-30 22:54:13 +01:00
f27a7b90c2 Makefile: Use coverage instead of pytest
Makefile:
Run pytest via coverage in `make test` to also generate a coverage
report.
2021-11-30 22:54:13 +01:00
c968e7815a Add python-coverage to test target
.gitlab-ci.yml:
Add python-coverage to test target.
2021-11-30 22:54:13 +01:00
a21e6f21fb Write bytes to stderr when raising during system call
libkeyringctl/util.py:
Change `system()` to write bytes to stderr.buffer, as before
CalledProcessError.stdout had been used, which returns a string.
2021-11-30 22:54:13 +01:00
4597fba6ba Rename test directory to tests
tests/*:
The existing coverage configuration is setup to use/ omit a tests
directory.
2021-11-30 22:54:13 +01:00
0ca74e243b feature(keyringctl): adding basic infrastructure for running tests 2021-11-30 22:54:13 +01:00
8ba7dc1dc9 feature(keyringctl): acquire trust status from key assumptions
Rework the whole trust handling by acquiring the trust status from
actual assumptions related to the amount of ownertrust signatures and
revocations.
2021-11-30 22:54:13 +01:00
26c7027660 feature(keyringctl): support importing from a piped fd
This feature allows to import from a piped fd like:
> ./keyringctl import --name foobar <(gpg --export foo@bar)

We achieve this even with hidepid by taking the naive approach of
copying the processes fd source to a tempfile and pass around latter.
2021-11-30 22:54:13 +01:00
2384d0337b fix(keyringctl): resolve cert dir per fingerprint and not parent user 2021-11-30 22:54:13 +01:00
03d5899f87 fix(keyring): use a single applied revocation to declare a key revoked
Otherwise the PGP trust and revocation status file will not match our
expectations. A single applied revocation to this directory structure
should be checked either way.

We can later create TODO's to have at least two revocations for the keys
that would otherwise be still trusted and then change this value.
2021-11-30 22:54:13 +01:00
878752dc13 fix(keyringctl): avoid leaking unclosed file descriptors 2021-11-30 22:54:13 +01:00
10d54ac35d feature(make): adding fmt target to format the project accordingly 2021-11-30 22:54:12 +01:00
a9e63edfa8 feature(keyringctl): adding ci command to verify newly added certs
Currently only newly added certificates will be checked against the
expectations as existing keys are not all fully compatible with those
assumptions.  New certificates are determined by using
$CI_MERGE_REQUEST_DIFF_BASE_SHA as the base,
2021-11-30 22:54:12 +01:00
9733fbafd8 feature(keyringctl): add verify command to check certificate expectation
This command checks certain expectations using sq and hokey, prints the
results to stdout and potentially exists non successfully.
2021-11-30 22:54:12 +01:00
94c3b4c8e9 fix(keyrinctl): yield file not found errors instead of blocking on stdin
Handle missing or wrong certificate paths in a way that does not lead to
a blocking command by reading from stdin. Instead throw either file not
found errors or expect optional outputs.
2021-11-30 22:54:12 +01:00
58307c629d chore(keyringctl): modularize the code for overview and testing 2021-11-30 22:54:12 +01:00
f90e860d16 fix(keyringctl): prioritize latest certification per issuer
When importing a non reduced keyring the certifications were not
deterministic for keys that have multiple certifications per issuer.
This was for example the case for self certifications to extend the
expiry time. Before this commit a random certification could remain the
final one which would lead to a non up to date keyring and a potentially
expired key.
2021-11-30 22:54:12 +01:00
32469720f8 fix(keyringctl): deterministic assembling order with single packet files
Fix the assembling of a certificate by joining the packets in the
correct order and splitting combined files into individual single
packets per file.
2021-11-30 22:54:12 +01:00
4b136dd6f6 feature(keyringctl): enrich inspect to show explicit label for main keys
This helps to identify if a certification issuer comes from a main key
or not.
2021-11-30 22:54:12 +01:00
b6c25fa531 chore(keyringctl): de-duplicate username/fprint transform code
We duplicated resolving usernames and fingerprints to actual keyring
paths in multiple places. De-duplicate the code by using dedicated
functions to do this job.
2021-11-30 22:54:12 +01:00
cced93480c fix(keyringctl): avoid walking non existing paths to resolve certs 2021-11-30 22:54:12 +01:00
02605edee5 feature(keyringctl): sort list command for alphabetical listing
Only do so when listing all keys, when a filter is provided, like
usernames or fingerprints, keep the order to allow a 1:1 mapping.
2021-11-30 22:54:12 +01:00
f3f3a63385 feature(keyringctl): avoid storing pubkey and uids in certifications
We do not need to duplicates packages in certifications and revocations.
Store the packets separated from their parent as those are already
persisted.
2021-11-30 22:54:12 +01:00
5249453726 feature(keyringctl): support passing fingerprint as source
This helps make the CLI more useful by listing, exporting or inspecting
a specific fingerprint.
2021-11-30 22:54:11 +01:00
6d336828e1 chore(keyringctl): remove docstring types as the signatures cover them
All modern tooling already reads type hinting from the signatures
instead of the docstring and supports annotating the parameter
accordingly. Remove the duplicated data to avoid out of sync
documentation.
2021-11-30 22:54:11 +01:00
619f2a3b68 chore(keyringctl): simplify convert usage by moving fingerprint filter 2021-11-30 22:54:11 +01:00
fc9ad848ab chore(keyringctl): simplify trust functions and return trusted/revoked
The API makes more sense to return (trusted,revoked) as the caller can
simply derive all certificates by joining the two sets.

To simplify the functions, some code has been replaced to use helper
methods to flatten the nested loops.
2021-11-30 22:54:11 +01:00
e0abfd195c feature(keyringctl): collect usernames to fingerprints to enrich output
By collecting the matching usernames to all fingerprints we are able to
enrich the output of `inspect` to show the usernames next to the
certifications.
2021-11-30 22:54:11 +01:00
2d1eb93a39 chore(keyringctl): move cert depth first search to own function
This way we can reuse the functionality which will allow to simplify a
lot of places that have multiple layers of inflexible nested loops.
2021-11-30 22:54:11 +01:00
3776ca942c fix(keyringctl): preserve keyring split filenames in separated dirs
This aids initial imports of keyrings that contain multiple certificates
by allowing keyring_split to enforce preserving the filenames. This is
achieved by moving each split keyring into unique sub directories where
the original input filename remains unique.
2021-11-30 22:54:11 +01:00
090d63ae20 fix(keyringctl): force overwrite packets when persisting
When we import new packet data, always allow overwrites of the final
packet files. This may happen when importing from multiple files that
provide the same packets, which is fine as they should still yield to
the same results.
2021-11-30 22:54:11 +01:00
82254e0a36 feature(keyringctl): add inspect command to pretty print certificates
This command prints a new and pretty representation of the certificate
data to visualize the keyring and its signatures.
2021-11-30 22:54:11 +01:00
0168ce1db0 feature(keyringctl): add simple command to list all certificates 2021-11-30 22:54:11 +01:00
1a8ea8397d chore(keyringctl): throw exception instead of exit on failed system calls 2021-11-30 22:54:11 +01:00
f6e3a4e94b feature(keyringctl): use build command to create final artifacts
This allows an easy to use cli which invokes the export function to get
the keyring and uses the ownertrust and revoke functions to write all
artifacts into a target directory.
2021-11-30 22:54:10 +01:00
77e5b36872 feature(keyringctl): add force parameter to keyring_merge 2021-11-30 22:54:10 +01:00
86747ecab7 feature(keyringctl): use the export command purely to export keyrings
This gives more control over the export command that may be useful to
export a single packager to import it into gpg. This will also give more
flexibility to chain this function to the future verify stage.

By default the command exports the whole keyring directory.
2021-11-30 22:54:10 +01:00
aa2f2ea497 feature(keyringctl): add dedicated keyring_merge function 2021-11-30 22:54:10 +01:00
cb95b92778 chore(editorconfig): sync line length with flake8 config to 120 chars 2021-11-30 22:54:10 +01:00
52178f38d5 feature(keyringctl): improve packet_join to optionally return the result 2021-11-30 22:54:10 +01:00
deaa312b7d feature(keyringctl): print a stack trace in case a system cmd fails 2021-11-30 22:54:10 +01:00
bc8c51749c chore(doc): improve import usage section exmaples 2021-11-30 22:54:10 +01:00
94b910a55e fix(ci): use unified multi import command 2021-11-30 22:54:10 +01:00
edbbc77086 chore(keyringctl): use python 3.9 iterable/iterator type imports 2021-11-30 22:54:10 +01:00
74f317344f feature(keyringctl): support importing multiple paths
Lets pass in a list of path's and reduce them to one set of path
iterables. This allows us to specify multiple source files/directories
2021-11-30 22:54:10 +01:00
1b1aa7f738 fix(doc): improve splitting topics across README.md and CONTRIBUTING.md 2021-11-30 22:54:09 +01:00
c214022300 fix(keyringctl): restore --target option for convert command 2021-11-30 22:54:09 +01:00
40592b3534 feature(keyringctl): print help if invoked without any subcommand 2021-11-30 22:54:09 +01:00
8bc0ae1da0 feature(keyringctl): unify import subcommand for condensed api
Both commands are basically doing the same with the same params except
the target directory differs. Lets condense this behavior by using a
single subcommand with a boolean options.
2021-11-30 22:54:09 +01:00
2f9ef0ef1d feature(keyringctl): keep filename if keyring split yields one keyring
Instead of always returning an artificial name try to preserve the
keyring filename if the split only yields a single certificate.
2021-11-30 22:54:09 +01:00
b91e8b983c feature(keyringctl): move main/packager folders to isolated keyring dir
This helps to structure the layout of the repository better by having
one root folder that contains the actual decomposed keyring structure.
2021-11-30 22:54:09 +01:00
48e9bb67cb chore(keyringctl): use singular for packager directory as well
So far we have used singular for all directories, lets keep that for the
packager directory as well.
2021-11-30 22:54:09 +01:00
37d0a5f633 chore(keyringctl): apply black formatter 2021-11-30 22:54:09 +01:00
930b5896a0 feature(keyringctl): introduce Username type instead of plain str 2021-11-30 22:54:09 +01:00
e422149c8a feature(keyringctl): add type hinting direct sigs/revocations 2021-11-30 22:54:09 +01:00
147287959f feature(keyringctl): derive username from short key id fingerprints
Allow short key id fingerprints to be used with the username derive
function by adding a glob in front of the fingerprint component.
2021-11-30 22:54:09 +01:00
60ee3d6d94 feature(keyringctl): avoid splitting a certificate multiple times
Move the name cascade to derive the username into the
`convert_certificate` function which allows to use the
certificate_fingerprint directly instead of trying to find it by
splitting the certificate one more time before converting.
2021-11-30 22:54:09 +01:00
cf6bac5fd9 chore(keyringctl): fix typo in docstring for convert_certificate 2021-11-30 22:54:08 +01:00
2206fe07b6 feature(keyringctl): simplification by removing static data from types
The certificate fingerprint in the convert function remains always the
same as we only process a single certificate and loop outside over
multiple keyrings. Therefor remove that layer from the data structures
and implicitly simplify all the assignments and usages.
2021-11-30 22:54:08 +01:00
a43d3dfac6 chore(keyringctl): add docstring for export_keyring() pacman_integration 2021-11-30 22:54:08 +01:00
f92a5884c5 chore(keyringctl): remove used input_path from get_fingerprints 2021-11-30 22:54:08 +01:00
e001de10d6 chore(keyringctl): blake compatible formatting of binary or chain 2021-11-30 22:54:08 +01:00
0bd10b9b4f chore(keyringctl): avoid shadowing convert function 2021-11-30 22:54:08 +01:00
77b1eab89e feature(keyringctl): add type hinting for fingerprint and uid
This drastically improves readability and type safety when joggling with
different keys in the data structures.
2021-11-30 22:54:08 +01:00
cd0a2005a7 isort: Configure to use single lines
pyproject.toml:
Configure isort to use single lines (one line for each import) to ease
merge conflicts.

keyringctl:
Reformat using new isort settings.
2021-11-30 22:54:08 +01:00
49ff2df1fc keyringctl: Implement filtering of certifications
keyringctl:
Add `get_fingerprints_from_import_source()` to derive all fingerprints
of PGP public keys found in the import source.
Add `get_fingerprints_from_decomposed_dir()` to derive all fingerprints
of PGP public keys found in a directory structure holding decomposed PGP
packet data.
Add `get_fingerprints()` to derive a set of fingerprints of PGP public
keys provided through `get_fingerprints_from_import_source()` and
`get_fingerprints_from_decomposed_dir()`.
Change `convert()` and `convert_certificate()` to accept an optional set
of strings (`fingerprint_filter`) that may be used as a filter for
valid fingerprints when considering certifications.
Change `__main__` to call `convert()` when importing keys to packager or
main dir, providing `fingerprint_filter` which will attempt to look up
fingerprints in the source as well as the target.
2021-11-30 22:54:08 +01:00
4b70feb2fb keyringctl: Derive username from target when importing existing key
keyringctl:
Add `derive_user_from_target()` to derive the username from an existing
public key in the target directory when importing (updates to) an
already known key.
Change `convert()` to either use a custom name override (if provided), a
username derived from target dir (if existing) or the file name of the
to be imported file as username.
2021-11-30 22:54:08 +01:00
5e6a8a2e98 gitlab-ci: Run lint, build and install
.gitlab-ci.yml:
Add rule to run `make lint` if `keyringctl` changes in a merge request.
Add integration stage to always attempt to build and install the keyring
in a containerized environment.
2021-11-30 22:54:08 +01:00
153ae31437 Makefile: Change to use new targets
Makefile:
Remove soon unneeded targets for dist and upload.
Add lint and build targets.
Simplify the installation and uninstallation target.
2021-11-30 22:54:07 +01:00
fa0f35a66c editorconfig: Extend for yaml files
editorconfig:
Add a sane default for YAML files.
2021-11-30 22:54:07 +01:00
1cbd360d17 keyringctl: Format file
keyringctl:
Use black to format the file, isort to auto-sort all imports.
Remove commented code and (for now) ignore the high complexity in
`convert()` so that flake8 can be used.
2021-11-30 22:54:07 +01:00
0e54261242 keyringctl: Do not persist unbound certifications
keyringctl:
Change `persist_certifications()` to not attempt to read UID binding
signatures for a given UID, if it does not exist and instead output an
error message.
2021-11-30 22:54:07 +01:00
8ec1654e0c keyringctl: Simplify subcommands
keyringctl:
Change `convert()` to create the target directory including parents.
Change `export_keyring()` to create the output directory and its
parents before outputting data into it.
Remove `keyring_import()` as its functionality is covered by using
`convert()` directly with different subcommands.
Change `__main__` to define `import-main` and `import-packager`
subcommands instead of `import` and to add an `export-keyring`
subcommand. Remove the explicit creation of target dirs (it is now
implemented in `convert()` and `export_keyring()`.
2021-11-30 22:54:07 +01:00
819e1adc37 README: Add new default sections and cleanup
README.md:
Add a short purpose introduction.
Add requirements, installation, contribution, releases and license
sections.
2021-11-30 22:54:07 +01:00
cc26ca503c chore(keyringctl): uniformly use path builder via operator
Instead of partially dealing with strings that contain slashes lets just
use the path builder interface by using the operator for every sub path
layer in a uniform way.
2021-11-30 22:54:07 +01:00
c86832f3a1 chore(keyringctl): use singular folder names for all sub-folders 2021-11-30 22:54:07 +01:00
6299f6416e chore(keyringctl): deduplicate iteration and split code in convert() 2021-11-30 22:54:07 +01:00
ac798eeeab feature(keyringctl): wire the import command for convenience
Use it to auto write a decompose/convert command into the local keyring
automatically.
2021-11-30 22:54:07 +01:00
b989203ff0 chore(doc): extend source parameter description 2021-11-30 22:54:07 +01:00
aa934d5ff5 chore(keyringctl): declare missing type hinting for cwd 2021-11-30 22:54:07 +01:00
04008da268 fix(keyringctl): do not line break before operators
This is a lot easier to read and also fixes a style warning python
issues.
2021-11-30 22:54:06 +01:00
4e98585232 feature(keyringctl): use prefixed temp dirs for easier recognition
It makes sense to prefix the temp directories so they can be identified
more easily to which application they belong to or what they may
contain.
2021-11-30 22:54:06 +01:00
a0199b0b04 fix(keyringctl): restore cwd before deleting the temporary working dir
This avoids potential issues with wrapped runtime like ipython or pdb
that try to invoke functions at exit and access the current working
directory, which will ultimately lead to an error in case we deleted it
before changing the current working directory.
2021-11-30 22:54:06 +01:00
92f07f0d4b feature(keyringctl): use sq to split a keyring into individual certificates
Lets use sequoia as well to split an input into individual certificates
instead of creating a custom made function for this job.

Pass down the name of the original input file to `convert_certificate`
in case no override has been defined.
2021-11-30 22:54:06 +01:00
4e24fe5da4 Add pyproject.toml with tooling configuration
pyproject.toml:
Add configuration for black, coverage, isort and mypy.
2021-11-30 22:54:06 +01:00
53ffb80740 Add flake8 configuration
.flake8:
Add integration for flake8.
Set maximum line length to 120 and maximum complexity to 10.
2021-11-30 22:54:06 +01:00
b3e1640553 Add contribution guidelines
CONTRIBUTING.md:
Add guidelines describing how code is added and which commands to use to
add or update key material.
2021-11-30 22:54:06 +01:00
5170319717 keyringctl: Add documentation to all functions
keyringctl:
Add documentation to all functions.
Change the inlined functions `convert()` and `alphanum_key()` in
`natural_sort_path()` to rely on type Union[int, str] instead of type
Any.
Change `convert_certificate()` to derive the username using the stem of
the provided certificate.
2021-11-30 22:54:06 +01:00
5320f2491e keyringctl: Implement export of ownertrust/ revoker status
keyringctl:
Add `temp_join_keys()` to generically join PGP packets in a directory
below a temporary directory.
Add `get_all_and_revoked_certs()` to retrieve a tuple containing a list
of all public key fingerprints and a list of all self-revoked public key
fingerprints in a list of paths.
Add `export_ownertrust()` to export a list of fingerprints of
non-revoked public keys to a file that can be imported using `gpg
--import-ownertrust`.
Add `export_revoked()` to export the fingerprints of all self-revoked
public keys and the fingerprints of public keys that have been revoked
by third party signing keys (the latter is still fairly naive).
Change `export_keyring()` to make use of `temp_join_keys()` for
preparing main signing keys and general keys for the export to file. Add
integration for exporting ownertrust and revoker status (using
`export_ownertrust()` and `export_revoked()`, respectively).
Change `__main__` by extending the export_parser by a `-m`/ `--main`
argument to provide one or multiple files or directories, that serve as
the signing authority for key material located below `-s`/ `--source`.
Add a `-p`/ `--pacman-integration` to provide the means to export
ownertrust and revoker status on demand.
2021-11-30 22:54:06 +01:00
3c31230eb2 keyringctl: Write User IDs to separate files
keyringctl:
Add `persist_uids()` to write User ID related packets: User-ID and
PositiveCertifications (UID binding signatures).
Rename `persist_basic_key()` to `persist_public_key()` and change it to
only persist the PublicKey packet.
Change `persist_{certifications,revocations}()` to persist the
certificates to a key-specific 'uids' subdirectory per PublicKey.
Change `convert_certificate()` to rename `uid_binding_sig` to
`uid_bind_sigs`. Simplify the logic for signature related data
assignments.
2021-11-30 22:54:06 +01:00
7e04c50a16 keyringctl: Split out subkeys to separate structure
keyringctl:
Add `persist_subkeys()` and `persist_subkey_revocations()` to persist
the Public-Subkeys and the SubkeyRevocations of a root key out into a
dedicated directory structure below the respective Public-Key.
Change `persist_basic_key()` to not persist the Public-Subkeys and
SubkeyRevocations of a root key anymore and to output debug information
before writing to file.
Change `convert_certificate()` to refer to Public-Subkeys and
PublicSubkeyBinding as `subkeys` and `subkey_binding_sigs`
(respectively) and to explicitly refer to the main certificate
fingerprint when aggregating the data about them. Add
`subkey_revocations` to track any SubkeyRevocations of a given
Public-Subkey, so that it can be persisted to file.
2021-11-30 22:54:06 +01:00
c4fbd95041 keyringctl: Add writing to keyring output file
keyringctl:
Change `packet_join()` to add documentation and a `force` parameter with
which sq's force parameter may be toggled (defaults to False).
Add `export_keyring()` to allow writing all provided PGP packet files to
a single output file using `sq keyring merge`.
Change `__main__` to add an `export` subcommand to allow for providing
multiple input sources and one output file. Add an optional `-f/--force`
parameter that can be used to force subcommands that support it. Remove
the unused `start_dir` variable. Move the creation of `target_dir` below
the context that creates the working directory and only create it when
using the `convert` or `import` subcommands (as it is not used
otherwise).
Call `export_keyring()` when using the `export` subcommand.
2021-11-30 22:54:05 +01:00
7f7c2f13f0 keyringctl: Deal with multi-certificate per user files
keyringctl:
Add `sanitize_certificate_file()` to potentially split per-user input
files that contain more than one certificate.
Change `packet_split()` to add documentation and rename the key
parameter to certificate, as it is more generic.
Change `convert_certificate()` to use named parameters when calling
`packet_split()`.
Change `convert()` to call `convert_certificate()` on a list of
sanitized certificates (generated using `sanitized_certificate_file()`)
to be able to deal with multi-certificate files per user.
2021-11-30 22:54:05 +01:00
cb8e827112 keyringctl: Copy files instead of moving them
keyringctl:
Change `__main__` to create the `target_dir` before calling any further
function that relies on it.
Change `convert()` to require the `target_dir` to be not None and to
create all username based target directories before using
`shutil.copytree()` to copy all sources to their respective target
directories when iterating over the paths to persist. This has the
upside, that updates to a target directory structure can be done on the
fly (overwriting existing data), which is not possible with
`shutil.move()`.
2021-11-30 22:54:05 +01:00
a5be572136 keyringctl: Derive output dir from file and allow override
keyringctl:
Change `convert_certificates()` to use a more descriptive
`name_override` parameter in its signature to allow the overriding of
the username directory name into which key material is persisted.
Distinguish between the per-username directory and the eventual key
material directory. Instead of the key directory return the username
directory.
Change the `persist*` functions to use the `key_dir` instead of the
`root_dir` terminology as well.

Change `convert()` to optionally allow a `name_override` as well and use
that in the calls to `convert_certificate()`. Make the moving of files
more robust, by at least allowing to move the per-key directories for a
username, if the username target directory exists already. NOTE: This
needs expansion for the use-case where existing files should be
updated/extended by new files.

Add an additional argument to the 'convert' argparse parser to allow
users to override the target username directory name.
2021-11-30 22:54:05 +01:00
40761f44a7 keyringctl: Add handling of KeyRevocations
keyringctl:
Change `persist_direct_sigs()` to track a sig_type parameter in its
signature so that the output directory of the direct signatures can be
altered.
Change `convert_certificate()` to set a `direct_revocations` variable,
that is used to track KeyRevocations for root keys. Extend the logic to
make use of `add_packet_to_direct_sigs()` to set a list of
KeyRevocations for a given root key. Eventually call
`persist_direct_sigs()` with `direct_revocations` and a custom
`sig_type` to persist the revocation certificates.
2021-11-30 22:54:05 +01:00
a77b334859 keyringctl: Persist direct signatures generically
keyringctl:
Rename `persist_direct_keys()` to `persist_direct_sigs()` as it is now
not only handling the persistence of DirectKeys but also *Certifications
directly on a root key (those without an explicit User ID).
Add inline function `add_packet_to_direct_sigs()` to
`convert_certificate()` to generically add direct signatures on a root
key, grouped by issuer.
Change `convert_certificate()` to add Certifications on a root key
(without a specified User ID) to the list of direct_sigs, so that they
are persisted alongside any existing DirectKeys.
Remove breakpoints from `persist_certifications()` as they are no longer
reached. The function is now solely used for Certifications on User IDs.
2021-11-30 22:54:05 +01:00
0d32d2f00a keyringctl: Dedicated functions for writing to file
keyringctl:
Add `persist_basic_key()`, `persist_direct_keys()`,
`persist_certifications()` and `persist_revocations()` to allow for
dedicated writing of basic key material, direct key signatures,
per UID certificates and per UID revocations (respectively).
Change `convert_certificate()` to call the new dedicated write functions
instead of implementing the functionality.
Change `convert_certificate()` to raise on missing current_packet_key
when trying to work on signature files (this is unlikely to occur,
unless the input data is somehow broken, but it keeps the linter happy).
Change `convert_certificate()` to handle direct_keys by issuer on a
given root key (DirectKey signatures by the same issuer are combined).
Change the argparse subparser for the 'convert' command to include a
help text.
2021-11-30 22:54:05 +01:00
f626e40b84 feature(keyringctl): add tool to work with key data 2021-11-30 22:54:05 +01:00
4116f94fbb feature(editorconfig): add standard python settings 2021-11-30 22:53:57 +01:00
4967abcb0c Merge remote-tracking branch 'origin/key_update'
* origin/key_update:
  Update keyring
2021-11-30 00:21:13 +01:00
0271f6121f Update keyring
Update the archlinux keyring and the packager keys.
2021-11-30 00:18:53 +01:00
77a72765b1 Merge remote-tracking branch 'origin/packager_key_mtorromeo'
* origin/packager_key_mtorromeo:
  Add new packager key of Massimiliano Torromeo (mtorromeo)
2021-11-30 00:10:38 +01:00
b8726b2498 Add new packager key of Massimiliano Torromeo (mtorromeo) 2021-11-30 00:07:40 +01:00
75b2957f4a Merge remote-tracking branch 'dbermond/dbermond-new-key'
* dbermond/dbermond-new-key:
  Add new packager key for Daniel Bermond
2021-11-29 17:25:45 +01:00
b9d4aaf8d9 Add new packager key for Daniel Bermond 2021-11-29 16:24:50 +00:00
f50472b9e3 Merge remote-tracking branch 'wild/wild-newkey'
* wild/wild-newkey:
  Add packager key for wild
2021-11-29 17:24:26 +01:00
d20e6a9f83 Add packager key for wild
Signed-off-by: Dan Printzell <wild@archlinux.org>
2021-11-29 16:23:44 +00:00
e21943f9b6 Merge remote-tracking branch 'idevolder/hotfix/new-ike.devolder.archlinux.org-key'
* idevolder/hotfix/new-ike.devolder.archlinux.org-key:
  add new archlinux.org gpg key for Ike
2021-11-29 17:23:05 +01:00
cb5fb8705b add new archlinux.org gpg key for Ike 2021-11-29 16:22:10 +00:00
5121c2d628 Merge remote-tracking branch 'juergen/new-gpg-key'
* juergen/new-gpg-key:
  add new archlinux.org gpg key for juergen
2021-11-29 17:21:49 +01:00
161c70dfc3 add new archlinux.org gpg key for juergen 2021-11-29 16:21:03 +00:00
5187908235 Merge remote-tracking branch 'xyne/xyne-add_gpg_key'
* xyne/xyne-add_gpg_key:
  Add new PGP key ID for Xyne.
2021-11-29 17:19:32 +01:00
99f56df063 Add new PGP key ID for Xyne. 2021-11-29 16:16:28 +00:00
703ce130f1 Merge remote-tracking branch 'escondida/escondida-new-key'
* escondida/escondida-new-key:
  add new key for escondida
2021-11-29 17:16:03 +01:00
a5c3b6b02f add new key for escondida 2021-11-29 15:59:29 +00:00
61e39d7dfe Merge remote-tracking branch 'maximbaz/maximbaz-master-patch-40138'
* maximbaz/maximbaz-master-patch-40138:
  Add packager key for maximbaz
2021-11-29 16:58:28 +01:00
d6518575d5 Add packager key for maximbaz 2021-11-29 15:54:01 +00:00
94cc605d0b Merge remote-tracking branch 'spupykin/master'
* spupykin/master:
  add new packager key id for spupykin
2021-11-29 16:48:50 +01:00
596ffb428b add new packager key id for spupykin 2021-11-29 15:47:36 +00:00
bae7359ee6 Merge remote-tracking branch 'muflone/master'
Add a new key for muflone.

* muflone/master:
  Added new key for muflone
2021-11-29 16:45:14 +01:00
ef9bf94435 Added new key for muflone 2021-11-28 11:49:12 +01:00
eef34e85a2 Prepare release 2021-10-28 11:59:05 +02:00
e7b1576300 Update keyring
... and collect latest changes.
2021-10-28 11:57:12 +02:00
f2f428ff1e Update keyring
... and collect latest changes.
2021-10-25 13:33:30 +02:00
c325a25de5 Prepare release 2021-09-02 22:08:43 +02:00
7fc9403560 Update keyring
... and collect latest changes, including key for alex19ep.
2021-09-02 22:07:09 +02:00
85b9ed4247 Add packager key ID for alex19ep
packager-keyids:
Add 6C7F7F22E0152A6FD5728592DAD6F3056C897266 as PGP key ID for alex19ep.
2021-09-02 22:02:17 +02:00
ad65524ec2 Prepare release 2021-08-20 09:07:31 +02:00
01609606b3 Update keyring
... and add new key of Morgan Adamiec (morganamilo).
2021-08-20 08:30:08 +02:00
23b36990f8 new key of Morgan Adamiec (morganamilo)
https://lists.archlinux.org/pipermail/aur-general/2021-June/036337.html
2021-08-20 07:50:25 +02:00
e3ab3cf2f6 Prepare release 2021-08-18 23:59:07 +02:00
5d392d8e84 Update keyring
... and collect latest changes.
2021-08-18 23:52:26 +02:00
4c7229bb49 removal of Alad Wenter (alad)
https://lists.archlinux.org/pipermail/aur-general/2021-August/036501.html
2021-08-18 23:39:08 +02:00
21f4e63d40 removal of Andrzej Giniewicz (aginiewicz)
https://lists.archlinux.org/pipermail/arch-dev-public/2021-May/030445.html
https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/issues/16
2021-08-18 23:37:54 +02:00
1e97f5193a new key of Caleb Maclennan (alerque)
https://lists.archlinux.org/pipermail/aur-general/2021-June/036321.html
2021-08-18 21:18:18 +00:00
42144ade00 packagers-keyids: fix my handle 2021-08-18 22:27:46 +02:00
8836013ea3 Update merge request templates
Merging these makes sense before closing the related issue. So add a
reference, but to not close automatically.
2021-08-18 17:00:51 +00:00
00f7bec5a3 Update keyring
... and collect extended key lifetime for jlichtblau.
2021-08-18 18:59:29 +02:00
393274968a Update keyring
... and collect extended key lifetime for yan12125.
2021-08-18 13:12:34 +02:00
3012463af8 Update keyring
... and collect extended key lifetime for rgacogne.
2021-08-16 12:33:13 +02:00
39194adf3f Prepare release 2021-08-02 14:16:38 +02:00
9ad88b84d9 Update keyring
... and collect latest changes, including:

* extended key lifetime for ainola
* extended key lifetime for daurnimator
2021-08-02 14:16:07 +02:00
9cbe1e1414 update-keys: switch to keyserver keyserver.ubuntu.com
As the SKS infrastructure is offline for good, we need to switch to
keyserver.ubuntu.com for the time being.

The Ubuntu keyservers to not support EC keys, thus we have to ignore
failure when refreshing keys.
2021-08-02 13:23:39 +02:00
0ee9781b80 Merge branch 'issues/3'
* issues/3:
  Add SPDX license identifier
  Add GPL-3.0-or-later license file
2021-07-29 07:53:44 +02:00
1cf0aa446f Add SPDX license identifier
update-keys:
Add SPDX license identifier for GPL-3.0-or-later.
2021-07-29 07:48:38 +02:00
8ca7ff505a Add GPL-3.0-or-later license file
LICENSE:
Add GPL-3.0-or-later license file.
2021-07-29 07:48:34 +02:00
8b14e1cb46 removal of Giovanni Scafora (giovanni)
Giovanni is developer fellow, but no longer active.
https://archlinux.org/people/developer-fellows/#giovanni
2021-06-16 08:08:59 +00:00
ebb7af3852 Prepare release 2021-06-16 09:53:56 +02:00
fd7104caf4 Update keyring
... and collect latest changes, including:

* main key for dvzrv
* packager key for grawlinson
2021-06-11 08:52:53 +02:00
3730c64961 Added grawlinson keyid
Signed-off-by: Morten Linderud <morten@linderud.pw>
2021-05-30 13:34:59 +02:00
5c3145c71d resignation of Dan McGee (dan)
All done, just missed to mark his key revoked here.
https://bugs.archlinux.org/task/65081
2021-05-12 10:04:37 +02:00
b51819cd50 Add merge request templates for key actions
.gitlab/merge_request_templates/*.md:
Add templates for merge requests that add or remove new packager or main
keys.
2021-05-12 07:18:06 +00:00
702320750d Extend issue templates to set title and be more specific
.gitlab/issue_templates/*.md:
Set the title in all issue templates.
Add an explicit identifier (MODIFY) to all parts of the template where
modification is required by the user.
Extend the main key removal template by more specific steps for the main
key holders and keyring maintainer.
2021-05-12 07:16:14 +00:00
9ce8c5953e Extend remove packager key issue template
.gitlab/issue_templates/Remove Packager Key.md:
Add a subsection for main key holders that specifically tracks the
status on the key signature revocation.
2021-05-12 07:16:14 +00:00
9bfb673253 Extend new packager key issue template
.gitlab/issue_templates/New Packager Key.md:
Extend the Checks section by a subsection specifically for main key
holders, that ensures all main key holders have validated and signed a
new packager key (with the help of checkboxes).
Clarify wording in the keyring maintainer related subsection.
2021-05-12 07:16:14 +00:00
f0b827ecd4 Add main key dvzrv
master-keyids
Add new main key 2AC0A42EFB0B5CBC7A0402ED4DC95B6D7BE9892E
(dvzrv@master-key.archlinux.org).

Closes #5
2021-05-08 20:35:53 +02:00
cee2860934 Resignation of bpiotrowski
Revoke key ID F3691687D867B81B51CE07D9BBE43771487328A9 of bpiotrowski
due to resignation.

Closes #8
2021-05-08 20:27:01 +02:00
38c96658c2 ci: add basic job to check new key additions and removals 2021-05-08 20:00:05 +02:00
feab8a68eb doc: split and add checks to issue templates according to responsibilities
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2021-04-29 20:17:49 +02:00
71a5af7f18 Add issue templates for key actions
.gitlab/issue_templates/New Main Key.md:
Add issue template for adding a new main key.

.gitlab/issue_templates/New Packager Key.md:
Add issue template for adding a new packager key.

.gitlab/issue_templates/Remove Main Key.md:
Add issue template for removing a main key.

.gitlab/issue_templates/Remove Packager Key.md:
Add issue template for removing a packager key.
2021-04-27 13:45:18 +02:00
6c54e35916 Prepare release 2021-01-10 21:28:53 +01:00
50059633a4 Update keyring
New trusted keys with this commit:

 * bastelfreak
 * orhun
 * rgacogne
2021-01-10 21:27:09 +01:00
c8f5fc16e9 Update keyring 2021-01-08 22:54:54 +01:00
586dfb5430 new key of Orhun Parmaksız (orhun) 2021-01-08 22:48:47 +01:00
6fd824cf03 resignation of Baptiste Jonglez (zorun)
Baptiste Jonglez resigned on aur-general.
2020-12-23 14:45:42 +01:00
48396d8203 new key of Remi Gacogne (rgacogne) 2020-12-12 21:55:53 +01:00
80e1407754 Prepare release 2020-12-10 21:02:08 +01:00
b652387226 Update keyring 2020-12-10 21:00:28 +01:00
bca14a1d30 Removal of arcanis due to inactivity 2020-12-10 20:51:49 +01:00
3a03a8e0e7 new key of Tim Meusel (bastelfreak) 2020-12-10 20:49:50 +01:00
76157b79a5 Update keyring
... and collect...

* revoked signatures for bisson & dreisner
* extended lifetime for jleclanche's key
2020-10-29 09:59:08 +01:00
3490b904b1 Prepare release 2020-10-28 17:04:48 +01:00
b60d3e0883 Update keyring
... and get raster's key including signatures.
2020-10-28 17:03:32 +01:00
7bf3611fb2 new key of Carsten Haitzler (raster) 2020-10-10 00:25:40 +02:00
cbea8e837e resignation of Dave Reisner (dreisner)
Dave Reisner resigned on arch-dev.
2020-09-07 22:50:15 +02:00
f8ad104596 resignation of Gaetan Bisson (bisson)
Gaetan Bisson resigned on arch-dev-public:
https://lists.archlinux.org/pipermail/arch-dev-public/2020-August/030073.html
2020-09-02 15:21:12 +02:00
93dea57cef Prepare release 2020-08-20 14:23:38 +02:00
8cb23a4919 Update keyring
... and get kgizdov's new key.
2020-08-20 14:22:26 +02:00
677c5b5391 new key of Konstantin Gizdov (kgizdov) 2020-08-20 14:21:23 +02:00
d34e495c40 Prepare release 2020-08-17 23:46:12 +02:00
f7201f68c3 Update keyring
... and get hashworks's key.
2020-08-17 23:45:19 +02:00
afe7d79c9e new key of Justin Kromlinger (hashworks) 2020-08-17 23:44:25 +02:00
129876cc3e update-keys: (re-)enable web of trust
We need web of trust to download the master key signatures...
So enable it.
2020-06-29 09:42:13 +02:00
df0685c894 Prepare release 2020-06-22 17:29:32 +02:00
97b56292aa Update keyring
... and get freswa's key.
2020-06-22 17:27:24 +02:00
d450aabc49 new key of Frederik Schwan (freswa) 2020-06-22 17:26:34 +02:00
b5dba61b0c Prepare release 2020-06-03 13:49:25 +02:00
e7d91c398d Update keyring
... and get latest signatures.
2020-06-03 13:47:59 +02:00
9f508ea63d Update keyring
... and get latest signatures, including new key for heftig.
2020-05-28 18:36:45 +02:00
a88c82a051 new key of Jan Alexander Steffens (heftig) 2020-05-28 18:34:13 +02:00
b0ee67ecc7 Prepare release 2020-04-22 14:56:19 +02:00
3e9e4491ce Update keyring
... and get latest signatures, including key with extended lifetime
from Filipe Laíns (FFY00).
2020-04-22 14:37:04 +02:00
0134750919 Update keyring
... and get latest signatures, including key with extended lifetime
from Christian Rebischke (shibumi).
2020-04-22 07:35:09 +02:00
30abce974e Update keyring
... and get latest signatures, including key with extended lifetime
from Nico Hood.
2020-04-21 22:26:23 +02:00
140cd1b4cb Update keyring
... and get latest signatures.
2020-03-19 15:12:59 +01:00
e7eeff4ce3 Revoke key of Guillaume Alaux (guillaume)
Resigned on arch-dev mailing list.
2020-03-19 15:11:57 +01:00
24aab64152 Prepare release 2020-01-08 14:48:15 +01:00
518219ad91 Update keyring
... and get latest signatures, including revokation certificate for
thomas' master key by tpowa.
2020-01-08 14:44:28 +01:00
30bf6dbbce Prepare release 2019-12-19 17:01:08 +01:00
fb1aef31bb Update keyring
... and get latest signatures, including sangy's key with
extended lifetime.
2019-12-19 16:56:15 +01:00
1c381e57ac Update keyring
... and get latest signatures
2019-12-13 10:29:05 +01:00
3a6f172ff9 Prepare release 2019-10-18 09:06:04 +02:00
9ed0a33e54 Update keyring
... and get latest signatures, including third master key signature
for kpcyrd from anthraxx.
2019-10-18 09:03:52 +02:00
440e87b589 Update keyring
... and get latest signatures, including several from Allan's and
Pierre's master keys.
2019-10-17 16:02:37 +02:00
d819c09e03 Revoke key of Rashif Rahman (schiv)
https://lists.archlinux.org/pipermail/aur-general/2019-October/035481.html
2019-10-16 20:29:15 +02:00
a55a47e124 Update keyring
... and get latest signatures.
2019-10-14 21:54:22 +02:00
5594da9f78 Add kpcyrd 2019-10-14 21:41:58 +02:00
4cf0341ed5 Prepare release 2019-10-11 23:10:52 +02:00
dabd93a841 Update keyring
... and get latest changes, including:

* revocation of stativ's packager key
* revocation of thomas' master key (dan and giovanni loose full
  trust, but no single package is signed by their key)
* new key of dvzrv
2019-10-11 23:01:41 +02:00
f9a3103dba new key of David Runge (dvzrv) 2019-10-11 22:43:57 +02:00
5f2b58b703 update-keys: also collect keys with marginal trust 2019-10-11 21:50:16 +02:00
ff463b24b1 Revoke thomas' master key 2019-10-11 21:49:49 +02:00
453c195114 Revoke key of stativ (Lukas Jirkovsky) 2019-10-11 21:46:35 +02:00
5d7de993be Update keyring
... and get latest signatures, including fourth master key signature
for arodseth (which should allow to revoke thomas' master key).
2019-10-08 16:04:49 +02:00
41c6a2b92c Prepare release 2019-10-07 23:41:41 +02:00
4e08e6d83b Update keyring
... with comments.
2019-10-07 23:39:59 +02:00
4966bc9b46 Export with comment
... containing username and keyid
2019-10-07 23:39:04 +02:00
af4b81ed04 Update keyring
... and get everything stripped by export-minimal before - including
proper revocation signatures.
2019-10-07 23:38:07 +02:00
8f471cf44e Do not export minimal, but clean 2019-10-07 23:36:09 +02:00
415fb73b35 Update keyring
... and get latest signatures, including:

* extended lifetime for anthraxx' packager key
* extra master signature for anatolik's key (which brings us one step
  closer to revoking thomas' master key)
* diabonas' packager key with three master key signatures
2019-10-07 23:35:07 +02:00
28814448e1 Add Jonas Witschel (diabonas) 2019-09-27 20:54:39 +02:00
4088d5cd3c Update keyring
... and get latest signatures.
2019-09-11 10:10:39 +02:00
283e940bbe Prepare release 2019-08-27 21:26:42 +02:00
91cd3b4fe4 Update keyring
... and get latest signatures, including key with extended
lifetime for daurnimator.
2019-08-27 21:23:17 +02:00
469a0ffbd0 Update keyring
No idea why options in configuration file are more effective than
options on the command line... But everything needed is still there.
2019-08-06 10:08:12 +02:00
cf5ed9feeb update-keys: do not minimize but export-minimal 2019-08-06 09:38:04 +02:00
5cb23e4ce6 update-keys: don't restore cwd in a subprocess
Using popd at the very end of a shell script is unnecessary, because, as
the very last command, there is nothing to restore state for.
Immediately after, the shell subprocess is ended, and processes don't
control the cwd of the parent process. Changing the cwd for the last
microsecond of the shell process, during which no commands are run, is
a mildly expensive no-op.

By the same measure, if popd is never used, pushd is not needed to
record the old cwd. So simply use 'cd'.

Signed-off-by: Christian Hesse <mail@eworm.de>
2019-08-06 09:35:52 +02:00
c4264b6784 update-keys: move armor to gpg.conf
This option only affects --export, and we always use armored keys.

Signed-off-by: Christian Hesse <mail@eworm.de>
2019-08-06 09:35:52 +02:00
cca61ee733 update-keys: move export-clean to gpg.conf instead of cleaning the keyring before export
This has the same effect, but causes only the exported version of the
key to be cleaned. Cleaning the internal copy doesn't matter.

Signed-off-by: Christian Hesse <mail@eworm.de>
2019-08-06 09:35:52 +02:00
44f69d009f update-keys: use gpg.conf to persist versions
It is easier than passing around a dozen options on the command line.

Signed-off-by: Christian Hesse <mail@eworm.de>
2019-08-06 09:35:52 +02:00
0d99720ded update-keys: use array for $GPG
Embedding quotes in a string doesn't work, it just causes KEYSERVER to
not be quoted at all.

Signed-off-by: Christian Hesse <mail@eworm.de>
2019-08-06 09:35:52 +02:00
c4f33de41d Prepare release 2019-08-05 09:57:20 +02:00
745bffab6a Update keyring
... and get latest signatures, including key with extended lifetime
for Brett Cornwall (ainola).
2019-08-04 19:20:45 +02:00
d3e01dd07b Update keyring
... and get latest signatures.
2019-07-17 14:52:39 +02:00
75b586c598 Update keyring
... and get latest signatures.
2019-05-14 00:05:25 +02:00
35d91559ff Modify the temporary master key generation 2019-01-23 23:12:15 +01:00
06553feca9 Prepare release 2019-01-23 22:55:41 +01:00
7b4d1dd1a8 Update keyring
get anthraxx's master key and his signatures
2019-01-23 22:51:55 +01:00
72e85ae7ce Add master key for Levente Polyak (anthraxx) 2019-01-23 22:37:38 +01:00
0e79570527 Rework the update process
* use --refresh-keys if key is available, not --recv-keys
* refresh/receive in one go
2019-01-23 22:37:38 +01:00
a48a66dfd6 Import archlinux.gpg into the temporary keyring
This makes sure we do not loose signatures depending on key server used.
2019-01-23 10:27:58 +01:00
f82fc176a5 Update keyring
get escondida's key with extended lifetime
2019-01-23 10:07:58 +01:00
122f61055c Update keyring
get alad's key with extended lifetime
2019-01-22 16:49:05 +01:00
b654887de7 Prepare release 2019-01-22 15:18:53 +01:00
8a130390bd Update keyring 2019-01-22 15:18:02 +01:00
331b16f201 Add daurnimator 2019-01-22 14:56:46 +01:00
cd5d6983b9 Prepare release 2018-12-18 09:19:28 +01:00
8ef0dc3ea3 Update keyring 2018-12-18 09:13:40 +01:00
7cca069608 Add Daniel M. Capella (polyzen) 2018-12-10 10:43:03 +01:00
7a78f814cc Prepare release 2018-11-28 13:10:34 +01:00
7382ce5e7a Update keyring 2018-11-28 13:10:09 +01:00
b4f3a2a6a4 Add Maxim Baz (maximbaz) 2018-11-26 16:44:31 +01:00
51cb7ec077 Prepare release 2018-11-26 16:40:40 +01:00
4c51317fe8 Update keyring 2018-11-26 12:28:42 +01:00
8b6831368e Add Brett Cornwall (ainola) 2018-11-25 20:32:28 +01:00
586568d991 Prepare release 2018-11-22 12:29:45 +01:00
09ccd53792 Update keyring 2018-11-22 12:29:01 +01:00
af552837dd Add Konstantin Gizdov (kgizdov) 2018-11-21 12:49:06 +01:00
833e213974 Prepare release 2018-11-13 20:32:03 +01:00
055d64cce1 Update keyring 2018-11-13 20:31:37 +01:00
5ae32f0406 Add Daniel Bermond (dbermond) 2018-11-13 20:07:22 +01:00
cc8ad71eac Prepare release 2018-10-31 17:34:21 +01:00
b3ccfc605e Update keyring 2018-10-31 17:33:45 +01:00
da5de1b77a prepare release
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2018-10-18 14:53:51 +02:00
fab4c1146b Update keyring
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2018-10-18 14:44:10 +02:00
1a263eb096 Re-add key of Alad Wenter
Signed-off-by: Florian Pritz <bluewind@xinu.at>
2018-10-18 14:41:30 +02:00
49d009adcc Revoke superseded of Gaetan Bisson 2018-10-07 11:17:01 +02:00
1b2edec099 Revoke key of eric (Eric Bélanger) 2018-10-07 11:07:11 +02:00
c67c67b643 Revoke key of dwallace (Daniel Wallace) 2018-10-07 11:00:27 +02:00
8b5b62910f README: Document the revocation of a packager key
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2018-10-04 16:02:28 +02:00
fbcb563e5f Prepare new release
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2018-10-03 21:21:15 +02:00
d923272ee2 Update keyring
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2018-10-03 21:18:26 +02:00
4241f7a953 Add Chih-Hsuan Yen (yan12125)
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2018-10-03 21:13:14 +02:00
6a921a3a2c Add Santiago Torres-Arias (sangy)
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2018-10-03 21:00:06 +02:00
997a308df2 Update keyring 2018-10-03 13:50:28 +02:00
aa26ebdf6b Revoke key of thestinger (Daniel Micay) 2018-10-03 13:49:22 +02:00
a685c3cd6e prepare release 2018-08-08 09:48:47 +02:00
13ef17ef71 Update keyring 2018-08-08 09:48:11 +02:00
d2f1aeb790 Revoke key of Tom Gundersen (tomegun) 2018-08-08 09:46:19 +02:00
702a7fbff8 add key of Filipe Laíns (FFY00) 2018-08-08 09:30:58 +02:00
cab9b11182 prepare release 2018-06-27 10:56:01 +02:00
5c3a394a0c Update keyring
... and get extended expiration time for shibumi's key.
2018-06-27 10:51:19 +02:00
182dab9197 Add README
Include a readme with steps how to add/remove/update a key in the
keyring and how to release a new keyring version.

Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2018-06-26 20:55:52 +02:00
2440c44491 prepare release 2018-06-26 08:53:51 +02:00
ef307e07ea Update keyring 2018-06-26 08:52:18 +02:00
93c54d1135 Update keyring 2018-06-01 11:32:29 +02:00
a2723b1227 Revoke key of Pierre Neidhardt (ambrevar) 2018-06-01 11:28:02 +02:00
257402b3bd Revoke key of Angel Velásquez (angvp) 2018-06-01 11:23:27 +02:00
c95a169e77 Update keyring 2018-04-04 09:14:08 +02:00
18cb949e1e Revoke key of Alad Wenter (alad)
He had revoked UIDs that had enough signatures and according to him,
he will be away till the end of the year.
2018-04-04 09:08:36 +02:00
a268d26c30 Add key of Brad Fanella (cesura) 2018-04-03 21:12:51 +02:00
876a8a10dd Fix bashism in install target 2018-04-03 21:12:10 +02:00
1da4852c7c Update keyring
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2018-03-22 21:28:03 +01:00
e57a0c347f Add key of Robin Broda (coderobe)
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2018-03-22 11:27:42 +01:00
2126648ec0 Update keyring 2018-03-02 08:01:02 +01:00
f4c4378e92 Add key of Ivy Foster (escondida) 2018-03-02 07:55:59 +01:00
eaa1c553f9 Revoke keys of speps and faidoc 2018-03-02 07:55:25 +01:00
5751362e3c Prepare new release 2018-01-08 05:36:34 +01:00
bbda395081 Update keyring 2018-01-08 05:36:01 +01:00
0d422a8ac9 Add key of Eli Schwartz 2018-01-08 05:35:39 +01:00
1795c0bb3a Prepare a release 2017-12-13 19:59:26 +01:00
eb222dd842 Update keyring 2017-12-13 19:58:32 +01:00
f81f89f01c add key of Andrew Crerar (andrewSC) 2017-12-13 19:55:35 +01:00
5cf4bbc993 Prepare a release 2017-11-30 11:21:58 +01:00
1d846756dc Update keyring 2017-11-30 11:20:33 +01:00
da877f909a add key of David Runge (Davezerave / dvzrv)
https://bugs.archlinux.org/task/56212
2017-11-30 11:17:20 +01:00
573b9cf8fa sort packager-keyids 2017-11-30 11:16:23 +01:00
7c9f861bf8 Update keyring 2017-10-24 12:40:38 +02:00
7f6f427624 Ionuț Bîru (ibiru) resigned as master key holder 2017-10-24 12:36:55 +02:00
6d0d80f16a Prepare a release 2017-10-20 14:57:20 +02:00
48e3742868 Update keyring 2017-10-20 10:11:04 +02:00
de4326f4d4 exit immediately on error
Intermittent errors (due to broker network connectivity, key server
failure, whatever ...) could result in an incomplete keyring. So exit
immediately on error.
2017-10-19 10:47:12 +02:00
a761b634e2 Update keyring 2017-10-17 14:01:48 +02:00
6f00b281f1 Revoke keys unconditionally 2017-10-17 14:01:23 +02:00
e29bd5eb26 Revoke key of Daniel Isenmann 2017-10-17 13:13:07 +02:00
b54038116e indent packager-revoked-keyids 2017-10-17 13:12:32 +02:00
465813d08e editorconfig: add indent size 2017-10-17 13:10:00 +02:00
8e8d330967 Use minimal export for revoked keys
We need the key and most recent self signature.

Signed-off-by: Christian Hesse <mail@eworm.de>
2017-10-17 12:09:39 +02:00
1c4f33d735 Do not export attribute user IDs (photo IDs)
There's no need to have images in pacman keyring...

Signed-off-by: Christian Hesse <mail@eworm.de>
2017-10-17 12:09:39 +02:00
b3cb9594af Update keyring 2017-10-13 13:49:07 +02:00
11b582af2d Revoke key of Vesa Kaihlavirta 2017-10-13 12:17:57 +02:00
cb40e604bf Revoke key of Thomas Dziedzic
Signed-off-by: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
2017-10-13 12:15:36 +02:00
00bd111ff3 Add key of Alad Wenter (alad)
Signed-off-by: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
2017-10-13 12:11:32 +02:00
e2935c1fc8 Add key of Morten Linderud (foxboron)
Signed-off-by: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
2017-10-13 12:11:30 +02:00
e6f44ab73e Revoke key of Andrea Scarpino
Signed-off-by: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
2017-10-13 12:11:29 +02:00
9e2b4558aa Fix typo 2017-10-13 12:11:28 +02:00
1c8358bb02 Revoke key of Thorsten Töpper
Signed-off-by: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
2017-10-13 12:11:27 +02:00
d9f2173654 Revoke key of Timothy Redaelli
Signed-off-by: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
2017-10-13 12:11:19 +02:00
def2c722c0 Add new key of Gaetan Bisson
Signed-off-by: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
2017-10-13 12:11:16 +02:00
2fe0842735 Add key of Dan Printzell (Wild) 2017-08-23 20:43:59 +02:00
fdd779743f Update keyring 2017-06-11 08:15:02 +02:00
8a5c52469e Add master key of Bartłomiej Piotrowski 2017-06-11 08:08:09 +02:00
23d484c3e9 Add key of Thore Bödecker (foxxx0) 2017-06-11 08:07:16 +02:00
26544368d9 Remove unused files from source package 2017-05-26 08:51:44 +02:00
d934400573 Add editor config 2017-05-26 08:26:32 +02:00
c6aa9163a0 Ignore IDE configuration 2017-05-26 08:23:34 +02:00
0e06665ea0 Fix typo in packager-revoked 2017-03-23 23:24:29 +01:00
0abfb04ebb Update keyring
- add keys of new Trusted Users: zorin, shibumi, archangegabriel
- revoke keys of ex-TUs: flexiondotorg, dicebot
- revoke Dan's master key

Signed-off-by: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
2017-03-20 22:40:09 +01:00
87a90bc616 Prepare release 2017-01-04 15:16:20 +02:00
d47e0662ef Update keyring to refresh jleclanche's expired key 2017-01-04 15:13:40 +02:00
eb1a8e2f2e Add key of grazzolini 2016-12-01 19:00:14 +01:00
2abc871e6e Add key of NicoHood 2016-11-01 09:59:13 +01:00
5f7b5c53f2 Update Keyring
See FS#51447
2016-10-21 17:18:56 +02:00
7e48603d3a Fix repo server 2016-08-12 07:41:51 +02:00
b81cc33ba4 Prepare release 2016-08-12 07:38:53 +02:00
c8783658a5 Add key of Nicola Squartini (tensor5) 2016-08-12 07:29:37 +02:00
34b9cceac7 Update keyring 2016-04-02 09:45:31 +02:00
d60f0f935d Update keyring 2016-02-15 19:10:44 +01:00
f50f596bda Update keys and prepare release 2016-01-23 14:25:55 +02:00
e7cd01a4f3 Add master key of Florian Pritz (bluewind) 2015-12-20 15:19:34 +01:00
86b271825d Actually add Jiachen Yang (farseerfc) key id 2015-12-20 13:21:17 +01:00
084423a333 Prepare release 2015-12-06 10:26:18 +01:00
89df24fa75 Add key of Jiachen Yang (farseerfc) 2015-12-06 10:25:34 +01:00
5c9696b1b2 Add key of Pierre Neidhardt (ambrevar) 2015-12-06 09:57:08 +01:00
9c7730af04 Update keys and prepare release 2015-06-05 06:37:47 +02:00
fa6df810c8 Update keys and prepare release 2015-05-23 23:17:40 +02:00
94b16227bb Prepare new release 2015-05-14 10:26:32 +02:00
562d02b287 Update Keyring and add new TU keys
Add new packager keys:
* Levente Polyak (anthraxx)
* Johannes Löthberg (kyrias)

Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2015-05-14 10:23:18 +02:00
bcd7b58d03 Update keys and prepare release 2015-02-12 06:18:55 +01:00
37a72350a3 Add key of Christian Hesse (eworm) and Jerome Leclanche (jleclanche) 2015-02-12 06:16:49 +01:00
5242dea788 GPG 2.1 compatibility 2015-02-07 10:28:34 +01:00
62bec2fda5 Prepare release 2014-12-18 15:38:50 +01:00
2c2663ce05 Add key of Antonio Rojas (arojas) 2014-12-18 15:38:03 +01:00
b51077d093 Removal of cinelli due to inactivity 2014-12-18 15:36:59 +01:00
af4043fc46 Add key of Fabio Castelli (muflone); revoked key of Peter Lewis (petelewis) 2014-09-08 20:37:13 +02:00
62960a53e2 Add key of Anatol Pomozov (anatolik) 2014-02-20 15:35:09 +01:00
d1613670fe Update Thorsten Töpper's key
His key expired on 2014-01-22 but was now renewd and is
valid till 2016-01-22.
2014-01-24 20:07:33 +01:00
17f35ee2d6 Add key of Martin Wimpress (flexiondotorg); revoked key of Jonathan Conder (jconder) 2014-01-08 21:27:48 +01:00
e824857fcd Add key of Evgeniy Alekseev (arcanis) 2013-10-27 15:39:35 +01:00
8878bfbcb5 Revoke inactive keys
These are keys by former developers who have resigned or keys that have been replaced by new ones.

See packager-revoked-keyids for revocation reasons.
2013-10-27 15:35:20 +01:00
178 changed files with 7149 additions and 18004 deletions

30
.editorconfig Normal file
View File

@ -0,0 +1,30 @@
root = true
[*]
end_of_line = lf
charset = utf-8
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
[Makefile]
end_of_line = lf
charset = utf-8
indent_style = tab
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
[{*.py,keyringctl}]
indent_style = space
indent_size = 4
max_line_length = 120
[*.{yml,yaml}]
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
charset = utf-8
indent_style = space
indent_size = 2

4
.flake8 Normal file
View File

@ -0,0 +1,4 @@
[flake8]
max-line-length = 120
output-file = flake8.txt
max-complexity = 10

7
.gitattributes vendored
View File

@ -1,7 +0,0 @@
update-keys export-ignore
.gitattributes export-ignore
.gitignore export-ignore
master-keyids export-ignore
packager-keyids export-ignore
master export-ignore
packager export-ignore

4
.gitignore vendored
View File

@ -1,3 +1,7 @@
/build
*~
archlinux-keyring-*.tar.gz
archlinux-keyring-*.tar.gz.sig
/.idea
.coverage
__pycache__/

93
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,93 @@
---
image: archlinux:latest
stages:
- test
- wkd
lint:
stage: test
needs: []
before_script:
- pacman -Syu --needed --noconfirm make flake8 mypy python-black python-isort
script:
- make lint
only:
changes:
- keyringctl
- libkeyringctl/*
- tests/*
- .gitlab-ci.yml
- Makefile
test:
stage: test
needs: []
before_script:
- pacman -Syu --needed --noconfirm make python sequoia-sq python-coverage python-pytest python-tomli
script:
- make test
only:
changes:
- keyringctl
- libkeyringctl/*
- tests/*
- .gitlab-ci.yml
- Makefile
coverage: '/TOTAL.*\s([.\d]+)%/'
artifacts:
when: always
reports:
coverage_report:
coverage_format: cobertura
path: build/coverage.xml
junit: build/junit-report.xml
build_install:
stage: test
needs: []
before_script:
- pacman -Syu --needed --noconfirm make pkgconf python sequoia-sq systemd
script:
- make
- make install PREFIX=/usr
- pacman-key --init
- pacman-key --populate archlinux
- pacman-key --updatedb
- pacman -Syu
keyring_check:
stage: test
needs: []
before_script:
- pacman -Syu --needed --noconfirm make python sequoia-sq git
script:
- ./keyringctl check
- ./keyringctl ci
only:
changes:
- keyring/**/*
- keyringctl
- libkeyringctl/*
- tests/*
- .gitlab-ci.yml
- Makefile
pages:
stage: wkd
needs: []
tags:
- secure
before_script:
- pacman -Syu --needed --noconfirm make python sequoia-sq
script:
- make wkd
- make wkd WKD_FQDN=master-key.archlinux.org
- make wkd_inspect
- make wkd_inspect WKD_FQDN=master-key.archlinux.org
- cp -r build/wkd/ public
artifacts:
paths:
- public
rules:
- if: $CI_PROJECT_PATH == "archlinux/archlinux-keyring" && $CI_COMMIT_TAG

View File

@ -0,0 +1,71 @@
<!--
This template is used when a new main PGP public key needs to be added to the
distribution's keyring.
It is used by users with a valid packager key.
NOTE: All comment sections with a MODIFY note need to be edited. All checkboxes
in the "Checks" section labeled as "Owner of new key" need to be checked by the
owner of the new key.
-->
/assign @archlinux/teams/main-key-holders
/label ~"new main key"
/title New main key of <!-- MODIFY: Add new main key holder's username -->
<!--
Please do not remove the above quick actions, which automatically label the
issue and assign relevant users.
-->
# Add a new main key
## Details
- Username: <!-- MODIFY: Add the @-prefixed username -->
- PGP key ID: <!-- MODIFY: Add the output of `gpg --keyid-format long --list-key <MY UID> | sed -n '2p' | tr -d ' '` here -->
- Revocation Certificate Holder: <!-- MODIFY: Add the @-prefixed username of the revocation certificate holder -->
<!--
MODIFY: Attach the above information of the details section as a clearsigned
document (see https://www.gnupg.org/gph/en/manual/x135.html) to this ticket
using a valid packager key of the user:
* Select the above text, copy/paste it into a file (e.g. `details.txt`).
* Make sure to sign with the root certificate of the packager key (not any of
the subkeys!):
`gpg --armor --default-key <fingerprint_of_root>! --clearsign details.txt`
* Upload `details.txt` as attachment to this ticket.
-->
## Checks
**NOTE**: The below check boxes **must be** checked before the accompanying
merge request to add the new main key can be merged.
### Owner of new key
- [ ] The [workflow for adding a new main
key](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/workflows/add-a-new-main-key)
has been followed
- [ ] The key pair has been validated according to the [best
practices](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/best-practices#validating-a-key-pair)
- [ ] The data in the [Details](#details) section is attached to this issue as
a clearsigned document
- [ ] The revocation certificate has been sent in an encrypted message to the
revocation certificate holder
- [ ] The public key has been uploaded to the `keyserver.ubuntu.com` and
`keys.openpgp.org` keyservers, and the `archlinux.org` UID has been verified
on the `keys.openpgp.org` keyserver. Optionally the key can also be uploaded
to the `pgp.mit.edu` keyserver, but this is no longer mandatory as it's
frequently flaky.
- [ ] A merge request to add the new public key has been created
### Revocation Certificate Holder
- [ ] The revocation certificate has been [verified
as working](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/workflows/verify-a-revocation-certificate)
and confirmed in a comment to this issue
- [ ] The revocation certificate has been backed up on a dedicated encrypted backup storage medium
### Main key holders
- [ ] The data in the [Details](#details) section is correct and signed with a
valid and trusted packager key, which is already part of `archlinux-keyring`

View File

@ -0,0 +1,79 @@
<!--
This template is used when a new packager PGP public key needs to be added to
the distribution's keyring.
It is either used by the sponsor of a new packager or by an existing packager
when adding a new key for themself.
NOTE: All comment sections with a MODIFY note need to be edited. All checkboxes
in the "Checks" section labeled as "Owner of new key" need to be checked by the
owner of the new key or by a sponsor of a new packager.
-->
/assign @archlinux/teams/main-key-holders
/label ~"new packager key"
/title New packager key of <!-- MODIFY: Add new packager key holder's username -->
<!--
Please do not remove the above quick actions, which automatically label the
issue and assign relevant users.
-->
# Add a new packager key
## Details
- Username: <!-- MODIFY: Add the @-prefixed username -->
- PGP key ID: <!-- MODIFY: Add the output of `gpg --keyid-format long --list-key <MY UID> | sed -n '2p' | tr -d ' '` here -->
- Sponsors: <!-- MODIFY: Add the @-prefixed usernames of the sponsors -->
- Application: <!-- MODIFY: Add link to application, if this is the key of a new packager, else remove -->
- Results: <!-- MODIFY: Add link to results of application, if this is the key of a new packager, else remove -->
- Previous Key: <!--
MODIFY: Add the output of `gpg --keyid-format long --list-key <MY PREVIOUS ID> | sed -n '2p' | tr -d ' '` here
if another packager key exists already, else remove
-->
<!--
MODIFY: Attach the above information of the details section as a clearsigned
document (see https://www.gnupg.org/gph/en/manual/x135.html) to this ticket.
If a previous (valid and trusted) packager key of the user exists, it needs to
be used for clearsigning the document.
If the key of a new packager is added, one of their sponsors needs to clearsign
the details section.
* Select the above text, copy/paste it into a file (e.g. `details.txt`).
* Make sure to sign with the root certificate of the packager key (not any of
the subkeys!):
`gpg --armor --default-key <fingerprint_of_root>! --clearsign details.txt`
* Upload `details.txt` as attachment to this ticket.
-->
## Checks
### Owner of new key
- [ ] The [workflow for adding a new packager
key](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/workflows/add-a-new-packager-key)
has been followed
- [ ] The key pair contains one user ID with a valid `<username>@archlinux.org` email address
used for signing
- [ ] The key pair has been validated according to the [best
practices](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/best-practices#validating-a-key-pair)
- [ ] The data in the [Details](#details) section is attached to this issue as
a clearsigned document
- [ ] The public key has been uploaded to the `keyserver.ubuntu.com` and
`keys.openpgp.org` keyservers, and the `archlinux.org` UID has been verified
on the `keys.openpgp.org` keyserver. Optionally the key can also be uploaded
to the `pgp.mit.edu` keyserver, but this is no longer mandatory as it's
frequently flaky.
- [ ] A merge request to add the new public key has been created
### Main key holders
- [ ] The public key has been signed by all main key holders
- [ ] @anthraxx
- [ ] @bluewind
- [ ] @demize
- [ ] @diabonas
- [ ] @dvzrv
### Developers of the archlinux-keyring project
- [ ] The data in the [Details](#details) section is correct and signed with a
valid and trusted packager key, which is already part of `archlinux-keyring`

View File

@ -0,0 +1,37 @@
<!--
This template is used when an existing main PGP public key needs to be removed
from the distribution's keyring.
It is used by users with a valid main key or the holder of the revocation
certificate of the main key that is about to be removed.
NOTE: All comment sections with a MODIFY note need to be edited. All checkboxes
in the "Check" section labeled as "Main key holders" need to be checked for the
accompanying merge request to be merged.
-->
/assign @archlinux/teams/main-key-holders
/label ~"remove main key"
/title Remove main key of <!-- MODIFY: Add main key holder's username -->
<!--
Please do not remove the above quick actions, which automatically label the
issue and assign relevant users.
-->
# Remove a main key
## Details
- Username: <!-- MODIFY: Add the @-prefixed username -->
- PGP key ID: <!-- MODIFY: Add the output of `gpg --keyid-format long --list-key <MAIN KEY UID> | sed -n '2p' | tr -d ' '` here -->
- Resignation: <!-- MODIFY: Link to resignation of key holder -->
## Checks
### Main key holders
- [ ] There are more than or equal to three valid main keys remaining after
removal of this key.
- [ ] All packagers have at least three valid main key signatures for their
packager key after removal of this key.
- [ ] A merge request to [remove the main public
key](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/workflows/remove-a-main-key)
has been created

View File

@ -0,0 +1,43 @@
<!--
This template is used when an existing packager PGP public key needs to be
removed from the distribution's keyring.
It is used by users with a valid main key or a valid packager key.
NOTE: All comment sections with a MODIFY note need to be edited.
-->
/assign @archlinux/teams/main-key-holders
/label ~"remove packager key"
/title Remove packager key of <!-- MODIFY: Add packager key holder's username -->
<!--
Please do not remove the above quick actions, which automatically label the
issue and assign relevant users.
-->
# Remove a packager key
## Details
- Username: <!-- MODIFY: Add the @-prefixed username -->
- PGP key ID: <!-- MODIFY: Add the output of `gpg --keyid-format long --list-key <PACKAGER KEY UID> | sed -n '2p' | tr -d ' '` here -->
- Resignation: <!-- MODIFY: Link to resignation of key holder -->
## Checks
**NOTE**: The below check box **must be** checked before the main key holders
can start to revoke the key.
- [ ] There are [no packages left in any of the official
repositories](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/workflows/Find-packages-signed-by-a-key),
that are signed by the key or any of its subkeys, which is about to be
removed.
### Main key holders
All main key holders should revoke their signature(s) for the given key in a
merge request to this repository using `keyringctl`.
- [ ] @anthraxx
- [ ] @bluewind
- [ ] @demize
- [ ] @diabonas
- [ ] @dvzrv

View File

@ -0,0 +1,34 @@
<!--
This template is used when a new main PGP public key needs to be added to the
distribution's keyring.
It is used by users with a valid packager key after all steps in an
accompanying issue (opened with the template "New Main Key") have been
fulfilled.
-->
/assign @archlinux/teams/main-key-holders
/label ~"new main key"
/title Add main key of <!-- MODIFY: Add the main key holder's username -->
<!--
Please do not remove the above quick actions, which automatically label the
issue and assign relevant users.
-->
# Add a new main key
## Details
- Username: <!-- MODIFY: Add the @-prefixed username -->
- PGP key ID: <!-- MODIFY: Add the "long format" key ID of the PGP public key here -->
Closes <!-- MODIFY: Add #-prefixed issue number, that will be closed by merging this merge request -->
## Checks
### Keyring maintainer
- [ ] All steps in the accompanying ticket are fulfilled.
### Main key holders
- [ ] The public key has been validated according to the [best
practices](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/best-practices#validating-a-key-pair)

View File

@ -0,0 +1,32 @@
<!--
This template is used when a new packager PGP public key needs to be added to
the distribution's keyring.
It is either used by the sponsor of a new packager or by an existing packager
when adding a new key for themself after all steps in an accompanying issue
(opened with the template "New Packager Key") have been fulfilled..
-->
/assign_reviewer @archlinux/teams/main-key-holders
/label ~"new packager key"
/title Add packager key of <!-- MODIFY: Add the packager key holder's username -->
<!--
Please do not remove the above quick actions, which automatically label the
issue and assign relevant users.
-->
# Add a new packager key
## Details
- Username: <!-- MODIFY: Add the @-prefixed username -->
- PGP key ID: <!-- MODIFY: Add the "long format" key ID of the PGP public key here -->
Related issue: <!-- MODIFY: Add #-prefixed issue number -->
## Checks
- [ ] All steps in the accompanying ticket are fulfilled.
### Main key holders
- [ ] The public key has been validated according to the [best
practices](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/wikis/best-practices#validating-a-key-pair)

View File

@ -0,0 +1,31 @@
<!--
This template is used when an existing main PGP public key needs to be removed
from the distribution's keyring.
It is used by users with a valid main key after all steps in an accompanying
issue (opened with the template "Remove Main Key") have been fulfilled.
-->
/assign_reviewer @archlinux/teams/main-key-holders
/label ~"remove main key"
/title Remove main key of <!-- MODIFY: Add the main key holder's username -->
<!--
Please do not remove the above quick actions, which automatically label the
issue and assign relevant users.
-->
# Remove a main key
## Details
- Username: <!-- MODIFY: Add the @-prefixed username -->
- PGP key ID: <!-- MODIFY: Add the "long format" key ID of the PGP public key here -->
Related issue: <!-- MODIFY: Add #-prefixed issue number -->
## Checks
### Keyring maintainer
- [ ] There are more than or equal to three valid main keys remaining after
removal of this key.
- [ ] All packagers have at least three valid main key signatures for their
packager key after removal of this key.

View File

@ -0,0 +1,30 @@
<!--
This template is used when an existing packager PGP public key needs to be
removed from the distribution's keyring.
It is used by users with a valid main key or a valid packager key after all
steps in an accompanying issue (opened with the template "Remove Packager Key")
have been fulfilled.
-->
/assign_reviewer @archlinux/teams/main-key-holders
/label ~"remove packager key"
/title Remove packager key of <!-- MODIFY: Add the packager's username -->
<!--
Please do not remove the above quick actions, which automatically label the
issue and assign relevant users as reviewers.
-->
# Remove a packager key
## Details
- Username: <!-- MODIFY: Add the @-prefixed username -->
- PGP key ID: <!-- MODIFY: Add the "long format" key ID of the PGP public key here -->
Related issue: <!-- MODIFY: Add #-prefixed issue number -->
## Checks
### Keyring maintainer
- [ ] There are no packages left in any of the official repositories, that are
signed by the key which is about to be removed.

66
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,66 @@
# Contributing
These are the contribution guidelines for archlinux-keyring.
All code contributions fall under the terms of the GPL-3.0-or-later (see
[LICENSE](LICENSE)).
Please read our distribution-wide [Code of
Conduct](https://terms.archlinux.org/docs/code-of-conduct/) before
contributing, to understand what actions will and will not be tolerated.
Development of archlinux-keyring takes place on Arch Linux' Gitlab:
https://gitlab.archlinux.org/archlinux/archlinux-keyring.
Any merge request to the repository requires two approvals of authorized
approvers (the current main key holders).
## Discussion
Discussion around archlinux-keyring may take place on the [arch-projects
mailing list](https://lists.archlinux.org/listinfo/arch-projects) and in
[#archlinux-projects](ircs://irc.libera.chat/archlinux-projects) on [Libera
Chat](https://libera.chat/).
## Requirements
The following additional packages need to be installed to be able to lint
and develop this project:
* python-black
* python-coverage
* python-isort
* python-pytest
* python-tomli
* flake8
* mypy
## Keyringctl
The `keyringctl` script is written in typed python, which makes use of
[sequoia](https://sequoia-pgp.org/)'s `sq` command.
The script is type checked, linted and formatted using standard tooling.
When providing a merge request make sure to run `make lint`.
## Testing
Test cases are developed per module in the [test](test) directory and should
consist of atomic single expectation tests. A Huge test case asserting various
different expectations are discouraged and should be split into finer grained
test cases.
To execute all tests using pytest
```bash
make test
```
To run keyring integrity and consistency checks
```bash
make check
```
## Web Key Directory
Only tagged releases are built and exposed via WKD. This helps to ensure, that
inconsistent state of the keyring is not exposed to the enduser, which may make
use of it instantaneously.

674
LICENSE Normal file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@ -1,20 +1,72 @@
V=20130926
SHELL = /bin/bash
PREFIX ?= /usr/local
BUILD_DIR ?= build
KEYRING_TARGET_DIR ?= $(PREFIX)/share/pacman/keyrings/
SCRIPT_TARGET_DIR ?= $(PREFIX)/bin
SYSTEMD_SYSTEM_UNIT_DIR ?= $(shell pkgconf --variable systemd_system_unit_dir systemd)
WKD_FQDN ?= archlinux.org
WKD_BUILD_DIR ?= $(BUILD_DIR)/wkd
KEYRING_FILE=archlinux.gpg
KEYRING_REVOKED_FILE=archlinux-revoked
KEYRING_TRUSTED_FILE=archlinux-trusted
WKD_SYNC_SCRIPT=archlinux-keyring-wkd-sync
WKD_SYNC_SERVICE_IN=archlinux-keyring-wkd-sync.service.in
WKD_SYNC_SERVICE=archlinux-keyring-wkd-sync.service
WKD_SYNC_TIMER=archlinux-keyring-wkd-sync.timer
SYSTEMD_TIMER_DIR=$(SYSTEMD_SYSTEM_UNIT_DIR)/timers.target.wants/
SOURCES := $(shell find keyring) $(shell find libkeyringctl -name '*.py' -or -type d) keyringctl
PREFIX = /usr/local
all: build
install:
install -dm755 $(DESTDIR)$(PREFIX)/share/pacman/keyrings/
install -m0644 archlinux{.gpg,-trusted,-revoked} $(DESTDIR)$(PREFIX)/share/pacman/keyrings/
lint:
black --check --diff keyringctl libkeyringctl tests
isort --diff .
flake8 keyringctl libkeyringctl tests
mypy --install-types --non-interactive keyringctl libkeyringctl tests
fmt:
black .
isort .
check:
./keyringctl -v check
test:
coverage run
coverage xml
coverage report --fail-under=100.0
build: $(SOURCES)
./keyringctl -v $(BUILD_DIR)
wkd: build
sq -f wkd generate -s $(WKD_BUILD_DIR)/ $(WKD_FQDN) $(BUILD_DIR)/$(KEYRING_FILE)
wkd_inspect: wkd
for file in $(WKD_BUILD_DIR)/.well-known/openpgpkey/$(WKD_FQDN)/hu/*; do sq inspect $$file; done
wkd_sync_service: wkd_sync/$(WKD_SYNC_SERVICE_IN)
sed -e 's|SCRIPT_TARGET_DIR|$(SCRIPT_TARGET_DIR)|' wkd_sync/$(WKD_SYNC_SERVICE_IN) > $(BUILD_DIR)/$(WKD_SYNC_SERVICE)
clean:
rm -rf $(BUILD_DIR) $(WKD_BUILD_DIR)
install: build wkd_sync_service
install -vDm 644 build/{$(KEYRING_FILE),$(KEYRING_REVOKED_FILE),$(KEYRING_TRUSTED_FILE)} -t $(DESTDIR)$(KEYRING_TARGET_DIR)
install -vDm 755 wkd_sync/$(WKD_SYNC_SCRIPT) -t $(DESTDIR)$(SCRIPT_TARGET_DIR)
install -vDm 644 build/$(WKD_SYNC_SERVICE) -t $(DESTDIR)$(SYSTEMD_SYSTEM_UNIT_DIR)
install -vDm 644 wkd_sync/$(WKD_SYNC_TIMER) -t $(DESTDIR)$(SYSTEMD_SYSTEM_UNIT_DIR)
install -vdm 755 $(DESTDIR)$(SYSTEMD_TIMER_DIR)
ln -fsv ../$(WKD_SYNC_TIMER) $(DESTDIR)$(SYSTEMD_TIMER_DIR)/$(WKD_SYNC_TIMER)
uninstall:
rm -f $(DESTDIR)$(PREFIX)/share/pacman/keyrings/archlinux{.gpg,-trusted,-revoked}
rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/pacman/keyrings/
rm -fv $(DESTDIR)$(KEYRING_TARGET_DIR)/{$(KEYRING_FILE),$(KEYRING_REVOKED_FILE),$(KEYRING_TRUSTED_FILE)}
rmdir -pv --ignore-fail-on-non-empty $(DESTDIR)$(KEYRING_TARGET_DIR)
rm -v $(DESTDIR)$(SCRIPT_TARGET_DIR)/$(WKD_SYNC_SCRIPT)
rmdir -pv --ignore-fail-on-non-empty $(DESTDIR)$(SCRIPT_TARGET_DIR)
rm -v $(DESTDIR)$(SYSTEMD_SYSTEM_UNIT_DIR)/{$(WKD_SYNC_SERVICE),$(WKD_SYNC_TIMER)}
rmdir -pv --ignore-fail-on-non-empty $(DESTDIR)$(SYSTEMD_SYSTEM_UNIT_DIR)
rm -v $(DESTDIR)$(SYSTEMD_TIMER_DIR)/$(WKD_SYNC_TIMER)
rmdir -pv --ignore-fail-on-non-empty $(DESTDIR)$(SYSTEMD_TIMER_DIR)
dist:
git archive --format=tar --prefix=archlinux-keyring-$(V)/ $(V) | gzip -9 > archlinux-keyring-$(V).tar.gz
gpg --detach-sign --use-agent archlinux-keyring-$(V).tar.gz
upload:
scp archlinux-keyring-$(V).tar.gz archlinux-keyring-$(V).tar.gz.sig nymeria.archlinux.org:/srv/ftp/other/archlinux-keyring/
.PHONY: install uninstall dist upload
.PHONY: all lint fmt check test clean install uninstall wkd wkd_inspect

158
README.md Normal file
View File

@ -0,0 +1,158 @@
# condorcore-keyring
The archlinux-keyring project holds PGP packet material and tooling
(`keyringctl`) to create the distribution keyring for Arch Linux.
The keyring is used by pacman to establish the web of trust for the packagers
of the distribution.
The PGP packets describing the main signing keys can be found below the
[keyring/main](keyring/main) directory, while those of the packagers are located below the
[keyring/packager](keyring/packager) directory.
## Requirements
The following packages need to be installed to be able to create a PGP keyring
from the provided data structure and to install it:
Build:
* make
* findutils
* pkgconf
* systemd
Runtime:
* python
* sequoia-sq >= 0.31.0
Optional:
* hopenpgp-tools (verify)
* git (ci)
## Usage
### Build
Build all PGP artifacts (keyring, ownertrust, revoked files) to the build directory
```bash
./keyringctl build
```
### Import
Import a new packager key by deriving the username from the filename.
```bash
./keyringctl import <username>.asc
```
Alternatively import a file or directory and override the username
```bash
./keyringctl import --name <username> <file_or_directory...>
```
Updates to existing keys will automatically derive the username from the known fingerprint.
```bash
./keyringctl import <file_or_directory...>
```
Main key imports support the same options plus a mandatory `--main`
```bash
./keyringctl import --main <username>.asc
```
### Export
Export the whole keyring including main and packager to stdout
```bash
./keyringctl export
```
Limit to specific certs using an output file
```bash
./keyringctl export <username_or_fingerprint_or_directory...> --output <filename>
```
### List
List all certificates in the keyring
```bash
./keyringctl list
```
Only show a specific main key
```bash
./keyringctl list --main <username_or_fingerprint...>
```
### Inspect
Inspect all certificates in the keyring
```bash
./keyringctl inspect
```
Only inspect a specific main key
```bash
./keyringctl inspect --main <username_or_fingerprint_or_directory...>
```
### Verify
Verify certificates against modern expectations and assumptions
```bash
./keyringctl verify <username_or_fingerprint_or_directory...>
```
## Installation
To install archlinux-keyring system-wide use the included `Makefile`:
```bash
make install
```
## Contribute
Read our [contributing guide](CONTRIBUTING.md) to learn more about guidelines and
how to provide fixes or improvements for the code base.
## Releases
[Releases of
archlinux-keyring](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/tags)
are exclusively created by [keyring maintainers](https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/project_members?with_inherited_permissions=exclude).
The tags are signed with one of the following legitimate keys:
```
condorbs master key <contacto@condorbs.net>
5972 44DB EA52 EC6E FE5F 36A4 FDD4 2A59 FD43 C07B
Kevin Muñoz (CyberSecurity Engineer) <kmunoz@condorbs.net>
2B9D 22B4 1F2A F104 2BFC E73A 3CA0 B9DF 1BE7 CE09
Jesus Martin Ortega Martinez (Sysadmin/Backend Developer) <jortega@condorbs.net>
9E64 6BB0 630C 8FD1 8ACD 1554 1B93 E6A7 66CD 229D
```
To verify a tag, first import the relevant PGP keys:
```bash
gpg --auto-key-locate wkd --search-keys <email-from-above>
```
Afterwards a tag can be verified from a clone of this repository. Please note
that one **must** check the used key of the signature against the legitimate
keys listed above:
```bash
git verify-tag <tag>
```
## License
Archlinux-keyring is licensed under the terms of the **GPL-3.0-or-later** (see
[LICENSE](LICENSE)).

View File

@ -1 +0,0 @@
BC1FBE4D2826A0B51E47ED62E2539214C6C11350

View File

@ -1,5 +0,0 @@
AB19265E5D7D20687D303246BA1DFB64FFF979E7:4:
27FFC4769E19F096D41D9265A04F9397CDFD6BB0:4:
44D4A033AC140143927397D47EFD567D4C7EA887:4:
0E8B644079F599DFC1DDC3973348882F6AC6A4C2:4:
684148BB25B49E986A4944C55184252D824B18E8:4:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEZO+HvhYJKwYBBAHaRw8BAQdA0ZgcznaDUjbUKMod0O1TPAwzzt/0r4elBhOw
7MbXW4k=
=qB7P
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zjgEZO+KNRIKKwYBBAGXVQEFAQEHQFkPP4NhQp0KsSfhhiTvssqu7PygTGXQi7Qe
H4z+Ud5JAwEIBw==
=n0nQ
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wngEGBYIACAWIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZO+KNQIbDAAKCRD91CpZ
/UPAe/Q1APwMjKPn5u6/qc8iSZNbmVoE4EgOAYS6WTVAcrVV7rF6fQD/Z+pl1zMf
CouDiHO4ZmlFjeNL2eXuZBZCk/lWhEVu/w0=
=WqjU
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zjMEZO+KdRYJKwYBBAHaRw8BAQdAYbnrkxnt+czK37JQ26fC0VrmdCfCSHn2xoEC
i99TBOE=
=wsKX
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wngEGBYIACAWIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZO+KdQIbIAAKCRD91CpZ
/UPAe4DZAP0TghO5H5L+O/fPZGo5JRiYz4UMDGz74LGxPp0gJO+NPwEAtkQwhStj
tdp06YC1pYYE5kXa1LTKYVvpyRiyf2rRogc=
=+Kku
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,5 @@
-----BEGIN PGP ARMORED FILE-----
zS4gKENvbmRvckJTIE1hc3RlciBLZXkpIDxjb250YWN0b0Bjb25kb3Jicy5uZXQ+
=gkv7
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP SIGNATURE-----
wpAEExYIADgWIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZO+HvgIbAwULCQgHAgYV
CgkICwIEFgIDAQIeAQIXgAAKCRD91CpZ/UPAexq8AQCetQu2K7djsOjNcmtzeqKD
2cF9SbLkyuoIzQXiHSC80AEA9H6W/acrWqPxGdfC/xZbYNDQDL+EQ3ACpXJQT3Hy
RwY=
=y5nP
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xpMEZMmVIRMFK4EEACMEIwQAMg6oXItBfN9on9xjiZlu12gJ1tLIh5H8obYC1hdc
8dp5I9/r2SDyModKr3YCRaLnvO9rkwoJ8G7aY0WXyj4O/c0AvosLnDvULoBexQB6
VHtMkWe9ugbB0cZB54EJJr+pdaJUimOyZT0X3QMmSRhTBriAhnU/nk9KDfiZEyMM
b8uZEjk=
=GKHU
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP ARMORED FILE-----
zpcEZMmVIRIFK4EEACMEIwQBtRBYmz2Ikb81Ng2DQ1vNfbSvPegAnBGgeBXcpN/o
lkCPy/ZlknKbcfl3IKQclFFi5+Oxn9wAl7cjUiEJ2I5hwXoAGz5B7+sj+YcFq+rg
0YcXqWZtgzqtHXElvB8cFua1XlVX5/e8nllFImSsWoy+Sx0xfkwnpn6jksvbACRW
ACpuB8YDAQoJ
=LjwU
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP SIGNATURE-----
wrsEGBMKACAWIQSeZGuwYwyP0YrNFVQbk+anZs0inQUCZMmVIQIbDAAKCRAbk+an
Zs0inUO6AgiGHmHLw4H6e4xXqIeagIvOYGYZWjp3L4flgogOUet+04zPV0GiH4aE
bojPlS9Qgis6uzVsdkvg2aTVlT1mNrwoWgIJASQuhhubtoKvM1OqPOE4Wg3dJGXt
435oYPDvCtd7aTleqLzo4Cu5ArSC6mLJ1u0ZmeGBIX2FCbboSHuwpCNca6aN
=F5p6
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zVBKZXN1cyBNYXJ0aW4gT3J0ZWdhIE1hcnRpbmV6IChTeXNhZG1pbi9CYWNrZW5k
IERldmVsb3BlcikgPGpvcnRlZ2FAY29uZG9yYnMubmV0Pg==
=e3s5
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNqa7AAKCRA8oLnfG+fO
CWqZAQD3QajH/taR/uqhPiZru3xo+ylvCi3ZuzaoLSYCMfWUiAEAuAfusmx7Rctj
y8k92/3roCiWz1HgmwGtAXfDAAxguA0=
=3qNK
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPTEhwAKCRD91CpZ/UPA
e2LuAP9tdozKCw1PUpDvfLyC3vKc7EFqJSkDYRhyNYmc+g70tgEAtKaD9hLGVY7E
7S7+MHx3ThOfcz7gp9mTRzrZ//NFswk=
=z6WD
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,9 @@
-----BEGIN PGP SIGNATURE-----
wsATBBMTCgA4FiEEnmRrsGMMj9GKzRVUG5Pmp2bNIp0FAmTJ6B8CGwMFCwkIBwIG
FQoJCAsCBBYCAwECHgECF4AACgkQG5Pmp2bNIp0P/AIJAdxv/DbUoqRGRnwdcEBF
wqZi12/v+K9IGgLsvmOyAlluInp/aWG8w6iO1Gcr7uz5ChQ+qCwPBe3cBQRNiE3e
52lfAgjUjvEO63nIwCCgERUNqaaDZorlVYUlNG/KO1bJ8BT6iJYI2ruj10jt3T8H
OQD7R+gE3Kye2v3QOj8h7XSDF0e3ZQ==
=8eqD
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zVpKZXN1cyBNYXJ0aW4gT3J0ZWdhIE1hcnRpbmV6IChTeXNhZG1pbi9CYWNrZW5k
IERldmVsb3BlcikgPG1hcnRpbi5vcnRlZ2EuYXJhc2hpQGdtYWlsLmNvbT4=
=HM/p
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNqa7AAKCRA8oLnfG+fO
CS1LAP44EV14Z4lOt+XiVFUzmBujq60m4/bvTjbB77tD9LvNegEAjeUkPoi3JtHx
WBMKHcJD07LnWS0hqrdlPxFl9dp5Uwg=
=Y2Va
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPTEgQAKCRD91CpZ/UPA
e0rYAQCl6lPg73DMmTeAUV1Uqi2nyMjNIefvEtUY2uabv8FvMwD9FiFMI0yDbmoc
c/sYuHcQqZhxzBJDlOYymnjw9OAv+QM=
=wrpE
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,9 @@
-----BEGIN PGP SIGNATURE-----
wsATBBMTCgA4FiEEnmRrsGMMj9GKzRVUG5Pmp2bNIp0FAmTJ6dECGwMFCwkIBwIG
FQoJCAsCBBYCAwECHgECF4AACgkQG5Pmp2bNIp3QYwIJARhW4FH+4LaSuqcJF+A3
DVlAM446erNpUWx0IZGreiO559IK+1YKdDlMXgiag26XVXKNM2QGrsHhAwU9+dLx
fC4FAgdO1bF1oPT9ASKljXqcFfy4+t2X/8nv1BMTl5u9esCP7VZ9xURirIpklJwY
NcDtRWMZSX4xrMBnkdn+x08EwLmzTQ==
=vhPl
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zVlKZXN1cyBNYXJ0aW4gT3J0ZWdhIE1hcnRpbmV6IChTeXNhZG1pbi9CYWNrZW5k
IERldmVsb3BlcikgPG1hcnRpbm9ydGVnYUBjaWVuY2lhcy51bmFtLm14Pg==
=ZuCG
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNqa7AAKCRA8oLnfG+fO
CS0rAQCJXdLjaSluAAs2/llUmSyNMEiHrewhW/1xMGT+flLeJwD+IbKRpqVSnxdv
1Zf1l7V4twaNTR9Szn+y79/iAXKi3Qo=
=xMYy
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPTEiAAKCRD91CpZ/UPA
ewEIAQD1Tv6GyecgA8IveFHfGVRus/hCgAoSc4PMMyWI15ypyQEA+FNlZsmueGul
kfskMpwMmp/BkVYi3PtBja2G9yNRggc=
=BnkF
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,9 @@
-----BEGIN PGP SIGNATURE-----
wsAUBBMTCgA4FiEEnmRrsGMMj9GKzRVUG5Pmp2bNIp0FAmTJ6X8CGwMFCwkIBwIG
FQoJCAsCBBYCAwECHgECF4AACgkQG5Pmp2bNIp2agwIJAcixnfmr/NmpYJa0oS6w
YB619pekk3gMzeLaBX3VXbHus3p/KPPcBIq0NbjGe6V7pcwHW2qd9Iq43zH/LtGD
CVnYAgkBCv9EzRpbXQrMNtc3fHiR/vbCRIeP4LVnQYcTImFh7+nrlmr01Fl4gy4I
MEF0ydpFMwwTLdA18CpjVWJysaLPogc=
=Fcxd
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEZNlVYBYJKwYBBAHaRw8BAQdAqrHl4S2UIU1DVv75VVqxYWzMXIj6DUYOEdx5
9S54ziY=
=AoQq
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zjMEZNlWbxYJKwYBBAHaRw8BAQdAV2fQb6zL0/FtXruJHxiYulW0C/RVdJH5u/st
dZ4XCao=
=xMzn
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wngEGBYIACAWIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNlWbwIbIAAKCRA8oLnf
G+fOCcclAP9vH93UilCUalYkdkg0IIimuOrYJAFE3PoYzM3Yfh9VSAD/b750y/y6
5soKAhwaVWI0mD+2ktStLv5GQQVsD9aYqAI=
=Vrin
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zjgEZNlWvxIKKwYBBAGXVQEFAQEHQEQesoNgKWVLnSEVok8pd9FyElkGY1zDKXsi
ZaVYcTRkAwEIBw==
=VQWX
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wngEGBYIACAWIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNlWvwIbDAAKCRA8oLnf
G+fOCU8IAP43YS3bfntHouOiZk7UuxLbHeXQl6YkBTgO0W+uKTPtrwD8CBgI2PED
ktTsoBkDQxKzGJRmCRwnaK1yIipT/mwQEQ8=
=T+Yn
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zTtLZXZpbiBNdcOxb3ogKENpYmVyU2VjdXJpdHkgRW5naW5lZXIpIDxrbXVub3pA
Y29uZG9yYnMubmV0Pg==
=dz9S
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP SIGNATURE-----
wpAEExYIADgWIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNlVYAIbAwULCQgHAgYV
CgkICwIEFgIDAQIeAQIXgAAKCRA8oLnfG+fOCS2YAP9NkmVFAljJiYFLtc7o1xB3
xT/qtfJKw95khnhQFLqd5AEAsb5vlZ/bDvb56Ygea+O/ar+qpq1q+cGvnUx2/OGP
Jg4=
=zdAS
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPS9OAAKCRD91CpZ/UPA
e7bFAQCN21II7aHOe/paU/jX2vyQ33XS3oxJVpmQSEzp6R7U/QEAzwXCicEeAV3T
71ymIsxFKu+fMHmpiSSvmAvzhxUBhwQ=
=Lpv2
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zTtLZXZpbiBNdcOxb3ogKEN5YmVyU2VjdXJpdHkgRW5naW5lZXIpIDxrbXVub3pA
Y29uZG9yYnMubmV0Pg==
=sa4s
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,11 @@
-----BEGIN PGP SIGNATURE-----
wsBmBBMWCADOAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAhkBFiEEK50itB8q
8QQr/Oc6PKC53xvnzgkFAmTnd4NDFIAAAAAAEAAqcHJvb2ZAYXJpYWRuZS5pZGh0
dHBzOi8vbWFzdG9kb24uY2VudGF1cmljb3JleC5uZXQvQGttdW5vek4UgAAAAAAQ
ADVwcm9vZkBhcmlhZG5lLmlkaHR0cHM6Ly90Lm1lL0Vycm9yNDA0SGFja2VyTm90
Rm91bmQ/cHJvb2Y9UGVsb2NvbmNoYTMACgkQPKC53xvnzgk04wD/X+sXGUkHidbq
LnXHpIRALPWj2Z3xMZ0lhQtGoFwzleUA/3qo1clCRsshDzPcogzhb17suxeeFCpc
xnhBBgIiQHAA
=kX0Z
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPS9MQAKCRD91CpZ/UPA
e1UaAP91tm9ss0SMP48+hyhqwijwWeGEhag1NFh2rsHJvZJI6wEArG3FTI9fp62K
iz6rdhGhqCNLy+xzapAxbWQSdbDl4AM=
=1F9Z
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xpMEZMmVIRMFK4EEACMEIwQAMg6oXItBfN9on9xjiZlu12gJ1tLIh5H8obYC1hdc
8dp5I9/r2SDyModKr3YCRaLnvO9rkwoJ8G7aY0WXyj4O/c0AvosLnDvULoBexQB6
VHtMkWe9ugbB0cZB54EJJr+pdaJUimOyZT0X3QMmSRhTBriAhnU/nk9KDfiZEyMM
b8uZEjk=
=GKHU
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP ARMORED FILE-----
zpcEZMmVIRIFK4EEACMEIwQBtRBYmz2Ikb81Ng2DQ1vNfbSvPegAnBGgeBXcpN/o
lkCPy/ZlknKbcfl3IKQclFFi5+Oxn9wAl7cjUiEJ2I5hwXoAGz5B7+sj+YcFq+rg
0YcXqWZtgzqtHXElvB8cFua1XlVX5/e8nllFImSsWoy+Sx0xfkwnpn6jksvbACRW
ACpuB8YDAQoJ
=LjwU
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP SIGNATURE-----
wrsEGBMKACAWIQSeZGuwYwyP0YrNFVQbk+anZs0inQUCZMmVIQIbDAAKCRAbk+an
Zs0inUO6AgiGHmHLw4H6e4xXqIeagIvOYGYZWjp3L4flgogOUet+04zPV0GiH4aE
bojPlS9Qgis6uzVsdkvg2aTVlT1mNrwoWgIJASQuhhubtoKvM1OqPOE4Wg3dJGXt
435oYPDvCtd7aTleqLzo4Cu5ArSC6mLJ1u0ZmeGBIX2FCbboSHuwpCNca6aN
=F5p6
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zVBKZXN1cyBNYXJ0aW4gT3J0ZWdhIE1hcnRpbmV6IChTeXNhZG1pbi9CYWNrZW5k
IERldmVsb3BlcikgPGpvcnRlZ2FAY29uZG9yYnMubmV0Pg==
=e3s5
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNqa7AAKCRA8oLnfG+fO
CWqZAQD3QajH/taR/uqhPiZru3xo+ylvCi3ZuzaoLSYCMfWUiAEAuAfusmx7Rctj
y8k92/3roCiWz1HgmwGtAXfDAAxguA0=
=3qNK
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPTEhwAKCRD91CpZ/UPA
e2LuAP9tdozKCw1PUpDvfLyC3vKc7EFqJSkDYRhyNYmc+g70tgEAtKaD9hLGVY7E
7S7+MHx3ThOfcz7gp9mTRzrZ//NFswk=
=z6WD
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,9 @@
-----BEGIN PGP SIGNATURE-----
wsATBBMTCgA4FiEEnmRrsGMMj9GKzRVUG5Pmp2bNIp0FAmTJ6B8CGwMFCwkIBwIG
FQoJCAsCBBYCAwECHgECF4AACgkQG5Pmp2bNIp0P/AIJAdxv/DbUoqRGRnwdcEBF
wqZi12/v+K9IGgLsvmOyAlluInp/aWG8w6iO1Gcr7uz5ChQ+qCwPBe3cBQRNiE3e
52lfAgjUjvEO63nIwCCgERUNqaaDZorlVYUlNG/KO1bJ8BT6iJYI2ruj10jt3T8H
OQD7R+gE3Kye2v3QOj8h7XSDF0e3ZQ==
=8eqD
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zVpKZXN1cyBNYXJ0aW4gT3J0ZWdhIE1hcnRpbmV6IChTeXNhZG1pbi9CYWNrZW5k
IERldmVsb3BlcikgPG1hcnRpbi5vcnRlZ2EuYXJhc2hpQGdtYWlsLmNvbT4=
=HM/p
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNqa7AAKCRA8oLnfG+fO
CS1LAP44EV14Z4lOt+XiVFUzmBujq60m4/bvTjbB77tD9LvNegEAjeUkPoi3JtHx
WBMKHcJD07LnWS0hqrdlPxFl9dp5Uwg=
=Y2Va
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPTEgQAKCRD91CpZ/UPA
e0rYAQCl6lPg73DMmTeAUV1Uqi2nyMjNIefvEtUY2uabv8FvMwD9FiFMI0yDbmoc
c/sYuHcQqZhxzBJDlOYymnjw9OAv+QM=
=wrpE
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,9 @@
-----BEGIN PGP SIGNATURE-----
wsATBBMTCgA4FiEEnmRrsGMMj9GKzRVUG5Pmp2bNIp0FAmTJ6dECGwMFCwkIBwIG
FQoJCAsCBBYCAwECHgECF4AACgkQG5Pmp2bNIp3QYwIJARhW4FH+4LaSuqcJF+A3
DVlAM446erNpUWx0IZGreiO559IK+1YKdDlMXgiag26XVXKNM2QGrsHhAwU9+dLx
fC4FAgdO1bF1oPT9ASKljXqcFfy4+t2X/8nv1BMTl5u9esCP7VZ9xURirIpklJwY
NcDtRWMZSX4xrMBnkdn+x08EwLmzTQ==
=vhPl
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zVlKZXN1cyBNYXJ0aW4gT3J0ZWdhIE1hcnRpbmV6IChTeXNhZG1pbi9CYWNrZW5k
IERldmVsb3BlcikgPG1hcnRpbm9ydGVnYUBjaWVuY2lhcy51bmFtLm14Pg==
=ZuCG
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNqa7AAKCRA8oLnfG+fO
CS0rAQCJXdLjaSluAAs2/llUmSyNMEiHrewhW/1xMGT+flLeJwD+IbKRpqVSnxdv
1Zf1l7V4twaNTR9Szn+y79/iAXKi3Qo=
=xMYy
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPTEiAAKCRD91CpZ/UPA
ewEIAQD1Tv6GyecgA8IveFHfGVRus/hCgAoSc4PMMyWI15ypyQEA+FNlZsmueGul
kfskMpwMmp/BkVYi3PtBja2G9yNRggc=
=BnkF
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,9 @@
-----BEGIN PGP SIGNATURE-----
wsAUBBMTCgA4FiEEnmRrsGMMj9GKzRVUG5Pmp2bNIp0FAmTJ6X8CGwMFCwkIBwIG
FQoJCAsCBBYCAwECHgECF4AACgkQG5Pmp2bNIp2agwIJAcixnfmr/NmpYJa0oS6w
YB619pekk3gMzeLaBX3VXbHus3p/KPPcBIq0NbjGe6V7pcwHW2qd9Iq43zH/LtGD
CVnYAgkBCv9EzRpbXQrMNtc3fHiR/vbCRIeP4LVnQYcTImFh7+nrlmr01Fl4gy4I
MEF0ydpFMwwTLdA18CpjVWJysaLPogc=
=Fcxd
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEZNlVYBYJKwYBBAHaRw8BAQdAqrHl4S2UIU1DVv75VVqxYWzMXIj6DUYOEdx5
9S54ziY=
=AoQq
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zjMEZNlWbxYJKwYBBAHaRw8BAQdAV2fQb6zL0/FtXruJHxiYulW0C/RVdJH5u/st
dZ4XCao=
=xMzn
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wngEGBYIACAWIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNlWbwIbIAAKCRA8oLnf
G+fOCcclAP9vH93UilCUalYkdkg0IIimuOrYJAFE3PoYzM3Yfh9VSAD/b750y/y6
5soKAhwaVWI0mD+2ktStLv5GQQVsD9aYqAI=
=Vrin
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zjgEZNlWvxIKKwYBBAGXVQEFAQEHQEQesoNgKWVLnSEVok8pd9FyElkGY1zDKXsi
ZaVYcTRkAwEIBw==
=VQWX
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wngEGBYIACAWIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNlWvwIbDAAKCRA8oLnf
G+fOCU8IAP43YS3bfntHouOiZk7UuxLbHeXQl6YkBTgO0W+uKTPtrwD8CBgI2PED
ktTsoBkDQxKzGJRmCRwnaK1yIipT/mwQEQ8=
=T+Yn
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zTtLZXZpbiBNdcOxb3ogKENpYmVyU2VjdXJpdHkgRW5naW5lZXIpIDxrbXVub3pA
Y29uZG9yYnMubmV0Pg==
=dz9S
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,8 @@
-----BEGIN PGP SIGNATURE-----
wpAEExYIADgWIQQrnSK0HyrxBCv85zo8oLnfG+fOCQUCZNlVYAIbAwULCQgHAgYV
CgkICwIEFgIDAQIeAQIXgAAKCRA8oLnfG+fOCS2YAP9NkmVFAljJiYFLtc7o1xB3
xT/qtfJKw95khnhQFLqd5AEAsb5vlZ/bDvb56Ygea+O/ar+qpq1q+cGvnUx2/OGP
Jg4=
=zdAS
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPS9OAAKCRD91CpZ/UPA
e7bFAQCN21II7aHOe/paU/jX2vyQ33XS3oxJVpmQSEzp6R7U/QEAzwXCicEeAV3T
71ymIsxFKu+fMHmpiSSvmAvzhxUBhwQ=
=Lpv2
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,6 @@
-----BEGIN PGP ARMORED FILE-----
zTtLZXZpbiBNdcOxb3ogKEN5YmVyU2VjdXJpdHkgRW5naW5lZXIpIDxrbXVub3pA
Y29uZG9yYnMubmV0Pg==
=sa4s
-----END PGP ARMORED FILE-----

View File

@ -0,0 +1,11 @@
-----BEGIN PGP SIGNATURE-----
wsBmBBMWCADOAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAhkBFiEEK50itB8q
8QQr/Oc6PKC53xvnzgkFAmTnd4NDFIAAAAAAEAAqcHJvb2ZAYXJpYWRuZS5pZGh0
dHBzOi8vbWFzdG9kb24uY2VudGF1cmljb3JleC5uZXQvQGttdW5vek4UgAAAAAAQ
ADVwcm9vZkBhcmlhZG5lLmlkaHR0cHM6Ly90Lm1lL0Vycm9yNDA0SGFja2VyTm90
Rm91bmQ/cHJvb2Y9UGVsb2NvbmNoYTMACgkQPKC53xvnzgk04wD/X+sXGUkHidbq
LnXHpIRALPWj2Z3xMZ0lhQtGoFwzleUA/3qo1clCRsshDzPcogzhb17suxeeFCpc
xnhBBgIiQHAA
=kX0Z
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
wnUEEBYIAB0WIQRZckTb6lLsbv5fNqT91CpZ/UPAewUCZPS9MQAKCRD91CpZ/UPA
e1UaAP91tm9ss0SMP48+hyhqwijwWeGEhag1NFh2rsHJvZJI6wEArG3FTI9fp62K
iz6rdhGhqCNLy+xzapAxbWQSdbDl4AM=
=1F9Z
-----END PGP SIGNATURE-----

8
keyringctl Executable file
View File

@ -0,0 +1,8 @@
#!/usr/bin/env python3
#
# SPDX-License-Identifier: GPL-3.0-or-later
from libkeyringctl.cli import main
if __name__ == "__main__":
main()

View File

45
libkeyringctl/ci.py Normal file
View File

@ -0,0 +1,45 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from os import environ
from pathlib import Path
from typing import List
from .git import git_changed_files
from .util import get_parent_cert_paths
from .verify import verify
def ci(working_dir: Path, keyring_root: Path, project_root: Path) -> None:
"""Verify certificates against modern expectations using `sq keyring lint` and hokey
Currently only newly added certificates will be checked against the expectations as existing
keys are not all fully compatible with those assumptions.
New certificates are determined by using $CI_MERGE_REQUEST_DIFF_BASE_SHA as the base,
Parameters
----------
working_dir: A directory to use for temporary files
keyring_root: The keyring root directory to look up username shorthand sources
project_root: Path to the root of the git repository
"""
ci_merge_request_diff_base = environ.get("CI_MERGE_REQUEST_DIFF_BASE_SHA")
created, deleted, modified = git_changed_files(
git_path=project_root, base=ci_merge_request_diff_base, paths=[Path("keyring")]
)
changed_certificates: List[Path] = list(get_parent_cert_paths(paths=created + deleted + modified))
verify(
working_dir=working_dir,
keyring_root=keyring_root,
sources=changed_certificates,
lint_hokey=False,
lint_sq_keyring=False,
)
added_certificates: List[Path] = [
path for path in changed_certificates if (path / f"{path.name}.asc").relative_to(project_root) in created
]
if added_certificates:
verify(working_dir=working_dir, keyring_root=keyring_root, sources=added_certificates)

229
libkeyringctl/cli.py Normal file
View File

@ -0,0 +1,229 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from argparse import ArgumentParser
from logging import DEBUG
from logging import basicConfig
from logging import debug
from pathlib import Path
from tempfile import TemporaryDirectory
from tempfile import mkdtemp
from .ci import ci
from .keyring import Username
from .keyring import build
from .keyring import convert
from .keyring import export
from .keyring import inspect_keyring
from .keyring import list_keyring
from .types import TrustFilter
from .util import absolute_path
from .util import cwd
from .verify import verify
parser = ArgumentParser()
parser.add_argument(
"-v", "--verbose", action="store_true", help="Causes to print debugging messages about the progress"
)
parser.add_argument("--wait", action="store_true", help="Block before cleaning up the temp directory")
parser.add_argument(
"-f",
"--force",
action="store_true",
default=False,
help="force the execution of subcommands (e.g. overwriting of files)",
)
subcommands = parser.add_subparsers(dest="subcommand")
convert_parser = subcommands.add_parser(
"convert",
help="convert one or multiple PGP public keys to a decomposed directory structure",
)
convert_parser.add_argument("source", type=absolute_path, nargs="+", help="Files or directorie to convert")
convert_parser.add_argument("--target", type=absolute_path, help="Target directory instead of a random tmpdir")
convert_parser.add_argument(
"--name",
type=Username,
default=None,
help="override the username to use (only useful when using a single file as source)",
)
import_parser = subcommands.add_parser(
"import",
help="import one or several PGP keys to the keyring directory structure",
)
import_parser.add_argument("source", type=absolute_path, nargs="+", help="Files or directories to import")
import_parser.add_argument(
"--name",
type=Username,
default=None,
help="override the username to use (only useful when using a single file as source)",
)
import_parser.add_argument("--main", action="store_true", help="Import a main signing key into the keyring")
export_parser = subcommands.add_parser(
"export",
help="export a directory structure of PGP packet data to a combined file",
)
export_parser.add_argument("-o", "--output", type=absolute_path, help="file to write PGP packet data to")
export_parser.add_argument(
"source",
nargs="*",
help="username, fingerprint or directories containing certificates",
type=absolute_path,
)
build_parser = subcommands.add_parser(
"build",
help="build keyring PGP artifacts alongside ownertrust and revoked status files",
)
list_parser = subcommands.add_parser(
"list",
help="list the certificates in the keyring",
)
list_parser.add_argument("--main", action="store_true", help="List main signing keys instead of packager keys")
list_parser.add_argument(
"--trust",
choices=[e.value for e in TrustFilter],
default=TrustFilter.all.value,
help="Filter the list based on trust",
)
list_parser.add_argument(
"source",
nargs="*",
help="username, fingerprint or directories containing certificates",
type=absolute_path,
)
inspect_parser = subcommands.add_parser(
"inspect",
help="inspect certificates in the keyring and pretty print the data",
)
inspect_parser.add_argument(
"source",
nargs="*",
help="username, fingerprint or directories containing certificates",
type=absolute_path,
)
verify_parser = subcommands.add_parser(
"verify",
help="verify certificates against modern expectations",
)
verify_parser.add_argument(
"source",
nargs="*",
help="username, fingerprint or directories containing certificates",
type=absolute_path,
)
verify_parser.add_argument("--no-lint-hokey", dest="lint_hokey", action="store_false", help="Do not run hokey lint")
verify_parser.add_argument(
"--no-lint-sq-keyring", dest="lint_sq_keyring", action="store_false", help="Do not run sq keyring lint"
)
verify_parser.set_defaults(lint_hokey=True, lint_sq_keyring=True)
check_parser = subcommands.add_parser(
"check",
help="Run keyring integrity and consistency checks",
)
ci_parser = subcommands.add_parser(
"ci",
help="ci command to verify certain aspects and expectations in pipelines",
)
def main() -> None: # noqa: ignore=C901
args = parser.parse_args()
if args.verbose:
basicConfig(level=DEBUG)
# temporary working directory that gets auto cleaned
with TemporaryDirectory(prefix="arch-keyringctl-") as tempdir:
project_root = Path(".").absolute()
keyring_root = Path("keyring").absolute()
working_dir = Path(tempdir)
debug(f"Working directory: {working_dir}")
with cwd(working_dir):
if "convert" == args.subcommand:
target_dir = args.target or Path(mkdtemp(prefix="arch-keyringctl-")).absolute()
print(
convert(
working_dir=working_dir,
keyring_root=keyring_root,
sources=args.source,
target_dir=target_dir,
name_override=args.name,
)
)
elif "import" == args.subcommand:
target_dir = "main" if args.main else "packager"
print(
convert(
working_dir=working_dir,
keyring_root=keyring_root,
sources=args.source,
target_dir=keyring_root / target_dir,
name_override=args.name,
)
)
elif "export" == args.subcommand:
result = export(
working_dir=working_dir,
keyring_root=keyring_root,
sources=args.source,
output=args.output,
)
if result:
print(
result,
end="",
)
elif "build" == args.subcommand:
build(
working_dir=working_dir,
keyring_root=keyring_root,
target_dir=keyring_root.parent / "build",
)
elif "list" == args.subcommand:
trust_filter = TrustFilter[args.trust]
list_keyring(
keyring_root=keyring_root,
sources=args.source,
main_keys=args.main,
trust_filter=trust_filter,
)
elif "inspect" == args.subcommand:
print(
inspect_keyring(
working_dir=working_dir,
keyring_root=keyring_root,
sources=args.source,
),
end="",
)
elif "verify" == args.subcommand:
verify(
working_dir=working_dir,
keyring_root=keyring_root,
sources=args.source,
lint_hokey=args.lint_hokey,
lint_sq_keyring=args.lint_sq_keyring,
)
elif "ci" == args.subcommand:
ci(working_dir=working_dir, keyring_root=keyring_root, project_root=project_root)
elif "check" == args.subcommand:
verify(
working_dir=working_dir,
keyring_root=keyring_root,
sources=[keyring_root],
lint_hokey=False,
lint_sq_keyring=False,
)
else:
parser.print_help()
if args.wait:
print("Press [ENTER] to continue")
input()

55
libkeyringctl/git.py Normal file
View File

@ -0,0 +1,55 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from pathlib import Path
from typing import List
from typing import Optional
from typing import Tuple
from .util import system
def git_changed_files(
git_path: Optional[Path] = None, base: Optional[str] = None, paths: Optional[List[Path]] = None
) -> Tuple[List[Path], List[Path], List[Path]]:
"""Returns lists of created, deleted and modified files based on diff stats related to a base commit
and optional paths.
Parameters
----------
git_path: Path to the git repository, current directory by default
base: Optional base rev or current index by default
paths: Optional list of paths to take into account, unfiltered by default
Returns
-------
Lists of created, deleted and modified paths
"""
cmd = ["git"]
if git_path:
cmd += ["-C", str(git_path)]
cmd += ["--no-pager", "diff", "--color=never", "--summary", "--numstat"]
if base:
cmd += [base]
if paths:
cmd += ["--"]
cmd += [str(path) for path in paths]
result: str = system(cmd)
created: List[Path] = []
deleted: List[Path] = []
modified: List[Path] = []
for line in result.splitlines():
line = line.strip()
if line.startswith("create"):
created.append(Path(line.split(maxsplit=3)[3]))
continue
if line.startswith("delete"):
deleted.append(Path(line.split(maxsplit=3)[3]))
continue
modified.append(Path(line.split(maxsplit=2)[2]))
modified = [path for path in modified if path not in created and path not in deleted]
return created, deleted, modified

1262
libkeyringctl/keyring.py Normal file

File diff suppressed because it is too large Load Diff

363
libkeyringctl/sequoia.py Normal file
View File

@ -0,0 +1,363 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from collections import deque
from datetime import datetime
from functools import reduce
from pathlib import Path
from platform import python_version_tuple
from re import sub
from tempfile import mkdtemp
from typing import Dict
# NOTE: remove after python 3.8.x is no longer supported upstream
if int(python_version_tuple()[1]) < 9: # pragma: no cover
from typing import Iterable
else:
from collections.abc import Iterable
from typing import List
from typing import Optional
from .types import Fingerprint
from .types import PacketKind
from .types import Uid
from .types import Username
from .util import cwd
from .util import natural_sort_path
from .util import system
def keyring_split(working_dir: Path, keyring: Path, preserve_filename: bool = False) -> Iterable[Path]:
"""Split a file containing a PGP keyring into separate certificate files
The original keyring filename is preserved if the split only yields a single certificate.
If preserve_filename is True, all keyrings are placed into separate directories while preserving
the filename.
The file is split using sq.
Parameters
----------
working_dir: The path of the working directory below which to create the output files
keyring: The path of a file containing a PGP keyring
preserve_filename: If True, all keyrings are placed into separate directories while preserving the filename
Returns
-------
An iterable over the naturally sorted list of certificate files derived from a keyring
"""
keyring_dir = Path(mkdtemp(dir=working_dir, prefix="keyring-")).absolute()
with cwd(keyring_dir):
system(["sq", "keyring", "split", "--prefix", "", str(keyring)])
keyrings: List[Path] = list(natural_sort_path(keyring_dir.iterdir()))
if 1 == len(keyrings) or preserve_filename:
for index, key in enumerate(keyrings):
keyring_sub_dir = Path(mkdtemp(dir=keyring_dir, prefix=f"{keyring.name}-")).absolute()
keyrings[index] = key.rename(keyring_sub_dir / keyring.name)
return keyrings
def keyring_merge(certificates: List[Path], output: Optional[Path] = None, force: bool = False) -> str:
"""Merge multiple certificates into a keyring
Parameters
----------
certificates: List of paths to certificates to merge into a keyring
output: Path to a file which the keyring is written, return the result instead if None
force: Whether to force overwriting existing files (defaults to False)
Returns
-------
The result if no output file has been used
"""
cmd = ["sq", "keyring", "merge"]
if force:
cmd.insert(1, "--force")
if output:
cmd += ["--output", str(output)]
cmd += [str(cert) for cert in sorted(certificates)]
return system(cmd)
def packet_split(working_dir: Path, certificate: Path) -> Iterable[Path]:
"""Split a file containing a PGP certificate into separate packet files
The files are split using sq
Parameters
----------
working_dir: The path of the working directory below which to create the output files
certificate: The absolute path of a file containing one PGP certificate
Returns
-------
An iterable over the naturally sorted list of packet files derived from certificate
"""
packet_dir = Path(mkdtemp(dir=working_dir, prefix="packet-")).absolute()
with cwd(packet_dir):
system(["sq", "packet", "split", "--prefix", "", str(certificate)])
return natural_sort_path(packet_dir.iterdir())
def packet_join(packets: List[Path], output: Optional[Path] = None, force: bool = False) -> str:
"""Join PGP packet data in files to a single output file
Parameters
----------
packets: A list of paths to files that contain PGP packet data
output: Path to a file to which all PGP packet data is written, return the result instead if None
force: Whether to force overwriting existing files (defaults to False)
Returns
-------
The result if no output file has been used
"""
cmd = ["sq", "packet", "join"]
if force:
cmd.insert(1, "--force")
packets_str = list(map(lambda path: str(path), packets))
cmd.extend(packets_str)
cmd.extend(["--output", str(output)])
return system(cmd)
def inspect(
packet: Path, certifications: bool = True, fingerprints: Optional[Dict[Fingerprint, Username]] = None
) -> str:
"""Inspect PGP packet data and return the result
Parameters
----------
packet: Path to a file that contain PGP data
certifications: Whether to print third-party certifications
fingerprints: Optional dict of fingerprints to usernames to enrich the output with
Returns
-------
The result of the inspection
"""
cmd = ["sq", "inspect"]
if certifications:
cmd.append("--certifications")
cmd.append(str(packet))
result: str = system(cmd)
if fingerprints:
for fingerprint, username in fingerprints.items():
result = sub(f"{fingerprint}", f"{fingerprint} {username}", result)
result = sub(f" {fingerprint[24:]}", f" {fingerprint[24:]} {username}", result)
return result
def packet_dump(packet: Path) -> str:
"""Dump a PGP packet to string
The `sq packet dump` command is used to retrieve a dump of information from a PGP packet
Parameters
----------
packet: The path to the PGP packet to retrieve the value from
Returns
-------
The contents of the packet dump
"""
return system(["sq", "packet", "dump", str(packet)])
def packet_dump_field(packet: Path, query: str) -> str:
"""Retrieve the value of a field from a PGP packet
Field queries are possible with the following notation during tree traversal:
- Use '.' to separate the parent section
- Use '*' as a wildcard for the current section
- Use '|' inside the current level as a logical OR
Example:
- Version
- Hashed area|Unhashed area.Issuer
- *.Issuer
Parameters
----------
packet: The path to the PGP packet to retrieve the value from
query: The name of the field as a query notation
Raises
------
Exception: If the field is not found in the PGP packet
Returns
-------
The value of the field found in packet
"""
dump = packet_dump(packet)
queries = deque(query.split("."))
path = [queries.popleft()]
depth = 0
# remove leading 4 space indention
lines = list(filter(lambda line: line.startswith(" "), dump.splitlines()))
lines = [sub(r"^ {4}", "", line, count=1) for line in lines]
# filter empty lines
lines = list(filter(lambda line: line.strip(), lines))
for line in lines:
# determine current line depth by counting whitespace pairs
depth_line = int((len(line) - len(line.lstrip(" "))) / 2)
line = line.lstrip(" ")
# skip nodes that are deeper as our currently matched path
if depth < depth_line:
continue
# unwind the current query path until reaching previous match depth
while depth > depth_line:
queries.appendleft(path.pop())
depth -= 1
matcher = path[-1].split("|")
# check if current field matches the query expression
field = line.split(sep=":", maxsplit=1)[0]
if field not in matcher and "*" not in matcher:
continue
# next depth is one level deeper as the current line
depth = depth_line + 1
# check if matcher is not the leaf of the query expression
if queries:
path.append(queries.popleft())
continue
# return final match
return line.split(sep=": ", maxsplit=1)[1] if ": " in line else line
raise Exception(f"Packet '{packet}' did not match the query '{query}'")
def packet_signature_creation_time(packet: Path) -> datetime:
"""Retrieve the signature creation time field as datetime
Parameters
----------
packet: The path to the PGP packet to retrieve the value from
Returns
-------
The signature creation time as datetime
"""
field = packet_dump_field(packet, "Hashed area.Signature creation time")
field = " ".join(field.split(" ", 3)[0:3])
return datetime.strptime(field, "%Y-%m-%d %H:%M:%S %Z")
def packet_kinds(packet: Path) -> List[PacketKind]:
"""Retrieve the PGP packet types of a packet path
Parameters
----------
packet: The path to the PGP packet to retrieve the kind of
Returns
-------
The kind of PGP packet
"""
dump = packet_dump(packet)
lines = [line for line in dump.splitlines()]
lines = list(
filter(lambda line: not line.startswith(" ") and not line.startswith("WARNING") and line.strip(), lines)
)
return [PacketKind(line.split()[0]) for line in lines]
def latest_certification(certifications: Iterable[Path]) -> Path:
"""Returns the latest certification based on the signature creation time from a list of packets.
Parameters
----------
certifications: List of certification from which to choose the latest from
Returns
-------
The latest certification from a list of packets
"""
return reduce(
lambda a, b: a if packet_signature_creation_time(a) > packet_signature_creation_time(b) else b,
certifications,
)
def key_generate(uids: List[Uid], outfile: Path) -> str:
"""Generate a PGP key with specific uids
Parameters
----------
uids: List of uids that the key should have
outfile: Path to the file to which the key should be written to
Returns
-------
The result of the key generate call
"""
cmd = ["sq", "key", "generate"]
for uid in uids:
cmd.extend(["--userid", str(uid)])
cmd.extend(["--output", str(outfile)])
return system(cmd)
def key_extract_certificate(key: Path, output: Optional[Path]) -> str:
"""Extracts the non secret part from a key into a certificate
Parameters
----------
key: Path to a file that contain secret key material
output: Path to the file to which the key should be written to, stdout if None
Returns
-------
The result of the extract in case output is None
"""
cmd = ["sq", "key", "extract-cert", str(key)]
if output:
cmd.extend(["--output", str(output)])
return system(cmd)
def certify(key: Path, certificate: Path, uid: Uid, output: Optional[Path]) -> str:
"""Inspect PGP packet data and return the result
Parameters
----------
key: Path to a file that contain secret key material
certificate: Path to a certificate file whose uid should be certified
uid: Uid contain in the certificate that should be certified
output: Path to the file to which the key should be written to, stdout if None
Returns
-------
The result of the certification in case output is None
"""
cmd = ["sq", "certify", str(key), str(certificate), uid]
if output:
cmd.extend(["--output", str(output)])
return system(cmd)

270
libkeyringctl/trust.py Normal file
View File

@ -0,0 +1,270 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from logging import debug
from pathlib import Path
from typing import Dict
from typing import Iterable
from typing import Optional
from typing import Set
from .types import Color
from .types import Fingerprint
from .types import Trust
from .types import TrustFilter
from .types import Uid
from .util import contains_fingerprint
from .util import get_cert_paths
from .util import get_fingerprint_from_partial
def certificate_trust_from_paths(
sources: Iterable[Path], main_keys: Set[Fingerprint], all_fingerprints: Set[Fingerprint]
) -> Dict[Fingerprint, Trust]:
"""Get the trust status of all certificates in a list of paths given by main keys.
Uses `get_get_certificate_trust` to determine the trust status.
Parameters
----------
sources: Certificates to acquire the trust status from
main_keys: Fingerprints of trusted keys used to calculate the trust of the certificates from sources
all_fingerprints: Fingerprints of all certificates, packager and main, to look up key-ids to full fingerprints
Returns
-------
A dictionary of fingerprints and their trust level
"""
sources = get_cert_paths(sources)
certificate_trusts: Dict[Fingerprint, Trust] = {}
for certificate in sorted(sources):
fingerprint = Fingerprint(certificate.name)
certificate_trusts[fingerprint] = certificate_trust(
certificate=certificate, main_keys=main_keys, all_fingerprints=all_fingerprints
)
return certificate_trusts
def certificate_trust( # noqa: ignore=C901
certificate: Path, main_keys: Set[Fingerprint], all_fingerprints: Set[Fingerprint]
) -> Trust:
"""Get the trust status of a certificates given by main keys.
main certificates are:
revoked if:
- the certificate has been self-revoked (also applies to 3rd party applied revocation certificates)
full trust if:
- the certificate is not self-revoked
regular certificates are:
full trust if:
- the certificate is not self-revoked and:
- any uid contains at least 3 non revoked main key signatures
marginal trust if:
- the certificate is not self-revoked and:
- any uid contains at least 1 but less than 3 non revoked main key signatures
- no uid contains at least 3 non revoked main key signatures
unknown trust if:
- the certificate is not self-revoked and:
- no uid contains any non revoked main key signature
revoked if:
- the certificate has been self-revoked, or
- no uid contains at least 3 non revoked main key signatures and:
- any uid contains at least 1 revoked main key signature
Parameters
----------
certificate: Certificate to acquire the trust status from
main_keys: Fingerprints of trusted keys used to calculate the trust of the certificates from sources
all_fingerprints: Fingerprints of all certificates, packager and main, to look up key-ids to full fingerprints
Returns
-------
Trust level of the certificate
"""
fingerprint: Fingerprint = Fingerprint(certificate.name)
keyring_root = certificate.parent.parent.parent
# collect revoked main keys
main_keys_revoked: Set[Fingerprint] = set()
for main_key in main_keys:
for revocation in keyring_root.glob(f"main/*/{main_key}/revocation/*.asc"):
if main_key.endswith(revocation.stem):
main_keys_revoked.add(main_key)
revocations: Set[Fingerprint] = set()
# TODO: what about direct key revocations/signatures?
for revocation in certificate.glob("revocation/*.asc"):
issuer: Optional[Fingerprint] = get_fingerprint_from_partial(all_fingerprints, Fingerprint(revocation.stem))
if not issuer:
raise Exception(f"Unknown issuer: {issuer}")
if not fingerprint.endswith(issuer):
raise Exception(f"Wrong root revocation issuer: {issuer}, expected: {fingerprint}")
debug(f"Revoking {fingerprint} due to self-revocation")
revocations.add(fingerprint)
if revocations:
return Trust.revoked
# main keys are either trusted or revoked
is_main_certificate = contains_fingerprint(fingerprints=main_keys, fingerprint=fingerprint)
if is_main_certificate:
return Trust.full
uid_trust: Dict[Uid, Trust] = {}
self_revoked_uids: Set[Uid] = set()
uids = certificate / "uid"
for uid_path in uids.iterdir():
uid: Uid = Uid(uid_path.name)
revocations = set()
for revocation in uid_path.glob("revocation/*.asc"):
issuer = get_fingerprint_from_partial(all_fingerprints, Fingerprint(revocation.stem))
if not issuer:
raise Exception(f"Unknown issuer: {issuer}")
# self revocation
if fingerprint.endswith(issuer):
self_revoked_uids.add(uid)
# main key revocation
elif contains_fingerprint(fingerprints=main_keys, fingerprint=issuer):
revocations.add(issuer)
certifications: Set[Fingerprint] = set()
for certification in uid_path.glob("certification/*.asc"):
issuer = get_fingerprint_from_partial(all_fingerprints, Fingerprint(certification.stem))
if not issuer:
raise Exception(f"Unknown issuer: {issuer}")
# only take main key certifications into account
if not contains_fingerprint(fingerprints=main_keys, fingerprint=issuer):
continue
# do not care about revoked main keys
if contains_fingerprint(fingerprints=main_keys_revoked, fingerprint=issuer):
continue
# do not care about certifications that are revoked
if contains_fingerprint(fingerprints=revocations, fingerprint=issuer):
continue
certifications.add(issuer)
# self revoked uid
if uid in self_revoked_uids:
debug(f"Certificate {fingerprint} with uid {uid} is self-revoked")
uid_trust[uid] = Trust.revoked
continue
# full trust
if len(certifications) >= 3:
uid_trust[uid] = Trust.full
continue
# no full trust and contains revocations
if revocations:
uid_trust[uid] = Trust.revoked
continue
# marginal trust
if certifications:
uid_trust[uid] = Trust.marginal
continue
# no trust
uid_trust[uid] = Trust.unknown
for uid, uid_trust_status in uid_trust.items():
debug(f"Certificate {fingerprint} with uid {uid} has trust level: {uid_trust_status.name}")
trust: Trust
# any uid has full trust
if any(map(lambda t: Trust.full == t, uid_trust.values())):
trust = Trust.full
# no uid has full trust but at least one is revoked
elif any(map(lambda e: Trust.revoked == e[1] and e[0] not in self_revoked_uids, uid_trust.items())):
trust = Trust.revoked
# no uid has full trust or is revoked
elif any(map(lambda t: Trust.marginal == t, uid_trust.values())):
trust = Trust.marginal
else:
trust = Trust.unknown
debug(f"Certificate {fingerprint} has trust level: {trust.name}")
return trust
def trust_icon(trust: Trust) -> str:
"""Returns a single character icon representing the passed trust status
Parameters
----------
trust: The trust to get an icon for
Returns
-------
The single character icon representing the passed trust status
"""
if trust == Trust.revoked:
return ""
if trust == Trust.unknown:
return "~"
if trust == Trust.marginal:
return "~"
if trust == Trust.full:
return ""
return "?"
def trust_color(trust: Trust) -> Color:
"""Returns a color representing the passed trust status
Parameters
----------
trust: The trust to get the color of
Returns
-------
The color representing the passed trust status
"""
match trust:
case Trust.full:
return Color.GREEN
case Trust.unknown | Trust.marginal:
return Color.YELLOW
case _:
return Color.RED
def format_trust_label(trust: Trust) -> str:
"""Formats a given trust status to a text label including color and icon.
Parameters
----------
trust: The trust to get the label for
Returns
-------
Text label representing the trust status as literal and icon with colors
"""
return f"{trust_color(trust).value}{trust_icon(trust)} {trust.name}{Color.RST.value}"
def filter_by_trust(trust: Trust, trust_filter: TrustFilter) -> bool:
"""Filters a trust by a given filter and returns true if within the rules
Parameters
----------
trust: Trust to check for being filtered
trust_filter: Filter rules to check the trust against
Returns
-------
True if the given trust is within the filter rules
"""
trust_map = {
TrustFilter.unknown: [Trust.unknown],
TrustFilter.marginal: [Trust.marginal],
TrustFilter.full: [Trust.full],
TrustFilter.revoked: [Trust.revoked],
TrustFilter.unrevoked: [Trust.unknown, Trust.marginal, Trust.full],
TrustFilter.all: [Trust.revoked, Trust.unknown, Trust.marginal, Trust.full],
}
return trust in trust_map[trust_filter]

38
libkeyringctl/types.py Normal file
View File

@ -0,0 +1,38 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from enum import Enum
from enum import auto
from typing import NewType
Fingerprint = NewType("Fingerprint", str)
Uid = NewType("Uid", str)
Username = NewType("Username", str)
PacketKind = NewType("PacketKind", str)
class Trust(Enum):
unknown = auto()
revoked = auto()
marginal = auto()
full = auto()
class TrustFilter(Enum):
unknown = "unknown"
revoked = "revoked"
marginal = "marginal"
full = "full"
unrevoked = "unrevoked"
all = "all"
TRUST_MAX_LENGTH: int = max([len(e.name) for e in Trust])
class Color(Enum):
RED = "\033[31m"
GREEN = "\033[32m"
YELLOW = "\033[33m"
RST = "\033[0m"
BOLD = "\033[1m"
UNDERLINE = "\033[4m"

341
libkeyringctl/util.py Normal file
View File

@ -0,0 +1,341 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from contextlib import contextmanager
from hashlib import sha256
from os import chdir
from os import environ
from os import getcwd
from pathlib import Path
from platform import python_version_tuple
from re import escape
from re import split
from re import sub
from string import ascii_letters
from string import digits
from subprocess import STDOUT
from subprocess import CalledProcessError
from subprocess import check_output
from sys import exit
from sys import stderr
from tempfile import mkstemp
from traceback import print_stack
from typing import IO
from typing import AnyStr
from typing import Dict
# NOTE: remove after python 3.8.x is no longer supported upstream
if int(python_version_tuple()[1]) < 9: # pragma: no cover
from typing import Iterable
from typing import Iterator
else:
from collections.abc import Iterable
from collections.abc import Iterator
from typing import List
from typing import Optional
from typing import Set
from typing import Union
from libkeyringctl.types import Fingerprint
from libkeyringctl.types import Trust
from libkeyringctl.types import Uid
@contextmanager
def cwd(new_dir: Path) -> Iterator[None]:
"""Change to a new current working directory in a context and go back to the previous dir after the context is done
Parameters
----------
new_dir: A path to change to
"""
previous_dir = getcwd()
chdir(new_dir)
try:
yield
finally:
chdir(previous_dir)
def natural_sort_path(_list: Iterable[Path]) -> Iterable[Path]:
"""Sort an Iterable of Paths naturally
Parameters
----------
_list: An iterable containing paths to be sorted
Return
------
An Iterable of paths that are naturally sorted
"""
def convert_text_chunk(text: str) -> Union[int, str]:
"""Convert input text to int or str
Parameters
----------
text: An input string
Returns
-------
Either an integer if text is a digit, else text in lower-case representation
"""
return int(text) if text.isdigit() else text.lower()
def alphanum_key(key: Path) -> List[Union[int, str]]:
"""Retrieve an alphanumeric key from a Path, that can be used in sorted()
Parameters
----------
key: A path for which to create a key
Returns
-------
A list of either int or str objects that may serve as 'key' argument for sorted()
"""
return [convert_text_chunk(c) for c in split("([0-9]+)", str(key.name))]
return sorted(_list, key=alphanum_key)
def system(
cmd: List[str],
_stdin: Optional[IO[AnyStr]] = None,
exit_on_error: bool = False,
env: Optional[Dict[str, str]] = None,
) -> str:
"""Execute a command using check_output
Parameters
----------
cmd: A list of strings to be fed to check_output
_stdin: input fd used for the spawned process
exit_on_error: Whether to exit the script when encountering an error (defaults to False)
env: Optional environment vars for the shell invocation
Raises
------
CalledProcessError: If not exit_on_error and `check_output()` encounters an error
Returns
-------
The output of cmd
"""
if not env:
env = {"HOME": environ["HOME"], "PATH": environ["PATH"], "LANG": "en_US.UTF-8"}
try:
return check_output(cmd, stderr=STDOUT, stdin=_stdin, env=env).decode()
except CalledProcessError as e:
stderr.buffer.write(e.stdout)
print_stack()
if exit_on_error:
exit(e.returncode)
raise e
def absolute_path(path: str) -> Path:
"""Return the absolute path of a given str
Parameters
----------
path: A string representing a path
Returns
-------
The absolute path representation of path
"""
return Path(path).absolute()
def transform_fd_to_tmpfile(working_dir: Path, sources: List[Path]) -> None:
"""Transforms an input list of paths from any file descriptor of the current process to a tempfile in working_dir.
Using this function on fd inputs allow to pass the content to another process while hidepid is active and /proc
not visible for the other process.
Parameters
----------
working_dir: A directory to use for temporary files
sources: Paths that should be iterated and all fd's transformed to tmpfiles
"""
for index, source in enumerate(sources):
source_str = str(source)
if source_str.startswith("/proc/self/fd/") or source_str.startswith("/dev/fd/"):
file = mkstemp(dir=working_dir, prefix=f"{source.name}", suffix=".fd")[1]
with open(file, mode="wb") as f:
f.write(source.read_bytes())
f.flush()
sources[index] = Path(file)
def get_cert_paths(paths: Iterable[Path]) -> Set[Path]:
"""Walks a list of paths and resolves all discovered certificate paths
Parameters
----------
paths: A list of paths to walk and resolve to certificate paths.
Returns
-------
A set of paths to certificates
"""
# depth first search certificate paths
cert_paths: Set[Path] = set()
visit: List[Path] = list(paths)
while visit:
path = visit.pop()
# this level contains a certificate, abort depth search
if list(path.glob("*.asc")):
cert_paths.add(path)
continue
visit.extend([path for path in path.iterdir() if path.is_dir()])
return cert_paths
def get_parent_cert_paths(paths: Iterable[Path]) -> Set[Path]:
"""Walks a list of paths upwards and resolves all discovered parent certificate paths
Parameters
----------
paths: A list of paths to walk and resolve to certificate paths.
Returns
-------
A set of paths to certificates
"""
# depth first search certificate paths
cert_paths: Set[Path] = set()
visit: List[Path] = list(paths)
while visit:
node = visit.pop().parent
# this level contains a certificate, abort depth search
if "keyring" == node.parent.parent.parent.name:
cert_paths.add(node)
continue
visit.append(node)
return cert_paths
def contains_fingerprint(fingerprints: Iterable[Fingerprint], fingerprint: Fingerprint) -> bool:
"""Returns weather an iterable structure of fingerprints contains a specific fingerprint
Parameters
----------
fingerprints: Iteratable structure of fingerprints that should be searched
fingerprint: Fingerprint to search for
Returns
-------
Weather an iterable structure of fingerprints contains a specific fingerprint
"""
return any(filter(lambda e: str(e).endswith(fingerprint), fingerprints))
def get_fingerprint_from_partial(
fingerprints: Iterable[Fingerprint], fingerprint: Fingerprint
) -> Optional[Fingerprint]:
"""Returns the full fingerprint looked up from a partial fingerprint like a key-id
Parameters
----------
fingerprints: Iteratable structure of fingerprints that should be searched
fingerprint: Partial fingerprint to search for
Returns
-------
The full fingerprint or None
"""
for fingerprint in filter(lambda e: str(e).endswith(fingerprint), fingerprints):
return fingerprint
return None
def filter_fingerprints_by_trust(trusts: Dict[Fingerprint, Trust], trust: Trust) -> List[Fingerprint]:
"""Filters a dict of Fingerprint to Trust by a passed Trust parameter and returns the matching fingerprints.
Parameters
----------
trusts: Dict of Fingerprint to Trust that should be filtered based on the trust parameter
trust: Trust that should be used to filter the trusts dict
Returns
-------
The matching fingerprints of the dict filtered by trust
"""
return list(
map(
lambda item: item[0],
filter(lambda item: trust == item[1], trusts.items()),
)
)
simple_printable: str = ascii_letters + digits + "_-.+@"
ascii_mapping: Dict[str, str] = {
"àáâãäæąăǎа": "a",
"ćçĉċč": "c",
"ďđ": "d",
"éèêëęēĕėěɇ": "e",
"ĝğġģ": "g",
"ĥħȟ": "h",
"ìíîïĩīĭįıij": "i",
"ĵɉ": "j",
"ķ": "k",
"ł": "l",
"ńņň": "n",
"òóôõöøŏőðȍǿ": "o",
"śș": "s",
"ß": "ss",
"ț": "t",
"úûüȗűȕù": "u",
"ýÿ": "y",
"źż": "z",
}
ascii_mapping_lookup: Dict[str, str] = {}
for key, value in ascii_mapping.items():
for c in key:
ascii_mapping_lookup[c] = value
ascii_mapping_lookup[c.upper()] = value.upper()
def simplify_ascii(_str: str) -> str:
"""Simplify a string to contain more filesystem and printable friendly characters
Parameters
----------
_str: A string to simplify (e.g. 'Foobar McFooface <foobar@foo.face>')
Returns
-------
The simplified representation of _str
"""
_str = _str.strip("<")
_str = _str.strip(">")
_str = "".join([ascii_mapping_lookup.get(char) or char for char in _str])
_str = sub("[^" + escape(simple_printable) + "]", "_", _str)
return _str
def simplify_uid(uid: Uid, hash_postfix: bool = True) -> str:
"""Simplify a uid to contain more filesystem and printable friendly characters with an optional
collision resistant hash postfix.
Parameters
----------
uid: Uid to simplify (e.g. 'Foobar McFooface <foobar@foo.face>')
hash_postfix: Whether to add a hash of the uid as postfix
Returns
-------
Simplified str representation of uid
"""
_hash = "" if not hash_postfix else f"_{sha256(uid.encode()).hexdigest()[:8]}"
return f"{simplify_ascii(_str=uid)}{_hash}"

342
libkeyringctl/verify.py Normal file
View File

@ -0,0 +1,342 @@
from logging import debug
from pathlib import Path
from subprocess import PIPE
from subprocess import Popen
from tempfile import NamedTemporaryFile
from typing import List
from typing import Optional
from typing import Set
from libkeyringctl.keyring import export
from libkeyringctl.keyring import get_fingerprints_from_paths
from libkeyringctl.keyring import is_pgp_fingerprint
from libkeyringctl.keyring import transform_fingerprint_to_keyring_path
from libkeyringctl.keyring import transform_username_to_keyring_path
from libkeyringctl.sequoia import packet_dump_field
from libkeyringctl.sequoia import packet_kinds
from libkeyringctl.types import Fingerprint
from libkeyringctl.types import Uid
from libkeyringctl.util import get_cert_paths
from libkeyringctl.util import get_fingerprint_from_partial
from libkeyringctl.util import simplify_uid
from libkeyringctl.util import system
def verify( # noqa: ignore=C901
working_dir: Path,
keyring_root: Path,
sources: Optional[List[Path]],
lint_hokey: bool = True,
lint_sq_keyring: bool = True,
) -> None:
"""Verify certificates against modern expectations using `sq keyring lint` and hokey
Parameters
----------
working_dir: A directory to use for temporary files
keyring_root: The keyring root directory to look up username shorthand sources
sources: A list of username, fingerprint or directories from which to read PGP packet information
(defaults to `keyring_root`)
lint_hokey: Whether to run hokey lint
lint_sq_keyring: Whether to run sq keyring lint
"""
if not sources:
sources = [keyring_root]
# transform shorthand paths to actual keyring paths
transform_username_to_keyring_path(keyring_dir=keyring_root / "packager", paths=sources)
transform_fingerprint_to_keyring_path(keyring_root=keyring_root, paths=sources)
cert_paths: Set[Path] = get_cert_paths(sources)
all_fingerprints = get_fingerprints_from_paths([keyring_root])
for certificate in sorted(cert_paths):
print(f"Verify {certificate.name} owned by {certificate.parent.name}")
verify_integrity(certificate=certificate, all_fingerprints=all_fingerprints)
with NamedTemporaryFile(
dir=working_dir, prefix=f"{certificate.parent.name}-{certificate.name}", suffix=".asc"
) as keyring:
keyring_path = Path(keyring.name)
export(
working_dir=working_dir,
keyring_root=keyring_root,
sources=[certificate],
output=keyring_path,
)
if lint_hokey:
keyring_fd = Popen(("sq", "dearmor", f"{str(keyring_path)}"), stdout=PIPE)
print(system(["hokey", "lint"], _stdin=keyring_fd.stdout), end="")
if lint_sq_keyring:
print(system(["sq", "keyring", "lint", f"{str(keyring_path)}"]), end="")
def verify_integrity(certificate: Path, all_fingerprints: Set[Fingerprint]) -> None: # noqa: ignore=C901
if not is_pgp_fingerprint(certificate.name):
raise Exception(f"Unexpected certificate name for certificate {certificate.name}: {str(certificate)}")
pubkey = certificate / f"{certificate.name}.asc"
if not pubkey.is_file():
raise Exception(f"Missing certificate pubkey {certificate.name}: {str(pubkey)}")
if not list(certificate.glob("uid/*/*.asc")):
raise Exception(f"Missing at least one UID for {certificate.name}")
# check packet files
for path in certificate.iterdir():
if path.is_file():
if path.name != f"{certificate.name}.asc":
raise Exception(f"Unexpected file in certificate {certificate.name}: {str(path)}")
assert_packet_kind(path=path, expected="Public-Key")
assert_filename_matches_packet_fingerprint(path=path, check=certificate.name)
debug(f"OK: {path}")
elif path.is_dir():
if "revocation" == path.name:
verify_integrity_key_revocations(path=path)
elif "directkey" == path.name:
for directkey in path.iterdir():
assert_is_dir(path=directkey)
if "certification" == directkey.name:
verify_integrity_direct_key_certifications(path=directkey)
elif "revocation" == directkey.name:
verify_integrity_direct_key_revocations(path=directkey)
else:
raise_unexpected_file(path=directkey)
elif "uid" == path.name:
for uid in path.iterdir():
assert_is_dir(path=uid)
uid_packet = uid / f"{uid.name}.asc"
assert_is_file(path=uid_packet)
uid_binding_sig = uid / "certification" / f"{certificate.name}.asc"
uid_revocation_sig = uid / "revocation" / f"{certificate.name}.asc"
if not uid_binding_sig.is_file() and not uid_revocation_sig:
raise Exception(f"Missing uid binding/revocation sig for {certificate.name}: {str(uid)}")
for uid_path in uid.iterdir():
if uid_path.is_file():
if uid_path.name != f"{uid.name}.asc":
raise Exception(f"Unexpected file in certificate {certificate.name}: {str(uid_path)}")
assert_packet_kind(path=uid_path, expected="User")
uid_value = simplify_uid(Uid(packet_dump_field(packet=uid_path, query="Value")))
if uid_value != uid.name:
raise Exception(f"Unexpected uid in file {str(uid_path)}: {uid_value}")
elif not uid_path.is_dir():
raise Exception(f"Unexpected file type in certificate {certificate.name}: {str(uid_path)}")
elif "certification" == uid_path.name:
for sig in uid_path.iterdir():
assert_is_file(path=sig)
assert_is_pgp_fingerprint(path=sig, _str=sig.stem)
assert_has_suffix(path=sig, suffix=".asc")
assert_packet_kind(path=sig, expected="Signature")
assert_signature_type_certification(path=sig)
issuer = get_fingerprint_from_partial(
fingerprints=all_fingerprints,
fingerprint=Fingerprint(
packet_dump_field(packet=sig, query="Hashed area|Unhashed area.Issuer")
),
)
if issuer != sig.stem:
raise Exception(f"Unexpected issuer in file {str(sig)}: {issuer}")
debug(f"OK: {sig}")
elif "revocation" == uid_path.name:
for sig in uid_path.iterdir():
assert_is_file(path=sig)
assert_is_pgp_fingerprint(path=sig, _str=sig.stem)
assert_has_suffix(path=sig, suffix=".asc")
assert_packet_kind(path=sig, expected="Signature")
assert_signature_type(path=sig, expected="CertificationRevocation")
issuer = get_fingerprint_from_partial(
fingerprints=all_fingerprints,
fingerprint=Fingerprint(
packet_dump_field(packet=sig, query="Hashed area|Unhashed area.Issuer")
),
)
if issuer != sig.stem:
raise Exception(f"Unexpected issuer in file {str(sig)}: {issuer}")
certification = uid_path.parent / "certification" / sig.name
if certification.exists():
raise Exception(f"Certification exists for revocation {str(sig)}: {certification}")
debug(f"OK: {sig}")
else:
raise Exception(f"Unexpected directory in certificate {certificate.name}: {str(uid_path)}")
debug(f"OK: {uid_path}")
debug(f"OK: {uid}")
elif "subkey" == path.name:
for subkey in path.iterdir():
assert_is_dir(path=subkey)
assert_is_pgp_fingerprint(path=subkey, _str=subkey.name)
subkey_packet = subkey / f"{subkey.name}.asc"
assert_is_file(path=subkey_packet)
subkey_binding_sig = subkey / "certification" / f"{certificate.name}.asc"
subkey_revocation_sig = subkey / "revocation" / f"{certificate.name}.asc"
if not subkey_binding_sig.is_file() and not subkey_revocation_sig:
raise Exception(f"Missing subkey binding/revocation sig for {certificate.name}: {str(subkey)}")
for subkey_path in subkey.iterdir():
if subkey_path.is_file():
if subkey_path.name != f"{subkey.name}.asc":
raise Exception(
f"Unexpected file in certificate {certificate.name}: {str(subkey_path)}"
)
assert_packet_kind(path=subkey_path, expected="Public-Subkey")
assert_filename_matches_packet_fingerprint(path=subkey_path, check=subkey_path.stem)
elif not subkey_path.is_dir():
raise Exception(
f"Unexpected file type in certificate {certificate.name}: {str(subkey_path)}"
)
elif "certification" == subkey_path.name:
for sig in subkey_path.iterdir():
assert_is_file(path=sig)
assert_is_pgp_fingerprint(path=sig, _str=sig.stem)
assert_has_suffix(path=sig, suffix=".asc")
assert_packet_kind(path=sig, expected="Signature")
assert_signature_type(path=sig, expected="SubkeyBinding")
assert_filename_matches_packet_issuer_fingerprint(path=sig, check=certificate.name)
elif "revocation" == subkey_path.name:
for sig in subkey_path.iterdir():
assert_is_file(path=sig)
assert_is_pgp_fingerprint(path=sig, _str=sig.stem)
assert_has_suffix(path=sig, suffix=".asc")
assert_packet_kind(path=sig, expected="Signature")
assert_signature_type(path=sig, expected="SubkeyRevocation")
assert_filename_matches_packet_issuer_fingerprint(path=sig, check=certificate.name)
else:
raise Exception(
f"Unexpected directory in certificate {certificate.name}: {str(subkey_path)}"
)
debug(f"OK: {subkey_path}")
else:
raise Exception(f"Unexpected directory in certificate {certificate.name}: {str(path)}")
else:
raise Exception(f"Unexpected file type in certificate {certificate.name}: {str(path)}")
def assert_packet_kind(path: Path, expected: str) -> None:
kinds = packet_kinds(packet=path)
if not kinds or len(kinds) != 1:
raise Exception(f"Unexpected amount of packets in file {str(path)}: {kinds}")
kind = kinds[0]
if kind != expected:
raise Exception(f"Unexpected packet in file {str(path)} kind: {kind} expected: {expected}")
def assert_signature_type(path: Path, expected: str) -> None:
sig_type = packet_dump_field(packet=path, query="Type")
if sig_type != expected:
raise Exception(f"Unexpected packet type in file {str(path)} type: {sig_type} expected: {expected}")
def assert_signature_type_certification(path: Path) -> None:
sig_type = packet_dump_field(packet=path, query="Type")
if sig_type not in ["GenericCertification", "PersonaCertification", "CasualCertification", "PositiveCertification"]:
raise Exception(f"Unexpected packet certification type in file {str(path)} type: {sig_type}")
def assert_is_pgp_fingerprint(path: Path, _str: str) -> None:
if not is_pgp_fingerprint(_str):
raise Exception(f"Unexpected file name, not a pgp fingerprint: {str(path)}")
def assert_filename_matches_packet_issuer_fingerprint(path: Path, check: str) -> None:
fingerprint = packet_dump_field(packet=path, query="Unhashed area|Hashed area.Issuer Fingerprint")
if not fingerprint == check:
raise Exception(f"Unexpected packet fingerprint in file {str(path)}: {fingerprint}")
def assert_filename_matches_packet_fingerprint(path: Path, check: str) -> None:
fingerprint = packet_dump_field(packet=path, query="Fingerprint")
if not fingerprint == check:
raise Exception(f"Unexpected packet fingerprint in file {str(path)}: {fingerprint}")
def assert_has_suffix(path: Path, suffix: str) -> None:
if path.suffix != suffix:
raise Exception(f"Unexpected file suffix in {str(path)} expected: {suffix}")
def assert_is_file(path: Path) -> None:
if not path.is_file():
raise Exception(f"Unexpected type, should be file: {str(path)}")
def assert_is_dir(path: Path) -> None:
if not path.is_dir():
raise Exception(f"Unexpected type, should be directory: {str(path)}")
def raise_unexpected_file(path: Path) -> None:
raise Exception(f"Unexpected file in directory: {str(path)}")
def verify_integrity_key_revocations(path: Path) -> None:
assert_is_dir(path=path)
for sig in path.iterdir():
assert_is_file(path=sig)
assert_is_pgp_fingerprint(path=sig, _str=sig.stem)
assert_has_suffix(path=sig, suffix=".asc")
assert_packet_kind(path=sig, expected="Signature")
assert_signature_type(path=sig, expected="KeyRevocation")
assert_filename_matches_packet_issuer_fingerprint(path=sig, check=sig.stem)
debug(f"OK: {sig}")
def verify_integrity_direct_key_certifications(path: Path) -> None:
for issuer_dir in path.iterdir():
assert_is_dir(path=issuer_dir)
assert_is_pgp_fingerprint(path=issuer_dir, _str=issuer_dir.name)
for certification in issuer_dir.iterdir():
verify_integrity_direct_key_certification(path=certification)
def verify_integrity_direct_key_revocations(path: Path) -> None:
for issuer_dir in path.iterdir():
assert_is_dir(path=issuer_dir)
assert_is_pgp_fingerprint(path=issuer_dir, _str=issuer_dir.name)
for certification in issuer_dir.iterdir():
verify_integrity_direct_key_revocation(path=certification)
def verify_integrity_direct_key_certification(path: Path) -> None:
assert_is_file(path=path)
assert_has_suffix(path=path, suffix=".asc")
assert_packet_kind(path=path, expected="Signature")
assert_signature_type(path=path, expected="DirectKey")
assert_filename_matches_packet_issuer_fingerprint(path=path, check=path.parent.name)
debug(f"OK: {path}")
def verify_integrity_direct_key_revocation(path: Path) -> None:
assert_is_file(path=path)
assert_has_suffix(path=path, suffix=".asc")
assert_packet_kind(path=path, expected="Signature")
assert_signature_type(path=path, expected="CertificationRevocation")
assert_filename_matches_packet_issuer_fingerprint(path=path, check=path.parent.name)
debug(f"OK: {path}")

BIN
maintainers/madara125.asc Normal file

Binary file not shown.

BIN
maintainers/mrhacker.asc Normal file

Binary file not shown.

View File

@ -1,5 +0,0 @@
AB19265E5D7D20687D303246BA1DFB64FFF979E7 allan
27FFC4769E19F096D41D9265A04F9397CDFD6BB0 dan
44D4A033AC140143927397D47EFD567D4C7EA887 ibiru
0E8B644079F599DFC1DDC3973348882F6AC6A4C2 pierre
684148BB25B49E986A4944C55184252D824B18E8 thomas

View File

@ -1,29 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBE7VXhABEAC7AB9vHjR4b/lXq/HANeeN2vWQYK3xL2/01nvUPwycjDbCkOg2
LZzBiun4KARWHgslErhZ26Yxsf5GQmkbndAliZJ1QDC8Evp9iH4zvc0BCp6Tw4+I
7uHc/rlNw4g5/92EzHVtOWzw0FaB5exRPZfiGuuyOtzbny3oEHw11uighYxt7POI
dlBFGAZjf1Qcjc1dAhRUerH7W/CFhL+fAvgu1zPtjei4m9jQNR2xjR8ISu9HyfYE
z1s7tQeL3AZwVg4YYRdFSjbJQAc1CJoRh5YnYdjpxfgmNVLxo8BAqM45ZrX21nW1
+eog00360d2lQhhYmFrySrxXLvlTfpapt0NwZbbSlvhJbS4C3DQ/Wxj3WIaYTXd3
tXbH6CQBnOUL8mItQnwHJKbHXZKV1dZHAftMNBrSllHX7s4yZZCKsDd7PxiSCqFJ
Ihh/RKGHRVprpx7WZ1b43MoeRDqcRvG+/dnoURFe7xEzzZU47YjLplxGETzQmw7h
fYkMihatKflMs3pgNbuUOduwF3wbvM/31PmCCD2/ZXeH+BBFJdu9Mwj/ZWBwHMxU
nTDnlRzSoo5ELBtc5oQ1ReZZD5By32WGNootgU3mjSi2XB0iL8nQSYBOQrvXlBxF
7NIdIdEIjHWvyPLP2Pf8r2j8Ly7WHW/rVpxRCmRMVShzevATFTBBhMe8eQARAQAB
tERBbGxhbiBNY1JhZSAoQXJjaCBMaW51eCBNYXN0ZXIgS2V5KSA8YWxsYW5AbWFz
dGVyLWtleS5hcmNobGludXgub3JnPokCOAQTAQIAIgUCTtVeEAIbAwYLCQgHAwIG
FQgCCQoLBBYCAwECHgECF4AACgkQuh37ZP/5eefKZQ//eYzQxcKro2T9CcYRXZk6
7+67u4gzBHOraOk0uioook0c5zGTX0Yi1E8p9yhj0GSmuEzUMruFiIPpFrIoGYqZ
bCiVprJ92NjHI2U2X/hoq4hc/w4lh+HWW1cWjH1zrfSHK2fMeIowul1FJubcI5O5
Pqw8joqSKPxw6LbnbSn7bsqxjL0exYF41XlfglNAFuXur5FwXtQJ7R7U84Zw61qr
PtEG3lFc7iEqdjySqILJr6Vd8MT8ETEjsI1IqCRmNJGxMSKqcVj3tyEmupFosNmP
L0RcvdVUkm4QST3Yu20oB/A3fMjr1VTbpvzX20/n9b7twbg3uwiFGi8PEKI092dS
rfI/CER+NZ+tStNFsQcqWggcMfeaR8o8XQ9fxBRdlCbIesnsp6sUPHDlmkrqCS85
T2YEZMoHiKOUvp8y4vNOjxImwjfeZ0f55GnWku+d8SMNlR9IZfY/tHpZXZKfh2BB
JX8kJ+drqVtitVrNWG6pAW1nNyE4lsHOF31dUlsYfrblBruIFNfXbeS/Q7su+ee5
a0UqqK+g4HHlpE4sZXFnLz5XNCHbFtRP1XZ4rFHmjy8bS9NMPi4eYLhJVUrpAwb6
CEDGzc1+01g3EulR7IeYDFzvlp/FmtKPnxc5DKXcgC7KlW5j5pVOcwbDFBZN7mor
yzb5eOr17cStIAH/hlIGL5A=
=gixX
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,40 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=18XY
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,70 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
GKT3VHw/QQ==
=Q9DZ
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,52 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=7voJ
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,67 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
DWK7TtEiLpQR6VL76LQ67lyK35zq8pLjQwsD0e0=
=cE6/
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,66 +0,0 @@
6645B0A8C7005E78DB1D7864F99FFE0FEAE999BD allan
9437DD3815A7A9169E3D3946AFF5D95098BC6FF5 alucryd
4FCF887689C41B09506BE8D5F3E1D5C5D30DB0AD andrea
ADC8A1FCC15E01D45310419E94657AB20F2A092B andyrtr
40776A5221EF5AD468A4906D42A1DB15EC133BAD angvp
962855F072C7A01846405864FCF3C8CB5CF9C8D4 arodseth
CE0BDE71A759A87F23F0F7D8B61DBCE10901C163 bgyorgy
5A2257D19FF7E1E0E415968CE62F853100F0D0F0 bisson
CFA6AF15E5C74149FC1D8C086D1655C14CE1C13E bluewind
F3691687D867B81B51CE07D9BBE43771487328A9 bpiotrowski
6EA3F3F3B9082632A9CBE931D53A0445B47A0DAB cbehan
66BD74A036D522F51DD70A3C7F2A16726521E06D cbrannon
9515D8A8EAB88E49BB65EDBCE6B456CAF15447D5 cinelli
E7210A59715F6940CF9A4E36A001876699AD6E84 daenyth
A5CA9D5515DC2CA73DF748CA5C2E46A0F53A76ED dan
5696C003B0854206450C8E5BE613C09CB4440678 daniel
40440DC037C05620984379A6761FAD69BA06C6A9 dicebot
63F395DE2D6398BBE458F281F2DBB4931985A992 dieter
0F334D8698881578F65D2AE55ED514A45BD5C938 djgera
487EACC08557AD082088DABA1EB2638FF56C0C53 dreisner
5559BC1A32B8F76B3FCCD9555FA5E5544F010D48 dwallace
5357F3B111688D88C1D88119FCF2CB179205AC90 eric
07DFD3A0BC213FA12EDC217559B3122E2FA915EC faidoc
86CFFCA918CF3AF47147588051E8B148A9999C34 foutrelis
B5971F2C5C10A9A08C60030F786C63F330D7CB92 fyan
717026A9D4779FC53940726640F557B731496106 aginiewicz
F648622B1715468FD654F45CB7310AE5F04569AE giovanni
4D913AECD81726D9A6C74F0ADA6426DD215B37AD guillaume
8218F88849AAC522E94CF470A5E9288C4FA415FA heftig
F4DDD6DDCEC320B665F502AAE8F18BA1615137BC ibiru
DB2277BCD500AA3825610BDDDB323392796CA067 idevolder
F5A361A3A13554B85E57DDDAAF7EF7873CFD4BB6 jconder
E499C79F53C96A54E572FEE1C06086337C50773E jelle
A84B8DC73AB832067BE54C3C976AC6FA3B94FA10 jgc
38EDD1886756924E1224E49524E4CDB0013C2580 jlichtblau
8742F7535E7B394A1B048163332C9C40F40D2072 jsteel
355BDB97ED4724E6B3A450E7A3D9562A589874AB juergen
8F76BEEA0289F9E1D3E229C05F946DED983D4366 juster
7FA647CD89891DEDC060287BB9113D1ED21E1A55 kchen
48C3B1F30DDD0FE67E516D16396E3E25BAB142C1 kkeen
535F8C0339450F054A4D282706096A6AD1CEDDAC lcarlier
2E36D8620221482FC45CB7F2A91764759326B440 lfleischer
2C118C620F02DB9AC1D0F9FA94DD2393DA2EE423 mtorromeo
4AA4767BBC9C4B1D18AE28B77F2D434B9741E8AC pierre
D4DE5ABDE2A7287644EAC7E36D1A9E70E19DAA50 plewis
44EA62ACDBC81B6A0D1FD267206CBC892D1493D2 remy
81D7F8241DB38BC759C80FCE3A726C6170E80477 romashka
EA84EA00866F51FB10CD19AE426991CD8406FFF3 ronald
D921CABED130A5690EF1896E81AF739EC0711BF1 schiv
2612B04099DBD9B9A3DD92A0456C7A9B91B842AE schuay
B81B051F2D7FC867AAFF35A58DBD63B82072D77A seblu
8840BD07FC24CB7CE394A07CCF7037A4F27FB7DA speps
3E518BF2526FD1979E8AAE4965C110C1EA433FC7 spupykin
76B4192E902C0A52642C63C273B8ED52F1D357C1 stativ
0B20CA1931F5DA3A70D0F8D2EA6836E1AB441196 stephane
8FC15A064950A99DD1BD14DD39E4B877E62EB915 svenstaro
34C5D94FE7E7913E86DC427E7FB1A3800C84C0A5 td123
65EEFE022108E2B708CBFCF7F9E712E59AF5F22A thestinger
A314827C4E4250A204CE6E13284FC34C8E4B1A25 thomas
FB871F0131FEA4FB5A9192B4C8880A6406361833 tomegun
5B7E3FB71B7F10329A1C03AB771DF6627EDF681F tpowa
8CF934E339CAD8ABF342E822E711306E3C4F88BC tredaelli
39F880E50E49A4D11341E8F939E4F17F295AFBF4 ttopper
B1F2C889CB2CCB2ADA36D963097D629E437520BD vesa
4A8B17E20B88ACA61860009B5CED81B7C2E5C0D2 xyne
EC3CBE7F607D11E663149E811D1F0DC78F173680 xyne

View File

@ -1 +0,0 @@
BC1FBE4D2826A0B51E47ED62E2539214C6C11350 cinelli User is no longer in possession of his key

Some files were not shown because too many files have changed in this diff Show More