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

Annotation of /trunk/Src/wptGPGME.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 255 - (hide annotations)
Tue Aug 1 16:37:23 2006 UTC (18 years, 7 months ago) by twoaday
File size: 7466 byte(s)


1 werner 36 /* wptGPGME.cpp - WinPT GPGME interface
2 twoaday 217 * Copyright (C) 2001-2006 Timo Schulz
3 werner 36 *
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     #ifdef HAVE_CONFIG_H
21     #include <config.h>
22     #endif
23    
24     #include <sys/types.h>
25     #include <windows.h>
26    
27 werner 47 #include "resource.h"
28 werner 36 #include "wptNLS.h"
29     #include "wptGPG.h"
30     #include "wptErrors.h"
31     #include "wptTypes.h"
32     #include "wptW32API.h"
33     #include "wptVersion.h"
34     #include "wptCommonCtl.h"
35     #include "wptContext.h"
36     #include "wptRegistry.h"
37     #include "wptDlgs.h"
38    
39     #include "openpgp.h"
40    
41     BOOL CALLBACK keycache_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam);
42     void progress_cleanup (progress_filter_s * pfx);
43    
44 twoaday 211 /* Global GPG key cache contexts. */
45 werner 36 static gpg_keycache_t pub = NULL;
46     static gpg_keycache_t sec = NULL;
47     static char *gpg_secring = NULL;
48    
49    
50 twoaday 217 int
51     keycache_not_available (void)
52     {
53     return pub == NULL;
54 werner 36 }
55    
56     /* Release both key cache objects. If @cleanup is 1,
57     also release other global structs. */
58     void
59     keycache_release (int cleanup)
60     {
61 twoaday 255 char tmpbuf[64];
62 werner 36 int n = gpg_keycache_get_size (pub);
63    
64     /* XXX: update the value when the cache has changed. */
65     sprintf (tmpbuf, "%d", n);
66     set_reg_key (HKEY_CURRENT_USER, "Software\\WinPT", "nKeys", tmpbuf);
67    
68     if (pub) {
69     gpg_keycache_release (pub);
70     pub = NULL;
71     }
72     if (sec) {
73     gpg_keycache_release (sec);
74     sec = NULL;
75     }
76 twoaday 211 if (cleanup)
77     safe_free (gpg_secring);
78 werner 36 }
79    
80    
81     /* Update the key with the keyid @keyid in the key cache.
82     If @is_sec is 1, the secret key cache is used. */
83     gpgme_error_t
84     keycache_update (int is_sec, const char *keyid)
85     {
86     gpg_keycache_t ctx = pub;
87     gpgme_error_t err;
88    
89     if (is_sec)
90     ctx = sec;
91     err = gpg_keycache_update_key (ctx, is_sec, pub, keyid);
92     if (is_sec)
93     gpg_keycache_prepare_single (ctx, keyid, NULL, gpg_secring);
94     return err;
95     }
96    
97    
98     /* Initialize both cache contexts. Use @pubring for the public
99     keyring and @secring for the secret keyring. */
100     gpgme_error_t
101     keycache_init (const char *pubring, const char *secring)
102     {
103     struct progress_filter_s pfx;
104     gpgme_error_t err;
105     int val = 0;
106     char *p;
107    
108     if (secring != NULL) {
109     free_if_alloc (gpg_secring);
110     gpg_secring = get_gnupg_keyring (0, NO_STRICT);
111     }
112 twoaday 150
113 werner 36 p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "nKeys");
114     if (p && *p != ' ') {
115     val = atoi (p);
116 twoaday 181 free_if_alloc (p);
117 werner 36 }
118    
119 twoaday 181 memset (&pfx, 0, sizeof (pfx));
120 twoaday 217 keycache_release (0); /* Release old contexts first. */
121 twoaday 150
122 werner 36 err = gpg_keycache_new (&pub);
123     if (err)
124     return err;
125     if (val != 0)
126     gpg_keycache_set_cb (pub, progress_callback, &pfx, val);
127     err = gpg_keycache_new (&sec);
128     if (!err)
129     err = gpg_keycache_init (pub, NULL, 0);
130     if (!err)
131 twoaday 175 err = gpg_keycache_init (sec, NULL, 1);
132     if (!err && pubring && *pubring)
133 twoaday 181 err = gpg_keycache_prepare (pub, pubring, NULL);
134 twoaday 175 if (!err && secring && * secring)
135     err = gpg_keycache_prepare (sec, NULL, secring);
136 werner 36 if (!err)
137     gpg_keycache_sync (pub, sec);
138     if (val != 0)
139     progress_cleanup (&pfx);
140     return err;
141     }
142    
143    
144     /* Return the public cache context if @is_pub is set
145     the secre cache context otherwise. */
146     gpg_keycache_t
147     keycache_get_ctx (int is_pub)
148     {
149 twoaday 208 gpg_keycache_t ctx;
150    
151     ctx = is_pub? pub : sec;
152     if (!ctx)
153     BUG (0);
154     return ctx;
155 werner 36 }
156    
157    
158     /* Get the GPG key with keyid @keyid from the cache. Return it
159     in @r_key on success. */
160 twoaday 211 static gpgme_error_t
161 twoaday 217 get_key_from_cache (const char *keyid, int secret, gpgme_key_t *r_key,
162     struct keycache_s **c)
163 werner 36 {
164     gpg_keycache_t cache;
165     gpgme_error_t err;
166     int mode = secret? KEYCACHE_PRV : KEYCACHE_PUB;
167    
168     if (!keyid)
169 twoaday 211 return gpg_error (GPG_ERR_INV_VALUE);
170 werner 36 if (r_key)
171     *r_key = NULL;
172     cache = keycache_get_ctx (mode);
173     if (!c)
174     err = gpg_keycache_find_key (cache, keyid, 0, r_key);
175     else
176     err = gpg_keycache_find_key2 (cache, keyid, 0, r_key, c);
177 twoaday 211 return err;
178 werner 36 }
179    
180    
181 twoaday 217 /* Release the internal key structure.
182     If allocated is 0, assume fixed cache item. */
183     void
184     winpt_release_pubkey (winpt_key_s *k)
185 werner 36 {
186 twoaday 217 /*log_box ("debug", 0, "alloc %d", k->allocated);*/
187     if (!k->allocated)
188     return;
189     gpg_keycache_item_release (k->ext);
190     k->ext = NULL;
191     k->allocated = 0;
192 werner 36 }
193    
194    
195     /* Search the public key with @keyid as the keyid in the cache and
196     return the item in @k. */
197 twoaday 211 gpgme_error_t
198 werner 36 winpt_get_pubkey (const char *keyid, winpt_key_s *k)
199     {
200 twoaday 217 gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
201 werner 36
202 twoaday 217 if (pub)
203     err = get_key_from_cache (keyid, 0, &k->ctx, &k->ext);
204     else
205     err = gpg_keycache_fetch_key (keyid, 0, &k->ctx, &k->ext);
206 twoaday 211 if (err)
207     return err;
208 werner 36 k->is_v3 = k->ctx->subkeys->pubkey_algo == GPGME_PK_RSA &&
209     strlen (k->ctx->subkeys->fpr) == 32;
210     k->is_protected = k->ext->gloflags.is_protected;
211 twoaday 212 k->keyid = k->ctx->subkeys->keyid+8;
212     k->uid = k->ext->uids->uid;
213 twoaday 217 k->allocated = pub? 0 : 1;
214 twoaday 211 return 0;
215 werner 36 }
216    
217    
218 twoaday 211 gpgme_error_t
219 werner 36 winpt_get_seckey (const char *keyid, winpt_key_s *k)
220     {
221 twoaday 211 gpgme_error_t err;
222    
223 twoaday 217 if (sec)
224     err = get_key_from_cache (keyid, 1, &k->ctx, &k->ext);
225     else
226     err = gpg_keycache_fetch_key (keyid, 1, &k->ctx, &k->ext);
227 twoaday 211 if (err)
228     return err;
229 werner 36 k->is_v3 = k->ctx->subkeys->pubkey_algo == GPGME_PK_RSA &&
230     strlen (k->ctx->subkeys->fpr) == 32;
231     k->is_protected = k->ext->gloflags.is_protected;
232 twoaday 212 k->keyid = k->ctx->subkeys->keyid+8;
233     k->uid = k->ext->uids->uid;
234 twoaday 219 k->allocated = sec? 0 : 1;
235 twoaday 211 return 0;
236 werner 36 }
237    
238    
239 twoaday 211 gpgme_error_t
240 werner 36 get_pubkey (const char *keyid, gpgme_key_t *ret_key)
241     {
242 twoaday 217 return get_key_from_cache (keyid, 0, ret_key, NULL);
243 werner 36 }
244    
245    
246 twoaday 211 gpgme_error_t
247 werner 36 get_seckey (const char *keyid, gpgme_key_t *ret_skey)
248     {
249 twoaday 217 return get_key_from_cache (keyid, 1, ret_skey, NULL);
250 werner 36 }
251    
252    
253    
254 twoaday 109 /* Map the signature summary in @sum to signature status table index.
255     Return value: index to table. */
256     static int
257     sigsum_to_index (gpgme_sigsum_t sum)
258     {
259     if ((sum & GPGME_SIGSUM_VALID) && (sum & GPGME_SIGSUM_KEY_REVOKED))
260     return 7;
261     if ((sum & GPGME_SIGSUM_VALID) && (sum & GPGME_SIGSUM_SIG_EXPIRED))
262     return 6;
263     if (sum & GPGME_SIGSUM_GREEN)
264     return 1;
265     else if (sum & GPGME_SIGSUM_RED)
266     return 2;
267     else if (sum & GPGME_SIGSUM_KEY_MISSING)
268     return 3;
269     return 0;
270     }
271    
272    
273     /* Return a humand readable description for the signature status @sum. */
274     const char*
275     get_gpg_sigstat (gpgme_sigsum_t sum)
276     {
277     const char *gpg_sigstat[] = {
278 twoaday 231 _("Error during verification process"),
279     _("The signature is good"),
280 twoaday 109 _("The signature is BAD!"),
281 twoaday 231 _("The signature could not be checked due to a missing key"),
282     _("No valid OpenPGP signature"),
283 twoaday 109 _("Signature Error"),
284     _("Good Signature (Expired Key)"),
285     _("Good Signature (Revoked Key)"),
286     NULL
287     };
288     const unsigned int mask = 8;
289    
290     return gpg_sigstat[sigsum_to_index (sum) % mask];
291     }
292 twoaday 175
293    
294 twoaday 214 bool
295     secret_key_available (void)
296     {
297 twoaday 219 if (!sec || gpg_keycache_get_size (sec) == 0)
298 twoaday 214 return false;
299     return true;
300     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26