/[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 7 - (show annotations) (download)
Fri Nov 2 21:25:34 2001 UTC (11 years, 6 months ago) by rabbi
File MIME type: text/plain
File size: 7669 byte(s)
Put "M" in key file (key.txt) if remailer is middleman. (disastry)

Remember the flags are:

C     accepts compressed messages.
M     will forward messages to another mix, when used as the final hop.
Nm    supports posting to Usenet throught a mail-to-news gateway.
Np    supports direct posting to Usenet.
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 $Id: keymgt.c,v 1.2 2001/11/02 21:25:34 rabbi Exp $ */
10
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 buf_sets(pass, PASSPHRASE);
101 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 int v2keymgt(force)
250 {
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 else if ((f = mix_openfile(SECRING, "r")) == NULL)
270 v2createkey();
271
272 if (force == 0 && (f = mix_openfile(KEYFILE, "r")) != NULL) {
273 fclose(f);
274 goto end;
275 }
276 keyring = mix_openfile(SECRING, "r");
277 if (keyring != NULL) {
278 for (;;) {
279 if (fgets(line, sizeof(line), keyring) == NULL)
280 break;
281 if (strleft(line, begin_key)) {
282 if (fgets(line, sizeof(line), keyring) == NULL)
283 break;
284 id_decode(line, k1);
285 fgets(line, sizeof(line), keyring);
286 if (fgets(line, sizeof(line), keyring) == NULL)
287 break;
288 buf_sets(iv, line);
289 decode(iv, iv);
290 buf_reset(b);
291 for (;;) {
292 if (fgets(line, sizeof(line), keyring) == NULL)
293 break;
294 if (strleft(line, end_key))
295 break;
296 buf_append(b, line, strlen(line) - 1);
297 }
298 if (decode(b, b) == -1)
299 break;
300 buf_sets(temp, PASSPHRASE);
301 digest_md5(temp, pass);
302 buf_crypt(b, pass, iv, DECRYPT);
303 if (seckeytopub(pk, b, k1) == 0)
304 found = 1;
305 break;
306 }
307 }
308 fclose(keyring);
309 }
310 if (found) {
311 id_encode(k1, line);
312 if ((f = mix_openfile(KEYFILE, "w")) != NULL) {
313 fprintf(f, "%s %s %s %s %s%s\n", SHORTNAME,
314 REMAILERADDR, line, VERSION,
315 MIDDLEMAN ? "M" : "",
316 NEWS[0] == '\0' ? "C" : (strchr(NEWS, '@') ? "CNm" : "CNp"));
317 fprintf(f, "\n%s\n", begin_key);
318 fprintf(f, "%s\n258\n", line);
319 encode(pk, 40);
320 buf_write(pk, f);
321 fprintf(f, "%s\n\n", end_key);
322 fclose(f);
323 }
324 } else
325 err = -1;
326
327 end:
328 buf_free(b);
329 buf_free(temp);
330 buf_free(iv);
331 buf_free(pass);
332 buf_free(pk);
333
334 return (err);
335 }
336 #endif
337
338 int keymgt(int force)
339 {
340 /* force = 0: write key file if there is none
341 force = 1: update key file
342 force = 2: generate new key */
343 int err = 0;
344
345 #ifdef USE_RSA
346 if (MIX && (err = v2keymgt(force)) == -1)
347 err = -1;
348 #endif
349 #ifdef USE_PGP
350 if (PGP && (err = pgp_keymgt(force)) == -1)
351 err = -1;
352 #endif
353 return (err);
354 }

  ViewVC Help
Powered by ViewVC 1.1.5