15
const char *program;
16
const char **verify_args;
17
const char **sigs;
18
+ int (*verify_signed_buffer)(struct signature_check *sigc,
19
+ struct gpg_format *fmt, const char *payload,
20
+ size_t payload_size, const char *signature,
21
+ size_t signature_size);
22
+ int (*sign_buffer)(struct strbuf *buffer, struct strbuf *signature,
23
+ const char *signing_key);
24
};
25
26
static const char *openpgp_verify_args[] = {
41
NULL
42
};
43
44
+static int verify_gpg_signed_buffer(struct signature_check *sigc,
45
+ struct gpg_format *fmt, const char *payload,
46
+ size_t payload_size, const char *signature,
47
+ size_t signature_size);
48
+static int sign_buffer_gpg(struct strbuf *buffer, struct strbuf *signature,
49
+ const char *signing_key);
50
+
51
static struct gpg_format gpg_format[] = {
39
- { .name = "openpgp", .program = "gpg",
40
- .verify_args = openpgp_verify_args,
41
- .sigs = openpgp_sigs
52
+ {
53
+ .name = "openpgp",
54
+ .program = "gpg",
55
+ .verify_args = openpgp_verify_args,
56
+ .sigs = openpgp_sigs,
57
+ .verify_signed_buffer = verify_gpg_signed_buffer,
58
+ .sign_buffer = sign_buffer_gpg,
59
},
43
- { .name = "x509", .program = "gpgsm",
44
- .verify_args = x509_verify_args,
45
- .sigs = x509_sigs
60
+ {
61
+ .name = "x509",
62
+ .program = "gpgsm",
63
+ .verify_args = x509_verify_args,
64
+ .sigs = x509_sigs,
65
+ .verify_signed_buffer = verify_gpg_signed_buffer,
66
+ .sign_buffer = sign_buffer_gpg,
67
},
68
};
69
93
void signature_check_clear(struct signature_check *sigc)
94
{
95
FREE_AND_NULL(sigc->payload);
75
- FREE_AND_NULL(sigc->gpg_output);
96
+ FREE_AND_NULL(sigc->output);
97
FREE_AND_NULL(sigc->gpg_status);
98
FREE_AND_NULL(sigc->signer);
99
FREE_AND_NULL(sigc->key);
278
FREE_AND_NULL(sigc->key);
279
}
280
260
-static int verify_signed_buffer(const char *payload, size_t payload_size,
261
- const char *signature, size_t signature_size,
262
- struct strbuf *gpg_output,
263
- struct strbuf *gpg_status)
281
+static int verify_gpg_signed_buffer(struct signature_check *sigc,
282
+ struct gpg_format *fmt, const char *payload,
283
+ size_t payload_size, const char *signature,
284
+ size_t signature_size)
285
{
286
struct child_process gpg = CHILD_PROCESS_INIT;
266
- struct gpg_format *fmt;
287
struct tempfile *temp;
288
int ret;
269
- struct strbuf buf = STRBUF_INIT;
289
+ struct strbuf gpg_stdout = STRBUF_INIT;
290
+ struct strbuf gpg_stderr = STRBUF_INIT;
291
292
temp = mks_tempfile_t(".git_vtag_tmpXXXXXX");
293
if (!temp)
300
return -1;
301
}
302
282
- fmt = get_format_by_sig(signature);
283
- if (!fmt)
284
- BUG("bad signature '%s'", signature);
285
-
303
strvec_push(&gpg.args, fmt->program);
304
strvec_pushv(&gpg.args, fmt->verify_args);
305
strvec_pushl(&gpg.args,
307
"--verify", temp->filename.buf, "-",
308
NULL);
309
293
- if (!gpg_status)
294
- gpg_status = &buf;
295
-
310
sigchain_push(SIGPIPE, SIG_IGN);
297
- ret = pipe_command(&gpg, payload, payload_size,
298
- gpg_status, 0, gpg_output, 0);
311
+ ret = pipe_command(&gpg, payload, payload_size, &gpg_stdout, 0,
312
+ &gpg_stderr, 0);
313
sigchain_pop(SIGPIPE);
314
315
delete_tempfile(&temp);
316
303
- ret |= !strstr(gpg_status->buf, "\n[GNUPG:] GOODSIG ");
304
- strbuf_release(&buf); /* no matter it was used or not */
317
+ ret |= !strstr(gpg_stdout.buf, "\n[GNUPG:] GOODSIG ");
318
+ sigc->payload = xmemdupz(payload, payload_size);
319
+ sigc->output = strbuf_detach(&gpg_stderr, NULL);
320
+ sigc->gpg_status = strbuf_detach(&gpg_stdout, NULL);
321
+
322
+ parse_gpg_output(sigc);
323
+
324
+ strbuf_release(&gpg_stdout);
325
+ strbuf_release(&gpg_stderr);
326
327
return ret;
328
}
330
int check_signature(const char *payload, size_t plen, const char *signature,
331
size_t slen, struct signature_check *sigc)
332
{
312
- struct strbuf gpg_output = STRBUF_INIT;
313
- struct strbuf gpg_status = STRBUF_INIT;
333
+ struct gpg_format *fmt;
334
int status;
335
336
sigc->result = 'N';
337
sigc->trust_level = -1;
338
319
- status = verify_signed_buffer(payload, plen, signature, slen,
320
- &gpg_output, &gpg_status);
321
- if (status && !gpg_output.len)
322
- goto out;
323
- sigc->payload = xmemdupz(payload, plen);
324
- sigc->gpg_output = strbuf_detach(&gpg_output, NULL);
325
- sigc->gpg_status = strbuf_detach(&gpg_status, NULL);
326
- parse_gpg_output(sigc);
339
+ fmt = get_format_by_sig(signature);
340
+ if (!fmt)
341
+ die(_("bad/incompatible signature '%s'"), signature);
342
+
343
+ status = fmt->verify_signed_buffer(sigc, fmt, payload, plen, signature,
344
+ slen);
345
+
346
+ if (status && !sigc->output)
347
+ return !!status;
348
+
349
status |= sigc->result != 'G';
350
status |= sigc->trust_level < configured_min_trust_level;
351
330
- out:
331
- strbuf_release(&gpg_status);
332
- strbuf_release(&gpg_output);
333
-
352
return !!status;
353
}
354
355
void print_signature_buffer(const struct signature_check *sigc, unsigned flags)
356
{
339
- const char *output = flags & GPG_VERIFY_RAW ?
340
- sigc->gpg_status : sigc->gpg_output;
357
+ const char *output = flags & GPG_VERIFY_RAW ? sigc->gpg_status :
358
+ sigc->output;
359
360
if (flags & GPG_VERIFY_VERBOSE && sigc->payload)
361
fputs(sigc->payload, stdout);
459
}
460
461
int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)
462
+{
463
+ return use_format->sign_buffer(buffer, signature, signing_key);
464
+}
465
+
466
+static int sign_buffer_gpg(struct strbuf *buffer, struct strbuf *signature,
467
+ const char *signing_key)
468
{
469
struct child_process gpg = CHILD_PROCESS_INIT;
470
int ret;