/[winpt]/trunk/Src/wptGPGME.cpp
ViewVC logotype

Annotation of /trunk/Src/wptGPGME.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 25 - (hide annotations)
Wed Oct 12 10:04:26 2005 UTC (19 years, 4 months ago) by twoaday
File size: 7118 byte(s)
First testing phase finished.
Provide bug fixes for a lot of (minor) problems.

1 twoaday 2 /* wptGPGME.cpp - WinPT GPGME interface
2 twoaday 22 * Copyright (C) 2001-2005 Timo Schulz
3 twoaday 2 *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU General Public License
8     * as published by the Free Software Foundation; either version 2
9     * of the License, or (at your option) any later version.
10     *
11     * WinPT is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     * General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with WinPT; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19     */
20    
21     #include <sys/types.h>
22     #include <windows.h>
23    
24     #include "../resource.h"
25     #include "wptNLS.h"
26     #include "wptGPG.h"
27     #include "wptErrors.h"
28     #include "wptTypes.h"
29     #include "wptW32API.h"
30     #include "wptVersion.h"
31     #include "wptCommonCtl.h"
32     #include "wptContext.h"
33     #include "wptRegistry.h"
34     #include "wptDlgs.h"
35    
36     #include "openpgp.h"
37    
38     BOOL CALLBACK keycache_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam);
39     void progress_cleanup (progress_filter_s * pfx);
40    
41 twoaday 25 static gpg_keycache_t pub = NULL;
42     static gpg_keycache_t sec = NULL;
43 twoaday 2 static unsigned int reload = 0;
44 twoaday 22 static char *gpg_secring = NULL;
45 twoaday 2
46 twoaday 25
47     /* Reload the key cache. */
48 twoaday 2 void
49     keycache_reload (HWND dlg)
50     {
51 twoaday 22 refresh_cache_s rcs;
52 twoaday 2
53 twoaday 22 memset (&rcs, 0, sizeof rcs);
54 twoaday 2 rcs.kr_reload = rcs.kr_update = 1;
55 twoaday 22 rcs.tr_update = 0;
56     DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
57     keycache_dlg_proc, (LPARAM)&rcs);
58 twoaday 25 }
59 twoaday 2
60 twoaday 25
61     /* Release both key cache objects. If @cleanup is 1,
62     also release other global structs. */
63 twoaday 2 void
64 twoaday 25 keycache_release (int cleanup)
65 twoaday 2 {
66 twoaday 25 int n = gpg_keycache_get_size (pub);
67 twoaday 2 char tmpbuf[64];
68    
69 twoaday 22 /* XXX: update the value when the cache has changed. */
70 twoaday 2 sprintf (tmpbuf, "%d", n);
71     set_reg_key (HKEY_CURRENT_USER, "Software\\WinPT", "nKeys", tmpbuf);
72    
73     if (pub) {
74 twoaday 25 gpg_keycache_release (pub);
75 twoaday 2 pub = NULL;
76     }
77     if (sec) {
78 twoaday 25 gpg_keycache_release (sec);
79 twoaday 2 sec = NULL;
80     }
81 twoaday 25 if (cleanup) {
82     if (gpg_secring)
83     free (gpg_secring);
84     gpg_secring = NULL;
85     }
86     }
87 twoaday 2
88    
89 twoaday 25 /* Update the key with the keyid @keyid in the key cache.
90     If @is_sec is 1, the secret key cache is used. */
91 twoaday 2 gpgme_error_t
92 twoaday 20 keycache_update (int is_sec, const char *keyid)
93 twoaday 2 {
94 twoaday 25 gpg_keycache_t ctx = pub;
95 twoaday 22 gpgme_error_t err;
96    
97 twoaday 20 if (is_sec)
98     ctx = sec;
99 twoaday 25 err = gpg_keycache_update_key (ctx, is_sec, pub, keyid);
100 twoaday 22 if (is_sec)
101 twoaday 25 gpg_keycache_prepare_single (ctx, keyid, NULL, gpg_secring);
102 twoaday 22 return err;
103 twoaday 19 }
104    
105 twoaday 22 /* XXX: cache_keyring_names must be called then the GPG homedir changes! */
106 twoaday 19
107     gpgme_error_t
108     keycache_init (const char *pubring, const char * secring)
109     {
110 twoaday 2 struct progress_filter_s pfx;
111     gpgme_error_t err;
112     int val = 0;
113     char * p;
114    
115 twoaday 22 if (secring != NULL) {
116     free_if_alloc (gpg_secring);
117     gpg_secring = get_gnupg_keyring (0, NO_STRICT);
118     }
119    
120 twoaday 2 if (reload) {
121 twoaday 25 keycache_release (0);
122 twoaday 2 reload = 0;
123     }
124     p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "nKeys");
125 twoaday 19 if (p && *p != ' ') {
126 twoaday 2 val = atoi (p);
127     free_if_alloc (p);
128 twoaday 22 memset (&pfx, 0, sizeof (pfx));
129 twoaday 2 }
130    
131 twoaday 25 err = gpg_keycache_new (&pub);
132 twoaday 2 if (err)
133     return err;
134     if (val != 0)
135 twoaday 25 gpg_keycache_set_cb (pub, progress_callback, &pfx, val);
136     err = gpg_keycache_new (&sec);
137 twoaday 2 if (!err)
138 twoaday 25 err = gpg_keycache_init (pub, NULL, 0);
139 twoaday 2 if (!err)
140 twoaday 25 err = gpg_keycache_init( sec, NULL, 1 );
141 twoaday 2 if( !err && pubring && *pubring )
142 twoaday 25 err = gpg_keycache_prepare( pub, pubring, NULL );
143 twoaday 2 if( !err && secring && * secring )
144 twoaday 25 err = gpg_keycache_prepare( sec, NULL, secring );
145 twoaday 2 if (!err)
146 twoaday 25 gpg_keycache_sync (pub, sec);
147 twoaday 2 if (val != 0)
148     progress_cleanup (&pfx);
149     return err;
150     } /* keycache_init */
151    
152    
153     void
154     keycache_set_reload( int yes )
155     {
156     reload = yes;
157     } /* keycache_set_reload */
158    
159    
160     int
161     keycache_get_reload( void )
162     {
163     return reload;
164     } /* keycache_get_reload */
165    
166    
167 twoaday 25 gpg_keycache_t
168 twoaday 22 keycache_get_ctx (int is_pub)
169 twoaday 2 {
170     return is_pub? pub : sec;
171 twoaday 25 }
172 twoaday 2
173    
174 twoaday 25 /* Get the GPG key with keyid @keyid from the cache. Return it
175     in @r_key on success. */
176 twoaday 2 static int
177 twoaday 25 get_key_from_cache (const char *keyid, gpgme_key_t *r_key,
178     struct keycache_s **c, int secret)
179 twoaday 2 {
180 twoaday 25 gpg_keycache_t cache;
181 twoaday 2 gpgme_error_t err;
182     int mode = secret? KEYCACHE_PRV : KEYCACHE_PUB;
183    
184 twoaday 25 if (!keyid)
185 twoaday 2 return WPTERR_GENERAL;
186 twoaday 25 if (r_key)
187 twoaday 2 *r_key = NULL;
188 twoaday 23 cache = keycache_get_ctx (mode);
189 twoaday 25 if (!cache)
190 twoaday 2 BUG( NULL );
191 twoaday 23 if (!c)
192 twoaday 25 err = gpg_keycache_find_key (cache, keyid, 0, r_key);
193 twoaday 23 else
194 twoaday 25 err = gpg_keycache_find_key2 (cache, keyid, 0, r_key, c);
195     return err? WPTERR_GENERAL : 0;
196     }
197 twoaday 2
198    
199 twoaday 25 /* Get GPG key with keyid @keyid directly from GPG and return
200     it in @r_key on success. */
201 twoaday 2 static int
202 twoaday 25 get_key_directly (const char *keyid, gpgme_key_t *r_key, int secret)
203 twoaday 2 {
204 twoaday 25 gpgme_ctx_t ctx;
205     gpgme_error_t err;
206 twoaday 2
207 twoaday 25 err = gpgme_new (&ctx);
208     if (err)
209     return WPTERR_GENERAL;
210     err = gpgme_get_key (ctx, keyid, r_key, secret);
211     gpgme_release (ctx);
212     return err? WPTERR_GENERAL : 0;
213     }
214 twoaday 2
215    
216     int
217 twoaday 23 winpt_get_pubkey (const char *keyid, winpt_key_s *k)
218     {
219     int rc;
220    
221 twoaday 25 rc = get_key_from_cache (keyid, &k->ctx, &k->ext, 0);
222 twoaday 23 if (rc)
223     return rc;
224     k->is_v3 = k->ctx->subkeys->pubkey_algo == GPGME_PK_RSA && strlen (k->ctx->subkeys->fpr) == 32;
225     k->is_protected = k->ext->gloflags.is_protected;
226     k->keyid = k->ctx->subkeys->keyid;
227     k->uid = k->ctx->uids->uid;
228     return rc;
229     }
230    
231    
232     int
233     winpt_get_seckey (const char *keyid, winpt_key_s *k)
234     {
235     int rc;
236 twoaday 25 rc = get_key_from_cache (keyid, &k->ctx, &k->ext, 1);
237 twoaday 23 if (rc)
238     return rc;
239     k->is_v3 = k->ctx->subkeys->pubkey_algo == GPGME_PK_RSA && strlen (k->ctx->subkeys->fpr) == 32;
240     k->is_protected = k->ext->gloflags.is_protected;
241     k->keyid = k->ctx->subkeys->keyid;
242     k->uid = k->ctx->uids->uid;
243     return rc;
244     }
245    
246    
247     int
248 twoaday 22 get_pubkey (const char *keyid, gpgme_key_t *ret_key)
249 twoaday 2 {
250     int rc = 0;
251    
252 twoaday 22 if (pub && sec)
253 twoaday 25 rc = get_key_from_cache (keyid, ret_key, NULL, 0);
254 twoaday 2 else
255 twoaday 25 rc = get_key_directly (keyid, ret_key, 0);
256 twoaday 2 return rc;
257 twoaday 25 }
258 twoaday 2
259    
260     int
261 twoaday 25 get_seckey (const char *keyid, gpgme_key_t *ret_skey)
262 twoaday 2 {
263     int rc = 0;
264    
265 twoaday 25 if (pub && sec)
266     rc = get_key_from_cache (keyid, ret_skey, NULL, 1);
267 twoaday 2 else
268 twoaday 25 rc = get_key_directly (keyid, ret_skey, 1);
269 twoaday 2 return rc;
270 twoaday 25 }
271 twoaday 2
272    
273 twoaday 25 /* Search for insecure ElGamal keys and return the
274     number of founded keys. */
275 twoaday 2 int
276     count_insecure_elgkeys (void)
277     {
278 twoaday 25 gpg_keycache_t pc;
279 twoaday 2 gpgme_key_t key;
280     int n=0;
281    
282     pc = keycache_get_ctx (1);
283     if (!pc)
284     BUG (0);
285 twoaday 25 while (!gpg_keycache_next_key (pc, 0, &key)) {
286 twoaday 23 if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
287 twoaday 2 n++;
288     }
289 twoaday 25 gpg_keycache_rewind (pc);
290 twoaday 2 return n;
291     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26