Mercurial > ~mikael > mcabber > hg
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) 20062015 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 021111307 
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.fuberlin.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.fuberlin.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 subsystems. 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.fuberlin.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_LOGNORMLPRINT_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.fuberlin.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.fuberlin.de>
parents:
2212
diff
changeset

82 // version 1, for example. 
90c25a29fb35
New option: 'gpg_path'
Holger Weiß <holger@zedat.fuberlin.de>
parents:
2212
diff
changeset

83 gpg_path = settings_opt_get("gpg_path"); 
2234
232c26383fc4
New option: 'gpg_home'
Holger Weiß <holger@zedat.fuberlin.de>
parents:
2233
diff
changeset

84 gpg_home = settings_opt_get("gpg_home"); 
232c26383fc4
New option: 'gpg_home'
Holger Weiß <holger@zedat.fuberlin.de>
parents:
2233
diff
changeset

85 if (gpg_path  gpg_home) { 
232c26383fc4
New option: 'gpg_home'
Holger Weiß <holger@zedat.fuberlin.de>
parents:
2233
diff
changeset

86 char *xp_gpg_home = expand_filename(gpg_home); 
232c26383fc4
New option: 'gpg_home'
Holger Weiß <holger@zedat.fuberlin.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.fuberlin.de>
parents:
2233
diff
changeset

88 g_free(xp_gpg_home); 
2233
90c25a29fb35
New option: 'gpg_path'
Holger Weiß <holger@zedat.fuberlin.de>
parents:
2212
diff
changeset

89 if (err) return 1; 
90c25a29fb35
New option: 'gpg_path'
Holger Weiß <holger@zedat.fuberlin.de>
parents:
2212
diff
changeset

90 } 
90c25a29fb35
New option: 'gpg_path'
Holger Weiß <holger@zedat.fuberlin.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  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, qp); 
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  207 // GCC ignores casts to void, thus we need to hack around that 
208 static inline void ignore(void*x) {}  
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  219 ignore((void*)write(fd, "\n", 1)); // We have an error anyway, thus it does 
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[] = "\nEND 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_LOGNORMLPRINT_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_LOGNORMLPRINT_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_LOGNORMLPRINT_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 PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

360 if (err) { 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

361 gpgme_data_release(out); 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
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_LOGNORMLPRINT_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[] = "\nEND 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_LOGNORMLPRINT_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 PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

426 if (err) { 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

427 gpgme_data_release(out); 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
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_LOGNORMLPRINT_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_LOGNORMLPRINT_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 PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

503 if (err) { 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

504 gpgme_data_release(out); 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
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 PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

507 if (encrypted_data) { 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
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 PGPencrypted
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 PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

510 free(encrypted_data); 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

511 encrypted_data = dd; 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

512 } 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
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_LOGNORMLPRINT_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 nonnull 
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  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  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  569 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ 