Skip to content

Commit d216c9d

Browse files
authored
Merge pull request #294 from escapewindow/ed25519
bug 1492617 - Add ed25519 signature support to cot
2 parents 5876847 + 4a8f0b2 commit d216c9d

33 files changed

+1018
-235
lines changed

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,28 @@
22
All notable changes to this project will be documented in this file.
33
This project adheres to [Semantic Versioning](http://semver.org/).
44

5+
## [22.0.0] - 2019-03-07
6+
### Added
7+
- ed25519 cot signature generation and verification support.
8+
- `scripts/gen_ed25519_key.py` - a standalone script to generate an ed25519 keypair
9+
- `ed25519_private_key_path` and `ed25519_public_keys` config items
10+
- `scriptworker.ed25519` module
11+
- `verify_link_gpg_cot_signature` is a new function, but is deprecated and will be removed in a future release.
12+
- `verify_link_ed25519_cot_signature` is a new function.
13+
- added `write_to_file` and `read_from_file` utils
14+
15+
### Changed
16+
- gpg support in chain of trust is now deprecated, and will be removed in a future release.
17+
- `generate_cot`'s `path` kwarg is now `parent_path`.
18+
- `generate_cot` now generates up to 3 files: `chainOfTrust.json.asc`, `chain-of-trust.json`, and `chain-of-trust.json.sig`.
19+
- `download_cot` now also downloads `chain-of-trust.json` as an optional artifact, and adds `chain-of-trust.json.sig` as an optional artifact if signature verification is enabled. These will become mandatory artifacts in a future release.
20+
- `chainOfTrust.json.asc` is now a mandatory artifact in cot verification, but is deprecated. We will remove this artifact in a future release.
21+
- `verify_cot_signatures` verifies ed25519, and falls back to gpg. We will make ed25519 signature verification mandatory in a future release, and remove gpg verification.
22+
- we now require `cryptography>=2.6.1` for ed25519 support.
23+
24+
### Removed
25+
- `is_task_required_by_any_mandatory_artifact` is removed
26+
527
## [21.0.0] - 2019-03-05
628
### Changed
729
- `is_try_or_pull_request()` is now an async (instead of a sync property). So is `is_pull_request()`.

docs/cot_overview.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,17 @@ Each chain-of-trust-enabled taskcluster worker generates and signs chain of trus
2525
The scriptworker nodes are the verification points. Scriptworkers run the release sensitive tasks, like signing and publishing releases. They verify their task definitions, as well as all upstream tasks that generate inputs into their task. Any broken link in the chain results in a task exception.
2626

2727
In conjunction with other best practices, like `separation of roles <https://en.wikipedia.org/wiki/Separation_of_duties>`__, we can reduce attack vectors and make penetration attempts more visible, with task exceptions on release branches.
28+
29+
Chain of Trust Versions
30+
=======================
31+
32+
1. Initial Chain of Trust implementation with GPG signatures: Initial `1.0.0b1 on 2016-11-14 <https://github.com/mozilla-releng/scriptworker/blob/master/CHANGELOG.md#100b1---2016-11-14>`_
33+
2. CoT v2: rebuild task definitions via json-e. `7.0.0 on 2018-01-18 <https://github.com/mozilla-releng/scriptworker/blob/master/CHANGELOG.md#700---2018-01-18>`_
34+
3. Generic action hook support. `12.0.0 on 2018-05-29 <https://github.com/mozilla-releng/scriptworker/blob/master/CHANGELOG.md#1200---2018-05-29>`_
35+
4. Release promotion action hook support. `17.1.0 on 2018-12-28 <https://github.com/mozilla-releng/scriptworker/blob/master/CHANGELOG.md#1710---2018-12-28>`_
36+
37+
Planned future versions:
38+
39+
* ed25519 support; deprecate GPG support.
40+
* drop support for non-hook actions
41+
* drop support for gpg

requirements/base.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
aiohttp
22
arrow
3+
cryptography>=2.6.1
34
defusedxml
45
dictdiffer
56
frozendict

requirements/base.txt

Lines changed: 75 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# SHA1:d2b4b6f31894fc101c26e594eb49aad64a1793b9
1+
# SHA1:b6c141f2d9b71344297f9956e2617bafab2b28eb
22
#
33
# This file is autogenerated by pip-compile-multi
44
# To update, run:
@@ -31,28 +31,82 @@ aiohttp==3.5.4 \
3131
arrow==0.13.1 \
3232
--hash=sha256:3397e5448952e18e1295bf047014659effa5ae8da6a5371d37ff0ddc46fa6872 \
3333
--hash=sha256:6f54d9f016c0b7811fac9fb8c2c7fa7421d80c54dbdd75ffb12913c55db60b8a
34+
asn1crypto==0.24.0 \
35+
--hash=sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87 \
36+
--hash=sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49 \
37+
# via cryptography
3438
async-timeout==3.0.1 \
3539
--hash=sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f \
3640
--hash=sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3 \
3741
# via aiohttp, taskcluster
38-
attrs==18.2.0 \
39-
--hash=sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69 \
40-
--hash=sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb \
41-
# via aiohttp
42+
attrs==19.1.0 \
43+
--hash=sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79 \
44+
--hash=sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399 \
45+
# via aiohttp, jsonschema
4246
certifi==2018.11.29 \
4347
--hash=sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7 \
4448
--hash=sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033 \
4549
# via requests
50+
cffi==1.12.2 \
51+
--hash=sha256:00b97afa72c233495560a0793cdc86c2571721b4271c0667addc83c417f3d90f \
52+
--hash=sha256:0ba1b0c90f2124459f6966a10c03794082a2f3985cd699d7d63c4a8dae113e11 \
53+
--hash=sha256:0bffb69da295a4fc3349f2ec7cbe16b8ba057b0a593a92cbe8396e535244ee9d \
54+
--hash=sha256:21469a2b1082088d11ccd79dd84157ba42d940064abbfa59cf5f024c19cf4891 \
55+
--hash=sha256:2e4812f7fa984bf1ab253a40f1f4391b604f7fc424a3e21f7de542a7f8f7aedf \
56+
--hash=sha256:2eac2cdd07b9049dd4e68449b90d3ef1adc7c759463af5beb53a84f1db62e36c \
57+
--hash=sha256:2f9089979d7456c74d21303c7851f158833d48fb265876923edcb2d0194104ed \
58+
--hash=sha256:3dd13feff00bddb0bd2d650cdb7338f815c1789a91a6f68fdc00e5c5ed40329b \
59+
--hash=sha256:4065c32b52f4b142f417af6f33a5024edc1336aa845b9d5a8d86071f6fcaac5a \
60+
--hash=sha256:51a4ba1256e9003a3acf508e3b4f4661bebd015b8180cc31849da222426ef585 \
61+
--hash=sha256:59888faac06403767c0cf8cfb3f4a777b2939b1fbd9f729299b5384f097f05ea \
62+
--hash=sha256:59c87886640574d8b14910840327f5cd15954e26ed0bbd4e7cef95fa5aef218f \
63+
--hash=sha256:610fc7d6db6c56a244c2701575f6851461753c60f73f2de89c79bbf1cc807f33 \
64+
--hash=sha256:70aeadeecb281ea901bf4230c6222af0248c41044d6f57401a614ea59d96d145 \
65+
--hash=sha256:71e1296d5e66c59cd2c0f2d72dc476d42afe02aeddc833d8e05630a0551dad7a \
66+
--hash=sha256:8fc7a49b440ea752cfdf1d51a586fd08d395ff7a5d555dc69e84b1939f7ddee3 \
67+
--hash=sha256:9b5c2afd2d6e3771d516045a6cfa11a8da9a60e3d128746a7fe9ab36dfe7221f \
68+
--hash=sha256:9c759051ebcb244d9d55ee791259ddd158188d15adee3c152502d3b69005e6bd \
69+
--hash=sha256:b4d1011fec5ec12aa7cc10c05a2f2f12dfa0adfe958e56ae38dc140614035804 \
70+
--hash=sha256:b4f1d6332339ecc61275bebd1f7b674098a66fea11a00c84d1c58851e618dc0d \
71+
--hash=sha256:c030cda3dc8e62b814831faa4eb93dd9a46498af8cd1d5c178c2de856972fd92 \
72+
--hash=sha256:c2e1f2012e56d61390c0e668c20c4fb0ae667c44d6f6a2eeea5d7148dcd3df9f \
73+
--hash=sha256:c37c77d6562074452120fc6c02ad86ec928f5710fbc435a181d69334b4de1d84 \
74+
--hash=sha256:c8149780c60f8fd02752d0429246088c6c04e234b895c4a42e1ea9b4de8d27fb \
75+
--hash=sha256:cbeeef1dc3c4299bd746b774f019de9e4672f7cc666c777cd5b409f0b746dac7 \
76+
--hash=sha256:e113878a446c6228669144ae8a56e268c91b7f1fafae927adc4879d9849e0ea7 \
77+
--hash=sha256:e21162bf941b85c0cda08224dade5def9360f53b09f9f259adb85fc7dd0e7b35 \
78+
--hash=sha256:fb6934ef4744becbda3143d30c6604718871495a5e36c408431bf33d9c146889 \
79+
# via cryptography
4680
chardet==3.0.4 \
4781
--hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae \
4882
--hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 \
4983
# via aiohttp, requests
84+
cryptography==2.6.1 \
85+
--hash=sha256:066f815f1fe46020877c5983a7e747ae140f517f1b09030ec098503575265ce1 \
86+
--hash=sha256:210210d9df0afba9e000636e97810117dc55b7157c903a55716bb73e3ae07705 \
87+
--hash=sha256:26c821cbeb683facb966045e2064303029d572a87ee69ca5a1bf54bf55f93ca6 \
88+
--hash=sha256:2afb83308dc5c5255149ff7d3fb9964f7c9ee3d59b603ec18ccf5b0a8852e2b1 \
89+
--hash=sha256:2db34e5c45988f36f7a08a7ab2b69638994a8923853dec2d4af121f689c66dc8 \
90+
--hash=sha256:409c4653e0f719fa78febcb71ac417076ae5e20160aec7270c91d009837b9151 \
91+
--hash=sha256:45a4f4cf4f4e6a55c8128f8b76b4c057027b27d4c67e3fe157fa02f27e37830d \
92+
--hash=sha256:48eab46ef38faf1031e58dfcc9c3e71756a1108f4c9c966150b605d4a1a7f659 \
93+
--hash=sha256:6b9e0ae298ab20d371fc26e2129fd683cfc0cfde4d157c6341722de645146537 \
94+
--hash=sha256:6c4778afe50f413707f604828c1ad1ff81fadf6c110cb669579dea7e2e98a75e \
95+
--hash=sha256:8c33fb99025d353c9520141f8bc989c2134a1f76bac6369cea060812f5b5c2bb \
96+
--hash=sha256:9873a1760a274b620a135054b756f9f218fa61ca030e42df31b409f0fb738b6c \
97+
--hash=sha256:9b069768c627f3f5623b1cbd3248c5e7e92aec62f4c98827059eed7053138cc9 \
98+
--hash=sha256:9e4ce27a507e4886efbd3c32d120db5089b906979a4debf1d5939ec01b9dd6c5 \
99+
--hash=sha256:acb424eaca214cb08735f1a744eceb97d014de6530c1ea23beb86d9c6f13c2ad \
100+
--hash=sha256:c8181c7d77388fe26ab8418bb088b1a1ef5fde058c6926790c8a0a3d94075a4a \
101+
--hash=sha256:d4afbb0840f489b60f5a580a41a1b9c3622e08ecb5eec8614d4fb4cd914c4460 \
102+
--hash=sha256:d9ed28030797c00f4bc43c86bf819266c76a5ea61d006cd4078a93ebf7da6bfd \
103+
--hash=sha256:e603aa7bb52e4e8ed4119a58a03b60323918467ef209e6ff9db3ac382e5cf2c6
50104
defusedxml==0.5.0 \
51105
--hash=sha256:24d7f2f94f7f3cb6061acb215685e5125fbcdc40a857eff9de22518820b0a4f4 \
52106
--hash=sha256:702a91ade2968a82beb0db1e0766a6a273f33d4616a6ce8cde475d8e09853b20
53-
dictdiffer==0.7.1 \
54-
--hash=sha256:6de9370f3c0c7fb5cc8bdc9e10dbca6ff05c39d8e2e58a67eb98d32677a224ca \
55-
--hash=sha256:e4f94167d037f70c11c6a8e7e289d81c8c7117bc02132cd82a0ab8fcba43cc08
107+
dictdiffer==0.7.2 \
108+
--hash=sha256:b6eed4cf74ed31ae9646257a9f802bb09e545ca817d5c0119d747b6a05b6a22d \
109+
--hash=sha256:cc398dc26600cdb9519b2c768157333a0967b24d64c3913077dd0794274395da
56110
frozendict==1.2 \
57111
--hash=sha256:774179f22db2ef8a106e9c38d4d1f8503864603db08de2e33be5b778230f6e45
58112
idna==2.8 \
@@ -61,9 +115,9 @@ idna==2.8 \
61115
# via requests, yarl
62116
json-e==3.0.0 \
63117
--hash=sha256:d2914f785d93ecc4f0b2ad6e3f2791f33327eaa740a3c4917d68a9a485dd282d
64-
jsonschema==2.6.0 \
65-
--hash=sha256:000e68abd33c972a5248544925a0cae7d1125f9bf6c58280d37546b946769a08 \
66-
--hash=sha256:6ff5f3180870836cae40f06fa10419f557208175f13ad7bc26caa77beb1f6e02
118+
jsonschema==3.0.1 \
119+
--hash=sha256:0c0a81564f181de3212efa2d17de1910f8732fa1b71c42266d983cd74304e20d \
120+
--hash=sha256:a5f6559964a3851f59040d3b961de5e68e70971afb88ba519d27e6a039efff1a
67121
mohawk==0.3.4 \
68122
--hash=sha256:b3f85ffa93a5c7d2f9cc591246ef9f8ac4a9fa716bfd5bae0377699a2d89d78c \
69123
--hash=sha256:e98b331d9fa9ece7b8be26094cbe2d57613ae882133cc755167268a984bc0ab3 \
@@ -106,6 +160,12 @@ ptyprocess==0.6.0 \
106160
--hash=sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0 \
107161
--hash=sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f \
108162
# via pexpect
163+
pycparser==2.19 \
164+
--hash=sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3 \
165+
# via cffi
166+
pyrsistent==0.14.11 \
167+
--hash=sha256:3ca82748918eb65e2d89f222b702277099aca77e34843c5eb9d52451173970e2 \
168+
# via jsonschema
109169
python-dateutil==2.8.0 \
110170
--hash=sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb \
111171
--hash=sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e \
@@ -132,7 +192,7 @@ requests==2.21.0 \
132192
six==1.12.0 \
133193
--hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \
134194
--hash=sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73 \
135-
# via mohawk, python-dateutil, taskcluster
195+
# via cryptography, jsonschema, mohawk, pyrsistent, python-dateutil, taskcluster
136196
slugid==1.0.7 \
137197
--hash=sha256:6dab3c7eef0bb423fb54cb7752e0f466ddd0ee495b78b763be60e8a27f69e779 \
138198
# via taskcluster
@@ -149,9 +209,9 @@ urllib3==1.24.1 \
149209
--hash=sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39 \
150210
--hash=sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22 \
151211
# via requests
152-
wheel==0.33.0 \
153-
--hash=sha256:12363e6df5678ecf9daf8429f06f97e7106e701405898f24318ce7f0b79c611a \
154-
--hash=sha256:b79ffea026bc0dbd940868347ae9eee36789b6496b6623bd2dec7c7c540a8f99
212+
wheel==0.33.1 \
213+
--hash=sha256:66a8fd76f28977bb664b098372daef2b27f60dc4d1688cfab7b37a09448f0e9d \
214+
--hash=sha256:8eb4a788b3aec8abf5ff68d4165441bc57420c9f64ca5f471f58c3969fe08668
155215
yarl==1.3.0 \
156216
--hash=sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9 \
157217
--hash=sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f \

requirements/test.txt

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ flake8-polyfill==1.0.2 \
6464
--hash=sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9 \
6565
--hash=sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda \
6666
# via flake8-docstrings
67-
flake8==3.7.5 \
68-
--hash=sha256:c3ba1e130c813191db95c431a18cb4d20a468e98af7a77e2181b68574481ad36 \
69-
--hash=sha256:fd9ddf503110bf3d8b1d270e8c673aab29ccb3dd6abf29bae1f54e5116ab4a91
67+
flake8==3.7.7 \
68+
--hash=sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661 \
69+
--hash=sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8
7070
mccabe==0.6.1 \
7171
--hash=sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42 \
7272
--hash=sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f \
@@ -78,17 +78,17 @@ more-itertools==6.0.0 \
7878
--hash=sha256:0125e8f60e9e031347105eb1682cef932f5e97d7b9a1a28d9bf00c22a5daef40 \
7979
--hash=sha256:590044e3942351a1bdb1de960b739ff4ce277960f2425ad4509446dbace8d9d1 \
8080
# via pytest
81-
pbr==5.1.2 \
82-
--hash=sha256:a7953f66e1f82e4b061f43096a4bcc058f7d3d41de9b94ac871770e8bdd831a2 \
83-
--hash=sha256:d717573351cfe09f49df61906cd272abaa759b3e91744396b804965ff7bff38b \
81+
pbr==5.1.3 \
82+
--hash=sha256:8257baf496c8522437e8a6cfe0f15e00aedc6c0e0e7c9d55eeeeab31e0853843 \
83+
--hash=sha256:8c361cc353d988e4f5b998555c88098b9d5964c2e11acf7b0d21925a66bb5824 \
8484
# via mock
85-
pluggy==0.8.1 \
86-
--hash=sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616 \
87-
--hash=sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a \
85+
pluggy==0.9.0 \
86+
--hash=sha256:19ecf9ce9db2fce065a7a0586e07cfb4ac8614fe96edf628a264b1c70116cf8f \
87+
--hash=sha256:84d306a647cc805219916e62aab89caa97a33a1dd8c342e87a37f91073cd4746 \
8888
# via pytest, tox
89-
py==1.7.0 \
90-
--hash=sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694 \
91-
--hash=sha256:e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6 \
89+
py==1.8.0 \
90+
--hash=sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa \
91+
--hash=sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53 \
9292
# via pytest, tox
9393
pycodestyle==2.5.0 \
9494
--hash=sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56 \
@@ -99,9 +99,9 @@ pydocstyle==3.0.0 \
9999
--hash=sha256:5741c85e408f9e0ddf873611085e819b809fca90b619f5fd7f34bd4959da3dd4 \
100100
--hash=sha256:ed79d4ec5e92655eccc21eb0c6cf512e69512b4a97d215ace46d17e4990f2039 \
101101
# via flake8-docstrings
102-
pyflakes==2.1.0 \
103-
--hash=sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d \
104-
--hash=sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd \
102+
pyflakes==2.1.1 \
103+
--hash=sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0 \
104+
--hash=sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2 \
105105
# via flake8
106106
pytest-asyncio==0.10.0 \
107107
--hash=sha256:9fac5100fd716cbecf6ef89233e8590a4ad61d729d1732e0a96b84182df1daaf \
@@ -115,9 +115,9 @@ pytest-mock==1.10.1 \
115115
pytest-random-order==1.0.4 \
116116
--hash=sha256:6b2159342a4c8c10855bc4fc6d65ee890fc614cb2b4ff688979b008a82a0ff52 \
117117
--hash=sha256:72279a7f823969e18b10e438950f58330d17e0fcffb57cbd7929770cd687ecb2
118-
pytest==4.2.1 \
119-
--hash=sha256:80cfd9c8b9e93f419abcc0400e9f595974a98e44b6863a77d3e1039961bfc9c4 \
120-
--hash=sha256:c2396a15726218a2dfef480861c4ba37bd3952ebaaa5b0fede3fc23fddcd7f8c
118+
pytest==4.3.0 \
119+
--hash=sha256:067a1d4bf827ffdd56ad21bd46674703fce77c5957f6c1eef731f6146bfcef1c \
120+
--hash=sha256:9687049d53695ad45cf5fdc7bbd51f0c49f1ea3ecfc4b7f3fde7501b541f17f4
121121
snowballstemmer==1.2.1 \
122122
--hash=sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128 \
123123
--hash=sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89 \
@@ -129,6 +129,6 @@ toml==0.10.0 \
129129
tox==3.7.0 \
130130
--hash=sha256:04f8f1aa05de8e76d7a266ccd14e0d665d429977cd42123bc38efa9b59964e9e \
131131
--hash=sha256:25ef928babe88c71e3ed3af0c464d1160b01fca2dd1870a5bb26c2dea61a17fc
132-
virtualenv==16.4.0 \
133-
--hash=sha256:8b9abfc51c38b70f61634bf265e5beacf6fae11fc25d355d1871f49b8e45f0db \
134-
--hash=sha256:cceab52aa7d4df1e1871a70236eb2b89fcfe29b6b43510d9738689787c513261
132+
virtualenv==16.4.3 \
133+
--hash=sha256:6aebaf4dd2568a0094225ebbca987859e369e3e5c22dc7d52e5406d504890417 \
134+
--hash=sha256:984d7e607b0a5d1329425dd8845bd971b957424b5ba664729fab51ab8c11bc39

scripts/gen_ed25519_key.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#!/usr/bin/env python
2+
"""Generate an ed25519 keypair, and store as base64-encoded text files.
3+
4+
This script doesn't currently reuse the functions in `scriptworker.ed25519`, for
5+
easier standalone use. It could easily be a `console_script` though.
6+
7+
"""
8+
from __future__ import print_function
9+
import base64
10+
from cryptography.hazmat.primitives import serialization
11+
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey, Ed25519PublicKey
12+
import sys
13+
14+
15+
def private_key_from_string(key_str):
16+
"""Create an Ed25519PrivateKey from a base64-encoded string."""
17+
return Ed25519PrivateKey.from_private_bytes(
18+
base64.b64decode(key_str)
19+
)
20+
21+
22+
def public_key_from_string(key_str):
23+
"""Create an Ed25519PublicKey from a base64-encoded string."""
24+
return Ed25519PublicKey.from_public_bytes(
25+
base64.b64decode(key_str)
26+
)
27+
28+
29+
def b64_from_private_key(key):
30+
"""Get the base64 string from an Ed25519PrivateKey."""
31+
return base64.b64encode(key.private_bytes(
32+
encoding=serialization.Encoding.Raw,
33+
format=serialization.PrivateFormat.Raw,
34+
encryption_algorithm=serialization.NoEncryption()
35+
)).decode('utf-8')
36+
37+
38+
def b64_from_public_key(key):
39+
"""Get the base64 string from an Ed25519PublicKey."""
40+
return base64.b64encode(key.public_bytes(
41+
encoding=serialization.Encoding.Raw,
42+
format=serialization.PublicFormat.Raw,
43+
)).decode('utf-8')
44+
45+
46+
prefix = ""
47+
if len(sys.argv) > 1:
48+
prefix = "{}_".format(sys.argv[1])
49+
50+
privkey = Ed25519PrivateKey.generate()
51+
pubkey = privkey.public_key()
52+
privkey_str = b64_from_private_key(privkey)
53+
pubkey_str = b64_from_public_key(pubkey)
54+
55+
# test
56+
privkey2 = private_key_from_string(privkey_str)
57+
pubkey2 = public_key_from_string(pubkey_str)
58+
assert b64_from_private_key(privkey2) == privkey_str
59+
assert b64_from_public_key(pubkey2) == pubkey_str
60+
61+
with open("{}private_key".format(prefix), "w") as fh:
62+
fh.write(privkey_str)
63+
with open("{}public_key".format(prefix), "w") as fh:
64+
fh.write(pubkey_str)

scriptworker.yaml.tmpl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,20 @@ gpg_path: gpg
9999
my_email: "[email protected]"
100100

101101

102+
#-----------------------------------------------------------------------------------------------
103+
# ed25519 settings.
104+
#-----------------------------------------------------------------------------------------------
105+
ed25519_private_key_path: /tmp/ed25519_privkey
106+
# Override this if we need to add/remove keys without requiring a new scriptworker release.
107+
# ed25519_public_keys:
108+
# docker-worker:
109+
# - BASE64_ED25519_KEY_STRING
110+
# generic-worker:
111+
# - BASE64_ED25519_KEY_STRING
112+
# scriptworker:
113+
# - BASE64_ED25519_KEY_STRING
114+
115+
102116
#-----------------------------------------------------------------------------------------------
103117
# Valid artifact rules.
104118
# This is a list of dictionaries. Each dictionary specifies schemes, netlocs, and path_regexes.

0 commit comments

Comments
 (0)