mix3.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 */