| 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 |
|
| 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 |
void 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 |
#ifdef WIN32
|
| 807 |
#include <windows.h>
|
| 808 |
#endif /* WIN32 */
|
| 809 |
|
| 810 |
typedef unsigned char byte;
|
| 811 |
|
| 812 |
typedef struct {
|
| 813 |
byte *data;
|
| 814 |
long length;
|
| 815 |
long ptr;
|
| 816 |
long size;
|
| 817 |
byte sensitive;
|
| 818 |
} BUFFER;
|
| 819 |
|
| 820 |
int mix_init(char *);
|
| 821 |
void mix_exit(void);
|
| 822 |
void rnd_update(byte *b, int n);
|
| 823 |
void rnd_initialized(void);
|
| 824 |
#ifdef WIN32
|
| 825 |
int rnd_mouse(UINT i, WPARAM w, LPARAM l);
|
| 826 |
#endif /* WIN32 */
|
| 827 |
|
| 828 |
BUFFER *buf_new(void);
|
| 829 |
int buf_free(BUFFER *buf);
|
| 830 |
int buf_read(BUFFER *message, FILE *infile);
|
| 831 |
int buf_write(BUFFER *message, FILE *outfile);
|
| 832 |
int buf_write_sync(BUFFER *message, FILE *outfile);
|
| 833 |
|
| 834 |
#define MSG_MAIL 1
|
| 835 |
#define MSG_POST 2
|
| 836 |
#define MSG_NULL 0
|
| 837 |
|
| 838 |
extern char MIXDIR[];
|
| 839 |
|
| 840 |
int mix_encrypt(int type, BUFFER *message, char *chain, int numcopies,
|
| 841 |
BUFFER *feedback);
|
| 842 |
int mix_decrypt(BUFFER *message);
|
| 843 |
int mix_send(void);
|
| 844 |
|
| 845 |
#define FORCE_POOL 1
|
| 846 |
#define FORCE_POP3 2
|
| 847 |
#define FORCE_DAILY 4
|
| 848 |
#define FORCE_MAILIN 8
|
| 849 |
int mix_regular(int force);
|
| 850 |
int mix_daemon(void);
|
| 851 |
int process_mailin(void);
|
| 852 |
|
| 853 |
#ifdef USE_PGP
|
| 854 |
|
| 855 |
#define NYM_CREATE 0
|
| 856 |
#define NYM_MODIFY 1
|
| 857 |
#define NYM_DELETE 2
|
| 858 |
|
| 859 |
int nym_config(int mode, char *nym, char *nymserver, BUFFER *pseudonym,
|
| 860 |
char *sendchain, int sendnumcopies, BUFFER *chains,
|
| 861 |
BUFFER *options);
|
| 862 |
int nym_encrypt(BUFFER *msg, char *nym, int type);
|
| 863 |
int nym_decrypt(BUFFER *msg, char *nym, BUFFER *log);
|
| 864 |
|
| 865 |
#define PGP_SIGN 1
|
| 866 |
#define PGP_ENCRYPT 2
|
| 867 |
#define PGP_CONVENTIONAL 4
|
| 868 |
#define PGP_REMAIL 8
|
| 869 |
#define PGP_TEXT 16
|
| 870 |
#define PGP_NOARMOR 32
|
| 871 |
#define PGP_DETACHEDSIG 64
|
| 872 |
#define PGP_NCONVENTIONAL 128
|
| 873 |
#define PGP_CONV3DES 256
|
| 874 |
#define PGP_CONVCAST 512
|
| 875 |
|
| 876 |
/* error codes */
|
| 877 |
#define PGP_OK 0 /* valid message, not signed */
|
| 878 |
#define PGP_SIGOK 1 /* valid signature */
|
| 879 |
#define PGP_NOMSG 2 /* is not an OpenPGP message */
|
| 880 |
#define PGP_NODATA 3 /* OpenPGP packet does not contain user data */
|
| 881 |
#define PGP_SIGNKEY 4 /* can't verify signature */
|
| 882 |
#define PGP_ERR -1 /* can't read message, no matching key found */
|
| 883 |
#define PGP_PASS -2 /* bad passphrase */
|
| 884 |
#define PGP_SIGBAD -3 /* bad signature */
|
| 885 |
|
| 886 |
|
| 887 |
/* algorithms */
|
| 888 |
#define PGP_ANY 0
|
| 889 |
#define PGP_ES_RSA 1
|
| 890 |
#define PGP_E_ELG 16
|
| 891 |
#define PGP_S_DSA 17
|
| 892 |
|
| 893 |
int pgp_encrypt(int mode, BUFFER *message, BUFFER *encr, BUFFER *sigid,
|
| 894 |
BUFFER *pass, char *pubring, char *secring);
|
| 895 |
int pgp_decrypt(BUFFER *message, BUFFER *pass, BUFFER *sig, char *pubring,
|
| 896 |
char *secring);
|
| 897 |
int pgp_keygen(int algo, int bits, BUFFER *userid, BUFFER *pass,
|
| 898 |
char *pubring, char *secring, int remail);
|
| 899 |
#endif /* USE_PGP */
|
| 900 |
#endif /* not _MIXLIB_H */
|