annotate mcabber/mcabber/pgp.c @ 2238:a34c8b41e0b5

Cosmectics (fix coding style)
author Mikael Berthe <mikael@lilotux.net>
date Sat, 21 Nov 2015 18:43:10 +0100
parents 048cff929e4d
children f5402d705f67
rev   line source
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
1 /*
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
2 * pgp.c -- PGP utility functions
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
3 *
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
4 * Copyright (C) 2006-2015 Mikael Berthe <mikael@lilotux.net>
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
5 * Some parts inspired by centericq (impgp.cc)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
6 *
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or (at
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
10 * your option) any later version.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
11 *
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful, but
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
15 * General Public License for more details.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
16 *
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
20 * USA
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
21 */
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
22
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
23 #include <config.h>
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
24
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
25 #ifdef HAVE_GPGME
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
26
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
27 #include <stdlib.h>
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
28 #include <string.h>
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
29 #include <unistd.h>
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
30 #include <locale.h>
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
31 #include <sys/mman.h>
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
32 #include <glib.h>
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
33
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
34 #include "pgp.h"
2233
90c25a29fb35 New option: 'gpg_path'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2212
diff changeset
35 #include "settings.h"
2237
048cff929e4d Include utils.h from pgp.c
Mikael Berthe <mikael@lilotux.net>
parents: 2234
diff changeset
36 #include "utils.h"
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
37 #include "logprint.h"
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
38
2233
90c25a29fb35 New option: 'gpg_path'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2212
diff changeset
39 #define MIN_GPGME_VERSION "1.1.0"
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
40
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
41 static struct gpg_struct
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
42 {
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
43 int enabled;
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
44 int version1;
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
45 char *private_key;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
46 char *passphrase;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
47 } gpg;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
48
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
49
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
50 // gpg_init(priv_key, passphrase)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
51 // Initialize the GPG sub-systems. This function must be invoked early.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
52 // Note: priv_key & passphrase are optional, they can be set later.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
53 // This function returns 0 if gpgme is available and initialized;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
54 // if not it returns the gpgme error code.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
55 int gpg_init(const char *priv_key, const char *passphrase)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
56 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
57 gpgme_error_t err;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
58
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
59 gpgme_ctx_t ctx;
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
60 gpgme_engine_info_t info;
2234
232c26383fc4 New option: 'gpg_home'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2233
diff changeset
61 const char *gpg_path, *gpg_home;
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
62
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
63 // Check for version and OpenPGP protocol support.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
64 if (!gpgme_check_version(MIN_GPGME_VERSION)) {
1057
4cdf19d9c74e PGP: Fix a small bug in initialization
Mikael Berthe <mikael@lilotux.net>
parents: 1054
diff changeset
65 scr_LogPrint(LPRINT_LOGNORM,
4cdf19d9c74e PGP: Fix a small bug in initialization
Mikael Berthe <mikael@lilotux.net>
parents: 1054
diff changeset
66 "GPGME initialization error: Bad library version");
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
67 return -1;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
68 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
69
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
70 err = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
71 if (err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
72 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
73 "GPGME initialization error: %s", gpgme_strerror(err));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
74 return err;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
75 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
76
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
77 // Set the locale information.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
78 gpgme_set_locale(NULL, LC_CTYPE, setlocale(LC_CTYPE, NULL));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
79 gpgme_set_locale(NULL, LC_MESSAGES, setlocale(LC_MESSAGES, NULL));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
80
2233
90c25a29fb35 New option: 'gpg_path'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2212
diff changeset
81 // The path to the gpg binary can be specified in order to force
90c25a29fb35 New option: 'gpg_path'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2212
diff changeset
82 // version 1, for example.
90c25a29fb35 New option: 'gpg_path'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2212
diff changeset
83 gpg_path = settings_opt_get("gpg_path");
2234
232c26383fc4 New option: 'gpg_home'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2233
diff changeset
84 gpg_home = settings_opt_get("gpg_home");
232c26383fc4 New option: 'gpg_home'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2233
diff changeset
85 if (gpg_path || gpg_home) {
232c26383fc4 New option: 'gpg_home'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2233
diff changeset
86 char *xp_gpg_home = expand_filename(gpg_home);
232c26383fc4 New option: 'gpg_home'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2233
diff changeset
87 err = gpgme_set_engine_info(GPGME_PROTOCOL_OpenPGP, gpg_path, xp_gpg_home);
232c26383fc4 New option: 'gpg_home'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2233
diff changeset
88 g_free(xp_gpg_home);
2233
90c25a29fb35 New option: 'gpg_path'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2212
diff changeset
89 if (err) return -1;
90c25a29fb35 New option: 'gpg_path'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2212
diff changeset
90 }
90c25a29fb35 New option: 'gpg_path'
Holger Weiß <holger@zedat.fu-berlin.de>
parents: 2212
diff changeset
91
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
92 // Store private data.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
93 gpg_set_private_key(priv_key);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
94 gpg_set_passphrase(passphrase);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
95
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
96 err = gpgme_new(&ctx);
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
97 if (err) return -1;
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
98
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
99 // Check OpenPGP engine version; with version 2+ the agent is mandatory
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
100 // and we do not manage the passphrase.
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
101 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
102 if (err) return -1;
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
103
2238
a34c8b41e0b5 Cosmectics (fix coding style)
Mikael Berthe <mikael@lilotux.net>
parents: 2237
diff changeset
104 err = gpgme_get_engine_info(&info);
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
105 if (!err) {
2238
a34c8b41e0b5 Cosmectics (fix coding style)
Mikael Berthe <mikael@lilotux.net>
parents: 2237
diff changeset
106 while (info && info->protocol != gpgme_get_protocol(ctx))
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
107 info = info->next;
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
108
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
109 if (info && info->version) {
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
110 if (!strncmp(info->version, "1.", 2))
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
111 gpg.version1 = TRUE;
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
112 scr_log_print(LPRINT_DEBUG, "GPGME: Engine version is '%s'.",
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
113 info->version);
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
114 }
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
115 }
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
116
2212
778280b01bcb Fix a few memory leaks
Mikael Berthe <mikael@lilotux.net>
parents: 2208
diff changeset
117 gpgme_release(ctx);
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
118 gpg.enabled = 1;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
119 return 0;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
120 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
121
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
122 // gpg_is_version1()
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
123 // Return TRUE if the GnuPG OpenPGP engine version is 1.x
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
124 int gpg_is_version1(void)
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
125 {
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
126 return gpg.version1;
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
127 }
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
128
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
129 // gpg_terminate()
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
130 // Destroy data and free memory.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
131 void gpg_terminate(void)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
132 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
133 gpg.enabled = 0;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
134 gpg_set_passphrase(NULL);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
135 gpg_set_private_key(NULL);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
136 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
137
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
138 // gpg_set_passphrase(passphrase)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
139 // Set the current passphrase (use NULL to erase it).
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
140 void gpg_set_passphrase(const char *passphrase)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
141 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
142 // Remove current passphrase
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
143 if (gpg.passphrase) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
144 ssize_t len = strlen(gpg.passphrase);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
145 memset(gpg.passphrase, 0, len);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
146 munlock(gpg.passphrase, len);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
147 g_free(gpg.passphrase);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
148 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
149 if (passphrase) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
150 gpg.passphrase = g_strdup(passphrase);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
151 mlock(gpg.passphrase, strlen(gpg.passphrase));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
152 } else {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
153 gpg.passphrase = NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
154 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
155 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
156
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
157 // gpg_set_private_key(keyid)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
158 // Set the current private key id (use NULL to unset it).
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
159 void gpg_set_private_key(const char *priv_keyid)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
160 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
161 g_free(gpg.private_key);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
162 if (priv_keyid)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
163 gpg.private_key = g_strdup(priv_keyid);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
164 else
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
165 gpg.private_key = NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
166 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
167
2188
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
168 // gpg_get_private_key_id()
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
169 // Return the current private key id (static string).
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
170 const char *gpg_get_private_key_id(void)
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
171 {
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
172 return gpg.private_key;
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
173 }
84252c616919 PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents: 2187
diff changeset
174
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
175 // strip_header_footer(data)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
176 // Remove PGP header & footer from data.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
177 // Return a new string, or NULL.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
178 // The string must be freed by the caller with g_free() when no longer needed.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
179 static char *strip_header_footer(const char *data)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
180 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
181 char *p, *q;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
182
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
183 if (!data)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
184 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
185
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
186 // p: beginning of real data
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
187 // q: end of real data
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
188
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
189 // Strip header (to the first empty line)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
190 p = strstr(data, "\n\n");
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
191 if (!p)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
192 return g_strdup(data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
193
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
194 // Strip footer
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
195 // We want to remove the last lines, until the line beginning with a '-'
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
196 p += 2;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
197 for (q = p ; *q; q++) ;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
198 // (q is at the end of data now)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
199 for (q--; q > p && (*q != '\n' || *(q+1) != '-'); q--) ;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
200
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
201 if (q <= p)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
202 return NULL; // Shouldn't happen...
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
203
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
204 return g_strndup(p, q-p);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
205 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
206
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1414
diff changeset
207 // GCC ignores casts to void, thus we need to hack around that
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1414
diff changeset
208 static inline void ignore(void*x) {}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1414
diff changeset
209
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
210 // passphrase_cb()
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
211 // GPGME passphrase callback function.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
212 static gpgme_error_t passphrase_cb(void *hook, const char *uid_hint,
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
213 const char *passphrase_info, int prev_was_bad, int fd)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
214 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
215 ssize_t len;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
216
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
217 // Abort if we do not have the password.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
218 if (!gpg.passphrase) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1414
diff changeset
219 ignore((void*)write(fd, "\n", 1)); // We have an error anyway, thus it does
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1414
diff changeset
220 // not matter if we fail again.
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
221 return gpg_error(GPG_ERR_CANCELED);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
222 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
223
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
224 // Write the passphrase to the file descriptor.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
225 len = strlen(gpg.passphrase);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
226 if (write(fd, gpg.passphrase, len) != len)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
227 return gpg_error(GPG_ERR_CANCELED);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
228 if (write(fd, "\n", 1) != 1)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
229 return gpg_error(GPG_ERR_CANCELED);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
230
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
231 return 0; // Success
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
232 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
233
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
234 // gpg_verify(gpg_data, text, *sigsum)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
235 // Verify that gpg_data is a correct signature for text.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
236 // Return the key id (or fingerprint), and set *sigsum to
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
237 // the gpgme signature summary value.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
238 // The returned string must be freed with g_free() after use.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
239 char *gpg_verify(const char *gpg_data, const char *text,
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
240 gpgme_sigsum_t *sigsum)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
241 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
242 gpgme_ctx_t ctx;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
243 gpgme_data_t data_sign, data_text;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
244 char *data;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
245 char *verified_key = NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
246 gpgme_key_t key;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
247 gpgme_error_t err;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
248 const char prefix[] = "-----BEGIN PGP SIGNATURE-----\n\n";
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
249 const char suffix[] = "\n-----END PGP SIGNATURE-----\n";
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
250
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
251 // Reset the summary.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
252 *sigsum = 0;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
253
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
254 if (!gpg.enabled)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
255 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
256
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
257 err = gpgme_new(&ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
258 if (err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
259 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
260 "GPGME error: %s", gpgme_strerror(err));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
261 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
262 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
263
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
264 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
265
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
266 // Surround the given data with the prefix & suffix
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
267 data = g_new(char, sizeof(prefix) + sizeof(suffix) + strlen(gpg_data));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
268 strcpy(data, prefix);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
269 strcat(data, gpg_data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
270 strcat(data, suffix);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
271
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
272 err = gpgme_data_new_from_mem(&data_sign, data, strlen(data), 0);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
273 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
274 err = gpgme_data_new_from_mem(&data_text, text, strlen(text), 0);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
275 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
276 err = gpgme_op_verify(ctx, data_sign, data_text, 0);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
277 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
278 gpgme_verify_result_t vr = gpgme_op_verify_result(ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
279 if (vr && vr->signatures) {
2200
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
280 gpgme_signature_t s = NULL;
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
281 // check all signatures and stop if the first could be verified
2208
7c843b29571b Fix changeset fec172dbacc7
Mikael Berthe <mikael@lilotux.net>
parents: 2202
diff changeset
282 for (s = vr->signatures; s && !verified_key; s = s->next) {
2200
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
283 // Found the fingerprint. Let's try to get the key id.
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
284 if (NULL != s->fpr) {
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
285 if (!gpgme_get_key(ctx, s->fpr, &key, 0)) {
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
286 if (key) {
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
287 verified_key = g_strdup(key->subkeys->keyid);
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
288 gpgme_key_release(key);
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
289 }
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
290 }
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
291 }
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
292 *sigsum = s->summary;
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
293 // For some reason summary could be 0 when status is 0 too,
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
294 // which means the signature is valid...
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
295 if ((!*sigsum) && (!s->status))
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
296 *sigsum = GPGME_SIGSUM_GREEN;
fec172dbacc7 Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents: 2196
diff changeset
297 }
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
298 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
299 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
300 gpgme_data_release(data_text);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
301 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
302 gpgme_data_release(data_sign);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
303 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
304 if (err)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
305 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
1047
0dc104d51dce PGP: Better error messages
Mikael Berthe <mikael@lilotux.net>
parents: 1041
diff changeset
306 "GPGME verification error: %s", gpgme_strerror(err));
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
307 gpgme_release(ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
308 g_free(data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
309 return verified_key;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
310 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
311
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
312 // gpg_sign(gpg_data)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
313 // Return a signature of gpg_data (or NULL).
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
314 // The returned string must be freed with g_free() after use.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
315 char *gpg_sign(const char *gpg_data)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
316 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
317 gpgme_ctx_t ctx;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
318 gpgme_data_t in, out;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
319 char *signed_data = NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
320 size_t nread;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
321 gpgme_key_t key;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
322 gpgme_error_t err;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
323
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
324 if (!gpg.enabled || !gpg.private_key)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
325 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
326
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
327 err = gpgme_new(&ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
328 if (err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
329 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
330 "GPGME error: %s", gpgme_strerror(err));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
331 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
332 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
333
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
334 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
335 gpgme_set_textmode(ctx, 0);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
336 gpgme_set_armor(ctx, 1);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
337
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
338 if (gpg.version1) {
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
339 // GPG_AGENT_INFO isn't used by GnuPG version 2+
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
340 char *p = getenv("GPG_AGENT_INFO");
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
341 if (!(p && strchr(p, ':')))
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
342 gpgme_set_passphrase_cb(ctx, passphrase_cb, 0);
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
343 }
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
344
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
345 err = gpgme_get_key(ctx, gpg.private_key, &key, 1);
1105
265e1d873d3e PGP: Improve checks for missing keys
Mikael Berthe <mikael@lilotux.net>
parents: 1057
diff changeset
346 if (err || !key) {
1049
ad5de4d1ee56 PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents: 1047
diff changeset
347 scr_LogPrint(LPRINT_LOGNORM, "GPGME error: private key not found");
ad5de4d1ee56 PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents: 1047
diff changeset
348 gpgme_release(ctx);
ad5de4d1ee56 PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents: 1047
diff changeset
349 return NULL;
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
350 }
1049
ad5de4d1ee56 PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents: 1047
diff changeset
351
ad5de4d1ee56 PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents: 1047
diff changeset
352 gpgme_signers_clear(ctx);
ad5de4d1ee56 PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents: 1047
diff changeset
353 gpgme_signers_add(ctx, key);
ad5de4d1ee56 PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents: 1047
diff changeset
354 gpgme_key_release(key);
ad5de4d1ee56 PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents: 1047
diff changeset
355 err = gpgme_data_new_from_mem(&in, gpg_data, strlen(gpg_data), 0);
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
356 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
357 err = gpgme_data_new(&out);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
358 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
359 err = gpgme_op_sign(ctx, in, out, GPGME_SIG_MODE_DETACH);
2202
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
360 if (err) {
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
361 gpgme_data_release(out);
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
362 } else {
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
363 signed_data = gpgme_data_release_and_get_mem(out, &nread);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
364 if (signed_data) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
365 // We need to add a trailing NULL
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
366 char *dd = g_strndup(signed_data, nread);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
367 free(signed_data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
368 signed_data = strip_header_footer(dd);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
369 g_free(dd);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
370 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
371 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
372 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
373 gpgme_data_release(in);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
374 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
375 if (err && err != GPG_ERR_CANCELED)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
376 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
1047
0dc104d51dce PGP: Better error messages
Mikael Berthe <mikael@lilotux.net>
parents: 1041
diff changeset
377 "GPGME signature error: %s", gpgme_strerror(err));
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
378 gpgme_release(ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
379 return signed_data;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
380 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
381
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
382 // gpg_decrypt(gpg_data)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
383 // Return decrypted gpg_data (or NULL).
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
384 // The returned string must be freed with g_free() after use.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
385 char *gpg_decrypt(const char *gpg_data)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
386 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
387 gpgme_ctx_t ctx;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
388 gpgme_data_t in, out;
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
389 char *data;
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
390 char *decrypted_data = NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
391 size_t nread;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
392 gpgme_error_t err;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
393 const char prefix[] = "-----BEGIN PGP MESSAGE-----\n\n";
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
394 const char suffix[] = "\n-----END PGP MESSAGE-----\n";
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
395
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
396 if (!gpg.enabled)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
397 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
398
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
399 err = gpgme_new(&ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
400 if (err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
401 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
402 "GPGME error: %s", gpgme_strerror(err));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
403 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
404 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
405
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
406 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
407
2196
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
408 if (gpg.version1) {
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
409 // GPG_AGENT_INFO isn't used by GnuPG version 2+
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
410 char *p = getenv("GPG_AGENT_INFO");
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
411 if (!(p && strchr(p, ':')))
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
412 gpgme_set_passphrase_cb(ctx, passphrase_cb, 0);
8811fe9d6ef0 Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents: 2195
diff changeset
413 }
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
414
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
415 // Surround the given data with the prefix & suffix
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
416 data = g_new(char, sizeof(prefix) + sizeof(suffix) + strlen(gpg_data));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
417 strcpy(data, prefix);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
418 strcat(data, gpg_data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
419 strcat(data, suffix);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
420
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
421 err = gpgme_data_new_from_mem(&in, data, strlen(data), 0);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
422 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
423 err = gpgme_data_new(&out);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
424 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
425 err = gpgme_op_decrypt(ctx, in, out);
2202
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
426 if (err) {
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
427 gpgme_data_release(out);
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
428 } else {
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
429 decrypted_data = gpgme_data_release_and_get_mem(out, &nread);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
430 if (decrypted_data) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
431 // We need to add a trailing NULL
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
432 char *dd = g_strndup(decrypted_data, nread);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
433 free(decrypted_data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
434 decrypted_data = dd;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
435 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
436 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
437 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
438 gpgme_data_release(in);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
439 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
440 if (err && err != GPG_ERR_CANCELED)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
441 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
1047
0dc104d51dce PGP: Better error messages
Mikael Berthe <mikael@lilotux.net>
parents: 1041
diff changeset
442 "GPGME decryption error: %s", gpgme_strerror(err));
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
443 gpgme_release(ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
444 g_free(data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
445 return decrypted_data;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
446 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
447
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
448 // gpg_encrypt(gpg_data, keyids[], n)
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
449 // Return encrypted gpg_data with the n keys from the keyids array (or NULL).
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
450 // The returned string must be freed with g_free() after use.
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
451 char *gpg_encrypt(const char *gpg_data, const char *keyids[], size_t nkeys)
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
452 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
453 gpgme_ctx_t ctx;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
454 gpgme_data_t in, out;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
455 char *encrypted_data = NULL, *edata;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
456 size_t nread;
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
457 gpgme_key_t *keys;
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
458 gpgme_error_t err;
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
459 unsigned i;
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
460
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
461 if (!gpg.enabled)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
462 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
463
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
464 if (!keyids || !nkeys) {
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
465 return NULL;
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
466 }
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
467
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
468 err = gpgme_new(&ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
469 if (err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
470 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
471 "GPGME error: %s", gpgme_strerror(err));
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
472 return NULL;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
473 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
474
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
475 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
476 gpgme_set_textmode(ctx, 0);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
477 gpgme_set_armor(ctx, 1);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
478
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
479 keys = g_new0(gpgme_key_t, 1+nkeys);
2195
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
480 if (!keys) {
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
481 gpgme_release(ctx);
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
482 return NULL;
40ddaebeb81e PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents: 2188
diff changeset
483 }
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
484
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
485 for (i = 0; i < nkeys; i++) {
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
486 err = gpgme_get_key(ctx, keyids[i], &keys[i], 0);
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
487 if (err || !keys[i]) {
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
488 scr_LogPrint(LPRINT_LOGNORM, "GPGME encryption error: cannot use key %s",
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
489 keyids[i]);
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
490 // We need to have err not null to ensure we won't try to encrypt
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
491 // without this key.
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
492 if (!err) err = GPG_ERR_UNKNOWN_ERRNO;
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
493 break;
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
494 }
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
495 }
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
496
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
497 if (!err) {
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
498 err = gpgme_data_new_from_mem(&in, gpg_data, strlen(gpg_data), 0);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
499 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
500 err = gpgme_data_new(&out);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
501 if (!err) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
502 err = gpgme_op_encrypt(ctx, keys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out);
2202
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
503 if (err) {
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
504 gpgme_data_release(out);
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
505 } else {
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
506 encrypted_data = gpgme_data_release_and_get_mem(out, &nread);
2202
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
507 if (encrypted_data) {
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
508 // We need to add a trailing NULL
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
509 char *dd = g_strndup(encrypted_data, nread);
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
510 free(encrypted_data);
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
511 encrypted_data = dd;
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
512 }
ff18feb75a6d PGP: Add a trailing NULL after a message is PGP-encrypted
Mikael Berthe <mikael@lilotux.net>
parents: 2200
diff changeset
513 }
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
514 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
515 gpgme_data_release(in);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
516 }
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
517
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
518 if (err && err != GPG_ERR_CANCELED) {
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
519 scr_LogPrint(LPRINT_LOGNORM|LPRINT_NOTUTF8,
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
520 "GPGME encryption error: %s", gpgme_strerror(err));
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
521 }
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
522 }
2187
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
523
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
524 for (i = 0; keys[i]; i++)
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
525 gpgme_key_release(keys[i]);
e3b66c8ead4f PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
526 g_free(keys);
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
527 gpgme_release(ctx);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
528 edata = strip_header_footer(encrypted_data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
529 if (encrypted_data)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
530 free(encrypted_data);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
531 return edata;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
532 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
533
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
534 // gpg_test_passphrase()
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
535 // Test the current gpg.passphrase with gpg.private_key.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
536 // If the test doesn't succeed, the passphrase is cleared and a non-null
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
537 // value is returned.
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
538 int gpg_test_passphrase(void)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
539 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
540 char *s;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
541
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
542 if (!gpg.private_key)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
543 return -1; // No private key...
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
544
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
545 s = gpg_sign("test");
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
546 if (s) {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
547 free(s);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
548 return 0; // Ok, test successful
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
549 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
550 // The passphrase is wrong (if provided)
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
551 gpg_set_passphrase(NULL);
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
552 return -1;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
553 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
554
1413
f89844a0448a Remove useless inlines
Mikael Berthe <mikael@lilotux.net>
parents: 1238
diff changeset
555 int gpg_enabled(void)
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
556 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
557 return gpg.enabled;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
558 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
559
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
560 #else /* not HAVE_GPGME */
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
561
1413
f89844a0448a Remove useless inlines
Mikael Berthe <mikael@lilotux.net>
parents: 1238
diff changeset
562 int gpg_enabled(void)
1041
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
563 {
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
564 return 0;
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
565 }
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
566
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
567 #endif /* HAVE_GPGME */
d4b97a2423eb Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
568
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1668
diff changeset
569 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */