/[pkg-mixmaster]/trunk/Mix/Src/keymgt.c
ViewVC logotype

Contents of /trunk/Mix/Src/keymgt.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 122 - (hide annotations) (download)
Wed Aug 7 17:27:01 2002 UTC (10 years, 9 months ago) by weaselp
File MIME type: text/plain
File size: 7755 byte(s)
Make sure files are closed
1 rabbi 1 /* Mixmaster version 3 -- (C) 1999 Anonymizer Inc.
2    
3     Mixmaster may be redistributed and modified under certain conditions.
4     This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
5     ANY KIND, either express or implied. See the file COPYRIGHT for
6     details.
7    
8     Key management
9 weaselp 122 $Id: keymgt.c,v 1.8 2002/08/07 17:27:01 weaselp Exp $ */
10 rabbi 1
11    
12     #include "mix3.h"
13     #include <string.h>
14     #include <assert.h>
15    
16     static int getv2seckey(byte keyid[], BUFFER *key);
17     static int getv3seckey(byte keyid[], BUFFER *key);
18     static int getv2pubkey(byte keyid[], BUFFER *key);
19     static int getv3pubkey(byte keyid[], BUFFER *key);
20    
21     int db_getseckey(byte keyid[], BUFFER *key)
22     {
23     if (getv3seckey(keyid, key) == -1 && getv2seckey(keyid, key) == -1)
24     return (-1);
25     else
26     return (0);
27     }
28    
29     int db_getpubkey(byte keyid[], BUFFER *key)
30     {
31     if (getv3pubkey(keyid, key) == -1 && getv2pubkey(keyid, key) == -1)
32     return (-1);
33     else
34     return (0);
35     }
36    
37     static int getv3seckey(byte keyid[], BUFFER *key)
38     {
39     return -1; /* XXX */
40     }
41    
42     static int getv3pubkey(byte keyid[], BUFFER *key)
43     {
44     return -1; /* XXX */
45     }
46    
47     #ifdef USE_RSA
48     static int getv2seckey(byte keyid[], BUFFER *key)
49     {
50     FILE *keyring;
51     BUFFER *iv, *pass, *temp;
52     char idstr[33];
53     char line[LINELEN];
54     int err = 0;
55    
56     pass = buf_new();
57     iv = buf_new();
58     temp = buf_new();
59     id_encode(keyid, idstr);
60     strcat(idstr, "\n");
61     if ((keyring = mix_openfile(SECRING, "r")) == NULL) {
62     errlog(ERRORMSG, "No secret key file!\n");
63     err = -1;
64     goto end;
65     }
66     for (;;) {
67     if (fgets(line, sizeof(line), keyring) == NULL)
68     break;
69     if (strleft(line, begin_key)) {
70     if (fgets(line, sizeof(line), keyring) == NULL)
71     break;
72     if (!streq(line, idstr))
73     continue;
74     fgets(line, sizeof(line), keyring);
75     fgets(line, sizeof(line), keyring);
76     buf_sets(iv, line);
77     decode(iv, iv);
78     for (;;) {
79     if (fgets(line, sizeof(line), keyring) == NULL)
80     break;
81     if (strleft(line, end_key))
82     break;
83     buf_append(key, line, strlen(line) - 1);
84     }
85     break;
86     }
87     }
88     fclose(keyring);
89    
90     if (key->length == 0) {
91     errlog(ERRORMSG, "No such key: %s", idstr);
92     err = -1;
93     } else {
94     err = decode(key, key);
95     if (err == -1)
96     errlog(ERRORMSG, "Corrupt secret key.\n");
97     }
98     if (err == -1)
99     goto end;
100 rabbi 102 buf_sets(pass, PASSPHRASE);
101 rabbi 1 digest_md5(pass, pass);
102     buf_crypt(key, pass, iv, DECRYPT);
103    
104     err = check_seckey(key, keyid);
105     if (err == -1)
106     errlog(ERRORMSG, "Corrupt secret key. Bad passphrase?\n");
107     end:
108     buf_free(pass);
109     buf_free(iv);
110     buf_free(temp);
111     return (err);
112     }
113    
114     static int getv2pubkey(byte keyid[], BUFFER *key)
115     {
116     FILE *keyring;
117     BUFFER *b, *temp, *iv;
118     char idstr[33];
119     char line[LINELEN];
120     int err = 0;
121    
122     b = buf_new();
123     iv = buf_new();
124     temp = buf_new();
125     id_encode(keyid, idstr);
126     strcat(idstr, "\n");
127     if ((keyring = mix_openfile(PUBRING, "r")) == NULL) {
128     errlog(ERRORMSG, "Can't open %s!\n", PUBRING);
129     err = -1;
130     goto end;
131     }
132     for (;;) {
133     if (fgets(line, sizeof(line), keyring) == NULL)
134     break;
135     if (strleft(line, begin_key)) {
136     if (fgets(line, sizeof(line), keyring) == NULL)
137     break;
138     if (!streq(line, idstr))
139     continue;
140     fgets(line, sizeof(line), keyring); /* ignore length */
141     for (;;) {
142     if (fgets(line, sizeof(line), keyring) == NULL)
143     goto done;
144     if (strleft(line, end_key))
145     goto done;
146     buf_append(key, line, strlen(line) - 1);
147     }
148     break;
149     }
150     }
151     done:
152     fclose(keyring);
153    
154     if (key->length == 0) {
155     errlog(ERRORMSG, "No such public key: %s", idstr);
156     err = -1;
157     goto end;
158     }
159     err = decode(key, key);
160     if (err != -1)
161     err = check_pubkey(key, keyid);
162     if (err == -1)
163     errlog(ERRORMSG, "Corrupt public key %s", idstr);
164     end:
165     buf_free(b);
166     buf_free(iv);
167     buf_free(temp);
168     return (err);
169     }
170    
171     #else
172     static int getv2seckey(byte keyid[], BUFFER *key)
173     {
174     return -1;
175     }
176    
177     static int getv2pubkey(byte keyid[], BUFFER *key)
178     {
179     return -1;
180     }
181     #endif
182    
183     int key(BUFFER *out)
184     {
185     int err = -1;
186     FILE *f;
187    
188     buf_sets(out, "Subject: Remailer key for ");
189     buf_appends(out, SHORTNAME);
190     buf_appends(out, "\n\n");
191    
192     keymgt(0);
193    
194     conf_premail(out);
195     buf_nl(out);
196    
197     if (PGP) {
198     if ((f = mix_openfile(PGPKEY, "r")) != NULL) {
199     buf_appends(out, "Here is the PGP key:\n\n");
200     buf_read(out, f);
201     buf_nl(out);
202     fclose(f);
203     err = 0;
204     }
205     }
206     if (MIX) {
207     if ((f = mix_openfile(KEYFILE, "r")) != NULL) {
208     buf_appends(out, "Here is the Mixmaster key:\n\n");
209     buf_appends(out, "=-=-=-=-=-=-=-=-=-=-=-=\n");
210     buf_read(out, f);
211     buf_nl(out);
212     fclose(f);
213     err = 0;
214     }
215     }
216     if (err == -1 && UNENCRYPTED) {
217     buf_appends(out, "The remailer accepts unencrypted messages.\n");
218     err = 0;
219     }
220     if (err == -1)
221     errlog(ERRORMSG, "Cannot create remailer keys!");
222    
223     return (err);
224     }
225    
226     int adminkey(BUFFER *out)
227     {
228     int err = -1;
229     FILE *f;
230    
231     buf_sets( out, "Subject: Admin key for the " );
232     buf_appends( out, SHORTNAME );
233     buf_appends( out, " remailer\n\n" );
234    
235     if ( (f = mix_openfile( ADMKEYFILE, "r" )) != NULL ) {
236     buf_read( out, f );
237     buf_nl( out );
238     fclose( f );
239     err = 0;
240     }
241    
242     if ( err == -1 )
243     errlog( ERRORMSG, "Can not read admin key file!\n" );
244    
245     return err;
246     }
247    
248     #ifdef USE_RSA
249 weaselp 120 int v2keymgt(int force)
250 rabbi 1 {
251     /* scan secring, write the pubkey. function will be rewritten
252     for advanced key management in v3 */
253    
254     FILE *keyring, *f;
255     char line[LINELEN];
256     byte k1[16];
257     BUFFER *b, *temp, *iv, *pass, *pk;
258     int err = 0;
259     int found = 0;
260    
261     b = buf_new();
262     temp = buf_new();
263     iv = buf_new();
264     pass = buf_new();
265     pk = buf_new();
266    
267     if (force == 2)
268     v2createkey();
269 weaselp 122 else {
270     if ((f = mix_openfile(SECRING, "r")) == NULL)
271     v2createkey();
272     else
273     flcose(f);
274     }
275 rabbi 1
276     if (force == 0 && (f = mix_openfile(KEYFILE, "r")) != NULL) {
277     fclose(f);
278     goto end;
279     }
280     keyring = mix_openfile(SECRING, "r");
281     if (keyring != NULL) {
282     for (;;) {
283     if (fgets(line, sizeof(line), keyring) == NULL)
284     break;
285     if (strleft(line, begin_key)) {
286     if (fgets(line, sizeof(line), keyring) == NULL)
287     break;
288     id_decode(line, k1);
289     fgets(line, sizeof(line), keyring);
290     if (fgets(line, sizeof(line), keyring) == NULL)
291     break;
292     buf_sets(iv, line);
293     decode(iv, iv);
294     buf_reset(b);
295     for (;;) {
296     if (fgets(line, sizeof(line), keyring) == NULL)
297     break;
298     if (strleft(line, end_key))
299     break;
300     buf_append(b, line, strlen(line) - 1);
301     }
302     if (decode(b, b) == -1)
303     break;
304 rabbi 102 buf_sets(temp, PASSPHRASE);
305 rabbi 1 digest_md5(temp, pass);
306     buf_crypt(b, pass, iv, DECRYPT);
307     if (seckeytopub(pk, b, k1) == 0)
308     found = 1;
309     break;
310     }
311     }
312     fclose(keyring);
313     }
314     if (found) {
315     id_encode(k1, line);
316     if ((f = mix_openfile(KEYFILE, "w")) != NULL) {
317 rabbi 7 fprintf(f, "%s %s %s %s %s%s\n", SHORTNAME,
318 rabbi 1 REMAILERADDR, line, VERSION,
319 rabbi 7 MIDDLEMAN ? "M" : "",
320 rabbi 1 NEWS[0] == '\0' ? "C" : (strchr(NEWS, '@') ? "CNm" : "CNp"));
321     fprintf(f, "\n%s\n", begin_key);
322     fprintf(f, "%s\n258\n", line);
323     encode(pk, 40);
324     buf_write(pk, f);
325     fprintf(f, "%s\n\n", end_key);
326     fclose(f);
327     }
328     } else
329     err = -1;
330    
331     end:
332     buf_free(b);
333     buf_free(temp);
334     buf_free(iv);
335     buf_free(pass);
336     buf_free(pk);
337    
338     return (err);
339     }
340     #endif
341    
342     int keymgt(int force)
343     {
344     /* force = 0: write key file if there is none
345     force = 1: update key file
346     force = 2: generate new key */
347     int err = 0;
348    
349 weaselp 108 if (REMAIL || force == 2) {
350 rabbi 1 #ifdef USE_RSA
351 rabbi 81 if (MIX && (err = v2keymgt(force)) == -1)
352     err = -1;
353 rabbi 1 #endif
354     #ifdef USE_PGP
355 rabbi 81 if (PGP && (err = pgp_keymgt(force)) == -1)
356     err = -1;
357 rabbi 1 #endif
358 rabbi 81 }
359 rabbi 1 return (err);
360     }

  ViewVC Help
Powered by ViewVC 1.1.5