mix.h (25220B)
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 9 Mixmaster Library API 10 ===================== 11 12 The Mixmaster library consists of a set of high-level functions that 13 generate or process remailer messages, lower-level functions that 14 manipulate data in various ways, and a number of functions that 15 provide an interface to the underlying cryptographic library. 16 Generally, a return value of 0 indicates success, and -1 an error. 17 18 19 Initialization 20 ============== 21 22 int mix_init(char mixdir[]); 23 24 This function initializes internal data of the Mixmaster library, 25 such as the random number generator. This should be the first call 26 to the Mixmaster library. It returns 0 on success. If the random 27 number generator cannot be initialized, mix_init() terminates. 28 29 The variable mixdir determines where the Mixmaster configuration 30 files and the message pool are located. If mixdir is NULL, the 31 library will use the directory specified in the environment variable 32 $MIXPATH, the directory given at compile time if it exists, and the 33 directory ~/Mix otherwise. 34 35 36 void mix_exit(void); 37 38 A program must call mix_exit before exiting. This function writes back 39 the state of the random number generator. 40 41 42 Using the Mixmaster DLL 43 ======================= 44 45 In textmode applications, mix_init() can be used as described above. 46 In graphical applications, these functions are not needed. Instead, 47 the function rnd_mouse() should be called whenever the program gets 48 WM_MOUSEMOVE or other messages: 49 50 int rnd_mouse(UINT i, WPARAM w, LPARAM l); 51 52 All events that a window gets may be passed to this function. It 53 will extract the inherent randomness in user interaction, especially 54 in mouse movements. It returns 100 if it has accumulated enough 55 randomness to perform cryptographic operations, and a number between 56 0 and 99 otherwise. This number can be used to provide graphical 57 feedback on the progress of initializing the random number generator 58 while asking the user to move the mouse. A runtime error will occur 59 if any cryptographic functions are used before rnd_mouse() has 60 signaled success. 61 62 63 Message I/O 64 =========== 65 66 The library uses dynamically allocated buffers for messages and other 67 data. Functions for buffer manipulation are described in section 68 "Buffers" below. 69 70 71 BUFFER *buf_new(void); 72 73 Buffers must be initialized before they can be used. buf_new() returns 74 a pointer to a newly initialized buffer. 75 76 77 int buf_free(BUFFER *buf); 78 79 When a buffer is no longer needed, it should be freed. This function 80 returns the memory used for the buffer to the operating system. 81 82 83 int buf_read(BUFFER *message, FILE *infile); 84 85 This function reads data from a stream and appends them to the buffer. 86 87 Return values: 88 0 on success, 89 1 if the file is too large to store it in a buffer, 90 -1 if no data could be read. 91 92 93 int buf_write(BUFFER *message, FILE *outfile); 94 95 This function writes the entire buffer to the output stream. 96 97 Return values: 98 0 if the buffer could be written completely, 99 -1 otherwise. 100 101 int buf_write_sync(BUFFER *message, FILE *outfile); 102 103 This function does the same as buf_write but also does 104 checks for return values of fflush, fsync and ***fclose***. 105 106 Return values: 107 0 if the buffer could be written, synced and closed completely, 108 -1 otherwise. 109 110 Remailer Messages 111 ================= 112 113 int mix_encrypt(int type, BUFFER *message, char *chain, int numcopies, 114 BUFFER *feedback); 115 116 This function creates a Mixmaster message and stores it the Mixmaster 117 message pool. 118 119 The type is one of the following: 120 121 MSG_MAIL electronic mail message 122 MSG_POST Usenet news article 123 MSG_NULL dummy message, will be discarded 124 125 *chain is a string consisting of a comma-separated list of remailer 126 names that the message will be sent through. '*' means that a remailer 127 will be chosen at random. If *chain is NULL, mix_encrypt() will use the 128 default chain. 129 130 numcopies is a number between 1 and 10 that indicates how many 131 (redundant) copies of the message should be sent. If numcopies is 0, 132 the default value will be used. The default values for *chain and 133 numcopies are read from the configuration file. 134 135 If *feedback is not NULL, mix_encrypt() will write the chain(s) that 136 have been selected as newline-separated strings, or a textual error 137 message to *feedback. This text can be presented to the user as 138 feedback. 139 140 Return values: 141 0 on success, 142 -1 if the message could not be created. 143 144 145 int mix_decrypt(BUFFER *message); 146 147 This is the remailer function, which reads Mixmaster and Cypherpunk 148 remailer messages as well as help file and key requests. Remailer 149 messages are decrypted and stored in the message pool. Replies to 150 information requests are sent immediately. 151 152 Return values: 153 0 if the message has been processed successfully, 154 1 if the message is of an unknown type, 155 -1 if the message could not be processed. 156 157 158 int mix_send(void); 159 160 This function causes the messages in the pool to be sent. Depending on 161 the configuration, mix_send() may send only a certain fraction of the 162 messages in the pool. 163 164 Return value: The size of the pool after the messages have been sent. 165 166 167 int mix_regular(int force); 168 169 This function is responsible for regular actions of the remailer such 170 as sending messages from the pool, getting mail from POP3 servers and 171 expiring log files. 172 173 174 Nymserver Client Functions 175 ========================== 176 177 The nymserver functions use user_pass() to get the passphrase for 178 opening the nym database. 179 180 int nym_config(int mode, char *nym, char *nymserver, BUFFER *pseudonym, 181 char *sendchain, int sendnumcopies, BUFFER *chains, 182 BUFFER *options); 183 184 Create, modify or delete a nym. mode is one of NYM_CREATE, NYM_MODIFY and 185 NYM_DELETE. 186 187 nym is the pseudonymous address or its local part. In the latter case, 188 nymserver must contain a string that selects a nymserver. 189 190 pseudonym is a text string or NULL. 191 192 sendchain and sendnumcopies are the chain and number of copies of 193 the Mixmaster message sent to the nymserver. 194 195 chains contains a list of reply blocks, consisting of "To:", 196 "Newsgroups:", "Null:", "Latency:", "Chain:" and arbitrary header lines 197 such as "Subject:". The "Chain:" line contains a remailer selection 198 string for type 1 remailers. The reply blocks are separated by empty 199 lines. 200 201 options contains nymserver options (any of "acksend", "signsend", 202 "fixedsize", "disable", "fingerkey" with a "+" or "-" prefix) or is NULL. 203 204 205 int nym_encrypt(BUFFER *msg, char *nym, int type); 206 207 Prepare the message msg of type MSG_MAIL or MSG_POST to be sent using 208 the nym. After successful encryption, msg contains a message of type 209 MSG_MAIL addressed to the nymserver. 210 211 212 int nym_decrypt(BUFFER *msg, char *nym, BUFFER *log); 213 214 Decrypt nymserver replies and PGP messages. If msg contains a nymserver 215 reply, the the recipient nym is stored in nym (unless nym is NULL), and 216 msg is replaced with the plaintext message in the Unix mail folder 217 format. 218 219 If log is not NULL, nym_decrypt will compute a unique ID for each 220 message and append it to log. If the ID already is contained in log, 221 it will return an empty msg buffer. 222 223 224 Lower-Level Remailer Functions 225 ============================== 226 227 t1_decrypt(BUFFER *in); 228 229 Decrypts and processes a Cypherpunk remailer message. 230 231 232 t2_decrypt(BUFFER *in); 233 234 Decrypts and processes a Mixmaster remailer message. 235 236 237 int mix_pool(BUFFER *msg, int type, long latent); 238 239 Adds the message msg of type MSG_MAIL or MSG_POST to the pool. 240 latent is 0 or the message latency in seconds. 241 242 243 OpenPGP encryption 244 ================== 245 246 int pgp_encrypt(int mode, BUFFER *message, BUFFER *encr, 247 BUFFER *sigid, BUFFER *pass, char *pubring, 248 char *secring); 249 250 This function encrypts and signs a message according to OpenPGP (RFC 2440). 251 252 mode is the bitwise or of one of PGP_ENCRYPT, PGP_CONVENTIONAL and PGP_SIGN, 253 and any of PGP_TEXT, PGP_REMAIL and PGP_NOARMOR. 254 255 PGP_CONVENTIONAL: the message is encrypted conventionally, using 256 the passphrase encr. If PGP_NCONVENTIONAL is used instead, 257 the new OpenPGP format is used. 258 PGP_ENCRYPT: public key encryption is used. The message is encrypted to 259 the first public key on the keyring a User ID of which contains 260 the substring encr. encr may contain several lines with one 261 address substring each. 262 PGP_SIGN: the message is signed with the first key from the secret 263 key ring whose user ID contains sigid as a substring, or the 264 first key if sigid is NULL. 265 PGP_TEXT: message is treated as text, without PGP_TEXT as binary. 266 PGP_DETACHEDSIG: signature will not include the signed message. 267 PGP_REMAIL: a random offset is subtracted from signature dates, and the 268 ASCII armor is made to mimic PGP. 269 PGP_NOARMOR: message armor is not applied. 270 271 If none of PGP_SIGN, PGP_CONVENTIONAL and PGP_ENCRYPT is set, the 272 message is only compressed and armored. 273 274 pubring and secring can be NULL or specify the name of a key ring. 275 276 Return values: 277 0 on success, 278 -1 no matching key found, 279 PGP_PASS bad signature passphrase. 280 281 282 int pgp_mailenc(int mode, BUFFER *message, char *sigid, 283 BUFFER *pass, char *pubring, char *secring); 284 285 This function encrypts and signs an RFC 822 e-mail message according to 286 RFC 2015 (OpenPGP/MIME). Signatures without encryption on non-MIME messages 287 are "cleartext" signatures. 288 289 290 int pgp_decrypt(BUFFER *message, BUFFER *pass, BUFFER *sig, char *pubring, 291 char *secring); 292 293 This function decrypts the OpenPGP message and verifies its signature. 294 pass must contain the passphrase if message is conventionally encrypted 295 or the secret key is protected by a passphrase. Otherwise it can be 296 NULL. 297 298 If message is a detached signature, sig must contain the signed data. 299 It sig is NULL, the message will be decrypted without signature 300 verification. 301 302 pgp_getmsg() writes a string containing the signing time and 303 signer's user ID or the key ID of the unknown signature key to sig. 304 305 pubring and secring can be NULL or specify the name of a key ring. 306 307 Return values: 308 PGP_OK on success, 309 PGP_ERR the message can't be read, 310 PGP_PASS bad passphrase, 311 PGP_NOMSG message is not an OpenPGP message, 312 PGP_SIGOK success, and signature has been verified, 313 PGP_SIGNKEY can't verify signature, 314 PGP_SIGBAD bad signature, 315 PGP_NODATA OpenPGP message does not contain user data. 316 317 318 int pgp_keygen(int algo, int bits, BUFFER *userid, BUFFER *pass, char *pubring, 319 char *secring, int remail); 320 321 Generate a new key pair with given userid, encrypt the secret key with 322 pass if not NULL. Use a fake date if remail is not zero. Assume an 323 encrypted secring if remail == 2. algo is PGP_ES_RSA or PGP_E_ELG. 324 325 326 Buffers 327 ======= 328 329 Buffers contain binary data of arbitrary length. You can append data 330 to buffers, clear buffers, and read data from buffers sequentially. 331 As data are appended to a buffer, memory is allocated dynamically. 332 333 typedef unsigned char byte; 334 335 typedef struct 336 { 337 byte *data; 338 long length; 339 long ptr; 340 long size; 341 byte sensitive; 342 } BUFFER; 343 344 For a buffer *b, b->data is a pointer to at least b->length+1 bytes of 345 memory. b->data[b->length] is guaranteed to contain a null byte, so that 346 string functions can be used directly on buffers that contain text. 347 348 ptr is a counter for reading data from the buffer. b->data[b->ptr] is 349 the first data byte that has not been read (0 <= ptr <= length). 350 351 If sensitive is 1, the buffer contents will be overwritten before the 352 memory is released. 353 354 355 int buf_reset(BUFFER *buf); 356 357 This function empties the buffer and returns the memory it has used to 358 the operating system. It does not free the buffer itself. 359 360 361 int buf_clear(BUFFER *buf); 362 363 buf_clear() empties the buffer but does not free the memory it uses. 364 This function should be used if data of a similar size will be stored 365 to the buffer later. 366 367 368 int buf_eq(BUFFER *buf1, BUFFER *buf2); 369 370 Return values: 371 1 if the buffers contain identical data, 372 0 otherwise. 373 374 375 int buf_append(BUFFER *buf, byte *msg, int len); 376 377 This is the most basic function for appending data to a buffer. It is 378 called by all other functions that write to buffers. buf_append() 379 appends len bytes pointed to by msg to buf. New memory will be 380 allocated for the buffer if necessary. 381 382 If msg is NULL, the buffer is increased by len bytes, but no 383 guarantee is made about the contents of the appended bytes. 384 385 Return value: 386 0 on success, 387 does not return if allocation of memory fails. 388 389 390 int buf_appendc(BUFFER *buf, byte b); 391 appends the byte b to buf. 392 393 394 int buf_appends(BUFFER *buf, char *s); 395 appends the null-terminated string s to buf. 396 397 398 int buf_appendf(BUFFER *buf, char *fmt, ...); 399 appends formatted output to buf. 400 401 402 int buf_sets(BUFFER *buf, char *s); 403 sets buf to contain the null-terminated string s. 404 405 406 int buf_setf(BUFFER *buf, char *fmt, ...); 407 sets buf to contain the formatted output. 408 409 410 int buf_nl(BUFFER *buf); 411 appends a newline character to buf. 412 413 414 int buf_cat(BUFFER *buf, BUFFER *f); 415 appends the entire contents of f to buf. 416 417 418 int buf_rest(BUFFER *buf, BUFFER *f); 419 appends the unread data from f to buf. 420 421 422 int buf_set(BUFFER *buf, BUFFER *f); 423 sets buf to a copy of the contents of f. 424 425 426 int buf_move(BUFFER *buf, BUFFER *f); 427 sets buf to the contents of f, and resets f. This is equivalent to 428 buf_set(buf, f); buf_reset(f); but more efficient. 429 430 431 int buf_appendrnd(BUFFER *buf, int n); 432 appends n cryptographically strong pseudo-random bytes to buf. 433 434 435 int buf_setrnd(BUFFER *buf, int n); 436 places n cryptographically strong pseudo-random bytes in buf. 437 438 439 int buf_appendzero(BUFFER *buf, int n); 440 appends n null bytes to buf. 441 442 443 int buf_pad(BUFFER *buf, int size); 444 pads the buffer with cryptographically strong pseudo-random data to 445 length size. Aborts if size < buf->length. 446 447 448 int buf_appendi(BUFFER *b, int i); 449 appends the two bytes representing i in big-endian byte order to buf. 450 451 452 int buf_appendi_lo(BUFFER *b, int i); 453 appends the two bytes representing i in little-endian byte order to buf. 454 455 456 int buf_appendl(BUFFER *buf, long l); 457 appends the four bytes representing l in big-endian byte order to buf. 458 459 460 int buf_appendl_lo(BUFFER *buf, long l); 461 appends the four bytes representing l in little-endian byte order to buf. 462 463 464 int buf_prepare(BUFFER *buf, int size); 465 sets buf to contain size bytes of arbitrary data. 466 467 468 int buf_get(BUFFER *buf, BUFFER *t, int n); 469 470 This function sets buffer t to contain n bytes read from buf. 471 472 Return values: 473 0 on success, 474 -1 if buf does not contain n unread bytes. 475 476 477 int buf_getc(BUFFER *buf); 478 reads one byte from buf. Returns -1 if buf contains no unread data, 479 the byte otherwise. 480 481 482 int buf_geti(BUFFER *buf); 483 reads two bytes from buf. Returns -1 if buf buf does not contain two 484 unread bytes, the integer represented by the bytes in big-endian 485 byte order otherwise. 486 487 488 int buf_geti_lo(BUFFER *buf); 489 reads two bytes from buf. Returns -1 if buf buf does not contain two 490 unread bytes, the integer represented by the bytes in little-endian 491 byte order otherwise. 492 493 494 long buf_getl(BUFFER *buf); 495 reads four bytes from buf. Returns -1 if buf buf does not contain four 496 unread bytes, the integer represented by the bytes in big-endian 497 byte order otherwise. 498 499 500 long buf_getl_lo(BUFFER *buf); 501 reads four bytes from buf. Returns -1 if buf buf does not contain four 502 unread bytes, the integer represented by the bytes in little-endian 503 byte order otherwise. 504 505 506 void buf_ungetc(BUFFER *buf); 507 restores one character for reading. 508 509 510 int buf_appendb(BUFFER *buf, BUFFER *p); 511 appends p (with length information) to buf. 512 513 514 int buf_getb(BUFFER *buf, BUFFER *p); 515 gets length information, then p from buf. 516 517 518 int buf_getline(BUFFER *buf, BUFFER *line); 519 520 This function reads one line of text from buf, and stores it (without 521 the trailing newline) in the buffer line. 522 523 Return values: 524 0 if a line of text has been read, 525 1 if the line read is empty, 526 -1 if buf contains no unread data. 527 528 529 int buf_lookahead(BUFFER *buf, BUFFER *line); 530 531 This function reads one line of text from buf, and stores it (without 532 the trailing newline) in the buffer line, without increasing the read 533 counter. 534 535 Return values: 536 0 if a line of text has been read, 537 1 if the line read is empty, 538 -1 if buf contains no unread data. 539 540 541 int buf_chop(BUFFER *buf); 542 543 buf is assumed to contain one line of text. A trailing newline and any 544 other lines of text buf may contain are removed. 545 546 547 int buf_isheader(BUFFER *buf); 548 549 This function checks whether the first line of buf is a RFC 822 header line. 550 551 Returns: 552 0 if it is not a header line. 553 1 if it is a header line. 554 555 int buf_getheader(BUFFER *buf, BUFFER *field, BUFFER *content); 556 557 This function reads a RFC 822 header line from buf. The field name of 558 the header line without the colon is stored in field, the line's 559 contents in content. 560 561 Returns: 562 0 on success, 563 1 at end of header, 564 -1 if buf contains no unread data. 565 566 567 int buf_appendheader(BUFFER *buffer, BUFFER *field, BUFFER *content); 568 569 This function appends the RFC 822 header consisting of field and content 570 to buffer. 571 572 573 int buf_rewind(BUFFER *buf); 574 575 This function sets the read counter of buf to the start of the buffer 576 (equivalent to buf->ptr = 0). 577 578 579 Randomness 580 ========== 581 582 byte rnd_byte(void); 583 returns a random byte. 584 585 586 int rnd_number(int n); 587 returns a random number in 0 .. n-1. 588 589 590 int rnd_bytes(byte *b, int n); 591 stores n random bytes at b. 592 593 594 Interface to the crypto library PRNG 595 ==================================== 596 597 int rnd_init(void); 598 599 initializes the PRNG from the random seed file. Called from mix_init(). 600 Return values: 601 0 on success, 602 -1 on error. 603 604 605 int rnd_final(void); 606 607 writes the random seed file and ends the PRNG. Called from mix_exit(). 608 Return values: 609 0 on success, 610 -1 on error. 611 612 613 int rnd_seed(void); 614 seeds the PRNG, using console input if necessary. 615 616 617 void rnd_update(byte *b, int n); 618 adds n bytes from b to the PRNG, unless b == NULL, and adds randomness 619 from the system environment. 620 621 622 extern int rnd_state; 623 An application may set rnd_state = RND_WILLSEED before executing 624 mix_init() to indicate that it will seed the PRNG later by making calls 625 to rnd_update() and then to rnd_initialized(). In that case, 626 rnd_seed() will not ask for user input. [This is what the DLL startup code 627 does internally.] 628 629 630 String comparison 631 ================= 632 633 These functions operate on null-terminated strings. They return truth 634 values. 635 636 637 int streq(const char *s1, const char *s2); 638 639 Return values: 640 1 if the strings s1 and s2 are equal, 641 0 otherwise. 642 643 644 int strieq(const char *s1, const char *s2); 645 646 Return values: 647 1 if the strings s1 and s2 are equal except for case, 648 0 otherwise. 649 650 651 int strleft(const char *s, const char *keyword); 652 653 Return values: 654 1 if keyword is the left part of s, 655 0 otherwise. 656 657 658 int strileft(const char *s, const char *keyword); 659 660 Return values: 661 1 if keyword is the left part of s, except for case, 662 0 otherwise. 663 664 665 int strfind(const char *s, const char *keyword); 666 667 Return values: 668 1 if keyword is contained in s, 669 0 otherwise. 670 671 672 int strifind(const char *s, const char *keyword); 673 674 Return values: 675 1 if keyword is contained in s, except for case, 676 0 otherwise. 677 678 679 RFC 822 Addresses 680 ================= 681 682 void rfc822_addr(BUFFER *destination, BUFFER *list); 683 stores a list of RFC 822 addresses from destination in list, separated 684 by newlines. 685 686 void rfc822_name(BUFFER *line, BUFFER *name); 687 stores the name given in the RFC 822 address in line in name. 688 689 690 Files and Pipes 691 =============== 692 693 int mixfile(char path[PATHMAX], const char *name); 694 stores the path to a given file in the Mixmaster directory in path[]. 695 696 697 FILE *mix_openfile(const char *name, const char *a); 698 opens a file in the Mixmaster directory. 699 700 701 LOCK *lockfile(char *filename); 702 creates and locks a lockfile associated with filename. 703 704 705 int unlockfile(LOCK *lock); 706 releases the lock and deletes the lockfile. 707 708 709 int lock(FILE *f); 710 sets a lock on a file. 711 712 713 int unlock(FILE *f); 714 releases a lock on a file. 715 716 717 FILE *openpipe(const char *prog); 718 opens a pipe. 719 720 721 int closepipe(FILE *p); 722 closes a pipe. 723 724 725 int sendmail(BUFFER *message, BUFFER *address, const char *from); 726 727 This function sends a mail message. The From: line and the destination 728 address may be contained in the message; in that case address and from 729 must be NULL. address is checked against the destination block list. 730 731 int sendmail_loop(BUFFER *message, BUFFER *address, const char *from); 732 733 Identical to sendmail() but adds an X-Loop: header line. 734 735 736 Printable Encoding 737 ================== 738 739 int encode(BUFFER *buf, int linelen); 740 741 buf is encoded in base 64 encoding [RFC 1421]. If linelen > 0, the 742 resulting text is broken into lines of linelen characters. 743 744 Return value: 0. 745 746 747 int decode(BUFFER *in, BUFFER *out); 748 749 This function reads the unread data from in, as long as it is valid 750 base 64 encoded text, and stores the decoded data in out. 751 752 Return values: 753 0 if the in could be decoded to the end, 754 -1 otherwise. 755 756 757 int hdr_encode(BUFFER *in, int n); 758 759 Encodes a header line according to the MIME standard. The header is 760 broken into lines of at most n characters. 761 762 763 int mail_encode(BUFFER *in, int encoding); 764 765 Encodes the mail headers of a message, and encodes the body according 766 to encoding MIME_7BIT or MIME_8BIT. 767 768 769 void id_encode(byte id[16], byte *s); 770 stores the hexadecimal representation of id in s. 771 772 773 void id_decode(byte *s, byte id[16]); 774 sets id to the value of the hexadecimal string s. 775 776 777 Compression 778 =========== 779 780 int buf_zip(BUFFER *buf, BUFFER *f, int b); 781 782 compresses buffer f using GZIP with b bits (or a default value, if 783 b == 0), and appends the result to buf. 784 785 Return values: 786 0 on success, 787 -1 on error. 788 789 790 int buf_unzip(BUFFER *buf, int type); 791 792 uncompresses a GZIP [RFC 1952] compressed buffer. If type == 1, uncompress 793 a ZLIB [RFC 1950] compressed buffer. 794 795 Return values: 796 0 on success, 797 -1 on error. 798 799 800 **************************************************************************/ 801 802 #ifndef _MIXLIB_H 803 #define _MIXLIB_H 804 805 #include <stdio.h> 806 #include <time.h> 807 #ifdef WIN32 808 #include <windows.h> 809 #endif /* WIN32 */ 810 811 typedef unsigned char byte; 812 813 typedef struct { 814 byte *data; 815 long length; 816 long ptr; 817 long size; 818 byte sensitive; 819 } BUFFER; 820 821 int mix_init(char *); 822 void mix_exit(void); 823 void rnd_update(byte *b, int n); 824 void rnd_initialized(void); 825 #ifdef WIN32 826 int rnd_mouse(UINT i, WPARAM w, LPARAM l); 827 #endif /* WIN32 */ 828 829 BUFFER *buf_new(void); 830 int buf_free(BUFFER *buf); 831 int buf_read(BUFFER *message, FILE *infile); 832 int buf_write(BUFFER *message, FILE *outfile); 833 int buf_write_sync(BUFFER *message, FILE *outfile); 834 835 #define MSG_MAIL 1 836 #define MSG_POST 2 837 #define MSG_NULL 0 838 839 extern char MIXDIR[]; 840 841 int mix_encrypt(int type, BUFFER *message, char *chain, int numcopies, 842 BUFFER *feedback); 843 int mix_decrypt(BUFFER *message); 844 int mix_send(void); 845 846 #define FORCE_POOL 1 847 #define FORCE_POP3 2 848 #define FORCE_DAILY 4 849 #define FORCE_MAILIN 8 850 #define FORCE_STATS 16 851 void mix_check_timeskew(void); 852 int mix_regular(int force); 853 int mix_daemon(void); 854 int process_mailin(void); 855 856 #ifdef USE_PGP 857 858 #define NYM_CREATE 0 859 #define NYM_MODIFY 1 860 #define NYM_DELETE 2 861 862 int nym_config(int mode, char *nym, char *nymserver, BUFFER *pseudonym, 863 char *sendchain, int sendnumcopies, BUFFER *chains, 864 BUFFER *options); 865 int nym_encrypt(BUFFER *msg, char *nym, int type); 866 int nym_decrypt(BUFFER *msg, char *nym, BUFFER *log); 867 868 #define PGP_SIGN 1 869 #define PGP_ENCRYPT 2 870 #define PGP_CONVENTIONAL 4 871 #define PGP_REMAIL 8 872 #define PGP_TEXT 16 873 #define PGP_NOARMOR 32 874 #define PGP_DETACHEDSIG 64 875 #define PGP_NCONVENTIONAL 128 876 #define PGP_CONV3DES 256 877 #define PGP_CONVCAST 512 878 879 /* error codes */ 880 #define PGP_OK 0 /* valid message, not signed */ 881 #define PGP_SIGOK 1 /* valid signature */ 882 #define PGP_NOMSG 2 /* is not an OpenPGP message */ 883 #define PGP_NODATA 3 /* OpenPGP packet does not contain user data */ 884 #define PGP_SIGNKEY 4 /* can't verify signature */ 885 #define PGP_ERR -1 /* can't read message, no matching key found */ 886 #define PGP_PASS -2 /* bad passphrase */ 887 #define PGP_SIGBAD -3 /* bad signature */ 888 889 890 /* algorithms */ 891 #define PGP_ANY 0 892 #define PGP_ES_RSA 1 893 #define PGP_E_ELG 16 894 #define PGP_S_DSA 17 895 896 int pgp_encrypt(int mode, BUFFER *message, BUFFER *encr, BUFFER *sigid, 897 BUFFER *pass, char *pubring, char *secring); 898 int pgp_decrypt(BUFFER *message, BUFFER *pass, BUFFER *sig, char *pubring, 899 char *secring); 900 int pgp_keygen(int algo, int bits, BUFFER *userid, BUFFER *pass, 901 char *pubring, char *secring, int remail); 902 #endif /* USE_PGP */ 903 904 905 /* parsedate */ 906 time_t parsedate(char *p); 907 908 909 910 #ifdef WIN32 911 912 #define sleep(x) Sleep((x)*1000) 913 #define strcasecmp stricmp 914 915 #endif /* WIN32 */ 916 917 #endif /* not _MIXLIB_H */