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