Mercurial > ~mikael > mcabber > hg
annotate mcabber/mcabber/pgp.c @ 2212:778280b01bcb
Fix a few memory leaks
author  Mikael Berthe <mikael@lilotux.net> 

date  Thu, 05 Nov 2015 15:08:47 +0100 
parents  7c843b29571b 
children  90c25a29fb35 
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" 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

35 #include "logprint.h" 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

36 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

37 #define MIN_GPGME_VERSION "1.0.0" 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

38 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

39 static struct gpg_struct 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

40 { 
2196
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

41 int enabled; 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

42 int version1; 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

43 char *private_key; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

44 char *passphrase; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

45 } gpg; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

46 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

47 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

48 // gpg_init(priv_key, passphrase) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

49 // Initialize the GPG subsystems. This function must be invoked early. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

50 // Note: priv_key & passphrase are optional, they can be set later. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

51 // This function returns 0 if gpgme is available and initialized; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

52 // if not it returns the gpgme error code. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

53 int gpg_init(const char *priv_key, const char *passphrase) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

54 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

55 gpgme_error_t err; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

56 
2196
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

57 gpgme_ctx_t ctx; 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

58 gpgme_engine_info_t info; 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

59 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

60 // Check for version and OpenPGP protocol support. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

61 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

62 scr_LogPrint(LPRINT_LOGNORM, 
4cdf19d9c74e
PGP: Fix a small bug in initialization
Mikael Berthe <mikael@lilotux.net>
parents:
1054
diff
changeset

63 "GPGME initialization error: Bad library version"); 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

64 return 1; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

65 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

66 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

67 err = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

68 if (err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

69 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

70 "GPGME initialization error: %s", gpgme_strerror(err)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

71 return err; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

72 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

73 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

74 // Set the locale information. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

75 gpgme_set_locale(NULL, LC_CTYPE, setlocale(LC_CTYPE, NULL)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

76 gpgme_set_locale(NULL, LC_MESSAGES, setlocale(LC_MESSAGES, NULL)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

77 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

78 // Store private data. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

79 gpg_set_private_key(priv_key); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

80 gpg_set_passphrase(passphrase); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

81 
2196
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

82 err = gpgme_new(&ctx); 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

83 if (err) return 1; 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

84 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

85 // 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

86 // and we do not manage the passphrase. 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

87 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP); 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

88 if (err) return 1; 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

89 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

90 err = gpgme_get_engine_info (&info); 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

91 if (!err) { 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

92 while (info && info>protocol != gpgme_get_protocol (ctx)) 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

93 info = info>next; 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

94 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

95 if (info && info>version) { 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

96 if (!strncmp(info>version, "1.", 2)) 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

97 gpg.version1 = TRUE; 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

98 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

99 info>version); 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

100 } 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

101 } 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

102 
2212  103 gpgme_release(ctx); 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

104 gpg.enabled = 1; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

105 return 0; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

106 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

107 
2196
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

108 // gpg_is_version1() 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

109 // 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

110 int gpg_is_version1(void) 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

111 { 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

112 return gpg.version1; 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

113 } 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

114 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

115 // gpg_terminate() 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

116 // Destroy data and free memory. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

117 void gpg_terminate(void) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

118 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

119 gpg.enabled = 0; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

120 gpg_set_passphrase(NULL); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

121 gpg_set_private_key(NULL); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

122 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

123 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

124 // gpg_set_passphrase(passphrase) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

125 // Set the current passphrase (use NULL to erase it). 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

126 void gpg_set_passphrase(const char *passphrase) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

127 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

128 // Remove current passphrase 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

129 if (gpg.passphrase) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

130 ssize_t len = strlen(gpg.passphrase); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

131 memset(gpg.passphrase, 0, len); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

132 munlock(gpg.passphrase, len); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

133 g_free(gpg.passphrase); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

134 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

135 if (passphrase) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

136 gpg.passphrase = g_strdup(passphrase); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

137 mlock(gpg.passphrase, strlen(gpg.passphrase)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

138 } else { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

139 gpg.passphrase = NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

140 } 
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 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

143 // gpg_set_private_key(keyid) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

144 // Set the current private key id (use NULL to unset it). 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

145 void gpg_set_private_key(const char *priv_keyid) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

146 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

147 g_free(gpg.private_key); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

148 if (priv_keyid) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

149 gpg.private_key = g_strdup(priv_keyid); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

150 else 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

151 gpg.private_key = NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

152 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

153 
2188
84252c616919
PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents:
2187
diff
changeset

154 // 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

155 // 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

156 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

157 { 
84252c616919
PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents:
2187
diff
changeset

158 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

159 } 
84252c616919
PGP: Encrypt messages with our own PGP key when carbons are enabled
Mikael Berthe <mikael@lilotux.net>
parents:
2187
diff
changeset

160 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

161 // strip_header_footer(data) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

162 // Remove PGP header & footer from data. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

163 // Return a new string, or NULL. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

164 // 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

165 static char *strip_header_footer(const char *data) 
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 char *p, *q; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

168 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

169 if (!data) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

170 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

171 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

172 // p: beginning of real data 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

173 // q: end of real data 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

174 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

175 // Strip header (to the first empty line) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

176 p = strstr(data, "\n\n"); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

177 if (!p) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

178 return g_strdup(data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

179 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

180 // Strip footer 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

181 // 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

182 p += 2; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

183 for (q = p ; *q; q++) ; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

184 // (q is at the end of data now) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

185 for (q; q > p && (*q != '\n'  *(q+1) != ''); q) ; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

186 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

187 if (q <= p) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

188 return NULL; // Shouldn't happen... 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

189 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

190 return g_strndup(p, qp); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

191 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

192 
1598  193 // GCC ignores casts to void, thus we need to hack around that 
194 static inline void ignore(void*x) {}  
195  
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

196 // passphrase_cb() 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

197 // GPGME passphrase callback function. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

198 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

199 const char *passphrase_info, int prev_was_bad, int fd) 
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 ssize_t len; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

202 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

203 // Abort if we do not have the password. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

204 if (!gpg.passphrase) { 
1598  205 ignore((void*)write(fd, "\n", 1)); // We have an error anyway, thus it does 
206 // not matter if we fail again.  
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

207 return gpg_error(GPG_ERR_CANCELED); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

208 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

209 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

210 // Write the passphrase to the file descriptor. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

211 len = strlen(gpg.passphrase); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

212 if (write(fd, gpg.passphrase, len) != len) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

213 return gpg_error(GPG_ERR_CANCELED); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

214 if (write(fd, "\n", 1) != 1) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

215 return gpg_error(GPG_ERR_CANCELED); 
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 return 0; // Success 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

218 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

219 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

220 // gpg_verify(gpg_data, text, *sigsum) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

221 // Verify that gpg_data is a correct signature for text. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

222 // Return the key id (or fingerprint), and set *sigsum to 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

223 // the gpgme signature summary value. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

224 // The returned string must be freed with g_free() after use. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

225 char *gpg_verify(const char *gpg_data, const char *text, 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

226 gpgme_sigsum_t *sigsum) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

227 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

228 gpgme_ctx_t ctx; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

229 gpgme_data_t data_sign, data_text; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

230 char *data; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

231 char *verified_key = NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

232 gpgme_key_t key; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

233 gpgme_error_t err; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

234 const char prefix[] = "BEGIN PGP SIGNATURE\n\n"; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

235 const char suffix[] = "\nEND PGP SIGNATURE\n"; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

236 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

237 // Reset the summary. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

238 *sigsum = 0; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

239 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

240 if (!gpg.enabled) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

241 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

242 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

243 err = gpgme_new(&ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

244 if (err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

245 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

246 "GPGME error: %s", gpgme_strerror(err)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

247 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

248 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

249 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

250 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

251 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

252 // Surround the given data with the prefix & suffix 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

253 data = g_new(char, sizeof(prefix) + sizeof(suffix) + strlen(gpg_data)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

254 strcpy(data, prefix); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

255 strcat(data, gpg_data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

256 strcat(data, suffix); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

257 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

258 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

259 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

260 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

261 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

262 err = gpgme_op_verify(ctx, data_sign, data_text, 0); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

263 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

264 gpgme_verify_result_t vr = gpgme_op_verify_result(ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

265 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

266 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

267 // 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

268 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

269 // 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

270 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

271 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

272 if (key) { 
fec172dbacc7
Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents:
2196
diff
changeset

273 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

274 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

275 } 
fec172dbacc7
Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents:
2196
diff
changeset

276 } 
fec172dbacc7
Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents:
2196
diff
changeset

277 } 
fec172dbacc7
Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents:
2196
diff
changeset

278 *sigsum = s>summary; 
fec172dbacc7
Check all signatures and stop immediately if one could be verified
Sven Gaerner <sgaerner@gmx.net>
parents:
2196
diff
changeset

279 // 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

280 // 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

281 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

282 *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

283 } 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

284 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

285 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

286 gpgme_data_release(data_text); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

287 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

288 gpgme_data_release(data_sign); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

289 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

290 if (err) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

291 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, 
1047
0dc104d51dce
PGP: Better error messages
Mikael Berthe <mikael@lilotux.net>
parents:
1041
diff
changeset

292 "GPGME verification error: %s", gpgme_strerror(err)); 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

293 gpgme_release(ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

294 g_free(data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

295 return verified_key; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

296 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

297 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

298 // gpg_sign(gpg_data) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

299 // Return a signature of gpg_data (or NULL). 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

300 // The returned string must be freed with g_free() after use. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

301 char *gpg_sign(const char *gpg_data) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

302 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

303 gpgme_ctx_t ctx; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

304 gpgme_data_t in, out; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

305 char *signed_data = NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

306 size_t nread; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

307 gpgme_key_t key; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

308 gpgme_error_t err; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

309 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

310 if (!gpg.enabled  !gpg.private_key) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

311 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

312 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

313 err = gpgme_new(&ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

314 if (err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

315 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

316 "GPGME error: %s", gpgme_strerror(err)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

317 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

318 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

319 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

320 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

321 gpgme_set_textmode(ctx, 0); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

322 gpgme_set_armor(ctx, 1); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

323 
2196
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

324 if (gpg.version1) { 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

325 // 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

326 char *p = getenv("GPG_AGENT_INFO"); 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

327 if (!(p && strchr(p, ':'))) 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

328 gpgme_set_passphrase_cb(ctx, passphrase_cb, 0); 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

329 } 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

330 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

331 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

332 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

333 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

334 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

335 return NULL; 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

336 } 
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

337 
ad5de4d1ee56
PGP: Give a more useful error message when the private key isn't found
Mikael Berthe <mikael@lilotux.net>
parents:
1047
diff
changeset

338 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

339 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

340 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

341 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

342 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

343 err = gpgme_data_new(&out); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

344 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

345 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

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

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

348 } else { 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

349 signed_data = gpgme_data_release_and_get_mem(out, &nread); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

350 if (signed_data) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

351 // We need to add a trailing NULL 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

352 char *dd = g_strndup(signed_data, nread); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

353 free(signed_data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

354 signed_data = strip_header_footer(dd); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

355 g_free(dd); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

356 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

357 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

358 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

359 gpgme_data_release(in); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

360 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

361 if (err && err != GPG_ERR_CANCELED) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

362 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, 
1047
0dc104d51dce
PGP: Better error messages
Mikael Berthe <mikael@lilotux.net>
parents:
1041
diff
changeset

363 "GPGME signature error: %s", gpgme_strerror(err)); 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

364 gpgme_release(ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

365 return signed_data; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

366 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

367 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

368 // gpg_decrypt(gpg_data) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

369 // Return decrypted gpg_data (or NULL). 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

370 // The returned string must be freed with g_free() after use. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

371 char *gpg_decrypt(const char *gpg_data) 
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_ctx_t ctx; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

374 gpgme_data_t in, out; 
2196
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

375 char *data; 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

376 char *decrypted_data = NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

377 size_t nread; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

378 gpgme_error_t err; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

379 const char prefix[] = "BEGIN PGP MESSAGE\n\n"; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

380 const char suffix[] = "\nEND PGP MESSAGE\n"; 
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 if (!gpg.enabled) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

383 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

384 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

385 err = gpgme_new(&ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

386 if (err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

387 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

388 "GPGME error: %s", gpgme_strerror(err)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

389 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

390 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

391 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

392 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

393 
2196
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

394 if (gpg.version1) { 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

395 // 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

396 char *p = getenv("GPG_AGENT_INFO"); 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

397 if (!(p && strchr(p, ':'))) 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

398 gpgme_set_passphrase_cb(ctx, passphrase_cb, 0); 
8811fe9d6ef0
Improve support for GnuPG v2+
Mikael Berthe <mikael@lilotux.net>
parents:
2195
diff
changeset

399 } 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

400 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

401 // Surround the given data with the prefix & suffix 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

402 data = g_new(char, sizeof(prefix) + sizeof(suffix) + strlen(gpg_data)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

403 strcpy(data, prefix); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

404 strcat(data, gpg_data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

405 strcat(data, suffix); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

406 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

407 err = gpgme_data_new_from_mem(&in, data, strlen(data), 0); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

408 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

409 err = gpgme_data_new(&out); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

410 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

411 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

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

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

414 } else { 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

415 decrypted_data = gpgme_data_release_and_get_mem(out, &nread); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

416 if (decrypted_data) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

417 // We need to add a trailing NULL 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

418 char *dd = g_strndup(decrypted_data, nread); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

419 free(decrypted_data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

420 decrypted_data = dd; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

421 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

422 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

423 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

424 gpgme_data_release(in); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

425 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

426 if (err && err != GPG_ERR_CANCELED) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

427 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, 
1047
0dc104d51dce
PGP: Better error messages
Mikael Berthe <mikael@lilotux.net>
parents:
1041
diff
changeset

428 "GPGME decryption error: %s", gpgme_strerror(err)); 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

429 gpgme_release(ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

430 g_free(data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

431 return decrypted_data; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

432 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

433 
2187
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

434 // 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

435 // 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

436 // 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

437 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

438 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

439 gpgme_ctx_t ctx; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

440 gpgme_data_t in, out; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

441 char *encrypted_data = NULL, *edata; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

442 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

443 gpgme_key_t *keys; 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

444 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

445 unsigned i; 
1041
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 if (!gpg.enabled) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

448 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

449 
2187
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

450 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

451 return NULL; 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

452 } 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

453 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

454 err = gpgme_new(&ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

455 if (err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

456 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

457 "GPGME error: %s", gpgme_strerror(err)); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

458 return NULL; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

459 } 
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 gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

462 gpgme_set_textmode(ctx, 0); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

463 gpgme_set_armor(ctx, 1); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

464 
2187
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

465 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

466 if (!keys) { 
40ddaebeb81e
PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents:
2188
diff
changeset

467 gpgme_release(ctx); 
40ddaebeb81e
PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents:
2188
diff
changeset

468 return NULL; 
40ddaebeb81e
PGP: Add a memory allocation check and compilation directives
Mikael Berthe <mikael@lilotux.net>
parents:
2188
diff
changeset

469 } 
2187
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

470 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

471 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

472 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

473 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

474 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

475 keyids[i]); 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

476 // 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

477 // 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

478 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

479 break; 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

480 } 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

481 } 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

482 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

483 if (!err) { 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

484 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

485 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

486 err = gpgme_data_new(&out); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

487 if (!err) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

488 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

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

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

491 } else { 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

492 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

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

494 // 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

495 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

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

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

498 } 
ff18feb75a6d
PGP: Add a trailing NULL after a message is PGPencrypted
Mikael Berthe <mikael@lilotux.net>
parents:
2200
diff
changeset

499 } 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

500 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

501 gpgme_data_release(in); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

502 } 
2187
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

503 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

504 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

505 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

506 "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

507 } 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

508 } 
2187
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

509 
e3b66c8ead4f
PGP: Change gpg_encrypt() so that several encryption keys can be used
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset

510 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

511 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

512 g_free(keys); 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

513 gpgme_release(ctx); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

514 edata = strip_header_footer(encrypted_data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

515 if (encrypted_data) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

516 free(encrypted_data); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

517 return edata; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

518 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

519 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

520 // gpg_test_passphrase() 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

521 // Test the current gpg.passphrase with gpg.private_key. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

522 // 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

523 // value is returned. 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

524 int gpg_test_passphrase(void) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

525 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

526 char *s; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

527 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

528 if (!gpg.private_key) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

529 return 1; // No private key... 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

530 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

531 s = gpg_sign("test"); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

532 if (s) { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

533 free(s); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

534 return 0; // Ok, test successful 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

535 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

536 // The passphrase is wrong (if provided) 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

537 gpg_set_passphrase(NULL); 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

538 return 1; 
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 
1413  541 int gpg_enabled(void) 
1041
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

542 { 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

543 return gpg.enabled; 
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 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

546 #else /* not HAVE_GPGME */ 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

547 
1413  548 int gpg_enabled(void) 
1041
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 return 0; 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

551 } 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

552 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

553 #endif /* HAVE_GPGME */ 
d4b97a2423eb
Introduce PGP utility functions
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset

554 
1811  555 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ 