1use crate::errors::*;
2use crate::signed::Signed;
3use bstr::ByteSlice;
4use gix_object::{CommitRef, WriteTo};
5
6#[derive(Debug, Clone, Copy, clap::ValueEnum)]
7pub enum Kind {
8 Commit,
9 Tag,
10}
11
12pub fn convert(kind: Option<Kind>, buf: &[u8]) -> Result<Signed> {
13 let signed = match kind {
14 Some(Kind::Commit) => {
15 let mut commit = CommitRef::from_bytes(buf).context("Failed to decode as commit")?;
16
17 let mut signature = None;
18 for (k, v) in &commit.extra_headers {
19 if k.as_bytes() == b"gpgsig" {
20 signature = Some(v.to_vec());
21 }
22 }
23
24 let signature = signature.context("Provided commit is not signed")?;
25
26 commit
27 .extra_headers
28 .retain(|(k, _v)| k.as_bytes() != b"gpgsig");
29
30 let mut msg = b"-----BEGIN PGP SIGNED MESSAGE-----\n\n".to_vec();
31 commit.write_to(&mut msg)?;
32 msg.extend(&signature);
33 msg.push(b'\n');
34
35 let (signed, _) = Signed::from_bytes(&msg)?;
36 signed
37 }
38 Some(Kind::Tag) => {
39 let mut msg = b"-----BEGIN PGP SIGNED MESSAGE-----\n\n".to_vec();
41 msg.extend(buf);
42
43 let (signed, _) = Signed::from_bytes(&msg)?;
44 signed
45 }
46 None => bail!("git objects with loose header are not supported yet"),
47 };
48
49 Ok(signed)
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55 use crate::plumbing::Keyring;
56
57 fn init() {
58 let _ = env_logger::builder().is_test(true).try_init();
59 }
60
61 const KEYRING: &[u8] = b"-----BEGIN PGP PUBLIC KEY BLOCK-----
62
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
99Wvy2w/qAYfy+XKIgNEqr8dCwp6BL3JTsXpK48hYyilBOfLdXPvqsphfgUGF5BRIz
100Qw756s1Sc8uQOo1alo6JcC8iB9quX6UjZSGXf3dgFvu4v3KiEDzWnijySW5At7Qn
101TGV2ZW50ZSBQb2x5YWsgPGFudGhyYXh4QGFyY2hsaW51eC5vcmc+iQJUBBMBCgA+
102AhsDAh4BAheABQsJCAcDBRUKCQgLBRYCAwEAFiEE4kC1fixGMLp2ji8m/BtUfI2B
103csgFAmF5ymAFCRbZqpUACgkQ/BtUfI2BcsiZrw/+KU48++ZguIg7rVYHk1zTnPqy
104QG8/cPB87K3kY/Tfr5InPHtDMSeyACLat5xvLMYI3xZ2M9XPZMOUqJI5DPpx6rT0
105CYBPDjLnWxcma+t2SwcXTpl3bbxMVH3cNuttAniFXLMpr/E8W9LKWgqLc1kUeHHQ
1061ig2+PVjKwzU+kRWH1/w6ztPfbhBnaLhnXavDM5O+Pt0mrFWlYFIbRHpDofR6eew
107SU8iA6gZyfvWMVXuQWqn9kESPExQw7rdxwXVcOMMgCPsF7Bk5XL5rA6V6L1++CSP
108VYly/48CBXYh5h6w2haQStieq3iTHy/+ikvIgWWkYjmKaYietPWoMSmqwUOm0Ab0
1091vsC/PQRWSo8TJzJ99qKl1YUiUuRLsElUN+f29MAR/3zC8us7/tlLhl2kk5qSVhQ
110uK0GEA/9ilLecDRuJFQL9GyBYDaGcwaIrWzybGdqFEijpKkQXTI8d0YjMU9olBrf
111Rq3Nq6Nv9qw3o0CddOwHxi8Xmd8MQszAuED+RqTZ54KIW+5fa9igW7ag15wRW/s6
112r26PHBbOS/wRg18xpmFfktcmNA2RalW6Wh2z2E89f8GW96P4vyZmej8sogv7i5Zp
113Hmr19kMjxptxA0SfxXa0uJRq5zPQuFt6691JbeuDW5Wa43UGdBiWcnZ3B04L3bzo
1148bh5d51zDLBZuYit30O0KExldmVudGUgUG9seWFrIDxhbnRocmF4eEBoYW1idXJn
115LmNjYy5kZT6JAlQEEwEKAD4CGwMCHgECF4AFCwkIBwMFFQoJCAsFFgIDAQAWIQTi
116QLV+LEYwunaOLyb8G1R8jYFyyAUCYXnKYAUJFtmqlQAKCRD8G1R8jYFyyHGsD/9o
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
178=NtF6
179-----END PGP PUBLIC KEY BLOCK-----
180";
181
182 #[test]
183 fn verify_tag() -> Result<()> {
184 init();
185 let buf = b"object f870ab6864bedcf9e5af137214aa9bc726b8299c
186type commit
187tag 20230105
188tagger Levente Polyak <anthraxx@archlinux.org> 1672932047 +0100
189
190Version 20230105
191-----BEGIN PGP SIGNATURE-----
192
193iQIzBAABCgAdFiEE4kC1fixGMLp2ji8m/BtUfI2BcsgFAmO26s8ACgkQ/BtUfI2B
194csifzA//czbzHwvxg+HVJwzUmId4rVt452si+7ucOjG0+dRtcE31zL39FgA3jeqK
195zL0z+G/lI7LoINM5FKrakBwXBcBx5TYDvt41P900NTwH0EqR7ZKePdL/gya8B0HN
1966RC7SrdVnY/nkibDOHSGOyMBcf5x815oxgHffo+87Fgoz3pTpZmifEMnFs4Kr7oc
197C9GMvsBEs8tPztYaBxgXsJ4Sd7ThqqxOa3u82ioiD1K5Wp/RaAaWW3CRpg0RKgg4
198pw8HVdNJk1rd42x5K1stSvmdiC6nyZBumaNP3HXMYdkecKRY+Iv5powcQr4kpp61
199lwcfTYcwEg5qeWscUlyrOtx0pYh1WHu4rg3HdOy0bwhEwOOIizLzmVArSH43OQRA
200DwK9gEvsmZspB1j6xQA/gQqeP7ps4VDJ2hW+NVn4AAMDpLvybSBzHCA6/8fO3Z+m
201vSfPc7oxQ4MFlligyrhXFZAa4rhBb3kUDY15P5TcrX6zTUbQA9BDQrQbuRrj+uEP
202yLFl/ptRrn+mW+AB80IOD4stu3tTZqKkyV4BMJLou8z2buWN3VN14CbUTGCTUNMW
203gEZz7HSkX3WmEJKFBRG45hyDfIx9XqaEbJH0SXcmDzZ1uZ55aD40vBQQcHqZoKLj
2047f06imt697ReuFR5bMYjkNMlWmMAYR4ERrEIWBQXnCcY3MpiMx0=
205=Sg65
206-----END PGP SIGNATURE-----
207";
208 let keyring = Keyring::new(KEYRING)?;
209
210 let signed = convert(Some(Kind::Tag), buf)?;
211 assert_eq!(
212 signed,
213 Signed {
214 content: "object f870ab6864bedcf9e5af137214aa9bc726b8299c
215type commit
216tag 20230105
217tagger Levente Polyak <anthraxx@archlinux.org> 1672932047 +0100
218
219Version 20230105
220"
221 .into(),
222 signature: vec![
223 137, 2, 51, 4, 0, 1, 10, 0, 29, 22, 33, 4, 226, 64, 181, 126, 44, 70, 48, 186,
224 118, 142, 47, 38, 252, 27, 84, 124, 141, 129, 114, 200, 5, 2, 99, 182, 234,
225 207, 0, 10, 9, 16, 252, 27, 84, 124, 141, 129, 114, 200, 159, 204, 15, 255,
226 115, 54, 243, 31, 11, 241, 131, 225, 213, 39, 12, 212, 152, 135, 120, 173, 91,
227 120, 231, 107, 34, 251, 187, 156, 58, 49, 180, 249, 212, 109, 112, 77, 245,
228 204, 189, 253, 22, 0, 55, 141, 234, 138, 204, 189, 51, 248, 111, 229, 35, 178,
229 232, 32, 211, 57, 20, 170, 218, 144, 28, 23, 5, 192, 113, 229, 54, 3, 190, 222,
230 53, 63, 221, 52, 53, 60, 7, 208, 74, 145, 237, 146, 158, 61, 210, 255, 131, 38,
231 188, 7, 65, 205, 233, 16, 187, 74, 183, 85, 157, 143, 231, 146, 38, 195, 56,
232 116, 134, 59, 35, 1, 113, 254, 113, 243, 94, 104, 198, 1, 223, 126, 143, 188,
233 236, 88, 40, 207, 122, 83, 165, 153, 162, 124, 67, 39, 22, 206, 10, 175, 186,
234 28, 11, 209, 140, 190, 192, 68, 179, 203, 79, 206, 214, 26, 7, 24, 23, 176,
235 158, 18, 119, 180, 225, 170, 172, 78, 107, 123, 188, 218, 42, 34, 15, 82, 185,
236 90, 159, 209, 104, 6, 150, 91, 112, 145, 166, 13, 17, 42, 8, 56, 167, 15, 7,
237 85, 211, 73, 147, 90, 221, 227, 108, 121, 43, 91, 45, 74, 249, 157, 136, 46,
238 167, 201, 144, 110, 153, 163, 79, 220, 117, 204, 97, 217, 30, 112, 164, 88,
239 248, 139, 249, 166, 140, 28, 66, 190, 36, 166, 158, 181, 151, 7, 31, 77, 135,
240 48, 18, 14, 106, 121, 107, 28, 82, 92, 171, 58, 220, 116, 165, 136, 117, 88,
241 123, 184, 174, 13, 199, 116, 236, 180, 111, 8, 68, 192, 227, 136, 139, 50, 243,
242 153, 80, 43, 72, 126, 55, 57, 4, 64, 15, 2, 189, 128, 75, 236, 153, 155, 41, 7,
243 88, 250, 197, 0, 63, 129, 10, 158, 63, 186, 108, 225, 80, 201, 218, 21, 190,
244 53, 89, 248, 0, 3, 3, 164, 187, 242, 109, 32, 115, 28, 32, 58, 255, 199, 206,
245 221, 159, 166, 189, 39, 207, 115, 186, 49, 67, 131, 5, 150, 88, 160, 202, 184,
246 87, 21, 144, 26, 226, 184, 65, 111, 121, 20, 13, 141, 121, 63, 148, 220, 173,
247 126, 179, 77, 70, 208, 3, 208, 67, 66, 180, 27, 185, 26, 227, 250, 225, 15,
248 200, 177, 101, 254, 155, 81, 174, 127, 166, 91, 224, 1, 243, 66, 14, 15, 139,
249 45, 187, 123, 83, 102, 162, 164, 201, 94, 1, 48, 146, 232, 187, 204, 246, 110,
250 229, 141, 221, 83, 117, 224, 38, 212, 76, 96, 147, 80, 211, 22, 128, 70, 115,
251 236, 116, 164, 95, 117, 166, 16, 146, 133, 5, 17, 184, 230, 28, 131, 124, 140,
252 125, 94, 166, 132, 108, 145, 244, 73, 119, 38, 15, 54, 117, 185, 158, 121, 104,
253 62, 52, 188, 20, 16, 112, 122, 153, 160, 162, 227, 237, 253, 58, 138, 107, 122,
254 247, 180, 94, 184, 84, 121, 108, 198, 35, 144, 211, 37, 90, 99, 0, 97, 30, 4,
255 70, 177, 8, 88, 20, 23, 156, 39, 24, 220, 202, 98, 51, 29
256 ]
257 }
258 );
259 let canonical = signed.canonicalize(Some(&keyring))?;
260 assert_eq!(
261 canonical,
262 vec![(
263 Some("E240B57E2C4630BA768E2F26FC1B547C8D8172C8".parse()?),
264 Signed {
265 content: "object f870ab6864bedcf9e5af137214aa9bc726b8299c
266type commit
267tag 20230105
268tagger Levente Polyak <anthraxx@archlinux.org> 1672932047 +0100
269
270Version 20230105
271"
272 .into(),
273 signature: vec![
274 194, 193, 115, 4, 0, 1, 10, 0, 29, 22, 33, 4, 226, 64, 181, 126, 44, 70,
275 48, 186, 118, 142, 47, 38, 252, 27, 84, 124, 141, 129, 114, 200, 5, 2, 99,
276 182, 234, 207, 0, 10, 9, 16, 252, 27, 84, 124, 141, 129, 114, 200, 159,
277 204, 15, 255, 115, 54, 243, 31, 11, 241, 131, 225, 213, 39, 12, 212, 152,
278 135, 120, 173, 91, 120, 231, 107, 34, 251, 187, 156, 58, 49, 180, 249, 212,
279 109, 112, 77, 245, 204, 189, 253, 22, 0, 55, 141, 234, 138, 204, 189, 51,
280 248, 111, 229, 35, 178, 232, 32, 211, 57, 20, 170, 218, 144, 28, 23, 5,
281 192, 113, 229, 54, 3, 190, 222, 53, 63, 221, 52, 53, 60, 7, 208, 74, 145,
282 237, 146, 158, 61, 210, 255, 131, 38, 188, 7, 65, 205, 233, 16, 187, 74,
283 183, 85, 157, 143, 231, 146, 38, 195, 56, 116, 134, 59, 35, 1, 113, 254,
284 113, 243, 94, 104, 198, 1, 223, 126, 143, 188, 236, 88, 40, 207, 122, 83,
285 165, 153, 162, 124, 67, 39, 22, 206, 10, 175, 186, 28, 11, 209, 140, 190,
286 192, 68, 179, 203, 79, 206, 214, 26, 7, 24, 23, 176, 158, 18, 119, 180,
287 225, 170, 172, 78, 107, 123, 188, 218, 42, 34, 15, 82, 185, 90, 159, 209,
288 104, 6, 150, 91, 112, 145, 166, 13, 17, 42, 8, 56, 167, 15, 7, 85, 211, 73,
289 147, 90, 221, 227, 108, 121, 43, 91, 45, 74, 249, 157, 136, 46, 167, 201,
290 144, 110, 153, 163, 79, 220, 117, 204, 97, 217, 30, 112, 164, 88, 248, 139,
291 249, 166, 140, 28, 66, 190, 36, 166, 158, 181, 151, 7, 31, 77, 135, 48, 18,
292 14, 106, 121, 107, 28, 82, 92, 171, 58, 220, 116, 165, 136, 117, 88, 123,
293 184, 174, 13, 199, 116, 236, 180, 111, 8, 68, 192, 227, 136, 139, 50, 243,
294 153, 80, 43, 72, 126, 55, 57, 4, 64, 15, 2, 189, 128, 75, 236, 153, 155,
295 41, 7, 88, 250, 197, 0, 63, 129, 10, 158, 63, 186, 108, 225, 80, 201, 218,
296 21, 190, 53, 89, 248, 0, 3, 3, 164, 187, 242, 109, 32, 115, 28, 32, 58,
297 255, 199, 206, 221, 159, 166, 189, 39, 207, 115, 186, 49, 67, 131, 5, 150,
298 88, 160, 202, 184, 87, 21, 144, 26, 226, 184, 65, 111, 121, 20, 13, 141,
299 121, 63, 148, 220, 173, 126, 179, 77, 70, 208, 3, 208, 67, 66, 180, 27,
300 185, 26, 227, 250, 225, 15, 200, 177, 101, 254, 155, 81, 174, 127, 166, 91,
301 224, 1, 243, 66, 14, 15, 139, 45, 187, 123, 83, 102, 162, 164, 201, 94, 1,
302 48, 146, 232, 187, 204, 246, 110, 229, 141, 221, 83, 117, 224, 38, 212, 76,
303 96, 147, 80, 211, 22, 128, 70, 115, 236, 116, 164, 95, 117, 166, 16, 146,
304 133, 5, 17, 184, 230, 28, 131, 124, 140, 125, 94, 166, 132, 108, 145, 244,
305 73, 119, 38, 15, 54, 117, 185, 158, 121, 104, 62, 52, 188, 20, 16, 112,
306 122, 153, 160, 162, 227, 237, 253, 58, 138, 107, 122, 247, 180, 94, 184,
307 84, 121, 108, 198, 35, 144, 211, 37, 90, 99, 0, 97, 30, 4, 70, 177, 8, 88,
308 20, 23, 156, 39, 24, 220, 202, 98, 51, 29
309 ]
310 }
311 )]
312 );
313
314 Ok(())
315 }
316
317 #[test]
318 fn verify_commit() -> Result<()> {
319 init();
320 let buf = b"tree 1b99d17009234a86e65e830c7a7ae6f7d182b8ef
321parent d45e77738bda2d17b10f87d05167a12fa5be8d63
322author Levente Polyak <anthraxx@archlinux.org> 1673558348 +0100
323committer Levente Polyak <anthraxx@archlinux.org> 1673912904 +0100
324gpgsig -----BEGIN PGP SIGNATURE-----
325
326 iQIzBAABCgAdFiEE4kC1fixGMLp2ji8m/BtUfI2BcsgFAmPF4koACgkQ/BtUfI2B
327 csjt2g//f4DDzb+z8MoMP9UfLCXy3nTstCxdlIiQQtPz7t9WPhxNxjKZai32UQzW
328 4SBlwzErlugnOe0wkZb2olD7X/+/ffKO/s/b32rqxumjzrzpqSXHrrqo9XoL3Aut
329 dXrgQ0X+hDRGcwbJS6iT05zJuYV9XXxgY+IKrJPQKveiTNYXS9M04b/kxHPvM4Vl
330 gdCAxXKsjSdBxFepepI1vHEZOziEtT/3cB+7Rm2l93AyRuSPG01DZ48xKbIvpsEs
331 Pt2X16cQTe0d0OORBVnnRXjhx9CI1QE5+H4ZUm94CW64GOoOtYQV74mtzJMZjuvN
332 exdaWciOG/5Jq1QrIWvT4uRCl1mc3+rtjj/S9SPelZb24HqakoCCQE6xf1UAu5F8
333 cN+8AyeENizh5xanueiAVwnRKzc07+VzKbKjR5nA4UWaTs6tNMLII6+LPnLnn2Du
334 ZUCWEg972TevQ5u9AlkJkUI6JqkucBYc0IQZ8r6A7gg4YrLhbElpC5MY3F/EozGY
335 T1jbwndZ/BQFSauImU75eU/JqRTnVi2K+gTXo78U7QaJZuUhhnPxjlbwm4Pgva7X
336 cO5e9ZEVYT8PxgT2CrbBmNFDAu3SH87ONiuJR3OibNsjCikTpUIdgcNK8E4A15JR
337 M3Qw+dOJUEDzhvDkzFYQ87Liz8ITX7cFgpx9OnkBgVjWi6zl+uo=
338 =YZzN
339 -----END PGP SIGNATURE-----
340
341commitpkg: abort execution if msg file editor exits none-successfully
342
343Previously the script execution did not abort if the msg file editor
344exited none-successfully leading to undesired commits with a potentially
345unfinished message. Instead abort the commit if the msg file editor is
346deliberately terminated with a failure code.
347
348Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
349";
350
351 let keyring = Keyring::new(KEYRING)?;
352
353 let signed = convert(Some(Kind::Commit), buf)?;
354 assert_eq!(
355 signed,
356 Signed {
357 content: "tree 1b99d17009234a86e65e830c7a7ae6f7d182b8ef
358parent d45e77738bda2d17b10f87d05167a12fa5be8d63
359author Levente Polyak <anthraxx@archlinux.org> 1673558348 +0100
360committer Levente Polyak <anthraxx@archlinux.org> 1673912904 +0100
361
362commitpkg: abort execution if msg file editor exits none-successfully
363
364Previously the script execution did not abort if the msg file editor
365exited none-successfully leading to undesired commits with a potentially
366unfinished message. Instead abort the commit if the msg file editor is
367deliberately terminated with a failure code.
368
369Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
370"
371 .into(),
372 signature: vec![
373 137, 2, 51, 4, 0, 1, 10, 0, 29, 22, 33, 4, 226, 64, 181, 126, 44, 70, 48, 186,
374 118, 142, 47, 38, 252, 27, 84, 124, 141, 129, 114, 200, 5, 2, 99, 197, 226, 74,
375 0, 10, 9, 16, 252, 27, 84, 124, 141, 129, 114, 200, 237, 218, 15, 255, 127,
376 128, 195, 205, 191, 179, 240, 202, 12, 63, 213, 31, 44, 37, 242, 222, 116, 236,
377 180, 44, 93, 148, 136, 144, 66, 211, 243, 238, 223, 86, 62, 28, 77, 198, 50,
378 153, 106, 45, 246, 81, 12, 214, 225, 32, 101, 195, 49, 43, 150, 232, 39, 57,
379 237, 48, 145, 150, 246, 162, 80, 251, 95, 255, 191, 125, 242, 142, 254, 207,
380 219, 223, 106, 234, 198, 233, 163, 206, 188, 233, 169, 37, 199, 174, 186, 168,
381 245, 122, 11, 220, 11, 173, 117, 122, 224, 67, 69, 254, 132, 52, 70, 115, 6,
382 201, 75, 168, 147, 211, 156, 201, 185, 133, 125, 93, 124, 96, 99, 226, 10, 172,
383 147, 208, 42, 247, 162, 76, 214, 23, 75, 211, 52, 225, 191, 228, 196, 115, 239,
384 51, 133, 101, 129, 208, 128, 197, 114, 172, 141, 39, 65, 196, 87, 169, 122,
385 146, 53, 188, 113, 25, 59, 56, 132, 181, 63, 247, 112, 31, 187, 70, 109, 165,
386 247, 112, 50, 70, 228, 143, 27, 77, 67, 103, 143, 49, 41, 178, 47, 166, 193,
387 44, 62, 221, 151, 215, 167, 16, 77, 237, 29, 208, 227, 145, 5, 89, 231, 69,
388 120, 225, 199, 208, 136, 213, 1, 57, 248, 126, 25, 82, 111, 120, 9, 110, 184,
389 24, 234, 14, 181, 132, 21, 239, 137, 173, 204, 147, 25, 142, 235, 205, 123, 23,
390 90, 89, 200, 142, 27, 254, 73, 171, 84, 43, 33, 107, 211, 226, 228, 66, 151,
391 89, 156, 223, 234, 237, 142, 63, 210, 245, 35, 222, 149, 150, 246, 224, 122,
392 154, 146, 128, 130, 64, 78, 177, 127, 85, 0, 187, 145, 124, 112, 223, 188, 3,
393 39, 132, 54, 44, 225, 231, 22, 167, 185, 232, 128, 87, 9, 209, 43, 55, 52, 239,
394 229, 115, 41, 178, 163, 71, 153, 192, 225, 69, 154, 78, 206, 173, 52, 194, 200,
395 35, 175, 139, 62, 114, 231, 159, 96, 238, 101, 64, 150, 18, 15, 123, 217, 55,
396 175, 67, 155, 189, 2, 89, 9, 145, 66, 58, 38, 169, 46, 112, 22, 28, 208, 132,
397 25, 242, 190, 128, 238, 8, 56, 98, 178, 225, 108, 73, 105, 11, 147, 24, 220,
398 95, 196, 163, 49, 152, 79, 88, 219, 194, 119, 89, 252, 20, 5, 73, 171, 136,
399 153, 78, 249, 121, 79, 201, 169, 20, 231, 86, 45, 138, 250, 4, 215, 163, 191,
400 20, 237, 6, 137, 102, 229, 33, 134, 115, 241, 142, 86, 240, 155, 131, 224, 189,
401 174, 215, 112, 238, 94, 245, 145, 21, 97, 63, 15, 198, 4, 246, 10, 182, 193,
402 152, 209, 67, 2, 237, 210, 31, 206, 206, 54, 43, 137, 71, 115, 162, 108, 219,
403 35, 10, 41, 19, 165, 66, 29, 129, 195, 74, 240, 78, 0, 215, 146, 81, 51, 116,
404 48, 249, 211, 137, 80, 64, 243, 134, 240, 228, 204, 86, 16, 243, 178, 226, 207,
405 194, 19, 95, 183, 5, 130, 156, 125, 58, 121, 1, 129, 88, 214, 139, 172, 229,
406 250, 234
407 ]
408 }
409 );
410
411 let canonical = signed.canonicalize(Some(&keyring))?;
412 assert_eq!(
413 canonical,
414 vec![(
415 Some("E240B57E2C4630BA768E2F26FC1B547C8D8172C8".parse()?),
416 Signed {
417 content: "tree 1b99d17009234a86e65e830c7a7ae6f7d182b8ef
418parent d45e77738bda2d17b10f87d05167a12fa5be8d63
419author Levente Polyak <anthraxx@archlinux.org> 1673558348 +0100
420committer Levente Polyak <anthraxx@archlinux.org> 1673912904 +0100
421
422commitpkg: abort execution if msg file editor exits none-successfully
423
424Previously the script execution did not abort if the msg file editor
425exited none-successfully leading to undesired commits with a potentially
426unfinished message. Instead abort the commit if the msg file editor is
427deliberately terminated with a failure code.
428
429Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
430"
431 .into(),
432 signature: vec![
433 194, 193, 115, 4, 0, 1, 10, 0, 29, 22, 33, 4, 226, 64, 181, 126, 44, 70,
434 48, 186, 118, 142, 47, 38, 252, 27, 84, 124, 141, 129, 114, 200, 5, 2, 99,
435 197, 226, 74, 0, 10, 9, 16, 252, 27, 84, 124, 141, 129, 114, 200, 237, 218,
436 15, 255, 127, 128, 195, 205, 191, 179, 240, 202, 12, 63, 213, 31, 44, 37,
437 242, 222, 116, 236, 180, 44, 93, 148, 136, 144, 66, 211, 243, 238, 223, 86,
438 62, 28, 77, 198, 50, 153, 106, 45, 246, 81, 12, 214, 225, 32, 101, 195, 49,
439 43, 150, 232, 39, 57, 237, 48, 145, 150, 246, 162, 80, 251, 95, 255, 191,
440 125, 242, 142, 254, 207, 219, 223, 106, 234, 198, 233, 163, 206, 188, 233,
441 169, 37, 199, 174, 186, 168, 245, 122, 11, 220, 11, 173, 117, 122, 224, 67,
442 69, 254, 132, 52, 70, 115, 6, 201, 75, 168, 147, 211, 156, 201, 185, 133,
443 125, 93, 124, 96, 99, 226, 10, 172, 147, 208, 42, 247, 162, 76, 214, 23,
444 75, 211, 52, 225, 191, 228, 196, 115, 239, 51, 133, 101, 129, 208, 128,
445 197, 114, 172, 141, 39, 65, 196, 87, 169, 122, 146, 53, 188, 113, 25, 59,
446 56, 132, 181, 63, 247, 112, 31, 187, 70, 109, 165, 247, 112, 50, 70, 228,
447 143, 27, 77, 67, 103, 143, 49, 41, 178, 47, 166, 193, 44, 62, 221, 151,
448 215, 167, 16, 77, 237, 29, 208, 227, 145, 5, 89, 231, 69, 120, 225, 199,
449 208, 136, 213, 1, 57, 248, 126, 25, 82, 111, 120, 9, 110, 184, 24, 234, 14,
450 181, 132, 21, 239, 137, 173, 204, 147, 25, 142, 235, 205, 123, 23, 90, 89,
451 200, 142, 27, 254, 73, 171, 84, 43, 33, 107, 211, 226, 228, 66, 151, 89,
452 156, 223, 234, 237, 142, 63, 210, 245, 35, 222, 149, 150, 246, 224, 122,
453 154, 146, 128, 130, 64, 78, 177, 127, 85, 0, 187, 145, 124, 112, 223, 188,
454 3, 39, 132, 54, 44, 225, 231, 22, 167, 185, 232, 128, 87, 9, 209, 43, 55,
455 52, 239, 229, 115, 41, 178, 163, 71, 153, 192, 225, 69, 154, 78, 206, 173,
456 52, 194, 200, 35, 175, 139, 62, 114, 231, 159, 96, 238, 101, 64, 150, 18,
457 15, 123, 217, 55, 175, 67, 155, 189, 2, 89, 9, 145, 66, 58, 38, 169, 46,
458 112, 22, 28, 208, 132, 25, 242, 190, 128, 238, 8, 56, 98, 178, 225, 108,
459 73, 105, 11, 147, 24, 220, 95, 196, 163, 49, 152, 79, 88, 219, 194, 119,
460 89, 252, 20, 5, 73, 171, 136, 153, 78, 249, 121, 79, 201, 169, 20, 231, 86,
461 45, 138, 250, 4, 215, 163, 191, 20, 237, 6, 137, 102, 229, 33, 134, 115,
462 241, 142, 86, 240, 155, 131, 224, 189, 174, 215, 112, 238, 94, 245, 145,
463 21, 97, 63, 15, 198, 4, 246, 10, 182, 193, 152, 209, 67, 2, 237, 210, 31,
464 206, 206, 54, 43, 137, 71, 115, 162, 108, 219, 35, 10, 41, 19, 165, 66, 29,
465 129, 195, 74, 240, 78, 0, 215, 146, 81, 51, 116, 48, 249, 211, 137, 80, 64,
466 243, 134, 240, 228, 204, 86, 16, 243, 178, 226, 207, 194, 19, 95, 183, 5,
467 130, 156, 125, 58, 121, 1, 129, 88, 214, 139, 172, 229, 250, 234
468 ]
469 }
470 )]
471 );
472
473 Ok(())
474 }
475
476 #[test]
477 fn detect_modified_tag() -> Result<()> {
478 init();
479 let buf = b"this is
480tampered
481-----BEGIN PGP SIGNATURE-----
482
483iQIzBAABCgAdFiEE4kC1fixGMLp2ji8m/BtUfI2BcsgFAmO26s8ACgkQ/BtUfI2B
484csifzA//czbzHwvxg+HVJwzUmId4rVt452si+7ucOjG0+dRtcE31zL39FgA3jeqK
485zL0z+G/lI7LoINM5FKrakBwXBcBx5TYDvt41P900NTwH0EqR7ZKePdL/gya8B0HN
4866RC7SrdVnY/nkibDOHSGOyMBcf5x815oxgHffo+87Fgoz3pTpZmifEMnFs4Kr7oc
487C9GMvsBEs8tPztYaBxgXsJ4Sd7ThqqxOa3u82ioiD1K5Wp/RaAaWW3CRpg0RKgg4
488pw8HVdNJk1rd42x5K1stSvmdiC6nyZBumaNP3HXMYdkecKRY+Iv5powcQr4kpp61
489lwcfTYcwEg5qeWscUlyrOtx0pYh1WHu4rg3HdOy0bwhEwOOIizLzmVArSH43OQRA
490DwK9gEvsmZspB1j6xQA/gQqeP7ps4VDJ2hW+NVn4AAMDpLvybSBzHCA6/8fO3Z+m
491vSfPc7oxQ4MFlligyrhXFZAa4rhBb3kUDY15P5TcrX6zTUbQA9BDQrQbuRrj+uEP
492yLFl/ptRrn+mW+AB80IOD4stu3tTZqKkyV4BMJLou8z2buWN3VN14CbUTGCTUNMW
493gEZz7HSkX3WmEJKFBRG45hyDfIx9XqaEbJH0SXcmDzZ1uZ55aD40vBQQcHqZoKLj
4947f06imt697ReuFR5bMYjkNMlWmMAYR4ERrEIWBQXnCcY3MpiMx0=
495=Sg65
496-----END PGP SIGNATURE-----
497";
498 let keyring = Keyring::new(KEYRING)?;
499
500 let signed = convert(Some(Kind::Tag), buf)?;
501 let canonical = signed.canonicalize(None)?;
502 assert_eq!(canonical.len(), 1);
503
504 let signed = convert(Some(Kind::Tag), buf)?;
505 let canonical = signed.canonicalize(Some(&keyring))?;
506 assert_eq!(canonical.len(), 0);
507
508 Ok(())
509 }
510
511 #[test]
512 fn detect_modified_commit() -> Result<()> {
513 init();
514 let buf = b"tree ffffffffffffffffffffffffffffffffffffffff
515parent eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
516author Levente Polyak <anthraxx@archlinux.org> 1673558348 +0100
517committer Levente Polyak <anthraxx@archlinux.org> 1673912904 +0100
518gpgsig -----BEGIN PGP SIGNATURE-----
519
520 iQIzBAABCgAdFiEE4kC1fixGMLp2ji8m/BtUfI2BcsgFAmPF4koACgkQ/BtUfI2B
521 csjt2g//f4DDzb+z8MoMP9UfLCXy3nTstCxdlIiQQtPz7t9WPhxNxjKZai32UQzW
522 4SBlwzErlugnOe0wkZb2olD7X/+/ffKO/s/b32rqxumjzrzpqSXHrrqo9XoL3Aut
523 dXrgQ0X+hDRGcwbJS6iT05zJuYV9XXxgY+IKrJPQKveiTNYXS9M04b/kxHPvM4Vl
524 gdCAxXKsjSdBxFepepI1vHEZOziEtT/3cB+7Rm2l93AyRuSPG01DZ48xKbIvpsEs
525 Pt2X16cQTe0d0OORBVnnRXjhx9CI1QE5+H4ZUm94CW64GOoOtYQV74mtzJMZjuvN
526 exdaWciOG/5Jq1QrIWvT4uRCl1mc3+rtjj/S9SPelZb24HqakoCCQE6xf1UAu5F8
527 cN+8AyeENizh5xanueiAVwnRKzc07+VzKbKjR5nA4UWaTs6tNMLII6+LPnLnn2Du
528 ZUCWEg972TevQ5u9AlkJkUI6JqkucBYc0IQZ8r6A7gg4YrLhbElpC5MY3F/EozGY
529 T1jbwndZ/BQFSauImU75eU/JqRTnVi2K+gTXo78U7QaJZuUhhnPxjlbwm4Pgva7X
530 cO5e9ZEVYT8PxgT2CrbBmNFDAu3SH87ONiuJR3OibNsjCikTpUIdgcNK8E4A15JR
531 M3Qw+dOJUEDzhvDkzFYQ87Liz8ITX7cFgpx9OnkBgVjWi6zl+uo=
532 =YZzN
533 -----END PGP SIGNATURE-----
534
535this is tampered
536";
537 let keyring = Keyring::new(KEYRING)?;
538
539 let signed = convert(Some(Kind::Commit), buf)?;
540 let canonical = signed.canonicalize(None)?;
541 assert_eq!(canonical.len(), 1);
542
543 let signed = convert(Some(Kind::Commit), buf)?;
544 let canonical = signed.canonicalize(Some(&keyring))?;
545 assert_eq!(canonical.len(), 0);
546
547 Ok(())
548 }
549}