Skip to content

Commit 46e974f

Browse files
committed
Merge branch 'main' into rage-0.11.2
2 parents 4e58037 + 6db6ca4 commit 46e974f

61 files changed

Lines changed: 6188 additions & 2043 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/interop.yml

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@ jobs:
2020
- name: cargo build
2121
run: cargo build --release --features unstable
2222
working-directory: ./rage
23+
- name: Build the dummy plugin
24+
run: cargo build --release --example age-plugin-unencrypted
2325
- uses: actions/upload-artifact@v4
2426
with:
2527
name: rage
2628
path: |
2729
target/release/rage
2830
target/release/rage-keygen
31+
target/release/examples/age-plugin-unencrypted
2932
3033
- name: Update FiloSottile/age status with result
3134
if: always() && github.event.action == 'age-interop-request'
@@ -95,7 +98,13 @@ jobs:
9598
matrix:
9699
alice: [rage, age]
97100
bob: [rage, age]
98-
recipient: [x25519, ssh-rsa, ssh-ed25519]
101+
recipient: [x25519, tag, tagpq, ssh-rsa, ssh-ed25519, plugin]
102+
include:
103+
- identity: true
104+
- recipient: tag
105+
identity: false
106+
- recipient: tagpq
107+
identity: false
99108
fail-fast: false
100109

101110
steps:
@@ -119,18 +128,33 @@ jobs:
119128
- run: chmod +x age
120129
- run: chmod +x age-keygen
121130

131+
# Prepare the plugin environment
132+
- name: Prepare the plugin environment
133+
if: matrix.recipient == 'plugin'
134+
run: |
135+
chmod +x ./examples/age-plugin-unencrypted
136+
mkdir -p ~/.local/bin
137+
mv ./examples/age-plugin-unencrypted ~/.local/bin
138+
122139
# Prepare the test environment
123140
- name: Install dos2unix for simulating Windows files
124141
run: sudo apt update && sudo apt install dos2unix
125-
- name: Write (very not private) age X25519 key
126-
if: matrix.recipient == 'x25519'
127-
run: echo "AGE-SECRET-KEY-1TRYTV7PQS5XPUYSTAQZCD7DQCWC7Q77YJD7UVFJRMW4J82Q6930QS70MRX" >key.txt
128-
- name: Save the corresponding age x25519 recipient
129-
if: matrix.recipient == 'x25519'
130-
run: echo "age1y8m84r6pwd4da5d45zzk03rlgv2xr7fn9px80suw3psrahul44ashl0usm" >key.txt.pub
131-
- name: Set the corresponding age x25519 recipient
142+
- name: Set up the X25519 identity and recipient
132143
if: matrix.recipient == 'x25519'
133-
run: echo "AGE_PUBKEY=-r age1y8m84r6pwd4da5d45zzk03rlgv2xr7fn9px80suw3psrahul44ashl0usm" >> $GITHUB_ENV
144+
run: |
145+
echo "AGE-SECRET-KEY-1TRYTV7PQS5XPUYSTAQZCD7DQCWC7Q77YJD7UVFJRMW4J82Q6930QS70MRX" >key.txt
146+
echo "age1y8m84r6pwd4da5d45zzk03rlgv2xr7fn9px80suw3psrahul44ashl0usm" >key.txt.pub
147+
echo "AGE_PUBKEY=-r age1y8m84r6pwd4da5d45zzk03rlgv2xr7fn9px80suw3psrahul44ashl0usm" >> $GITHUB_ENV
148+
- name: Set up the age tag recipient
149+
if: matrix.recipient == 'tag'
150+
run: |
151+
echo "age1tag1qt8lw0ual6avlwmwatk888yqnmdamm7xfd0wak53ut6elz5c4swx2yqdj4e" >key.txt.pub
152+
echo "AGE_PUBKEY=-r age1tag1qt8lw0ual6avlwmwatk888yqnmdamm7xfd0wak53ut6elz5c4swx2yqdj4e" >> $GITHUB_ENV
153+
- name: Set up the age tagpq recipient
154+
if: matrix.recipient == 'tagpq'
155+
run: |
156+
echo "age1tagpq1m3e4wvp6hzcrn9exhy0ae3xfx2sjymp594k3tg7j4dpmj922we65vtnmrt2pyallax8669zqkr2pmfchptr4n38kug2xmcmp3adk2lnjqu00x5kxz5pvhmrltvfh9wuq973pcx35cnq8syn9qd3tzpehgztl4xpzr3tpd67g8af9trnjpc05gh7wu536aq4qt2y8zhsm4tvrfpsfl36qs5fpzysnk3sp9w77qzeg49357xex40v4s2lvt620swyys7u8yxdcnu4rkkwxdmt55gsuc3h5c5swahnegjgqwc60hn085ec3sjztwm45l44y3j2at9t6v9zra4ek3kek6waecqm98yaxl37w0d2zra626nz63jdm5sg59w7lyptw83zm6fntd8d0x03a9z6h9prfgpygzar6zrxjcrt4cdctk2mhf95s4a6v4zklfd49xhpsaeujm57thx2x3e3hwzc86ftfhmq5mkxxz3d6r8ws24xj4qfn73eyezg2wy094e3why592pghz27ruq3vkyegrv80eftnw9wqzwgvnwyseaus0yt84fylzrpzp6x2fguxuqjmgudr8xd33qm30evdpxd3jvjg8qh4q60kyq80jgff369k7nrepdc38grd2dava520excqp0ey0x39khx8ry03yffcatgv84fsx5j49djpapedsy693zute5xv5g2ewzrlj5se7akvkc4g4vmzhputpq8eyj9wz5dz6qtn7g3cfpd95nahw4ytspan0feyye04dcylv24ege7zkaj004gjwcxqxfqu2quawa83sx452jqjn8t48czp0xspwgnmvjyhttzzy6nhq8xzkdwnvsfefkwva6asrqc93zjn4rly5gnlv93xy3uzmr39szvjnf63426qzyeyvguc4vdcquwgsxgq236afcpqz866ny4tn7ckc0umefj242rt5vtvwqzzrvfev2mpvqcufp9pqvefyv4ftyuhgausfzuaadsczeykmft5wv3frzgrcp9ztr93h478ke4t86spp2uhyjkj73mp9g92ddk2fpv7v3njzsqgwhq3789sqrgkskehn0zjscckhwftyq4vet7vrlx2hs5kd9cwnq6t0djffhh3zquh4j3p0yaj9z2rc9wykg0usqw7983rrgur9jg8rnnqypwcz2lyclnnc705fc5g3an93ps60q6mxqp85u0ewtxdjlqcks84yduft0a0g6e7naew3v9u2d08knarvajn8q3gq9pgxde3s7nx94lus48wwvw2xjm7k82tvylec2393jdsuvch2xpe77w8hpv9nvsxfsrs270njpmfvpmgyk2cffl9tjp3qqcc4dfkf5rme2dg0x7ew8g39www5smm705q5da4eqvnqwrkavtq6xje9ss38hnkglz4eddz8f5qruvqmq2ff9l22gwkv8h432rdkysy0grkul8e2fedvkyyapfxt760udcgu92m54wl9yavmj4ga3ph9r5n99cjrq6wj5v33x33fe5vkjvfwnnt40wuv2hyexc9f4ylyqv9ldqq9epd4yuv8vrsfx2qy2kqz08kqhnzspy6s0x8fa5c2xkg5y2q0rvz4vnk7rp0acg6eksc3t7cxnn8y7glkjsqja3p56uz6vvhcw55d3ysad0hvsqxpjnc7svenf2gc5xn5kyr0et2vvyruxlnpqcdpqh9pzplumy5yzjxftyzh9ujfw0jq7ee60zx2x23p0jzyh9dvmly8p9h9ysptlqu7kwnejd65dnr75a0np2fvke8xen38r57w6z3wz3mycjmmn267wwxndfh9jdps7uxtct2wwfgamkpa5ap8s96lhfjztpwcm6fguhphu38yunu2v4vz3syzrvgwtqpemkewzp766nyu6texxvjlaemnhyyqutkcy6a42vqfsz49rw5wr4gt70r4vdaasehqjg46fnyts4sthrxadfllha3avu49wsj2c4jx" >key.txt.pub
157+
echo "AGE_PUBKEY=-r age1tagpq1m3e4wvp6hzcrn9exhy0ae3xfx2sjymp594k3tg7j4dpmj922we65vtnmrt2pyallax8669zqkr2pmfchptr4n38kug2xmcmp3adk2lnjqu00x5kxz5pvhmrltvfh9wuq973pcx35cnq8syn9qd3tzpehgztl4xpzr3tpd67g8af9trnjpc05gh7wu536aq4qt2y8zhsm4tvrfpsfl36qs5fpzysnk3sp9w77qzeg49357xex40v4s2lvt620swyys7u8yxdcnu4rkkwxdmt55gsuc3h5c5swahnegjgqwc60hn085ec3sjztwm45l44y3j2at9t6v9zra4ek3kek6waecqm98yaxl37w0d2zra626nz63jdm5sg59w7lyptw83zm6fntd8d0x03a9z6h9prfgpygzar6zrxjcrt4cdctk2mhf95s4a6v4zklfd49xhpsaeujm57thx2x3e3hwzc86ftfhmq5mkxxz3d6r8ws24xj4qfn73eyezg2wy094e3why592pghz27ruq3vkyegrv80eftnw9wqzwgvnwyseaus0yt84fylzrpzp6x2fguxuqjmgudr8xd33qm30evdpxd3jvjg8qh4q60kyq80jgff369k7nrepdc38grd2dava520excqp0ey0x39khx8ry03yffcatgv84fsx5j49djpapedsy693zute5xv5g2ewzrlj5se7akvkc4g4vmzhputpq8eyj9wz5dz6qtn7g3cfpd95nahw4ytspan0feyye04dcylv24ege7zkaj004gjwcxqxfqu2quawa83sx452jqjn8t48czp0xspwgnmvjyhttzzy6nhq8xzkdwnvsfefkwva6asrqc93zjn4rly5gnlv93xy3uzmr39szvjnf63426qzyeyvguc4vdcquwgsxgq236afcpqz866ny4tn7ckc0umefj242rt5vtvwqzzrvfev2mpvqcufp9pqvefyv4ftyuhgausfzuaadsczeykmft5wv3frzgrcp9ztr93h478ke4t86spp2uhyjkj73mp9g92ddk2fpv7v3njzsqgwhq3789sqrgkskehn0zjscckhwftyq4vet7vrlx2hs5kd9cwnq6t0djffhh3zquh4j3p0yaj9z2rc9wykg0usqw7983rrgur9jg8rnnqypwcz2lyclnnc705fc5g3an93ps60q6mxqp85u0ewtxdjlqcks84yduft0a0g6e7naew3v9u2d08knarvajn8q3gq9pgxde3s7nx94lus48wwvw2xjm7k82tvylec2393jdsuvch2xpe77w8hpv9nvsxfsrs270njpmfvpmgyk2cffl9tjp3qqcc4dfkf5rme2dg0x7ew8g39www5smm705q5da4eqvnqwrkavtq6xje9ss38hnkglz4eddz8f5qruvqmq2ff9l22gwkv8h432rdkysy0grkul8e2fedvkyyapfxt760udcgu92m54wl9yavmj4ga3ph9r5n99cjrq6wj5v33x33fe5vkjvfwnnt40wuv2hyexc9f4ylyqv9ldqq9epd4yuv8vrsfx2qy2kqz08kqhnzspy6s0x8fa5c2xkg5y2q0rvz4vnk7rp0acg6eksc3t7cxnn8y7glkjsqja3p56uz6vvhcw55d3ysad0hvsqxpjnc7svenf2gc5xn5kyr0et2vvyruxlnpqcdpqh9pzplumy5yzjxftyzh9ujfw0jq7ee60zx2x23p0jzyh9dvmly8p9h9ysptlqu7kwnejd65dnr75a0np2fvke8xen38r57w6z3wz3mycjmmn267wwxndfh9jdps7uxtct2wwfgamkpa5ap8s96lhfjztpwcm6fguhphu38yunu2v4vz3syzrvgwtqpemkewzp766nyu6texxvjlaemnhyyqutkcy6a42vqfsz49rw5wr4gt70r4vdaasehqjg46fnyts4sthrxadfllha3avu49wsj2c4jx" >> $GITHUB_ENV
134158
- name: Generate an ssh-rsa key
135159
if: matrix.recipient == 'ssh-rsa'
136160
run: ssh-keygen -t rsa -N "" -f key.txt
@@ -140,6 +164,12 @@ jobs:
140164
- name: Set the corresponding SSH recipient
141165
if: matrix.recipient == 'ssh-rsa' || matrix.recipient == 'ssh-ed25519'
142166
run: echo "AGE_PUBKEY=-R key.txt.pub" >> $GITHUB_ENV
167+
- name: Set up the plugin identity and recipient
168+
if: matrix.recipient == 'plugin'
169+
run: |
170+
age-plugin-unencrypted >key.txt
171+
echo "age1unencrypted1k5fr0r" >key.txt.pub
172+
echo "AGE_PUBKEY=-r age1unencrypted1k5fr0r" >> $GITHUB_ENV
143173
- name: Store key.txt in case we need it
144174
uses: actions/upload-artifact@v4
145175
with:
@@ -151,6 +181,7 @@ jobs:
151181
run: echo "Test string" | ./${{ matrix.alice }} -o test.age $AGE_PUBKEY
152182
- name: Decrypt from file
153183
run: ./${{ matrix.bob }} -d -i key.txt test.age | grep -q "^Test string$"
184+
if: matrix.identity
154185
- name: Store test.age
155186
uses: actions/upload-artifact@v4
156187
if: failure()
@@ -163,6 +194,7 @@ jobs:
163194
- name: Encrypt to ASCII-armored file
164195
run: ./${{ matrix.alice }} -a -o test2.age $AGE_PUBKEY test2.txt
165196
- name: Decrypt from ASCII-armored file
197+
if: matrix.identity
166198
run: ./${{ matrix.bob }} -d -i key.txt test2.age | grep -q "^2 test 2 string$"
167199
- name: Store test2.age
168200
uses: actions/upload-artifact@v4
@@ -174,6 +206,7 @@ jobs:
174206
- name: Convert file to CRLF
175207
run: unix2dos test2.age
176208
- name: Decrypt from ASCII-armored CRLF file
209+
if: matrix.identity
177210
run: ./${{ matrix.bob }} -d -i key.txt test2.age | grep -q "^2 test 2 string$"
178211
- name: Store CRLF-ed test2.age
179212
uses: actions/upload-artifact@v4
@@ -183,6 +216,7 @@ jobs:
183216
path: test2.age
184217

185218
- name: Pipes!
219+
if: matrix.identity
186220
run: echo "Test string 3 - ASCII Drift" | ./${{ matrix.alice }} $AGE_PUBKEY | tee --output-error=warn test3.age | ./${{ matrix.bob }} -d -i key.txt | grep -q "^Test string 3 - ASCII Drift$"
187221
- name: Store test3.age
188222
uses: actions/upload-artifact@v4
@@ -194,6 +228,7 @@ jobs:
194228
- name: Explicit stdout during encryption
195229
run: ./${{ matrix.alice }} -a -o - $AGE_PUBKEY test2.txt >test4.age
196230
- name: Explicit stdin during decryption
231+
if: matrix.identity
197232
run: cat test4.age | ./${{ matrix.bob }} -d -i key.txt - | grep -q "^2 test 2 string$"
198233
- name: Store test4.age
199234
uses: actions/upload-artifact@v4
@@ -205,8 +240,10 @@ jobs:
205240
- name: Generate a file to encrypt
206241
run: echo "Test 5" > test5.txt
207242
- name: Encrypt to identity in a named pipe
243+
if: matrix.identity
208244
run: ./${{ matrix.alice }} -e -i <(cat key.txt) -o test5.age test5.txt
209245
- name: Decrypt with identity in a named pipe
246+
if: matrix.identity
210247
run: ./${{ matrix.bob }} -d -i <(cat key.txt) test5.age | grep -q "^Test 5$"
211248
- name: Store test5.age
212249
uses: actions/upload-artifact@v4
@@ -218,6 +255,7 @@ jobs:
218255
- name: Encrypt to recipient in standard input
219256
run: cat key.txt.pub | ./${{ matrix.alice }} -e -R - -o test6.age test5.txt
220257
- name: Decrypt with identity in standard input
258+
if: matrix.identity
221259
run: cat key.txt | ./${{ matrix.bob }} -d -i - test6.age | grep -q "^Test 5$"
222260
- name: Store test6.age
223261
uses: actions/upload-artifact@v4
@@ -227,6 +265,7 @@ jobs:
227265
path: test6.age
228266

229267
- name: Keygen prevents overwriting an existing file
268+
if: matrix.identity
230269
run: |
231270
touch do_not_overwrite_key.txt
232271
if $(./${{ matrix.alice }}-keygen -o do_not_overwrite_key.txt); then
@@ -236,6 +275,7 @@ jobs:
236275
fi
237276
238277
- name: Keygen supports conversion from stdin
278+
if: matrix.identity
239279
run: ./${{ matrix.alice }}-keygen | ./${{ matrix.bob }}-keygen -y
240280

241281
- name: Keygen supports conversion from file

.github/workflows/mutants.yml

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
name: Mutation testing
2+
3+
env:
4+
CARGO_TERM_COLOR: always
5+
6+
on:
7+
# Run weekly on Sundays at 2 AM UTC
8+
schedule:
9+
- cron: "0 2 * * 0"
10+
# Allow manual triggering
11+
workflow_dispatch:
12+
inputs:
13+
package:
14+
description: "Package to test (select 'all' for all packages)"
15+
required: false
16+
default: "all"
17+
type: choice
18+
options:
19+
- all
20+
- age
21+
- age-core
22+
- age-plugin
23+
- rage
24+
25+
permissions:
26+
contents: read
27+
28+
# Only run one mutation test at a time
29+
concurrency:
30+
group: mutation-testing
31+
cancel-in-progress: false
32+
33+
jobs:
34+
mutants:
35+
name: Mutation testing of ${{ matrix.package }}
36+
runs-on: ubuntu-latest
37+
strategy:
38+
fail-fast: false
39+
matrix:
40+
package:
41+
- age
42+
- age-core
43+
- age-plugin
44+
- rage
45+
# Only filter if a specific package was requested via workflow_dispatch
46+
# For push/pull_request events, inputs.package is undefined, so default to 'all'
47+
exclude:
48+
- package: ${{ case((github.event.inputs.package || 'all') != 'all' && (github.event.inputs.package || 'all') != 'age', 'age', 'NONE') }}
49+
- package: ${{ case((github.event.inputs.package || 'all') != 'all' && (github.event.inputs.package || 'all') != 'age-core', 'age-core', 'NONE') }}
50+
- package: ${{ case((github.event.inputs.package || 'all') != 'all' && (github.event.inputs.package || 'all') != 'age-plugin', 'age-plugin', 'NONE') }}
51+
- package: ${{ case((github.event.inputs.package || 'all') != 'all' && (github.event.inputs.package || 'all') != 'rage', 'rage', 'NONE') }}
52+
53+
steps:
54+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
55+
with:
56+
persist-credentials: false
57+
- uses: dtolnay/rust-toolchain@stable
58+
id: toolchain
59+
- run: rustup override set "${TOOLCHAIN}"
60+
shell: sh
61+
env:
62+
TOOLCHAIN: ${{steps.toolchain.outputs.name}}
63+
- name: Install linux build dependencies
64+
run: sudo apt update && sudo apt install libfuse-dev
65+
- uses: taiki-e/install-action@650c5ca14212efbbf3e580844b04bdccf68dac31 # v2.67.18
66+
with:
67+
tool: cargo-mutants
68+
- run: >
69+
cargo mutants
70+
--package "${{ matrix.package }}"
71+
--all-features
72+
-vV
73+
--in-place
74+
--test-workspace true
75+
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
76+
if: always()
77+
with:
78+
name: mutants-${{ matrix.package }}
79+
path: |
80+
mutants.out/
81+
retention-days: 30

0 commit comments

Comments
 (0)