blob: b30cbdcd3da546888fb1f8f206205c2373ad633b [file] [log] [blame]
Junio C Hamano2f47eae2011-09-07 21:19:47 -07001#ifndef GPG_INTERFACE_H
2#define GPG_INTERFACE_H
3
Elijah Newrenef3ca952018-08-15 10:54:05 -07004struct strbuf;
5
Lukas Puehringer94240b92017-01-17 18:37:18 -05006#define GPG_VERIFY_VERBOSE 1
7#define GPG_VERIFY_RAW 2
8#define GPG_VERIFY_OMIT_STATUS 4
brian m. carlsonca194d52015-06-21 23:14:41 +00009
Hans Jerry Illikainen54887b42019-12-27 13:55:57 +000010enum signature_trust_level {
11 TRUST_UNDEFINED,
12 TRUST_NEVER,
13 TRUST_MARGINAL,
14 TRUST_FULLY,
15 TRUST_ULTIMATE,
16};
17
Fabian Stelzer6393c952021-12-09 09:52:45 +010018enum payload_type {
19 SIGNATURE_PAYLOAD_UNDEFINED,
20 SIGNATURE_PAYLOAD_COMMIT,
21 SIGNATURE_PAYLOAD_TAG,
22 SIGNATURE_PAYLOAD_PUSH_CERT,
23};
24
Sebastian Götteffb6d7d2013-03-31 18:00:14 +020025struct signature_check {
Michael J Gruber71c214c2014-06-23 09:05:48 +020026 char *payload;
Fabian Stelzer02769432021-12-09 09:52:43 +010027 size_t payload_len;
Fabian Stelzer6393c952021-12-09 09:52:45 +010028 enum payload_type payload_type;
29 timestamp_t payload_timestamp;
Fabian Stelzerb5726a52021-09-10 20:07:34 +000030 char *output;
Sebastian Götteffb6d7d2013-03-31 18:00:14 +020031 char *gpg_status;
Junio C Hamanoa50e7ca2014-08-14 15:31:13 -070032
33 /*
34 * possible "result":
35 * 0 (not checked)
36 * N (checked but no further result)
Junio C Hamanoa50e7ca2014-08-14 15:31:13 -070037 * G (good)
38 * B (bad)
39 */
40 char result;
Sebastian Götteffb6d7d2013-03-31 18:00:14 +020041 char *signer;
42 char *key;
Michał Górny3daaaab2018-10-22 18:38:20 +020043 char *fingerprint;
Michał Górny4de93942018-10-22 18:38:21 +020044 char *primary_key_fingerprint;
Hans Jerry Illikainen54887b42019-12-27 13:55:57 +000045 enum signature_trust_level trust_level;
Sebastian Götteffb6d7d2013-03-31 18:00:14 +020046};
47
Jeff Kingf80bee22018-04-13 15:18:31 -060048void signature_check_clear(struct signature_check *sigc);
49
50/*
brian m. carlson482c1192021-02-11 02:08:03 +000051 * Look at a GPG signed tag object. If such a signature exists, store it in
52 * signature and the signed content in payload. Return 1 if a signature was
53 * found, and 0 otherwise.
54 */
55int parse_signature(const char *buf, size_t size, struct strbuf *payload, struct strbuf *signature);
56
57/*
Jeff Kingf80bee22018-04-13 15:18:31 -060058 * Look at GPG signed content (e.g. a signed tag object), whose
59 * payload is followed by a detached signature on it. Return the
60 * offset where the embedded detached signature begins, or the end of
61 * the data when there is no such signature.
62 */
brian m. carlson482c1192021-02-11 02:08:03 +000063size_t parse_signed_buffer(const char *buf, size_t size);
Jeff Kingf80bee22018-04-13 15:18:31 -060064
Jeff Kingf80bee22018-04-13 15:18:31 -060065/*
66 * Create a detached signature for the contents of "buffer" and append
67 * it after "signature"; "buffer" and "signature" can be the same
68 * strbuf instance, which would cause the detached signature appended
69 * at the end.
70 */
71int sign_buffer(struct strbuf *buffer, struct strbuf *signature,
72 const char *signing_key);
73
Jeff Kingf80bee22018-04-13 15:18:31 -060074int git_gpg_config(const char *, const char *, void *);
75void set_signing_key(const char *);
76const char *get_signing_key(void);
Fabian Stelzer4838f622021-09-10 20:07:38 +000077
78/*
79 * Returns a textual unique representation of the signing key in use
80 * Either a GPG KeyID or a SSH Key Fingerprint
81 */
82const char *get_signing_key_id(void);
Fabian Stelzer02769432021-12-09 09:52:43 +010083int check_signature(struct signature_check *sigc,
84 const char *signature, size_t slen);
Jeff Kingf80bee22018-04-13 15:18:31 -060085void print_signature_buffer(const struct signature_check *sigc,
86 unsigned flags);
Junio C Hamano2f47eae2011-09-07 21:19:47 -070087
88#endif