/[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 512 - (hide annotations) (download)
Thu May 8 18:07:08 2003 UTC (10 years ago) by weaselp
File MIME type: text/plain
File size: 13133 byte(s)
Experimental feature:  --redirect -l <chain>.  If you have a mixmaster message
with a chain starting with hop1 (you cannot know any more because it already is
encrypted) then mix --redirect -l=foo,bar < file redirect the message so the
chain is actually foo,bar,hop1,... and places it in your pool.  If the total
number of hops (which cannot be known) exceeds 20 the message is damanged and
will fail at the 20th node.
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     Function prototypes
9 weaselp 512 $Id: mix3.h,v 1.24 2003/05/08 18:07:08 weaselp Exp $ */
10 rabbi 1
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 rabbi 262 #endif /* not USE_SOCK */
23 rabbi 1 #include <windows.h>
24 rabbi 11 #ifdef _MSC
25     #define snprintf _snprintf
26 rabbi 262 #endif /* _MSC */
27 rabbi 11 #define DIRSEP '\\'
28     #define DIRSEPSTR "\\"
29 rabbi 262 #else /* end of WIN32 */
30 rabbi 11 #define DIRSEP '/'
31     #define DIRSEPSTR "/"
32 rabbi 262 #endif /* else if not WIN32 */
33 rabbi 1
34     #define NOT_IMPLEMENTED {printf("Function not implemented.\n");return -1;}
35     #define SECONDSPERDAY 86400
36    
37 weaselp 214 #include <time.h>
38    
39 rabbi 1 /* 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 weaselp 116 int buf_isheader(BUFFER *buffer);
68 rabbi 1 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 weaselp 116 int sendmail_loop(BUFFER *message, char *from, BUFFER *address);
118 rabbi 1 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 weaselp 153 int maildirWrite(char *maildir, BUFFER *message, int create);
125 weaselp 197 int write_pidfile(char *pidfile);
126     int clear_pidfile(char *pidfile);
127 weaselp 214 time_t parse_yearmonthday(char* str);
128 rabbi 1
129 weaselp 197
130 rabbi 1 typedef struct {
131     char *name;
132     FILE *f;
133     } LOCK;
134    
135     int lock(FILE *f);
136     int unlock(FILE *f);
137     LOCK *lockfile(char *filename);
138     int unlockfile(LOCK *lock);
139    
140     int filtermsg(BUFFER *msg);
141     BUFFER *readdestblk( );
142     int doblock(BUFFER *line, BUFFER *filter, int logandreset);
143     int doallow(BUFFER *line, BUFFER *filter);
144     int allowmessage(BUFFER *in);
145    
146     void errlog(int type, char *format,...);
147     void clienterr(BUFFER *msgbuf, char *err);
148     void logmail(char *mailbox, BUFFER *message);
149    
150     void mix_status(char *fmt,...);
151     void mix_genericerror(void);
152    
153     #define ERRORMSG 1
154     #define WARNING 2
155     #define NOTICE 3
156     #define LOG 4
157     #define DEBUGINFO 5
158    
159     int decode(BUFFER *in, BUFFER *out);
160     int encode(BUFFER *b, int linelen);
161     void id_encode(byte id[], byte *s);
162     void id_decode(byte *s, byte id[]);
163    
164     int decode_header(BUFFER *content);
165     int boundary(BUFFER *line, BUFFER *mboundary);
166     void get_parameter(BUFFER *content, char *attribute, BUFFER *value);
167     int get_type(BUFFER *content, BUFFER *type, BUFFER *subtype);
168     int mail_encode(BUFFER *in, int encoding);
169     int hdr_encode(BUFFER *in, int n);
170     int attachfile(BUFFER *message, BUFFER *filename);
171     int pgpmime_sign(BUFFER *message, BUFFER *uid, BUFFER *pass, char *secring);
172     int mime_attach(BUFFER *message, BUFFER *attachment, BUFFER *type);
173     void mimedecode(BUFFER *msg);
174 rabbi 41 int qp_decode_message(BUFFER *msg);
175 rabbi 1
176     #define MIME_8BIT 1 /* transport is 8bit */
177     #define MIME_7BIT 2 /* transport is 7bit */
178    
179     /* randomness */
180     int rnd_bytes(byte *b, int n);
181     byte rnd_byte(void);
182     int rnd_number(int n);
183     int rnd_add(byte *b, int l);
184     int rnd_seed(void);
185     void rnd_time(void);
186    
187     int rnd_init(void);
188     int rnd_final(void);
189     void rnd_error(void);
190    
191     #define RND_QUERY 0
192     #define RND_NOTSEEDED -1
193     #define RND_SEEDED 1
194     #define RND_WILLSEED 2
195     extern int rnd_state; /* flag for PRNG status */
196    
197     /* compression */
198     int buf_compress(BUFFER *b);
199     int buf_zip(BUFFER *out, BUFFER *in, int bits);
200     int buf_uncompress(BUFFER *b);
201     int buf_unzip(BUFFER *b, int type);
202    
203     /* crypto functions */
204     int digest_md5(BUFFER *b, BUFFER *md);
205     int isdigest_md5(BUFFER *b, BUFFER *md);
206     int digestmem_md5(byte *b, int n, BUFFER *md);
207     int digest_sha1(BUFFER *b, BUFFER *md);
208     int digest_rmd160(BUFFER *b, BUFFER *md);
209    
210     int keymgt(int force);
211     int key(BUFFER *b);
212     int adminkey(BUFFER *b);
213    
214     #define ENCRYPT 1
215     #define DECRYPT 0
216     int buf_crypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
217    
218     #ifdef USE_IDEA
219     int buf_ideacrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
220 rabbi 262 #endif /* USE_IDEA */
221 rabbi 1 int buf_bfcrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
222     int buf_3descrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
223     int buf_castcrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
224 rabbi 98 #ifdef USE_AES
225     int buf_aescrypt(BUFFER *b, BUFFER *key, BUFFER *iv, int enc);
226 rabbi 262 #endif /* USE_AES */
227 rabbi 1
228     int db_getseckey(byte keyid[], BUFFER *key);
229     int db_getpubkey(byte keyid[], BUFFER *key);
230     int pk_decrypt(BUFFER *encrypted, BUFFER *privkey);
231     int pk_encrypt(BUFFER *plaintext, BUFFER *privkey);
232     int check_seckey(BUFFER *buf, const byte id[]);
233     int check_pubkey(BUFFER *buf, const byte id[]);
234     int v2createkey(void);
235 weaselp 188 int getv2seckey(byte keyid[], BUFFER *key);
236 rabbi 1 int seckeytopub(BUFFER *pub, BUFFER *sec, byte keyid[]);
237    
238     /* configuration, general remailer functions */
239     int mix_configline(char *line);
240 disastry 265 int mix_config(void);
241 rabbi 1 int mix_initialized(void);
242     int mix_daily(void);
243    
244     /* message pool */
245     #define INTERMEDIATE 0
246     int pool_send(void);
247     int pool_read(BUFFER *pool);
248     int pool_add(BUFFER *msg, char *type);
249     FILE *pool_new(char *type, char *tmpname, char *path);
250     int mix_pool(BUFFER *msg, int type, long latent);
251     int pool_packetfile(char *fname, BUFFER *mid, int packetnum);
252     void pool_packetexp(void);
253     int idexp(void);
254 weaselp 477 int pgpmaxexp(void);
255 rabbi 1 void pop3get(void);
256    
257 rabbi 82 typedef struct { /* added for binary id.log change */
258     char id[16];
259     long time;
260     } idlog_t;
261    
262 rabbi 1 /* statistics */
263     int stats_log(int);
264     int stats_out(int);
265    
266     /* OpenPGP */
267 weaselp 182 #define PGP_ARMOR_NORMAL 0
268     #define PGP_ARMOR_REM 1
269     #define PGP_ARMOR_KEY 2
270     #define PGP_ARMOR_NYMKEY 3
271     #define PGP_ARMOR_NYMSIG 4
272     #define PGP_ARMOR_SECKEY 5
273    
274 weaselp 285 #define PGP_TYPE_UNDEFINED 0
275     #define PGP_TYPE_PRIVATE 1
276     #define PGP_TYPE_PUBLIC 2
277    
278 rabbi 1 int pgp_keymgt(int force);
279 weaselp 298 int pgp_latestkeys(BUFFER* outtxt, int algo);
280 rabbi 1 int pgp_armor(BUFFER *buf, int mode);
281     int pgp_dearmor(BUFFER *buf, BUFFER *out);
282     int pgp_pubkeycert(BUFFER *userid, char *keyring, BUFFER *pass,
283     BUFFER *out, int remail);
284     int pgp_signtxt(BUFFER *msg, BUFFER *uid, BUFFER *pass,
285     char *secring, int remail);
286     int pgp_isconventional(BUFFER *buf);
287     int pgp_mailenc(int mode, BUFFER *msg, char *sigid,
288     BUFFER *pass, char *pubring, char *secring);
289     int pgp_signhashalgo(BUFFER *algo, BUFFER *userid, char *secring,
290     BUFFER *pass);
291    
292     /* menu */
293     int menu_initialized;
294     void menu_main(void);
295     void menu_folder(char command, char *name);
296     int menu_getuserpass(BUFFER *p, int mode);
297    
298     int user_pass(BUFFER *b);
299     int user_confirmpass(BUFFER *b);
300     void user_delpass(void);
301    
302     /* remailer */
303     typedef struct {
304     char name[20];
305     int version;
306     char addr[128];
307     byte keyid[16];
308     struct {
309     unsigned int mix:1;
310     unsigned int compress:1;
311    
312     unsigned int cpunk:1;
313     unsigned int pgp:1;
314     unsigned int pgponly:1;
315     unsigned int latent:1;
316     unsigned int hash:1;
317     unsigned int ek:1;
318     unsigned int esub:1;
319    
320     unsigned int nym:1;
321     unsigned int newnym:1;
322    
323     unsigned int post:1;
324     unsigned int middle:1;
325 weaselp 387
326     unsigned int star_ex:1;
327 rabbi 1 } flags;
328     struct rinfo {
329     int reliability;
330     int latency;
331     char history[13];
332     } info[2];
333     } REMAILER;
334    
335     #define CHAINMAX 421
336     #define MAXREM 100
337 weaselp 168 int prepare_type2list(BUFFER *out);
338 weaselp 500 int mix2_rlist(REMAILER remailer[], int badchains[MAXREM][MAXREM]);
339     int t1_rlist(REMAILER remailer[], int badchains[MAXREM][MAXREM]);
340 rabbi 1 int pgp_rlist(REMAILER remailer[], int n);
341 weaselp 171 int pgp_rkeylist(REMAILER remailer[], int keyid[], int n);
342 weaselp 500 void parse_badchains(int badchains[MAXREM][MAXREM], char *file, char *startindicator, REMAILER *remailer, int maxrem);
343 rabbi 1 int chain_select(int hop[], char *chainstr, int maxrem, REMAILER *remailer,
344     int type, BUFFER *feedback);
345 weaselp 500 int chain_rand(REMAILER *remailer, int badchains[MAXREM][MAXREM], int maxrem,
346 rabbi 1 int thischain[], int chainlen, int t);
347 weaselp 510 int chain_randfinal(int type, REMAILER *remailer, int badchains[MAXREM][MAXREM], int maxrem, int rtype, int chain[], int chainlen);
348 rabbi 1
349     float chain_reliability(char *chain, int chaintype,
350     char *reliability_string);
351 weaselp 512 int redirect_message(BUFFER *sendmsg, char *chain, int numcopies, BUFFER *chainlist);
352 rabbi 1 int mix2_encrypt(int type, BUFFER *message, char *chainstr, int numcopies,
353     BUFFER *feedback);
354     int t1_encrypt(int type, BUFFER *message, char *chainstr, int latency,
355     BUFFER *ek, BUFFER *feedback);
356    
357     int t1_getreply(BUFFER *msg, BUFFER *ek, int len);
358    
359     int t1_decrypt(BUFFER *in);
360     int t2_decrypt(BUFFER *in);
361    
362     int mix2_decrypt(BUFFER *m);
363     int mix3_decrypt(BUFFER *m);
364    
365     /* type 2 */
366     #define MAGIC0 0
367     #define MAGIC1 3
368    
369     int v3_magic(byte *b);
370     int v2body(BUFFER *body);
371     int v2body_setlen(BUFFER *body);
372     int v2partial(BUFFER *body, BUFFER *mid, int packet, int numpackets);
373     int v2_merge(BUFFER *mid);
374     int mix_armor(BUFFER *in);
375     int mix_dearmor(BUFFER *armored, BUFFER *bin);
376    
377     /* type 1 */
378     #define HDRMARK "::"
379     #define EKMARK "**"
380     #define HASHMARK "##"
381     int isline(BUFFER *line, char *text);
382    
383     /* nym database */
384    
385     #define NYM_WAITING 0
386     #define NYM_OK 1
387     #define NYM_DELETED 2
388     #define NYM_ANY -1
389    
390     int nymlist_read(BUFFER *n);
391     int nymlist_write(BUFFER *list);
392     int nymlist_get(BUFFER *list, char *nym, BUFFER *config, BUFFER *ek,
393     BUFFER *options, BUFFER *name, BUFFER *rblocks, int *status);
394     int nymlist_append(BUFFER *list, char *nym, BUFFER *config, BUFFER *options,
395     BUFFER *name, BUFFER *chains, BUFFER *eklist, int status);
396     int nymlist_del(BUFFER *list, char *nym);
397     int nymlist_getnym(char *nym, BUFFER *config, BUFFER *ek, BUFFER *opt,
398     BUFFER *name, BUFFER *rblocks);
399     int nymlist_getstatus(char *nym);
400    
401     /* Visual C lacks dirent */
402     #ifdef _MSC
403     typedef HANDLE DIR;
404    
405     struct dirent {
406     char d_name[PATHMAX];
407     };
408    
409     DIR *opendir(const char *name);
410     struct dirent *readdir(DIR *dir);
411     int closedir(DIR *dir);
412 rabbi 262 #endif /* _MSC */
413 rabbi 1
414     /* sockets */
415     #if defined(WIN32) && defined(USE_SOCK)
416     #include <winsock.h>
417     int sock_init(void);
418     void sock_exit(void);
419    
420 rabbi 262 #else /* end of defined(WIN32) && defined(USE_SOCK) */
421 rabbi 1 typedef int SOCKET;
422    
423     #define INVALID_SOCKET -1
424     SOCKET opensocket(char *hostname, int port);
425     int closesocket(SOCKET s);
426    
427 rabbi 262 #endif /* else if not defined(WIN32) && defined(USE_SOCK) */
428 rabbi 1
429 rabbi 30 #ifdef WIN32
430     int is_nt_service(void);
431     void set_nt_exit_event();
432 rabbi 262 #endif /* WIN32 */
433 rabbi 30
434 rabbi 1 /* check for memory leaks */
435     #ifdef DEBUG
436     #define malloc mix3_malloc
437     #define free mix3_free
438     BUFFER *mix3_bufnew(char *, int, char*);
439     #if __GNUC__ >= 2
440     # define buf_new() mix3_bufnew(__FILE__, __LINE__, __PRETTY_FUNCTION__)
441 rabbi 262 #else /* end of __GNUC__ >= 2 */
442 rabbi 1 # define buf_new() mix3_bufnew(__FILE__, __LINE__, "file")
443 rabbi 262 #endif /* else if not __GNUC__ >= 2 */
444 rabbi 1 #endif /* DEBUG */
445    
446 rabbi 262 #endif /* not _MIX3_H */

  ViewVC Help
Powered by ViewVC 1.1.5