/[pkg-mixmaster]/trunk/Mix/Src/mix3.h
ViewVC logotype

Contents of /trunk/Mix/Src/mix3.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 116 - (show annotations) (download)
Mon Jul 29 23:52:00 2002 UTC (10 years, 9 months ago) by weaselp
File MIME type: text/plain
File size: 11756 byte(s)
Make smtp sending similar to local /usr/lib/sendmail sending (wrt header/body seperation; Closes: #482052).
Add X-Loop header on mailbox forwarded messages.
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 Function prototypes
9 $Id: mix3.h,v 1.8 2002/07/29 23:52:00 weaselp Exp $ */
10
11
12 #ifndef _MIX3_H
13 #define _MIX3_H
14 #define COPYRIGHT "Copyright Anonymizer Inc."
15
16 #include "config.h"
17 #include "mix.h"
18
19 #ifdef WIN32
20 #ifndef USE_SOCK
21 #define _WINSOCKAPI_ /* don't include winsock */
22 #endif
23 #include <windows.h>
24 #ifdef _MSC
25 #define snprintf _snprintf
26 #endif
27 #define DIRSEP '\\'
28 #define DIRSEPSTR "\\"
29 #else
30 #define DIRSEP '/'
31 #define DIRSEPSTR "/"
32 #endif
33
34 #define NOT_IMPLEMENTED {printf("Function not implemented.\n");return -1;}
35 #define SECONDSPERDAY 86400
36
37 /* Dynamically allocated buffers */
38
39 int buf_reset(BUFFER *buffer);
40 int buf_clear(BUFFER *buffer);
41 int buf_append(BUFFER *buffer, byte *mess, int len);
42 int buf_cat(BUFFER *to, BUFFER *from);
43 int buf_set(BUFFER *to, BUFFER *from);
44 int buf_rest(BUFFER *to, BUFFER *from);
45 int buf_appendrnd(BUFFER *to, int n);
46 int buf_appendzero(BUFFER *to, int n);
47 int buf_setc(BUFFER *buf, byte c);
48 int buf_appendc(BUFFER *to, byte b);
49 int buf_setrnd(BUFFER *b, int n);
50 int buf_setf(BUFFER *buffer, char *fmt, ...);
51 int buf_appendf(BUFFER *buffer, char *fmt, ...);
52 int buf_sets(BUFFER *buf, char *s);
53 int buf_appends(BUFFER *buffer, char *s);
54 int buf_nl(BUFFER *buffer);
55 int buf_pad(BUFFER *buffer, int size);
56 int buf_prepare(BUFFER *buffer, int size);
57 int buf_rewind(BUFFER *buffer);
58 int buf_getc(BUFFER *buffer);
59 void buf_ungetc(BUFFER *buffer);
60 int buf_get(BUFFER *buffer, BUFFER *to, int n);
61 int buf_getline(BUFFER *buffer, BUFFER *line);
62 int buf_chop(BUFFER *b);
63 void buf_move(BUFFER *dest, BUFFER *src);
64 byte *buf_data(BUFFER *buffer);
65 int buf_isheader(BUFFER *buffer);
66 int buf_getheader(BUFFER *buffer, BUFFER *field, BUFFER *content);
67 int buf_appendheader(BUFFER *buffer, BUFFER *field, BUFFER *contents);
68 int buf_lookahead(BUFFER *buffer, BUFFER *line);
69 int buf_eq(BUFFER *b1, BUFFER *b2);
70 int buf_ieq(BUFFER *b1, BUFFER *b2);
71 void buf_cut_out(BUFFER *buffer, BUFFER *cut_out, BUFFER *rest,
72 int from, int len);
73
74 int buf_appendl(BUFFER *b, long l);
75 int buf_appendl_lo(BUFFER *b, long l);
76 long buf_getl(BUFFER *b);
77 long buf_getl_lo(BUFFER *b);
78 int buf_appendi(BUFFER *b, int i);
79 int buf_appendi_lo(BUFFER *b, int i);
80 int buf_geti(BUFFER *b);
81 int buf_geti_lo(BUFFER *b);
82
83 /* String comparison */
84 int strieq(const char *s1, const char *s2);
85 int strileft(const char *string, const char *keyword);
86 int striright(const char *string, const char *keyword);
87 int strifind(const char *string, const char *keyword);
88
89 int streq(const char *s1, const char *s2);
90 int strfind(const char *string, const char *keyword);
91 int strleft(const char *string, const char *keyword);
92
93 void strcatn(char *dest, const char *src, int n);
94
95 int bufleft(BUFFER *b, char *k);
96 int buffind(BUFFER *b, char *k);
97 int bufeq(BUFFER *b, char *k);
98
99 int bufileft(BUFFER *b, char *k);
100 int bufifind(BUFFER *b, char *k);
101 int bufiright(BUFFER *b, char *k);
102 int bufieq(BUFFER *b, char *k);
103
104 /* Utility functions */
105 void whoami(char *addr, char *defaultname);
106 int sendinfofile(char *name, char *log, BUFFER *address, BUFFER *subject);
107 int stats(BUFFER *out);
108 int conf(BUFFER *out);
109 void conf_premail(BUFFER *out);
110
111 void rfc822_addr(BUFFER *line, BUFFER *list);
112 void rfc822_name(BUFFER *line, BUFFER *name);
113 void sendmail_begin(void); /* begin mail sending session */
114 void sendmail_end(void); /* end mail sending session */
115 int sendmail_loop(BUFFER *message, char *from, BUFFER *address);
116 int sendmail(BUFFER *message, char *from, BUFFER *address);
117 int mixfile(char *path, const char *name);
118 int file_to_out(const char *name);
119 FILE *mix_openfile(const char *name, const char *a);
120 FILE *openpipe(const char *prog);
121 int closepipe(FILE *fp);
122
123 typedef struct {
124 char *name;
125 FILE *f;
126 } LOCK;
127
128 int lock(FILE *f);
129 int unlock(FILE *f);
130 LOCK *lockfile(char *filename);
131 int unlockfile(LOCK *lock);
132
133 int filtermsg(BUFFER *msg);
134 BUFFER *readdestblk( );
135 int doblock(BUFFER *line, BUFFER *filter, int logandreset);
136 int doallow(BUFFER *line, BUFFER *filter);
137 int allowmessage(BUFFER *in);
138
139 void errlog(int type, char *format,...);
140 void clienterr(BUFFER *msgbuf, char *err);
141 void logmail(char *mailbox, BUFFER *message);
142
143 void mix_status(char *fmt,...);
144 void mix_genericerror(void);
145
146 #define ERRORMSG 1
147 #define WARNING 2
148 #define NOTICE 3
149 #define LOG 4
150 #define DEBUGINFO 5
151
152 int decode(BUFFER *in, BUFFER *out);
153 int encode(BUFFER *b, int linelen);
154 void id_encode(byte id[], byte *s);
155 void id_decode(byte *s, byte id[]);
156
157 int decode_header(BUFFER *content);
158 int boundary(BUFFER *line, BUFFER *mboundary);
159 void get_parameter(BUFFER *content, char *attribute, BUFFER *value);
160 int get_type(BUFFER *content, BUFFER *type, BUFFER *subtype);
161 int mail_encode(BUFFER *in, int encoding);
162 int hdr_encode(BUFFER *in, int n);
163 int attachfile(BUFFER *message, BUFFER *filename);
164 int pgpmime_sign(BUFFER *message, BUFFER *uid, BUFFER *pass, char *secring);
165 int mime_attach(BUFFER *message, BUFFER *attachment, BUFFER *type);
166 void mimedecode(BUFFER *msg);
167 int qp_decode_message(BUFFER *msg);
168
169 #define MIME_8BIT 1 /* transport is 8bit */
170 #define MIME_7BIT 2 /* transport is 7bit */
171
172 /* randomness */
173 int rnd_bytes(byte *b, int n);
174 byte rnd_byte(void);
175 int rnd_number(int n);
176 int rnd_add(byte *b, int l);
177 int rnd_seed(void);
178 void rnd_time(void);
179
180 int rnd_init(void);
181 int rnd_final(void);
182 void rnd_error(void);
183
184 #define RND_QUERY 0
185 #define RND_NOTSEEDED -1
186 #define RND_SEEDED 1
187 #define RND_WILLSEED 2
188 extern int rnd_state; /* flag for PRNG status */
189
190 /* compression */
191 int buf_compress(BUFFER *b);
192 int buf_zip(BUFFER *out, BUFFER *in, int bits);
193 int buf_uncompress(BUFFER *b);
194 int buf_unzip(BUFFER *b, int type);
195
196 /* crypto functions */
197 int digest_md5(BUFFER *b, BUFFER *md);
198 int isdigest_md5(BUFFER *b, BUFFER *md);
199 int digestmem_md5(byte *b, int n, BUFFER *md);
200 int digest_sha1(BUFFER *b, BUFFER *md);
201 int digest_rmd160(BUFFER *b, BUFFER *md);
202
203 int keymgt(int force);
204 int key(BUFFER *b);
205 int adminkey(BUFFER *b);
206
207 #define ENCRYPT 1
208 #define DECRYPT 0
209 int buf_crypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
210
211 #ifdef USE_IDEA
212 int buf_ideacrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
213 #endif
214 int buf_bfcrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
215 int buf_3descrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
216 int buf_castcrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
217 #ifdef USE_AES
218 int buf_aescrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
219 #endif
220
221 int db_getseckey(byte keyid[], BUFFER *key);
222 int db_getpubkey(byte keyid[], BUFFER *key);
223 int pk_decrypt(BUFFER *encrypted, BUFFER *privkey);
224 int pk_encrypt(BUFFER *plaintext, BUFFER *privkey);
225 int check_seckey(BUFFER *buf, const byte id[]);
226 int check_pubkey(BUFFER *buf, const byte id[]);
227 int v2createkey(void);
228 int seckeytopub(BUFFER *pub, BUFFER *sec, byte keyid[]);
229
230 /* configuration, general remailer functions */
231 int mix_configline(char *line);
232 int mix_initialized(void);
233 int mix_daily(void);
234
235 /* message pool */
236 #define INTERMEDIATE 0
237 int pool_send(void);
238 int pool_read(BUFFER *pool);
239 int pool_add(BUFFER *msg, char *type);
240 FILE *pool_new(char *type, char *tmpname, char *path);
241 int mix_pool(BUFFER *msg, int type, long latent);
242 int pool_packetfile(char *fname, BUFFER *mid, int packetnum);
243 void pool_packetexp(void);
244 int idexp(void);
245 void pop3get(void);
246
247 typedef struct { /* added for binary id.log change */
248 char id[16];
249 long time;
250 } idlog_t;
251
252 /* statistics */
253 int stats_log(int);
254 int stats_out(int);
255
256 /* OpenPGP */
257 int pgp_keymgt(int force);
258 int pgp_armor(BUFFER *buf, int mode);
259 int pgp_dearmor(BUFFER *buf, BUFFER *out);
260 int pgp_pubkeycert(BUFFER *userid, char *keyring, BUFFER *pass,
261 BUFFER *out, int remail);
262 int pgp_signtxt(BUFFER *msg, BUFFER *uid, BUFFER *pass,
263 char *secring, int remail);
264 int pgp_isconventional(BUFFER *buf);
265 int pgp_mailenc(int mode, BUFFER *msg, char *sigid,
266 BUFFER *pass, char *pubring, char *secring);
267 int pgp_signhashalgo(BUFFER *algo, BUFFER *userid, char *secring,
268 BUFFER *pass);
269
270 /* menu */
271 int menu_initialized;
272 void menu_main(void);
273 void menu_folder(char command, char *name);
274 int menu_getuserpass(BUFFER *p, int mode);
275
276 int user_pass(BUFFER *b);
277 int user_confirmpass(BUFFER *b);
278 void user_delpass(void);
279
280 /* remailer */
281 typedef struct {
282 char name[20];
283 int version;
284 char addr[128];
285 byte keyid[16];
286 struct {
287 unsigned int mix:1;
288 unsigned int compress:1;
289
290 unsigned int cpunk:1;
291 unsigned int pgp:1;
292 unsigned int pgponly:1;
293 unsigned int latent:1;
294 unsigned int hash:1;
295 unsigned int ek:1;
296 unsigned int esub:1;
297
298 unsigned int nym:1;
299 unsigned int newnym:1;
300
301 unsigned int post:1;
302 unsigned int middle:1;
303 } flags;
304 struct rinfo {
305 int reliability;
306 int latency;
307 char history[13];
308 } info[2];
309 } REMAILER;
310
311 #define CHAINMAX 421
312 #define MAXREM 100
313 int print_type2list();
314 int mix2_rlist(REMAILER remailer[]);
315 int t1_rlist(REMAILER remailer[]);
316 int pgp_rlist(REMAILER remailer[], int n);
317 int chain_select(int hop[], char *chainstr, int maxrem, REMAILER *remailer,
318 int type, BUFFER *feedback);
319 int chain_rand(REMAILER *remailer, int maxrem,
320 int thischain[], int chainlen, int t);
321 int chain_randfinal(int type, REMAILER *remailer, int maxrem, int t);
322
323 float chain_reliability(char *chain, int chaintype,
324 char *reliability_string);
325 int mix2_encrypt(int type, BUFFER *message, char *chainstr, int numcopies,
326 BUFFER *feedback);
327 int t1_encrypt(int type, BUFFER *message, char *chainstr, int latency,
328 BUFFER *ek, BUFFER *feedback);
329
330 int t1_getreply(BUFFER *msg, BUFFER *ek, int len);
331
332 int t1_decrypt(BUFFER *in);
333 int t2_decrypt(BUFFER *in);
334
335 int mix2_decrypt(BUFFER *m);
336 int mix3_decrypt(BUFFER *m);
337
338 /* type 2 */
339 #define MAGIC0 0
340 #define MAGIC1 3
341
342 int v3_magic(byte *b);
343 int v2body(BUFFER *body);
344 int v2body_setlen(BUFFER *body);
345 int v2partial(BUFFER *body, BUFFER *mid, int packet, int numpackets);
346 int v2_merge(BUFFER *mid);
347 int mix_armor(BUFFER *in);
348 int mix_dearmor(BUFFER *armored, BUFFER *bin);
349
350 /* type 1 */
351 #define HDRMARK "::"
352 #define EKMARK "**"
353 #define HASHMARK "##"
354 int isline(BUFFER *line, char *text);
355
356 /* nym database */
357
358 #define NYM_WAITING 0
359 #define NYM_OK 1
360 #define NYM_DELETED 2
361 #define NYM_ANY -1
362
363 int nymlist_read(BUFFER *n);
364 int nymlist_write(BUFFER *list);
365 int nymlist_get(BUFFER *list, char *nym, BUFFER *config, BUFFER *ek,
366 BUFFER *options, BUFFER *name, BUFFER *rblocks, int *status);
367 int nymlist_append(BUFFER *list, char *nym, BUFFER *config, BUFFER *options,
368 BUFFER *name, BUFFER *chains, BUFFER *eklist, int status);
369 int nymlist_del(BUFFER *list, char *nym);
370 int nymlist_getnym(char *nym, BUFFER *config, BUFFER *ek, BUFFER *opt,
371 BUFFER *name, BUFFER *rblocks);
372 int nymlist_getstatus(char *nym);
373
374 /* Visual C lacks dirent */
375 #ifdef _MSC
376 typedef HANDLE DIR;
377
378 struct dirent {
379 char d_name[PATHMAX];
380 };
381
382 DIR *opendir(const char *name);
383 struct dirent *readdir(DIR *dir);
384 int closedir(DIR *dir);
385 #endif
386
387 /* sockets */
388 #if defined(WIN32) && defined(USE_SOCK)
389 #include <winsock.h>
390 int sock_init(void);
391 void sock_exit(void);
392
393 #else
394 typedef int SOCKET;
395
396 #define INVALID_SOCKET -1
397 SOCKET opensocket(char *hostname, int port);
398 int closesocket(SOCKET s);
399
400 #endif
401
402 #ifdef WIN32
403 int is_nt_service(void);
404 void set_nt_exit_event();
405 #endif
406
407 /* check for memory leaks */
408 #ifdef DEBUG
409 #define malloc mix3_malloc
410 #define free mix3_free
411 BUFFER *mix3_bufnew(char *, int, char*);
412 #if __GNUC__ >= 2
413 # define buf_new() mix3_bufnew(__FILE__, __LINE__, __PRETTY_FUNCTION__)
414 #else
415 # define buf_new() mix3_bufnew(__FILE__, __LINE__, "file")
416 #endif
417 #endif /* DEBUG */
418
419 #endif

  ViewVC Help
Powered by ViewVC 1.1.5