--- premail-0.46.orig/README
+++ premail-0.46/README
@@ -1,4 +1,5 @@
- p r e m a i l v. 0 . 4 5
+
+ p r e m a i l v. 0 . 4 5
This is the Halloween Eve release of premail, version 0.45.
--- premail-0.46.orig/debian/README.Debian
+++ premail-0.46/debian/README.Debian
@@ -0,0 +1,17 @@
+premail for DEBIAN
+----------------------
+
+This version of premail has been modified to work with Perl-5.6.
+It is strongly suggested that the user make a back-up copy of their
+~/.premail/secrets file before using this version of premail.
+
+Steve Kostecke This document is available online at http://www.c2.net/~raph/premail/.
+
+ This is the documentation for version 0.46 of premail, an e-mail
+privacy package by Raph
+Levien. It is organized as a single, large document so as to be easily
+readable when printed. You can, however, jump directly to one of these
+topics:
+
+installation,
+
+secrets,
+
+preferences,
+
+Netscape,
+
+Pine,
+
+other mailers,
+
+command line,
+
+encryption,
+
+decoding,
+
+anonymity,
+
+nyms,
+
+usenet,
+
+address book,
+
+smime,
+
+debugging,
+
+technical notes,
+
+related documents,
+
+(end of list). The main function of premail is adding support for encrypted e-mail to
+your mailer, using plain PGP, PGP/MIME, MOSS, or S/MIME. In addition, premail provides a seamless, transparent interface to
+the anonymous
+remailers, including full support for Mixmaster remailers and the
+nymservers. Nymservers provide cryptographically protected, fully
+anonymous accounts for both sending and receiving e-mail. While premail can be used as a stand-alone application, it works
+best when integrated with your mailer. Currently, premail is
+integrated completely seamlessly and transparently only with Netscape
+3.0's built-in mailer. It works fairly well with Pine 3.94 or later, as
+well (plain PGP is supported, but decryption of MIME-based e-mail
+encryption protocols is still missing). Transparent integration of
+outgoing mail only is supported for any mailer in which the mail
+sending program can be configured, including Berkeley mail, most emacs
+mailers, and MH.
+For these mailers, you can decode messages with a single command. To integrate with your mailer, premail places itself between the
+mailer and the actual mail transport. For outgoing mail, premail
+masquerades as sendmail. You configure your mailer to call premail
+instead of sendmail. Then, premail performs the encryption or signing,
+and invokes sendmail to actually send the message. For mailers that call a command to receive incoming mail
+(including Netscape 3.0), the situation is similar. Netscape, for
+example, can be configured to call movemail to get incoming mail. To
+integrate premail, you'd configure Netscape to call premail instead,
+which would in turn call movemail to actually get the mail, then would
+decode it. You need the following software in order to effectively use
+premail: First, you need to get premail. The source code is available from
+an export-control
+Web server. You may also be able to find a copy on the Hacktic FTP
+site in the Netherlands. In either case, you want to get the file
+premail-0.46.tar.gz. After you've gotten the file, unpack it. This command should do
+it: The unpacking process will create a subdirectory called
+premail-0.46, containing the following files: Test to see if you can run premail. These commands should print a
+usage summary: If you get an error message reading "command not found," then you
+will have to edit the first line of premail to refer to the
+actual pathname of the perl5 interpreter. One good way to find out the
+pathname is to do "which perl5" or "which perl".
+ On the other hand, if you get a string of syntax errors, then the
+problem is that you are running perl4, while premail needs perl5. Try
+to see if you can find perl5 on your machine. Otherwise, you may need
+to install perl5 yourself. If you will be using premail from the command line frequently,
+then you may want to copy (or symlink) the premail program into a
+location in your $PATH. For example, if you have permission
+to add files into /usr/local/bin, then you may consider
+running this command: At this point, you are ready to test whether premail actually
+works. We are assuming that you already have PGP installed and have
+generated your own public key. Type this command, substituting in your
+own e-mail address: If all goes well, you should be back at the command line within a
+couple of seconds. If it seems to hang without any disk or net
+activity, try typing randomly for a minute, under the assumption that
+PGP needs random keystrokes. This shouldn't happen if PGP is already
+set up correctly (including having generated your own public key), but
+on the chance that it isn't, hanging while waiting for random
+keystrokes is one of the more common failure modes. This is also the point at which you may get a PGP error. Two
+common problems are that premail can't find the PGP program, in which
+case you will want to add a line to your preferences file (see below), or that it can't find the public key
+corresponding to your e-mail address. If the test was successful you now have a PGP-encrypted message in
+your mailbox, then you should now have a PGP-encrypted message in your
+mailbox. While premail's default configuration is designed to be sufficient
+for the the most common cases, you may want to change some of the
+configuration options. This is done by adding lines to the
+preferences file. The default location for the preferences file is
+~/.premail/preferences, where ~ represents your home
+directory. The premail distribution comes with a skeleton preferences
+file, but it does not automatically copy it into the
+~/.premail directory. You might choose to do that yourself,
+or you might create one from scratch. The format of the preferences file is a sequence of lines such as
+the following: All other lines (including those beginning with #) are
+considered to be comments and are ignored. Here's a typical
+preferences file (actually, the one on my home machine): As you can see, a major use for the preferences file is to specify
+full pathnames for the helper programs. In addition, I've set it up to
+produce a full log, which I find useful, because I'm constantly
+tracking down bugs :-) Here's a table of all the configuration options, their defaults,
+and a very brief description. More complete descriptions are found in
+the preferences file included in the premail distribution. To create signatures, decrypt messages, or use nyms, you need to
+set up a "premail secrets" file. If you will only be using premail to
+encrypt outgoing mail, you can skip this section. The default filename is /tmp/.premail-secrets.$< ,
+where $< is equal to your numeric user id. To change the
+filename, use a preferences line such as this one: If you don't know your numeric user id, you can find it by running
+"echo $uid" (from csh or tcsh), "echo $UID" (from sh
+or bash), or: The premail secrets file has this format: However, make sure your premail secrets file has restrictive
+permissions, so other people on your system can't read your
+passphrases! This command is well recommended (substituting your
+actual user id, of course): Generally, premail stores its secrets file in the /tmp
+directory. In some cases, this is good enough security. In other
+cases, it might be better to store the file encrypted most of the
+time, and only decrypt it when necessary. To use this capability of
+premail, first set a passphrase with: You will be prompted for a passphrase. You can use the same
+passphrase as for your PGP key, or a different one, depending on how
+many passphrases you want to remember. This command leaves you logged
+in with the new passphrase set.
+
+ To log out: You might consider adding this command to your .logout file, so
+that it occurs automatically every time you log out of your account.
+ To log in again: If you are running on a system with X, then premail will
+automatically pop up a window to log in whenever the secrets are
+needed. If you are not running X, and the secrets are needed, you will
+get an error. In this case, you can log in manually and try the
+command again. This section describes how to integrate premail into Netscape
+3.0's built-in mailer. Skip this section if you won't be using
+Netscape mail. 1. Create symbolic links to premail called "prezilla" and
+"premailmove". To do this, make sure you are in the same directory as
+premail itself, and type: 2. Find a working movemail. If you have emacs installed, then you
+most likely have one in /usr/lib/emacs/etc/movemail or a similar
+location. If you don't already have one, then the source (or possibly
+binary) for one is included in the Netscape Navigator distribution and
+you can build it (no need if a binary is included). Then, make sure
+premail can find it by adding a line such as this one to your
+preferences file: This usage assumes that you get your mail from a mail spool, as
+opposed to POP or some such. You may be able to get it to work for POP
+as well, but you need to figure out how to invoke movemail to move the
+mail from your mailbox to a file (specified as the second argument to
+the movemail script). 3. Add this line to your .cshrc, assuming your shell is csh or
+tcsh: Also run this command from the shell so it takes effect
+immediately. The syntax is slightly different if your shell is sh or
+bash (note: is this right?): 4. Start Netscape (exit first if it's already running). Go to the
+Options|Mail and News Preferences dialog, select the Servers tab.
+Click on "External Movemail" and set the value to
+/your/path/to/premailmove. Try sending yourself mail, and clicking on "Get Mail" from the
+Netscape Mail window. The mail should show up in the Inbox, correctly
+decoded. To view the X-Premail-Auth: header field to see the result of
+signature checking, select Options|Show All Headers from the Netscape
+Mail window. Note: as of Netscape v3.0, there is still a bug in the handling
+of the Bcc: header field, which causes it to be ignored. Do
+not use this field. Hopefully, this will be fixed in a future version
+of Netscape. Note: some 3.0 beta versions modify the PATH environment
+variable. If premail seems to work correctly from the command line,
+but not from Netscape, try setting absolute pathnames for the programs
+used by premail. As of Pine 3.94, premail integrates both outgoing mail and the
+decryption of plain PGP incoming mail. Unfortunately, decryption of
+MIME-based mail is not yet supported. Two Pine configuration options need to be set to integrate premail
+(i.e. from the main Pine screen, S for setup, then C
+for configure). First, sendmail-path should be set to a value
+similar to this (substituting the actual path to premail): Second, display_filters should be set to a value similar
+to this: If you have trouble finding these options in the setup screen,
+then you can edit the .pinerc file directly. One caveat when using Pine: it usually tries to be "smart" and
+remove comments from e-mail addresses, which includes the double-paren
+commands such as ((encrypt-pgp)). There are a few ways to
+deal with this problem: This section describes how to integrate premail with MH, emacs,
+and UCBMail. With these mailers, premail will only handle outgoing
+mail automatically. To decode incoming mail, you still need to invoke
+premail -decode by hand.
+
+ To add premail support to emacs, just add this line to your .emacs
+file: In whatever directory you keep the premail executable, create a
+symbolic link as follows: Under the name "prepost", premail will masquerade as MH's post
+program rather than sendmail. You can get MH to call premail instead
+of post by adding this line to your .mh_profile: One thing to keep in mind is that premail's processing is done
+before that of post. Thus, if you have MH aliases, they will get
+expanded after the call to premail. If you use only premail aliases,
+only MH aliases, or neither, this won't be a problem. Alternatively, if you have appropriate privileges, you can add this
+line to /usr/lib/mh/mtstailor: You may also have to configure MH to call sendmail locally rather
+than connecting to an SMTP server. Don't do both the mtstailor and
+mh_profile methods -- that would run premail twice. UCBmail is a simple mailer front-end (also known as Mail and
+mailx). If, when you type "mail user@site.dom", the mailer asks you
+for a "Subject: " line, you are undoubtedly using UCBmail. If so, you
+are in luck - it integrates very easily with premail. Just add this
+line to your ~/.mailrc file:
+
+Introduction to premail
+
+
+
+
+
+
+
+Installation
+
+
+
+
+ gzip -dc premail-0.46.tar.gz | tar xvf -
+
+
+
+
+ README A short
+description of the contents
+ premail The premail
+program itself
+
+ preferences A skeletal
+preferences file
+ cd premail-0.46
+ ./premail
+
+
+
+ cp -p premail /usr/local/bin
+
+
+
+ ./premail -t
+ To: your@own.email.addr ((encrypt-pgp))
+ Subject: Test
+
+ Does this really work?
+ .
+
+
+Preferences
+
+
+
+
+
+ $config{'option'} = 'value';
+
+
+
+ $config{'logfile'} = '/home/raph/premail/log';
+ $config{'debug'} = 'chvl';
+ $config{'movemail'} = '/home/raph/bin/movehome';
+ $config{'ripem'} = '/home/raph/install/ripem/main/ripem';
+ $config{'pgp'} = '/usr/local/bin/pgp';
+
+
+
+
+
+
+ option
+
defaultexplanation
+
+ pgp
pgpThe location
+of the PGP executable.
+
+ sendmail
+/usr/lib/sendmail The location of the
+sendmail executable.
+
+ mixmaster
mixmasterThe
+location of the Mixmaster executable (useful for more
+secure anonymous mail).
+
+ movemail
movemailThe
+location of the movemail executable (useful for integrating
+Netscape 3.0).
+
+ ripem
ripemThe location
+of the ripem executable (needed for S/MIME messages).
+
+ mossbin
The directory
+containing the TIS/MOSS executables (needed for MOSS messages).
+
+
+ post
postThe location
+of the MH post executable (needed for MH
+integration).
+
+ geturl
A command for
+getting files from the Web. Use "lynx -source" if behind a
+firewall.
+
+ dead-letter
+
~/dead.letter The file where premail stores undeliverable
+mail.
+
+ logfile
The location
+where premail stores its log, if the l debug flag is
+set.
+
+ storefile
If set, the
+location where premail stores outgoing mail, instead of calling
+sendmail.
+
+ tmpdir
/tmpWhere
+premail stores its temporary files.
+
+ charset
iso-8859-1The
+default charset for outgoing 8-bit messages.
+
+ encrypt
yesSet to
+blank to disable PGP encryption to remailers.
+
+ ack
If set, nymservers will
+send acknowledgements for all outgoing mail.
+
+ extrablank
If set,
+premail adds an extra blank on remailer messages. Useful if behind a
+broken mail proxy.
+
+ debug
Debugging flags
+(see section on debugging).
+
+ signuser
The user id of the
+default PGP secret key used to sign messages.
+
+ default-reply-to
Adds a
+Reply-To: header field with this address when sending
+anonymous e-mail.
+
+ addresses
+~/.premail/addresses The file containing your
+addresses.
+
+ rlist
+~/.premail/rlist The file where premail
+stores the remailer list.
+
+ pubring
+~/.premail/pubring.pgp The file where premail
+stores the public keyring for the remailers.
+
+ premail-secrets-pgp
+~/.premail/secrets.pgp
+ The file where premail stores the encrypted
+secrets file.
+
+premail-secrets
+/tmp/premail-secrets.$< The location of your
+secrets file
+
+
+
+
+
+ rlist-url
+http://kiwi.cs.berkeley.edu/rlist The URL for
+the remailer list.
+
+ pubring-url
+http://kiwi.cs.berkeley.edu/pubring.pgp The URL
+for the remailer public keyring.
+
+ type2-list-url
+http://www.jpunix.com/type2.html
+ The URL for the Mixmaster type2
+list.
+
+pubring-mix-url
+http://www.jpunix.com/pubring.html The URL for
+the Mixmaster pubring. Secrets
+
+
+
+
+ $config{'premail-secrets'} = '/mnt/cryptdisk/premail-secrets';
+
+
+
+ perl -e 'print "$<\n"'
+
+
+
+ $pgppass{'user'} = 'PGP passphrase for user';
+ $pgppass{'alternate'} = 'PGP passphrase for alternate';
+ $penetpass = 'Passphrase for anon.penet.fi';
+
+
+
+ chmod 600 /tmp/.premail-secrets.7437
+
+
+
+Logging in and logging out
+
+
+ premail -setpass
+
+
+
+ premail -logout
+
+
+
+ premail -login
+
+
+Netscape
+
+
+
+ ln -s premail prezilla
+ ln -s premail premailmove
+
+
+
+ $config{'movemail'} = '/usr/lib/emacs/etc/movemail';
+
+
+
+ setenv NS_MSG_DELIVERY_HOOK /your/path/to/prezilla
+
+
+
+ NS_MSG_DELIVERY_HOOK=/your/path/to/prezilla
+ export NS_MSG_DELIVERY_HOOK
+
+
+Pine
+
+
+
+ /your/path/to/premail -oem -t -oi
+
+
+
+ _BEGINNING("-----BEGIN PGP")_ /your/path/to/premail -decode -body
+
+
+
+
+
+
+
+ To: raph@cs.berkeley.edu ((encrypt-key, sign))
+ To: raph@cs.berkeley.edu^encrypt-key^sign
+
+
+Other mailers
+
+
+
Integrating premail with Emacs
+
+
+ (setq sendmail-program "/your/path/to/premail")
+
+
+
+Integrating premail with MH
+
+
+ ln -s premail prepost
+
+
+
+ postproc: /your/path/to/prepost
+
+
+
+ sendmail: /your/path/to/premail
+
+
+Installing premail with UCBmail
+
+
+ set sendmail=/your/path/to/premail
+
+
+
+ ++Hopefully, you have integrated premail into your mail client, and +you won't have to invoke it from the command line. However, there may +still be times when it is convenient to use premail from the command +line.
+ +The most basic use of premail is as a replacement for sendmail. +For example, you can send mail directly from the command line, as +follows (here, the > represents the Unix prompt):
+ ++ > premail -t + To: raph@cs.berkeley.edu ((sign)) + Subject: premail bug report + + Here's a bug in premail: ... + . + > ++ +The -t option specifies that the recipients are extracted +from the header fields (To:, Cc:, Bcc:, and +the Resent- variants of each). As in sendmail, you can +specify the recipients on the command line instead of using the +-t option.
+ +In addition, you can set configuration options from the command +line, using the +option=value syntax. This is especially +useful with the debug option. For example, to +show you what happens when formatting mail for remailers, but not +actually send the message:
+ ++ + > premail +debug=ry -t + To: raph@cs.berkeley.edu ((chain=1)) + Subject: test of remailer + + test + . + Chose chain exon + /usr/lib/sendmail -oi remailer\@remailer\.nl\.com << -eof- + To: remailer@remailer.nl.com + + :: + Encrypted: PGP + + -----BEGIN PGP MESSAGE----- remailer@remailer.nl.com + :: + Request-Remailing-To: raph@cs.berkeley.edu + + ## + Subject: test of remailer + + test + -----END PGP MESSAGE----- + -eof- ++ +There is one configuration option that can only be set from the +command line in this fashion, which is the location of the preferences +file itself. The configuration option is preferences, and the +default value is ~/.premail/preferences.
+ +
+ ++Once you've got premail set up, actually using encryption is easy. +You simply add commands in double parentheses to the e-mail addresses. +The encrypt-pgp command (which can be abbreviated to +key) adds encryption to the outgoing mail, and the +sign command signs it.
+ +For example, to send me encrypted mail, you'd send it to +raph@cs.berkeley.edu ((encrypt-pgp)). You need to have a key +with this user id on your PGP public keyring, otherwise you'll get an +error message. If the user id on the key doesn't match the e-mail +address, you can specify it directly. For example, to send mail +directly to my workstation, but using the same public key as above, +use raph@kiwi.cs.berkeley.edu ((key=raph@cs.berkeley.edu)). +
+ +Signing works much the same way. I can sign mail by adding +((sign=raph@cs.berkeley.edu)) to the outgoing address. +Actually, because I set the signuser configuration option in +my preferences file, all I have to add is ((sign)).
+ +Doing both encryption and signing is just as easy. For example, +to send me signed, encrypted mail, use this line:
+ ++ To: raph@cs.berkeley.edu ((encrypt-pgp, sign)) ++ +Each recipient is treated separately - the double-paren commands +after an e-mail address apply to that recipient only. However, you can +add a Sign: header field to indicate that your message is +signed for all recipients. Example:
+ ++ To: vp@company, secretary@company, employees@company, + friend@outside ((encrypt-pgp)) + Subject: Important announcement + Sign: + + ... ++ +In this example, all recipients will get a signed message, and the +message to friend@outside will be encrypted as well.
+ +
+ ++The basic way to decode encrypted messages is to use premail +-decode as a command line. You can either give a filename as an +argument, or premail will accept the encrypted message on its standard +input. In either case, the decoded message will be printed on the +standard output.
+ +The message can be a standard e-mail message (RFC 822 format), or +it can be an entire mailbox. In the latter case, premail will decode +each of the messages individually. If you don't have premail directly +integrated into your mailer, then here's a handy way to view your +mail:
+ ++ premail -decode $MAIL | more ++ +If the message is actually encrypted, then premail will need to +access the secrets file. If you are logged out of premail, then +premail will try to open an xterm window for you to type the +passphrase for the secrets file. If that doesn't succeed, premail will +print an error message. At that point, you might choose to log in +(i.e. premail -login) and then try the decoding again.
+ +If, as in many mailers, you have easy access to the body of the +message but not the header, then you can use premail -decode +-body on the body. This works well for plain PGP encrypted +messages, but unfortunately does not work for MIME-based message +formats, because important information is contained in the header. +
+ +The results of the decoding (including signature verification) are +given in an X-Premail-Auth: header field. This header field +is protected against forgery; if the original message contains it, it +is changed to X-Attempted-Auth-Forgery.
+ +
+ ++The original reason for writing premail was to provide good +support for anonymous +remailers. If you're not interested in sending anonymous mail, you +can skip this section.
+ +Sending anonymous mail is very similar to sending encrypted mail. +Simply add the ((chain)) command to the recipient's e-mail +address. Alternatively, you can add a Chain: header field, +and the mail will be send anonymously to all recipients.
+ +Even though the chain command is simple, a lot is going on under +the surface. The default chain is 3, which asks that three +"good" remailers be chosen randomly. To make sure that it makes its +choice based on fresh, up-to-date information, premail downloads the +remailer list and a set of PGP public keys for the remailers from the +Web (the actual URLs are configuration options). After choosing the +remailers, the message is multiply encrypted with the PGP public keys, +and finally sent to the first remailer in the chain.
+ +The automatic chain selection process is very good. My tests +indicate that reliability is consistently above 99%. Further, the +chain selection process avoids some potential problems. For example, +some remailers are known not to work well in chains, probably because +of incorrectly configured "block lists." Also, some remailers are +"linked," in the sense of being hosted on the same machine, or being +administered by the same person. Choosing a sequence of linked +remailers wouldn't offer much security, so premail doesn't.
+ +You can also choose the chain length. A shorter chain will be +faster and more reliable, but less secure, and conversely for longer +chains. For example, ((chain=5)) selects a chain of five +remailers.
+ +If this isn't enough control, you can specify the exact chain of +remailers by hand. For example, ((chain=replay;jam;exon)) +bounces the message around a few times outside the US.
+ +Mixmaster chains are specified inside an additional set of +parentheses. At the moment, there is no way to automatically select a +chain of Mixmaster remailers, so you have to do it by hand. For +example: ((chain=(replay;ecafe-mix;lcs))). You can even mix +Mixmaster and type-1 remailers; for example, +((chain=(anon);1;(replay))) will sandwich one well-chosen +remailer between the two Mixmaster remailers.
+ +Extra header fields can be placed in the outgoing message by +prefixing the header with "Anon-". A particularly common +usage is an Anon-Reply-To: field, which specifies a reply-to +address in the mail delivered to the recipient. The Reply-To: +header field is used often enough that premail includes a +default-reply-to configuration option, which automatically +adds it to all anonymous messages.
+ +The following header fields are passed through to the anonymized +message, even without the Anon- prefix:
+ ++ Mime-Version: + Content-Type: + Content-Transfer-Encoding: + Newsgroups: + X-Anon-To: + In-Reply-To: + References: ++ +
+ ++This section describes how to create and use nyms, which +are accounts for sending and receiving anonymous mail. There are two +types of nymservers: alpha (named after the now defunct alpha.c2.org), +and newnym. For the most part, the operation of the two is similar. +
+ +To create a new nym, type
+ ++ premail -makenym ++ +and follow the prompts. This command is also good for updating an +existing nym, which is important if one of the nym's remailers goes +down.
+ +You can also create or update a nym from the command line, as +follows:
+ ++ premail -makenym you@alias.cyberpass.net your@real.email.address ++ +When premail creates a nym, it chooses random passphrases (one for +each remailer in the chain). The passphrases and other details of the +nym are stored in the premail secrets file. Thus, the nym is fairly +secure (much more so than, say, anon.penet.fi).
+ +The decode mechanism handles responses to nyms, again looking up +the passphrases in the premail secrets file.
+ +You can also send mail from your nym, in one of two ways. Assume +for the sake of example that your nym is you@alias.cyberpass.net. Then, you +would use a chain of 2;cyber=you. Alternatively, you can use +a chain of 2;cyber and include this header field:
+ ++ Anon-From: you@alias.cyberpass.net (You Know Who) ++ +If you want the nymserver to send you a confirmation every time +you send mail from your nym, add a $config{'ack'} = 'yes'; +line to your preferences file.
+ +To delete a nym:
+ ++ premail -makenym you@alias.cyberpass delete ++ +Please delete nyms if you are not actually using them; this helps +free up disk space and prevents the nymservers from being overloaded.
+ +As of version 0.46, premail now supports the newnym type of +nymserver. This nymserver is more richly featured than the alpha type. +You do have to answer a few more prompts when creating nyms for the +newnym type, including creating a new PGP key. It's worth it, though. +The newnym servers seem to be working a lot better than the alpha ones +ever did. For more information on newnym, see the nym.alias.net +homepage. If you want to exchange nyms between premail and other +programs (or a manual setup), then take a look at the -importnym and +-exportnym commands, which are explained in the documentation for the +patch +that upgraded premail 0.44 to have newnym capability.
+ +
+ ++Even though some remailers can post directly to Usenet, premail does +not support that. Thus, if you want to post to Usenet, you should use +a mail-to-news gateway.
+ +To find a working mail-to-news gateway, check Don Kitchen's list. There +are two basic kinds: sites that scan the header fields, and sites that +include the newsgroup in the address.
+ +Using the address-parsing kind, to post to alt.anonymous, you'd +just send mail to alt.anonymous@myriad.alias.net (assuming, of +course, that myriad.alias.net is still functioning).
+ +Using the header-scanning kind, send mail to +mail2news@myriad.alias.net, and include this header field:
+ ++ Newsgroups: alt.anonymous ++ +The header scanning kind has one advantage: you can cross-post to +multiple newsgroups using one mail message.
+ +One frequently asked question is: how can I follow up on a thread +while posting anonymously? This is easy. Find the Message-Id: +header field in the post you're responding to, and change it into a +References: field in your outgoing mail.
+ +Here's an example that ties it all together. Let's say you wanted +to reply to this post:
+ ++ From: Edward Brian Kaufman <ebk8@columbia.edu> + Newsgroups: alt.privacy.anon-server, alt.anonymous + Subject: A few questions about anon posts + Message-ID: <Pine.SUN.3.94L.960630113156@aloha.cc.columbia.edu> + + Hi, + + I'd like to know what the best/easiest way to do anon posts is and + how to do them. Thank you, + + Ed ++ +To post the reply anonymously, send this mail:
+ ++ To: mail2news@myriad.alias.net ((chain)) + Cc: Edward Brian Kaufman <ebk8@columbia.edu> ((chain)) + Newsgroups: alt.privacy.anon-server, alt.anonymous + Subject: Re: A few questions about anon posts + References: <Pine.SUN.3.94L.960630113156@aloha.cc.columbia.edu> + + If you have a Unix machine, using premail is the best way. To find + out how, read the manual. ++ +
+ ++Adding the extra encryption commands is not difficult, but it can +be tedious and potentially error prone. Thus, premail provides an address +book for specifying commands to be used with specific e-mail addresses. + +
For example, let's say that one of your correspondents tells you +that she prefers mail to be PGP encrypted. Then, instead of typing +((encrypt-pgp)) every time you send her mail, you could add +this line to your addresses file:
+ ++ her@email.address: ((encrypt-pgp)) ++ +The addresses file is usually at ~/.premail/addresses, +but the location is a configurable option.
+ +Another example was the hackerpunks mailing list (now defunct), in +which all of the subscribers have alpha.c2.org nyms. Since +haqr@alpha.c2.org had this line in his addresses file, he was able to +post to the list with just "To: hpunks":
+ ++ hpunks: hackerpunks@alpha.c2.org ((chain=2;alpha=haqr)) ++ +An address book entry can also expand to a list of addresses. For +example:
+ ++ alice: alice@crypto.com ((encrypt-pgp)) + bob: bwhite@got.net ((key=bobw@netcom.com)) + eric: eric@ecsl.org ((encrypt-pgp)) + + friends: alice, bob, eric ++ +Sending mail to friends would then do what you'd expect: +send encrypted mail to each of alice, bob, and eric's full e-mail +addresses.
+ +
+ ++Version 0.46 of premail contains limited support for S/MIME +messages. Basic message formatting works, but there are problems with +creating usable certificates, and there is still no support for an +encryption algorithm interoperable with RC2. However, a few hearty +souls may wish to experiment with the S/MIME functionality that is +present. This section explains how to do it.
+ +First, you must install RIPEM 3.0b2 (or later). This is available +from the ripem export-controlled FTP site. You'll need +to get an account on the server in order to download any of the +export-controlled code - the GETTING_ACCESS +file on the site explains how.
+ +Once you have RIPEM installed (and the ripem +configuration option pointing to the executable), create a public key +with this command:
+ ++ premail -ripemkey ++ +You will then be prompted for your e-mail address. Alternatively, +you can give your e-mail address as a command line argument to +premail -ripemkey.
+ +After your key is created, you can send signed messages by adding +the ((ssign)) command. If you send a signed message to +another premail user, they will have your public key, and can send you +mail, by using ((encrypt=your@user.id)).
+ +The default encryption is Triple-DES. If the recipient can't +handle it, then ((encrypt-des)) will fall back to plain DES, +which most users will be able to decrypt - probably including "export" +versions of S/MIME. Of course, the disadvantage of using plain DES is +that any competent spy organization will also be able to decrypt the +messages ;-).
+ +Unfortunately, RIPEM 3.0b2 has some significant differences from +other S/MIME implementations in the way it handles public key +certificates. These prevent you from getting a VeriSign certificate +you can use. It is, however, possible to accept VeriSign class 1 beta +certificates by running the following (prompts and messages are in +normal font, what you type is in boldface; you can find out the +password by looking in the secrets file):
+ ++ > rcerts -u your@user.id + Enter password to private key: + E - Enable standard issuers... + ...other choices... + Enter choice: + e + ...V - VeriSign something or other... + v + Enter the number of months the certificate will be valid, or blank to cancel: + 12 + Enter choice: + q ++ +
+ ++If you run into trouble with premail, it might be of value to turn +on some of the debugging options. This can be done on the command +line, or in the .premailrc file. In the former case, add a ++debug=chvy argument to the command line. In the latter case, +try:
+ ++ $config{'debug'} = 'chvy'; ++ +Here are the meanings of the debug options:
+ +c: Print command line invocation.
+ +h: Print headers of input message.
+ +l: Debug output goes to log instead of stdout.
+ +p: Print finished message, do PGP.
+ +r: Print chain chosen (useful in debugging chain +selection).
+ +y: Print finished message, don't do PGP.
+ +v: Print all kinds of verbose info.
+ +Note that +debug=p puts the encrypted message on stdout. +This may be useful for constructing reply blocks, among other things. +
+ +If there are problems with premail, then one of the best ways to +track them down is through the log. Try setting the debug +configuration option to chvl, setting the logfile +configuration option (for example, to ~/.premail/log), and +then examining the log. Also, if you're bringing bugs to my attention, +it helps a lot if you can send me relevant excerpts from the log.
+ +
+ ++This section covers a number of techincal notes related to the +operation of premail. This information should not be necessary for +ordinary use.
+ +Multiple recipients
+ +One of the tricky problems with mail encryption packages such as +premail is how to deal with multiple recipients. Based on experience +with previous versions, this version of premail tries very hard to +"get it right." However, as a consequence, the exact behavior can +sometimes be difficult to understand.
+ +The hard part is when some of the recipients have encryption +specified and others don't. What premail does is to split the +recipients up into groups. If two recipients can receive the same +actual message, they are in the same group, otherwise not. For +example, recipients getting an encrypted and an unencrypted message +cannot be in the same group. However, multiple recipients appearing in +To: and Cc: fields that use the same encryption +method will be in the same group. A single message, encrypted to +multiple recipients, will be sent, which is considerably more +efficient than encrypting separately for each recipient.
+ +One subtle point is the handling of Bcc: recipients. The +semantics of Bcc: specify that the mail be sent to each of +the Bcc: recipients, but that none of the other recipients be +able to find out their identity. However, encrypting to multiple +recipients would defeat this, because it is possible to indentify all +of the recipients of the encrypted message. Thus, each encrypted +Bcc: recipient gets its own group.
+ +Each recipient of an anonymous message also gets its own group, +for similar reasons.
+ +An attempt is made to make the headers in the message +received by the recipient be the same as if no encryption were used. +Specifically, the complete To: and Cc: header fields +will be present, but the Bcc: field will be missing. One +exception to this rule is anonymous messages, in which case the +recipient can't see any information about the other recipients.
+ +Error handling
+ +The goal is to handle errors in the same way as sendmail. Thus, +the exact handling depends on the setting of the -oe command +line option. The default (as in sendmail) is -oep, meaning +that the error message is printed to standard out, and the mail message is +appended to the dead letter file (the location of which is a +configuration option).
+ +Another choice is -oem, in which case the error message +and the mail message are packaged together and mailed back to the +user. This is appropriate when the mailer has no way to deal with +error messages returned from premail.
+ +One additional choice, not provided by sendmail, is -oed, +which prints the error message on standard out, but drops the mail +message. This is a good choice if the mailer can interpret a non-zero +return status code as indication of an error. This is the mode used by +Netscape (and is automatically selected when premail is invoked as +prezilla).
+ +Security issues
+ +In designing premail, usefulness and convenience were considered +more important than top security. Nonetheless, it can provide good +security, especially if you are aware of the security issues.
+ +One overriding assumption was that your machine is secure, and +that the serious threats were those of eavesdroppers on the network +and e-mail forgers. In general, premail handles passive attacks quite +well, while containing a number of vulnerabilities to active attacks. +
+ +Here are some potential security pitfalls with premail:
+ ++ +
+ +- Stores secrets information on disk file. + +
- Stores (potentially sensitive) temporary files on disk. + +
- Does not check authenticity of remailer list, remailer public key +ring, or Mixmaster information gotten from the Web. + +
- Accessing the Web signals when anonymous mail is about to be sent, +perhaps aiding traffic analysis. + +
- Does not evaluate the trustworthiness of public keys used for +encryption and signature checking. + +
Useless features
+ +Over the years, premail has accumulated a number of features of +dubious value. One of them is support for MOSS, a nice encryption +protocol that nevertheless failed to catch on. If you feel the urge to +use it, documentation is available in the release +notes for version 0.43.
+ +One potentially cool feature is a server for decoding e-mail. This +would be a useful feature if there were any mailers which used +it. The protcol for the server was designed to be fast (much, much +faster than invoking premail -decode separately for each +message), as well as "crypto-neutral," meaning that it doesn't contain +any features designed just for crypto, and that it could be used for +other tasks, for example converting image formats or character sets. +Thus, a client designed to use this protocol would like be fully +exportable from the US. If you're interested in integrating support +for this protocol into a popular e-mail client, please get in touch +with me.
+ +
+ ++ ++ +
+ +- The README file for premail +version 0.33a. + +
- Release notes for version 0.43 of premail. + +
\s*$/i) {
- open (PUT, '>'.$file);
+ open (PUT, '>'.$file) ||
+ die "Couldn't open file: $!";
$put_open = 1;
$inpre = 1;
} elsif ($inpre && /^\s*\<\/pre\>\s*$/i) {
@@ -1678,7 +1745,8 @@
} else {
push (@window, $_);
if ($#window + 1 == 5) {
- open (PUT, '>'.$file);
+ open (PUT, '>'.$file) ||
+ die "Couldn't open file: $!";
$put_open = 1;
print PUT @window;
$yup = 1;
@@ -1687,7 +1755,7 @@
}
}
if ($put_open) { close (PUT); }
- close (GET);
+ close (WWW);
}
}
@@ -1715,7 +1783,8 @@
if (!-e $type2_list) {
&error ("Cannot find type2.list; not at $type2_list\n");
}
- open (LIST, "$type2_list");
+ open (LIST, "$type2_list") ||
+ die "Couldn't open file: $!";
$num = 0;
while () {
if (/^(\S+)\s+(\S+)\s/) {
@@ -1817,7 +1886,7 @@
}
}
push (@deliver_headers, "To\: $new_to\n");
- if ($addl =~ /\.(encrypt\-key\:\s*[^\.]+)(\.|$)/i) {
+ if (defined $addl && $addl =~ /\.(encrypt\-key\:\s*[^\.]+)(\.|$)/i) {
$hash = "$1\n".$hash;
$body = &cat_tail ($body, "\*\*\n");
}
@@ -1867,7 +1936,8 @@
my ($outfile, $line);
$outfile = &tmp_filename ();
- open (OUT, '>'.$outfile);
+ open (OUT, '>'.$outfile) ||
+ die "Couldn't open file: $!";
open_body ($body);
while (defined ($line = &get_line_body ($body))) {
print OUT $line;
@@ -2209,12 +2279,13 @@
} else {
$tmpfile = &tmp_filename ();
}
- open (DELIVER, '>'.$tmpfile);
+ open (DELIVER, '>'.$tmpfile) ||
+ die "Couldn't open file: $!";
} else {
# we know it's sendmail
$invoc = &bin_sendmail ();
if ($#sendmail_args >= 0) {
- $invoc .= ' '.join (' ', $sendmail_args);
+ $invoc .= ' '.join (' ', @sendmail_args);
}
$invoc .= ' -oi';
foreach $recip (@the_recips) {
@@ -2226,11 +2297,13 @@
$invoc .= ' << -eof-';
if (!$deliver_debug) {
open (DELIVER, '>>'
- .&tilde_expand_mkdir ($config{'storefile'}));
+ .&tilde_expand_mkdir ($config{'storefile'})) ||
+ die "Couldn't open file: $!";
}
&deliver_line ($invoc."\n");
} else {
- open (DELIVER, '|'.$invoc);
+ open (DELIVER, '|'.$invoc) ||
+ die "Couldn't open file: $!";
}
}
foreach (@deliver_headers) {
@@ -2252,16 +2325,19 @@
&close_body ($body);
if ($post) {
close (DELIVER);
- $post = &tilde_expand ($config{'post'});
- if ($post eq '') {
- $post = "/usr/lib/mh/post";
+ my $ppost = &tilde_expand ($config{'post'});
+ # bfulgham 7/1/99 -- another EDM fix, checks for undefined
+ # value on return
+ if (!defined($ppost) || $ppost eq '') {
+ $ppost = "/usr/lib/mh/post";
}
- system ($post, @post_args, $tmpfile);
+ system ($ppost, @post_args, $tmpfile);
unlink $tmpfile;
} elsif ($edit && !$prezilla) {
close (DELIVER);
if ($editfile eq '-') {
- open (CAT, $tmpfile);
+ open (CAT, $tmpfile) ||
+ die "Couldn't open file: $!";
while () { print; }
close (CAT);
&delete_tmpfile ($tmpfile);
@@ -2388,9 +2464,13 @@
}
else { $addr .= $token; }
}
- $addr =~ s/^\s+//s;
- $addr =~ s/\s+$//s;
- if ($addr ne '') { push (@addrs, $addr); }
+ # bfulgham, 7-1-99: EDM suggestion -- check for
+ # a defined $addr before manipulating
+ if (defined($addr)) {
+ $addr =~ s/^\s+//s;
+ $addr =~ s/\s+$//s;
+ if ($addr ne '') { push (@addrs, $addr); }
+ }
return (@addrs);
}
@@ -2441,6 +2521,7 @@
}
$strip =~ s/^\s+//s;
$strip =~ s/\s+$//s;
+ return ($strip, '') if ($config{'no-caret'});
return ($strip, $caret);
}
@@ -2639,7 +2720,8 @@
"Mime-Version: 1.0\n",
"Content-Type: multipart/mixed; boundary=\"_\"\n");
$new_body = &tmp_filename ();
- open (NEW, '>'.$new_body);
+ open (NEW, '>'.$new_body) ||
+ die "Couldn't open file: $!";
print NEW "--_\n";
print NEW "\n";
print NEW $error_msg;
@@ -2670,7 +2752,8 @@
print STDERR $error_msg;
$dead_letter = &tilde_expand ($config{'dead-letter'});
print STDERR "Saving message in $dead_letter\n";
- open (DEAD, '>>'.$dead_letter);
+ open (DEAD, '>>'.$dead_letter) ||
+ die "Couldn't open a dead letter file: $!";
print DEAD (("From $ENV{'USER'} ".localtime)."\n");
foreach $line (@in_headers) {
print DEAD $line;
@@ -2801,6 +2884,7 @@
# (@new_dict) = &delete_field ($key, @dict)
my ($key, @dict) = @_;
my (@new_dict);
+ my ($field_key, $field_val);
@new_dict = ();
foreach $field (@dict) {
@@ -2843,6 +2927,10 @@
# Expand filenames of the form ~/file. Also expand $< sequence (uid).
my ($file_name) = @_;
+ # bfulgham, 7-1-99: Another EDM fix. If file_name is undefined,
+ # return immediately to avoid error messages.
+ return $file_name unless defined($file_name);
+
if ($file_name =~ /^\~[^\/]/) {
&error ("premail can't handle ~user/ form in $file_name, use ~/ or\n".
"full path name instead\n");
@@ -2917,16 +3005,22 @@
# Return the name for a new temp file (and add to @open_tmpfiles).
# Reference count is set to one.
my ($suffix) = @_;
+ my $base;
my $fn;
$tmpfile_count++;
- $fn = &tilde_expand ($config{'tmpdir'});
- $fn =~ s/([^\/])$/$1\//;
- $fn .= 'premail.'.$$.'.'.$tmpfile_count;
+ $base = &tilde_expand ($config{'tmpdir'});
+ $base =~ s/([^\/])$/$1\//;
+ $base .= 'premail.'.$$.'.';
+ $fn = $base . $tmpfile_count;
$fn .= $suffix if $suffix;
-# Dangerous: this next command assumes Unix file deletion semantics. It
-# was not present in 0.44 and, I believe, can be safely removed.
- unlink ($fn);
+ while (!sysopen(TMPFH,$fn,&O_RDWR|&O_CREAT|&O_EXCL,0600) && $tmpfile_count < 32000) {
+ $tmpfile_count++;
+ $fn = $base . $tmpfile_count;
+ $fn .= $suffix if $suffix;
+ }
+ die "Can't open temp file: $!\n" if ($tmpfile_count >= 32000);
+ close (TMPFH);
push (@open_tmpfiles, $fn);
$tmpfile_refcnt{$fn} = 1;
return $fn;
@@ -2972,8 +3066,8 @@
$data = '';
if (open (ERRFILE, $file)) {
- print $_;
while () {
+ # print $_; # Removed 9-7-1999 BFulgham to allow filter use
$data .= $_;
}
close (ERRFILE);
@@ -2989,13 +3083,13 @@
my ($file) = @_;
my ($c);
- open (F, $file);
+ open (F, $file) || die "Can't open $file: $!";
seek (F, (-s $file) - 1, 0);
sysread (F, $c, 1);
close (F);
# print "Trailing character is really ".unpack ('c', $c)."\n";
if ($c ne "\n") {
- open (F, '>>'.$file);
+ open (F, '>>'.$file) || die "Can't open file: $!";
print F "\n";
close F;
}
@@ -3015,6 +3109,7 @@
# this interface).
#
# $err is the string returned.
+ print "I'm going into pgp now\n";
my ($body, $prefix, $sign, $signuser, $pubring, @keys) = @_;
my ($outfile, $errfile);
my ($invoc, $status, $line, $pass, $pr, $sr);
@@ -3040,7 +3135,9 @@
$pass = '';
}
if ($pubring) { $invoc .= ' +pubring='.&shell_quote ($pubring); }
- $invoc .= ' +comment= -feat';
+
+ # TEMP FIX -- Language support. Will be updated for others
+ $invoc .= ' +language=en +comment= -feat';
if ($sign) {
$invoc .= 's -u '.&shell_quote ($signuser);
&load_secrets ();
@@ -3083,7 +3180,7 @@
my ($outfile, $keys, $line);
$outfile = &tmp_filename ();
- open (OUT, '>'.$outfile);
+ open (OUT, '>'.$outfile) || die "Couldn't open file: $!";
if ($sign) {
$sign = " (sign $signuser)";
}
@@ -3126,7 +3223,9 @@
$signuser = '0x';
$pass = '';
}
- $invoc .= ' +comment= -fats +clearsig=on';
+
+ # TEMP FIX for language -- will be updated
+ $invoc .= ' +language=en +comment= -fats +clearsig=on';
$invoc .= ' -u '.&shell_quote ($signuser);
unless (defined $pass) {
if (defined $pgppass{$signuser}) {
@@ -3162,6 +3261,7 @@
# for obtaining the password lies below this interface).
#
# $err is the string returned.
+ print "I'm using the mime-pgp signing routine.\n";
my ($body, $prefix, $signuser, $sign_type) = @_;
my ($outfile, $errfile, $mimefile);
my ($invoc, $status, $line, $pass, $boundary);
@@ -3182,7 +3282,9 @@
$signuser = '0x';
$pass = '';
}
- $invoc .= ' +comment= -fabst';
+
+ # TEMP FIX for language -- will be updated
+ $invoc .= ' +language=en +comment= -fabst';
$invoc .= ' -u '.&shell_quote ($signuser);
unless (defined $pass) {
if (defined $pgppass{$signuser}) {
@@ -3197,7 +3299,7 @@
$status = &open_pgp ($invoc, $pass, 'w');
if (!$status) { &error ("Error invoking PGP!\n"); }
&open_body ($body);
- open (NEW, '>'.$mimefile);
+ open (NEW, '>'.$mimefile) || die "Couldn't open file: $!";
print NEW "This message is in PGP/MIME format, according to the"
." Internet Draft\n";
print NEW "draft-elkins-pem-pgp-04.txt. For more information, see:\n";
@@ -3238,7 +3340,7 @@
return ($mimefile, $err, $boundary);
}
-my $PUBRING, $SECRING;
+my ($PUBRING, $SECRING);
sub pgp_decrypt {
# ($out_body, $err) = &pgp_decrypt ($body, $pass)
# Try to decrypt $body using passphrase $pass. $out_body is null on error.
@@ -3251,7 +3353,9 @@
$outfile = &tmp_filename ();
$errfile = &tmp_filename ();
$invoc = &tilde_expand ($config{'pgp'});
- $invoc .= ' +batchmode=on';
+
+ # TEMP FIX for language -- will be updated
+ $invoc .= ' +language=en +batchmode=on';
$invoc .= " +pubring=$PUBRING" if $PUBRING;
$invoc .= " +secring=$SECRING" if $SECRING;
# if ($pass =~ /^RING$;/) {
@@ -3299,16 +3403,18 @@
$errfile = &tmp_filename ();
$invoc = &tilde_expand ($config{'pgp'});
- $invoc .= ' +batchmode=on ';
+
+ # TEMP FIX for language -- will be updated
+ $invoc .= ' +language=en +batchmode=on ';
$invoc .= ' '.$pgp_file;
$invoc .= ' '.$signed_file;
$invoc .= ' > '.$errfile.' 2>&1';
&pdv ("Invoking PGP as $invoc\n");
$status = &open_pgp ($invoc, '', '');
$err = &read_and_delete ($errfile);
- if (!$status) {
- &error ("Error in PGP verification!\n$err");
- }
+# if (!$status) {
+# &error ("Error in PGP verification!\n$err");
+# }
&pdv ($err);
return ($err);
}
@@ -3329,6 +3435,7 @@
# special PGP temp subdirectory, on a per-process basis (this assumes
# that each process invokes only one PGP at a time, which is safe given
# the relentless file-file orientation of this version of premail).
+
my ($invoc, $pass, $mode) = @_;
if ($mode eq 'r') { $invoc = $invoc.'|'; }
@@ -3344,6 +3451,8 @@
$ENV{'TMP'} = $pgp_tmpdir;
if ($pass) {
pipe (READER, WRITER);
+ # Added to make PGPPASSFD pipe work with perl-5.6 stk-12/27/00
+ fcntl(READER, F_SETFD, 0) or die "Can't fcntl: $!\n";
$ENV{'PGPPASSFD'} = fileno(READER);
}
$status = open (PGP, $invoc);
@@ -3390,7 +3499,9 @@
$chars_needed = 2 + sprintf ("%d", $bits / 8);
&pdv ($config{'pgp'}." +makerandom=$chars_needed $outf"
." >/dev/null 2>&1\n");
- $status = system $config{'pgp'}." +makerandom=$chars_needed $outf"
+
+ # TEMP FIX for language -- will be updated
+ $status = system $config{'pgp'}." +language=en +makerandom=$chars_needed $outf"
." >/dev/null 2>&1";
&pdv ($status."\n");
if (!$status) {
@@ -3416,7 +3527,7 @@
."generate randomness!\n");
}
$inf = &tmp_filename ();
- open (INF, '>'.$inf);
+ open (INF, '>'.$inf) || die "Couldn't open file: $!";
for ($i = 0; $i < 256; $i++) {
print INF (rand ())."\n";
}
@@ -3425,7 +3536,7 @@
($inf, '', '', '', '', $config{'signuser'});
print "$outf\n";
&delete_tmpfile ($inf);
- open (OUTF, $outf);
+ open (OUTF, $outf) || die "Couldn't open output file: $!";
@window = ();
while () {
if (/^[A-Za-z0-9\+\/]/) { push (@window, $_); }
@@ -3449,6 +3560,7 @@
# This routine needs to do a lot more.
#
# Sets the global variables $secrets_loaded and $premail_secrets
+
my ($ps_pgp);
if (!defined $secrets_loaded) {
@@ -3458,7 +3570,8 @@
&do_login (!$interactive);
}
if (-e $premail_secrets) {
- open (SECRETS, $premail_secrets);
+ open (SECRETS, $premail_secrets) ||
+ die "Couldn't open secrets file: $!";
while () {
if (/^\s*\$pgppass\{\'([^\']+)\'\}\s*\=\s*\'([^\']*)\'/) {
$pgppass{$1} = $2;
@@ -3498,9 +3611,15 @@
&error ("Need to log in to access secrets\n");
}
if (!-e $premail_secrets) {
- open (TOUCH, '>'.$premail_secrets);
+ if (!sysopen(TOUCH,$premail_secrets,&O_WRONLY|&O_CREAT|&O_EXCL,0600)) {
+ &error ("Can't open secrets file for writing\n");
+ }
&pfi ("Creating secrets file $premail_secrets\n");
close (TOUCH);
+ } else {
+ if (!-o $premail_secrets) {
+ &error ("Secrets file owned by wrong user.\n");
+ }
}
$secret_backup = $premail_secrets.'~';
rename ($premail_secrets, $secret_backup);
@@ -3586,10 +3705,18 @@
sub getpass {
# $pass = &getpass ($x)
# Get the premail passphrase, either from X or from stdin.
+
my ($x) = @_;
my ($pass);
if ($x) {
+ # if ($ENV{'DISPLAY'}) {
+ # require Gtk;
+ # $pass = create_entry();
+ # }
+
+ # This doesn't seem to work right with Debian's latest
+ # security fixes. Above is a Gtk interface.
if ($ENV{'DISPLAY'}) {
pipe (READER, WRITER);
system 'xterm -geometry 42x4-5-5 -e perl -e \''
@@ -3615,7 +3742,8 @@
print "\n";
system "stty echo";
}
- chop $pass;
+ # We might not always have a newline -- use chomp!
+ chomp $pass;
return $pass;
}
@@ -3626,11 +3754,16 @@
$errfile = &tmp_filename ();
$invoc = &tilde_expand ($config{'pgp'});
- $invoc .= ' +batchmode=on -f';
+
+ # TEMP FIX for language -- will be updated
+ $invoc .= ' +language=en +batchmode=on -f';
$invoc .= ' < '.$ps_pgp;
$invoc .= ' > '.$ps;
$invoc .= ' 2> '.$errfile;
&pdv ("Invoking PGP as $invoc\n");
+ if(-e $ps) {
+ &error ("Premail secrets file already exists\n");
+ }
$status = &open_pgp ($invoc, $pass, '');
$err = &read_and_delete ($errfile);
&pdv ($err);
@@ -3910,7 +4043,7 @@
&replace_field ('Content-Type: text/plain; charset='
.$config{'charset'}."\n",
@deliver_headers);
- } elsif ($charset =~ /^iso-8859-\d$/i && !$non_ascii) {
+ } elsif (($charset =~ /^iso-8859-\d$/i || $charset =~ /^koi8-r$/i) && !$non_ascii) {
# Should we detect other charsets which are supersets of us-ascii?
if (!$mv_present) {
push (@deliver_headers, 'MIME-Version: 1.0'."\n");
@@ -3923,7 +4056,7 @@
}
}
# must deal with existing cte, charset, etc.
- if ($non_ascii || $ctrl || $other) {
+ if ((($non_ascii || $ctrl) && (!$cte_present || lc $cte_val ne '8bit')) || $other) {
# Do the QP
&pdv ("Doing QP encoding!\n");
if (!$mv_present) {
@@ -3933,7 +4066,7 @@
&replace_field ('Content-Transfer-Encoding: quoted-printable'."\n",
@deliver_headers);
$new_body = &tmp_filename ();
- open (NEW, '>'.$new_body);
+ open (NEW, '>'.$new_body) || die "Couldn't open file: $!";
&open_body ($body);
while (defined ($line = &get_line_body ($body))) {
print NEW &encode_qp ($line, $type);
@@ -4000,7 +4133,7 @@
my ($val, $present, $param_val);
my ($type_base, @type_params);
- open (MNBIN, $infile);
+ open (MNBIN, $infile) || die "Couldn't open file: $!";
$newfile = '';
@sepstack = ();
$blocksize = 1024;
@@ -4073,7 +4206,7 @@
} elsif ($newfile eq '') {
$newfile = &tmp_filename ();
# print STDERR "newfile = $newfile\n";
- open (MNBOUT, '>'.$newfile);
+ open (MNBOUT, '>'.$newfile) || die "Couldn't open file: $!";
}
print MNBOUT (join ('', @header));
} elsif ($eof) {
@@ -4210,8 +4343,8 @@
print "\n";
print " premail -ripemkey\n";
print " Generate S/MIME key\n";
- print "\n";
- print "Please see http://www.c2.net/~raph/premail/ for more info.\n";
+ #print "\n";
+ #print "Please see http://www.c2.net/~raph/premail/ for more info.\n";
exit 0;
}
@@ -4225,7 +4358,7 @@
close (WWW);
if ($pubring ne '') {
$pubring_fn = &tilde_expand_mkdir ($config{'pubring'});
- open (PUB, '>'.$pubring_fn);
+ open (PUB, '>'.$pubring_fn) || die "Couldn't open file: $!";
print PUB $pubring;
close (PUB);
}
@@ -4291,7 +4424,7 @@
print $line;
$state = 0;
$msg_body = &tmp_filename ();
- open (MSG, '>'.$msg_body);
+ open (MSG, '>'.$msg_body) || die "Couldn't open file: $!";
while (defined ($line = &get_line ())) {
if ($line =~ /^From / && $state == 1) {
close (MSG);
@@ -4300,7 +4433,7 @@
print $line;
push (@open_tmpfiles, $msg_body);
$tmpfile_refcnt{$msg_body} = 1;
- open (MSG, '>'.$msg_body);
+ open (MSG, '>'.$msg_body) || die "Couldn't open file: $!";
$state = 0;
} elsif ($state == 0 && $line eq "\n") {
$state = 1;
@@ -4336,6 +4469,8 @@
exit 0;
}
+use vars qw($SAVE_BODY);
+
sub decode_msg {
# &decode_msg ($msg)
# This is possibly the ugliest function in all of premail. Most of it is
@@ -4350,12 +4485,12 @@
my ($msg_body, $new_msg, $save_select);
if ($msg ne '-') {
- open (SAVE_BODY, "<&BODY");
&open_body ($msg);
+ open (SAVE_BODY, "<&BODY") || die "Can't open a save file: $!";
}
&get_header ($msg);
$msg_body = &tmp_filename ();
- open (MSG_BODY, '>'.$msg_body);
+ open (MSG_BODY, '>'.$msg_body) || die "Can't open a message file: $!";
while (defined ($line = &get_line_body ($msg))) {
print MSG_BODY $line;
}
@@ -4372,7 +4507,7 @@
}
@deliver_headers = @new_headers;
$new_msg = &tmp_filename ();
- open (NEW_MSG, '>'.$new_msg);
+ open (NEW_MSG, '>'.$new_msg) || die "Couldn't open file: $!";
$save_select = select NEW_MSG;
select NEW_MSG;
&decode_body ($msg_body, '', 0);
@@ -4387,7 +4522,7 @@
&close_body ($new_msg);
if ($msg ne '-') {
&close_body ($msg);
- open (BODY, "<&SAVE_BODY");
+ open (BODY, "<&SAVE_BODY") || die "Couldn't open file: $!";
}
}
@@ -4456,7 +4591,7 @@
$encrypted = 1;
}
$pgp_body = &tmp_filename ();
- open (DEC, '>'.$pgp_body);
+ open (DEC, '>'.$pgp_body) || die "Couldn't open file: $!";
$body_open = 1;
foreach $l (@window) {
print DEC $l;
@@ -4767,7 +4902,7 @@
|| $protocol eq 'application/x-pkcs7-signature'
|| $protocol eq 'application/pkcs7-signature')){
$body[$part] = &tmp_filename ();
- open (NEW, '>'.$body[$part]);
+ open (NEW, '>'.$body[$part]) || die "Couldn't open file: $!";
$body_open = 1;
$state = 1;
$canon = ($protocol eq 'application/pgp-signature'
@@ -4779,13 +4914,16 @@
|| $part == 2) {
$body[$part] = &tmp_filename ();
if ($cte eq '' || &mossbin('mossdecode', 1) eq '') {
- open (NEW, '>'.$body[$part]);
+ open (NEW, '>'.$body[$part]) ||
+ die "Couldn't open file: $!";
} elsif ($cte eq 'quoted-printable') {
open (NEW, '|'.&mossbin ('mossdecode')
- .' -qp > '.$body[$part]);
+ .' -qp > '.$body[$part]) ||
+ die "Couldn't open file: $!";
} elsif ($cte eq 'base64') {
open (NEW, '|'.&mossbin ('mossdecode')
- .' -b64 > '.$body[$part]);
+ .' -b64 > '.$body[$part]) ||
+ die "Couldn't open file: $!";
} else {
&error ("Unknown Content-Transfer-Encoding: $cte\n");
}
@@ -4878,7 +5016,7 @@
$| = 1;
$new_body = &tmp_filename ();
- open (NEW, '>'.$new_body);
+ open (NEW, '>'.$new_body) || die "Couldn't open file: $!";
&open_body ($body);
$state = 0;
while (defined ($line = &get_line_body ($body))) {
@@ -5046,7 +5184,9 @@
$movemail = &tilde_expand ($config{'movemail'});
$status = system "$movemail $in $out";
if ($status) { exit $status >> 8; }
- open (MOVE_OUT, '>'.$move_work_fn);
+ if (!sysopen(MOVE_OUT,$move_work_fn,&O_WRONLY|&O_CREAT|&O_EXCL,0600)) {
+ &error ("Can't open $move_work_fn for writing\n");
+ }
select MOVE_OUT;
&decode ($out);
}
@@ -5129,7 +5269,7 @@
&load_secrets ();
foreach (keys %pgpring) {
my ($tpr, $tsr) = &makerings ($pgpring{$_});
- system ("$PGP +batchmode +verbose=0 -kx 0x $pr $tpr > /dev/null");
+ system ("$PGP +language=en +batchmode +verbose=0 -kx 0x $pr $tpr > /dev/null");
#filecat ($tpr, $pr);
filecat ($tsr, $sr);
&delete_tmpfile ($tpr);
@@ -5157,12 +5297,14 @@
# &pdv ('&makerings ("'.join ('", "', @_)."\")\n");
foreach ([$pr, $pk], [$sr, $sk]) {
open TMP, ">$$_[0]";
- print TMP $$_[1];
+ print TMP $$_[1] if defined $$_[1];
close TMP;
}
my $PGP = &tilde_expand ($config{'pgp'});
foreach $id (@pubkeys) {
- my $invoc = "$PGP +batchmode +force +verbose=0 -kx "
+
+ # TEMP FIX for lanuage -- will be updated
+ my $invoc = "$PGP +language=en +batchmode +force +verbose=0 -kx "
. "$id $pr $pubring 2>&1";
&pdv ("$invoc > /dev/null\n");
system "$invoc > /dev/null";
@@ -5189,7 +5331,9 @@
$outfile = &tmp_filename ();
$errfile = &tmp_filename ();
$invoc = &tilde_expand ($config{'pgp'});
- $invoc .= ' +batchmode +force +verbose=0 ';
+
+ # TEMP FIX for language -- will be updated
+ $invoc .= ' +language=en +batchmode +force +verbose=0 ';
$invoc .= " +pubring=$pr +secring=$sr ";
$invoc .= $cmd;
$invoc .= ' < ' . $infile if $infile;
@@ -5248,7 +5392,8 @@
EOF
;
- if (system ("$PGP -kg +pubring=$pr +secring=$sr +verbose=0")) {
+ # TEMP FIX for language -- will be updated
+ if (system ("$PGP +language=en -kg +pubring=$pr +secring=$sr +verbose=0")) {
print STDERR "\nKey generation failed.\n";
&killbaks ($pr, $sr);
&delete_open_tmpfiles ();
@@ -5272,7 +5417,9 @@
foreach $a ("$kid $pr",
"$remid $pr " . &tilde_expand ($config{'pubring'}),
"$kid $sr $defsr") {
- my $invoc = "$PGP +batchmode +force +verbose=0 -kx $a 2>&1";
+
+ # TEMP FIX for language -- will be updated
+ my $invoc = "$PGP +language=en +batchmode +force +verbose=0 -kx $a 2>&1";
# print STDERR "+ $invoc\n";
my $result = `$invoc`;
unless ($result =~ /^Key extracted/m) {
@@ -5300,7 +5447,8 @@
EOF
;
- my $invoc = "$PGP +secring=$sr -ke $kid $pr";
+ # TEMP FIX for language -- will be updated
+ my $invoc = "$PGP +language=en +secring=$sr -ke $kid $pr";
# print STDERR "+ $invoc\n";
if (system ($invoc)) {
print STDERR "Edit failed.\n";
@@ -5495,6 +5643,7 @@
}
}
}
+ $signsend = 'n' unless $signsend;
if ($#args >= 1) {
$to = $args[1];
} elsif ($#args < 0) {
@@ -5542,7 +5691,7 @@
if ($to eq 'delete') {
$prefix .= 'New-Password:'."\n\n";
$replyblock_fn = &tmp_filename ();
- open (TMP, '>'.$replyblock_fn);
+ open (TMP, '>'.$replyblock_fn) || die "Couldn't open file: $!";
close (TMP);
} else {
$prefix .= 'Reply-Block:'."\n";
@@ -5609,7 +5758,6 @@
$fullname = &query ('Full name of pseudonym (not just '
. 'E-mail address)', $fullname);
$fullname =~ s/[\'\^\n]//g; # kludge for secrets file
- $signsend = 'n' unless $signsend;
$signsend = &query ('Sign mail with (R)emailer key, '
. '(P)seudonym key or (N)o key?',
$signsend);
@@ -5629,7 +5777,7 @@
$prefix .= join ('', @rbs);
}
$replyblock_fn = &tmp_filename ();
- open (TMP, '>'.$replyblock_fn);
+ open (TMP, '>'.$replyblock_fn) || die "Couldn't open file: $!";
close (TMP);
}
# print $prefix;
@@ -5731,7 +5879,7 @@
my ($replyblock_fn);
$replyblock_fn = &tmp_filename ();
- open (REPLY, '>'.$replyblock_fn);
+ open (REPLY, '>'.$replyblock_fn) || die "Couldn't open file: $!";
print REPLY "To: $to\n";
print REPLY "Chain: $chain \n" if $chain;
print REPLY "\n";
@@ -5771,6 +5919,7 @@
if (!open (IN, $body)) {
&error ("Internal error opening replyblock\n");
}
+ $in_active = 1;
@in_headers = ("To: $to\n");
push (@in_headers, "Chain: $chain\n") if $chain;
$header_sep = "\n";
@@ -5784,6 +5933,7 @@
}
&send_group ($groups[0]);
close (IN);
+ $in_active = 0;
}
sub find_nym {
@@ -5814,7 +5964,7 @@
if ($all || $test eq 'ek') {
$replyblock_fn = &make_reply_block ($target,
$remailer.'.Encrypt-Key: test');
- open (RB, ">>$replyblock_fn");
+ open (RB, ">>$replyblock_fn") || die "Couldn't open file: $!";
print RB "Test of ek functionality of $remailer."
." This line must be encrypted.\n";
# print RB "**\n";
@@ -5897,8 +6047,8 @@
my ($file1, $file2) = @_;
my ($l2);
- open (F1, $file1);
- open (F2, $file2);
+ open (F1, $file1) || die "Couldn't open F1: $!";
+ open (F2, $file2) || die "Couldn't open F2: $!";
while () {
$l2 = ;
if ($_ ne $l2) { close (F1); close (F2); return 1; }
@@ -5997,7 +6147,7 @@
# The main loop
$quit = 0;
- $inoef = 0;
+ $ineof = 0;
while (!$quit) {
$rin = $win = $ein = '';
vec ($rin, fileno(STDIN), 1) = 1 unless $ineof;
@@ -6315,9 +6465,9 @@
# Open a Web connection for the file as file handle WWW.
my ($url) = @_;
my ($host, $port, $suf);
- my ($fqdn, $aliases, $type, $len, $thataddr);
+ my ($fqdn, $aliases, $type, $len);
my ($name, $proto);
- my ($that, $thataddr);
+ my ($that);
my ($savesel, $gotsep);
# my ($thishost, $this, $thisaddr);
@@ -6330,7 +6480,7 @@
$host = $1;
$port = $2;
$suf = $3;
- if ($port =~ /^\:(\d+)$/) { $port = $1; }
+ if (defined $port && $port =~ /^\:(\d+)$/) { $port = $1; }
else { $port = 80; }
($fqdn, $aliases, $type, $len, $thataddr) = gethostbyname ($host);
return &pdv ("Host not found: $host\n") if ($thataddr eq '');
@@ -6345,7 +6495,7 @@
unpack ('C4', $thataddr), $port));
eval {
$SIG{'ALRM'} = sub { die "Timeout error on $url\n" };
- alarm (5);
+ alarm (10);
# bind(WWW, $this) || &die_disarm ("bind: $!\n");
# &pdv ("bound the socket...\n");
connect(WWW, $that) || &die_disarm ("connect: $!\n");
@@ -6356,7 +6506,7 @@
."User-Agent: premail/$version (perl; unix)\n"
."\n";
$response = ;
- if ($response !~ /^HTTP\/1\.0 200/) {
+ if ($response !~ /^HTTP\/1\.\d 200/) {
&die_disarm ("Remote server error: $response");
}
$gotsep = 0;
@@ -6368,6 +6518,21 @@
};
if ($@) { return &pdv ($@); }
return &pdv ("No response from server\n") unless $gotsep;
+ } elsif ($url =~ /^finger:(.*)$/) {
+ my $target = @RELAYS ? $1 . '@' . $RELAYS[time % @RELAYS] : $1;
+ &error("'$target' contains no hostname\n") unless ($target =~ /(.*)@([^@]+)/);
+ my ($user, $host, $port, $ipaddr, $sin) = ($1, $2);
+ return &pdv ("Unknown host: $host\n") unless ($ipaddr = inet_aton($host));
+ &error ("Internal error: unknown service finger\n")
+ unless $port = getservbyname('finger', 'tcp');;
+ socket (WWW, PF_INET, SOCK_STREAM, getprotobyname ('tcp')) ||
+ return &pdv ("socket: $!\n");
+ $sin = sockaddr_in ($port, $ipaddr);
+ connect (WWW, $sin) || return &pdv("S! while connecting to $host\n");
+ &pdv ("connected to the socket...\n");
+ select ((select(WWW), $|=1)[0]);
+
+ print WWW "$user\r\n";
} else {
&error ("Misformed URL: $url\n");
}
@@ -6380,3 +6545,79 @@
$SIG{'ALRM'} = "IGNORE";
die @_;
}
+
+# Commented out so that we don't depend on GTK, Steve Kostecke 02/27/2000
+# sub create_entry {
+# # For some reason, the xterm hack for the passphrase doesn't work
+# # on the latest Debian release (2.0Beta). So, I have modified some
+# # code from the libgtk-perl package (test.pl program) to pop up a
+# # Gtk box to ask for the passphrase.
+# # 7/4/98 -- Brent Fulgham
+#
+# my($box1, $box2, $entry, $button, $separator, $pass_phrase, $label);
+#
+# init Gtk;
+#
+# if (not defined $entry_window) {
+# $entry_window = new Gtk::Window -toplevel;
+# $entry_window->signal_connect("destroy",\&destroy_window,\$entry_window);
+# $entry_window->signal_connect("delete_event",\&destroy_window,\$entry_window);
+# $entry_window->set_title("Passphrase Entry");
+# $entry_window->border_width(0);
+# $box1 = new Gtk::VBox(0,0);
+# $entry_window->add($box1);
+# show $box1;
+#
+# $box2 = new Gtk::VBox(0,10);
+# $box2->border_width(10);
+# $box1->pack_start($box2, 1, 1, 0);
+# show $box2;
+#
+# $entry = new Gtk::Entry;
+# $entry->set_usize(0,25);
+# $entry->set_visibility(0);
+# $entry->select_region(0, length($entry->get_text));
+# $box2->pack_start($entry, 1, 1, 0);
+# show $entry;
+#
+# $separator = new Gtk::HSeparator;
+# $box1->pack_start($separator, 0, 1, 0);
+# show $separator;
+#
+# $box2 = new Gtk::VBox(0,10);
+# $box2->border_width(10);
+# $box1->pack_start($box2,0,1,0);
+# show $box2;
+#
+# $button = new Gtk::Button "Finished";
+# $button->signal_connect("clicked", sub {
+# $pass_phrase = $entry->get_text;
+#
+# destroy_window ($entry_window);
+# });
+# $box2->pack_start($button, 1, 1, 0);
+# $button->can_default(1);
+# $button->grab_default;
+# show $button;
+#
+# $label = new Gtk::Label "Note: No output will appear";
+# $box2->pack_start($label, 1, 1, 0);
+# show $label;
+#
+# }
+# if (!visible $entry_window) {
+# show $entry_window;
+# }
+# else { destroy $entry_window };
+#
+# main Gtk;
+#
+# return $pass_phrase;
+# }
+#
+# sub destroy_window {
+# my($widget, $windowref, $w2) =@_;
+# $$windowref = undef;
+# $w2 = undef if defined $w2;
+# Gtk->main_quit;
+# }
--- premail-0.46.orig/premail.1
+++ premail-0.46/premail.1
@@ -0,0 +1,1209 @@
+'\"macro stdmacro
+.TH \f4premail\fP 1 "22 Aug 1997" "Premail Manual" "Premail Manual"
+.ds OK [\|
+.ds CK \|]
+.SH NAME
+premail \- An E\-Mail Privacy Package. Easy E\-Mail Encryption, Decryption, Signing and Anonymization.
+.SH SYNOPSIS
+.SS Command Line Invocations
+.B \f4premail\fP
+[
+.B -sendmail_options
+]
+.br
+.B \f4premail\fP
+.B -decode
+[
+.B -body
+] [
+.IR file
+]
+.br
+.B \f4premail\fP
+.B -makenym
+[
+.IR nym@server .\|.\|.\|
+]
+.br
+.B \f4premail\fP
+.B -login
+.br
+.B \f4premail\fP
+.B -logout
+.br
+.B \f4premail\fP
+.B -setpass
+.br
+.B \f4premail\fP
+.B -ripemkey
+.br
+.B \f4premail\fP
+.B -importnym
+[
+.IR nym@server .\|.\|.\|
+]
+.br
+.B \f4premail\fP
+.B -exportnym
+[
+.IR nym@server
+[
+.IR you@your.address
+] ]
+.SS Command Reference
+
+These are the things you put between the '((','))' on the To: line.
+Note that all of these, at least in theory, can also be used as their own
+header (first letter capitalized, of course).
+
+.TP
+\f4encrypt-pgp\fP
+Encrypts the message for the person(s) on the To: line. Synonymous with
+\f4key\fP. \f4encrypt-pgp\fP =
+.I name
+encrypts for recipient
+.I name.
+.TP
+\f4chain\fP
+Chains through a number of remailers (default 3, if you want a different
+number use \f4chain\fP =
+.IR num
+). If individual remailers are specified, they are placed
+after the '=' rather than
+.I num
+and separated by ';'. A special case of this is
+.I nym_server
+=
+.I name
+which chains through your
+.I name@nym_server
+pseudonym. Mixmaster remailers are specified by having one or more separated
+by ';' enclosed in an extra set of parentheses. Mimaster remailers cannot be
+chained automagically yet.
+.TP
+\f4sign\fP
+Signs your message, either with your default signature id (See "Preferences"
+below) or with the user id given after an '='.
+.TP
+\f4Anon- Headers\fP
+Not really a command, but any header in your message named Anon-
+.I Foo
+will come out of the last of a chain of remailers as
+.I Foo
+instead (i.e. the information will be preserved and the Anon- stripped).
+
+
+.SH DESCRIPTION
+.LP
+The main function of \f4premail\fP is adding support for encrypted e-mail
+to your mailer, using plain PGP, PGP/MIME, MOSS, or
+S/MIME.
+
+In addition, \f4premail\fP provides a seamless, transparent interface to
+the anonymous remailers, including full support for Mixmaster
+remailers and the nymservers. Nymservers provide cryptographically
+protected, fully anonymous accounts for both sending and receiving
+e-mail. These are known as pseudonyms or persistent anonymous accounts.
+
+While \f4premail\fP can be used as a stand-alone application, it works
+best when integrated with your mailer. Currently, \f4premail\fP is
+integrated completely seamlessly and transparently only with
+Netscape 3.0's built-in mailer. It works fairly well with Pine
+3.94 or later, as well (plain PGP is supported, but decryption of
+MIME-based e-mail encryption protocols is still missing).
+Transparent integration of outgoing mail only is supported for any
+mailer in which the mail sending program can be configured,
+including Berkeley mail, most emacs mailers, MUSH, and MH. For these
+mailers, you can decode messages with a single command.
+
+To integrate with your mailer, \f4premail\fP places itself between the
+mailer and the actual mail transport. For outgoing mail, premail
+masquerades as sendmail. You configure your mailer to call premail
+instead of sendmail. Then, \f4premail\fP performs the encryption or
+signing, and invokes sendmail to actually send the message.
+
+For mailers that call a command to receive incoming mail (including
+Netscape 3.0), the situation is similar. Netscape, for example, can
+be configured to call movemail to get incoming mail. To integrate
+premail, you'd configure Netscape to call \f4premail\fP instead, which
+would in turn call movemail to actually get the mail, then would
+decode it.
+
+.SS Requirements
+
+You need the following software in order to effectively use
+\f4premail\fP:
+
+.RS 2
+ * Unix. Unfortunately, \f4premail\fP does not work on Mac or Windows.
+ * Perl 5.000 or later.
+ * PGP (version 2.6.2 recommended).
+ * RIPEM 3.0b3 or later (optional, for S/MIME support)
+ * TIS/MOSS 7.1 (optional, for MOSS support)
+ * Mixmaster (optional, for higher security anonymous mail)
+ * Lynx (only if you're behind a firewall)
+.RE
+
+.SH USAGE
+
+.SS Command Line Invocation
+
+Hopefully, you have integrated premail into your mail client, and
+you won't have to invoke it from the command line. However, there
+may still be times when it is convenient to use premail from the
+command line.
+
+The most basic use of premail is as a replacement for sendmail. For
+example, you can send mail directly from the command line, as
+follows (here, the > represents the Unix prompt):
+
+ > premail -t
+ To: raph@cs.berkeley.edu ((sign))
+ Subject: premail bug report
+
+ Here's a bug in premail: ...
+ .
+ >
+
+The -t option specifies that the recipients are extracted from the
+header fields (To:, Cc:, Bcc:, and the Resent- variants of each).
+As in sendmail, you can specify the recipients on the command line
+instead of using the -t option.
+
+In addition, you can set configuration options from the command
+line, using the +option=value syntax. This is especially useful
+with the debug option. For example, to show you what happens
+when formatting mail for remailers, but not actually send the
+message:
+
+
+ > premail +debug=ry -t
+ To: raph@cs.berkeley.edu ((chain=1))
+ Subject: test of remailer
+
+ test
+ .
+ Chose chain exon
+ /usr/lib/sendmail -oi remailer\@remailer\.nl\.com
+
+There is one configuration option that can only be set from the
+command line in this fashion, which is the location of the preferences
+file itself. The configuration option is preferences, and the
+default value is ~/.premail/preferences. You could, of course,
+alias premail to have this option always set.
+
+
+.SS Encryption
+
+Once you've got premail set up, actually using encryption is easy.
+You simply add commands in double parentheses to the e-mail
+addresses. The encrypt-pgp command (which can be abbreviated to
+key) adds encryption to the outgoing mail, and the sign command
+signs it.
+
+For example, to send me encrypted mail, you'd send it to
+raph@cs.berkeley.edu ((encrypt-pgp)). You need to have a key with
+this user id on your PGP public keyring, otherwise you'll get an
+error message. If the user id on the key doesn't match the e-mail
+address, you can specify it directly. For example, to send mail
+directly to my workstation, but using the same public key as above,
+use raph@kiwi.cs.berkeley.edu ((key=raph@cs.berkeley.edu)).
+
+Signing works much the same way. I can sign mail by adding
+((sign=raph@cs.berkeley.edu)) to the outgoing address. Actually,
+because I set the signuser configuration option in my preferences
+file, all I have to add is ((sign)).
+
+Doing both encryption and signing is just as easy. For example, to
+send me signed, encrypted mail, use this line:
+
+ To: raph@cs.berkeley.edu ((encrypt-pgp, sign))
+
+Each recipient is treated separately - the double-paren commands
+after an e-mail address apply to that recipient only. However, you
+can add a Sign: header field to indicate that your message is
+signed for all recipients. Example:
+
+ To: vp@company, secretary@company, employees@company,
+ friend@outside ((encrypt-pgp))
+ Subject: Important announcement
+ Sign:
+
+ ...
+
+In this example, all recipients will get a signed message, and the
+message to friend@outside will be encrypted as well.
+
+.SS Decoding
+
+The basic way to decode encrypted messages is to use premail
+-decode as a command line. You can either give a filename as an
+argument, or premail will accept the encrypted message on its
+standard input. In either case, the decoded message will be printed
+on the standard output.
+
+The message can be a standard e-mail message (RFC 822 format), or
+it can be an entire mailbox. In the latter case, premail will
+decode each of the messages individually. If you don't have premail
+directly integrated into your mailer, then here's a handy way to
+view your mail:
+
+ premail -decode $MAIL | more
+
+If the message is actually encrypted, then premail will need to
+access the secrets file. If you are logged out of premail, then
+premail will try to open an xterm window for you to type the
+passphrase for the secrets file. If that doesn't succeed, premail
+will print an error message. At that point, you might choose to log
+in (i.e. premail -login) and then try the decoding again.
+
+If, as in many mailers, you have easy access to the body of the
+message but not the header, then you can use premail -decode -body
+on the body. This works well for plain PGP encrypted messages, but
+unfortunately does not work for MIME-based message formats, because
+important information is contained in the header.
+
+The results of the decoding (including signature verification) are
+given in an X-Premail-Auth: header field. This header field is
+protected against forgery; if the original message contains it, it
+is changed to X-Attempted-Auth-Forgery.
+
+.SS Anonymity
+
+The original reason for writing premail was to provide good support
+for anonymous remailers. If you're not interested in sending
+anonymous mail, you can skip this section.
+
+Sending anonymous mail is very similar to sending encrypted mail.
+Simply add the ((chain)) command to the recipient's e-mail address.
+Alternatively, you can add a Chain: header field, and the mail will
+be send anonymously to all recipients.
+
+Even though the chain command is simple, a lot is going on under
+the surface. The default chain is 3, which asks that three "good"
+remailers be chosen randomly. To make sure that it makes its choice
+based on fresh, up-to-date information, premail downloads the
+remailer list and a set of PGP public keys for the remailers from
+the Web (the actual URLs are configuration options). After choosing
+the remailers, the message is multiply encrypted with the PGP
+public keys, and finally sent to the first remailer in the chain.
+
+The automatic chain selection process is very good. My tests
+indicate that reliability is consistently above 99%. Further, the
+chain selection process avoids some potential problems. For
+example, some remailers are known not to work well in chains,
+probably because of incorrectly configured "block lists." Also,
+some remailers are "linked," in the sense of being hosted on the
+same machine, or being administered by the same person. Choosing a
+sequence of linked remailers wouldn't offer much security, so
+premail doesn't.
+
+You can also choose the chain length. A shorter chain will be
+faster and more reliable, but less secure, and conversely for
+longer chains. For example, ((chain=5)) selects a chain of five
+remailers.
+
+If this isn't enough control, you can specify the exact chain of
+remailers by hand. For example, ((chain=replay;jam;exon)) bounces
+the message around a few times outside the US.
+
+Mixmaster chains are specified inside an additional set of
+parentheses. At the moment, there is no way to automatically select
+a chain of Mixmaster remailers, so you have to do it by hand. For
+example: ((chain=(replay;ecafe-mix;lcs))). You can even mix
+Mixmaster and type-1 remailers; for example,
+((chain=(anon);1;(replay))) will sandwich one well-chosen remailer
+between the two Mixmaster remailers.
+
+Extra header fields can be placed in the outgoing message by
+prefixing the header with "Anon-". A particularly common usage is
+an Anon-Reply-To: field, which specifies a reply-to address in the
+mail delivered to the recipient. The Reply-To: header field is used
+often enough that premail includes a default-reply-to configuration
+option, which automatically adds it to all anonymous messages.
+
+The following header fields are passed through to the anonymized
+message, even without the Anon- prefix:
+
+ Mime-Version:
+ Content-Type:
+ Content-Transfer-Encoding:
+ Newsgroups:
+ X-Anon-To:
+ In-Reply-To:
+ References:
+
+.SS Using Nyms
+
+This section describes how to create and use _nyms_, which are
+accounts for sending and receiving anonymous mail. There are two
+types of nymservers: alpha (named after the now defunct
+alpha.c2.org), and newnym. For the most part, the operation of the
+two is similar.
+
+To create a new nym, type
+
+ premail -makenym
+
+and follow the prompts. This command is also good for updating an
+existing nym, which is important if one of the nym's remailers goes
+down.
+
+You can also create or update a nym from the command line, as
+follows:
+
+ premail -makenym you@alias.cyberpass.net your@real.address chain fakechains
+
+Note that chain is the number of remailers to use.
+
+When premail creates a nym, it chooses random passphrases (one for
+each remailer in the chain). The passphrases and other details of
+the nym are stored in the premail secrets file. Thus, the nym is
+fairly secure (much more so than, say, anon.penet.fi).
+
+The decode mechanism handles responses to nyms, again looking up
+the passphrases in the premail secrets file.
+
+You can also send mail from your nym, in one of two ways. Assume
+for the sake of example that your nym is you@alias.cyberpass.net.
+Then, you would use a chain of 2;cyber=you. Alternatively, you can
+use a chain of 2;cyber and include this header field:
+
+ Anon-From: you@alias.cyberpass.net (You Know Who)
+
+If you want the nymserver to send you a confirmation every time you
+send mail from your nym, add a $config{'ack'} = 'yes'; line to your
+preferences file.
+
+To delete a nym:
+
+ premail -makenym you@alias.cyberpass delete
+
+Please delete nyms if you are not actually using them; this helps
+free up disk space and prevents the nymservers from being
+overloaded.
+
+As of version 0.45, premail now supports the newnym type of
+nymserver. This nymserver is more richly featured than the alpha
+type. You do have to answer a few more prompts when creating nyms
+for the newnym type, including creating a new PGP key. It's worth
+it, though. The newnym servers seem to be working a lot better than
+the alpha ones ever did. For more information on newnym, see the
+nym.alias.net homepage. If you want to exchange nyms between
+premail and other programs (or a manual setup), then take a look at
+the -importnym and -exportnym commands, which are explained in the
+documentation for the patch that upgraded premail 0.44 to have
+newnym capability.
+
+From the patch documentation:
+
+.RS 3
+There are two new premail commands for dealing with "newnym"-style
+nyms (such as those on nym.alias.net), "-importnym" and "-exportnym".
+
+If you have an existing nym on nym.alias.net and you want to switch
+over to premail for managing that nym, run the command "premail
+-importnym". This will behave like "premail -makenym" except that it
+will use a PGP key already on your PGP keyring rather than creating a
+new PGP-key for the nym. Be aware, however, that premail will change
+your remailer chain and shared-key encryption passwords, so you will
+have to decrypt all subsequent mail you receive with premail. (The
+PGP key won't change, so if you don't like premail, you can always
+change back by manually mailing in a new reply-block.)
+
+Finally, if you created a nym with premail but would like to switch to
+something else, you can export your nym's PGP key by running "premail
+-exportnym". This will put your nym's public and private keys in the
+/tmp directory. The private key is not protected by a password, so
+you will probably want to edit it with "pgp -ke" before adding it to
+your private keyring.
+.RE
+
+.SS Posting To Usenet
+
+Even though some remailers can post directly to Usenet, premail
+does not support that. Thus, if you want to post to Usenet, you
+should use a mail-to-news gateway.
+
+To find a working mail-to-news gateway, check Don Kitchen's
+list. There are two basic kinds: sites that scan the header
+fields, and sites that include the newsgroup in the address.
+
+Using the address-parsing kind, to post to alt.anonymous, you'd
+just send mail to alt.anonymous@myriad.alias.net (assuming, of
+course, that myriad.alias.net is still functioning).
+
+Using the header-scanning kind, send mail to
+mail2news@myriad.alias.net, and include this header field:
+
+ Newsgroups: alt.anonymous
+
+The header scanning kind has one advantage: you can cross-post to
+multiple newsgroups using one mail message. If you post to multiple
+newsgroups, make sure you don't put a space between the newsgroups,
+only a comma. Otherwise, the articles will bounce.
+
+One frequently asked question is: how can I follow up on a thread
+while posting anonymously? This is easy. Find the Message-Id:
+header field in the post you're responding to, and change it into a
+References: field in your outgoing mail.
+
+Here's an example that ties it all together. Let's say you wanted
+to reply to this post:
+
+.RS 2
+ From: Edward Brian Kaufman
+ Newsgroups: alt.privacy.anon-server,alt.anonymous
+ Subject: A few questions about anon posts
+ Message-ID:
+
+ Hi,
+
+ I'd like to know what the best/easiest way to do anon posts is and
+ how to do them. Thank you,
+
+ Ed
+.RE
+
+To post the reply anonymously, send this mail:
+
+.RS 2
+ To: mail2news@myriad.alias.net ((chain))
+ Cc: Edward Brian Kaufman ((chain))
+ Newsgroups: alt.privacy.anon-server, alt.anonymous
+ Subject: Re: A few questions about anon posts
+ References:
+
+ If you have a Unix machine, using premail is the best way. To find
+ out how, read the manual.
+.RE
+
+.SS S/MIME
+
+Version 0.45 of premail contains limited support for S/MIME
+messages. Basic message formatting works, but there are problems
+with creating usable certificates, and there is still no support
+for an encryption algorithm interoperable with RC2. However, a few
+hearty souls may wish to experiment with the S/MIME functionality
+that is present. This section explains how to do it.
+
+First, you must install RIPEM 3.0b2 (or later). This is available
+from the ripem export-controlled FTP site. You'll need to get
+an account on the server in order to download any of the
+export-controlled code - the GETTING_ACCESS file on the site
+explains how.
+
+Once you have RIPEM installed (and the ripem configuration option
+pointing to the executable), create a public key with this command:
+
+ premail -ripemkey
+
+You will then be prompted for your e-mail address. Alternatively,
+you can give your e-mail address as a command line argument to
+premail -ripemkey.
+
+After your key is created, you can send signed messages by adding
+the ((ssign)) command. If you send a signed message to another
+premail user, they will have your public key, and can send you
+mail, by using ((encrypt=your@user.id)).
+
+The default encryption is Triple-DES. If the recipient can't handle
+it, then ((encrypt-des)) will fall back to plain DES, which most
+users will be able to decrypt - probably including "export"
+versions of S/MIME. Of course, the disadvantage of using plain DES
+is that any competent spy organization will also be able to decrypt
+the messages ;-).
+
+Unfortunately, RIPEM 3.0b2 has some significant differences from
+other S/MIME implementations in the way it handles public key
+certificates. These prevent you from getting a VeriSign certificate
+you can use. It is, however, possible to accept VeriSign class 1
+beta certificates by running the following (prompts and messages
+are in normal font, what you type is in boldface; you can find out
+the password by looking in the secrets file):
+
+ > _rcerts -u your@user.id_
+ Enter password to private key:
+ E - Enable standard issuers...
+ \f2...other choices...\fP
+ Enter choice:
+ \f2e\fP
+ ...V - VeriSign something or other...
+ \f2v\fP
+ Enter the number of months the certificate will be valid, or blank to
+ cancel:
+ \f212\fP
+ Enter choice:
+ \f2q\fP
+
+.SH SETUP
+
+.SS Installation
+
+First, you need to get premail. The source code is available from
+an export-control Web server. You may also be able to find a
+copy on the Hacktic FTP site in the Netherlands. In either
+case, you want to get the file premail-0.45.tar.gz.
+
+After you've gotten the file, unpack it. This command should do it:
+
+ gzip -dc premail-0.45.tar.gz | tar xvf -
+
+The unpacking process will create a subdirectory called
+premail-0.45, containing the following files:
+
+.TP
+README
+A short description of the contents
+.TP
+premail
+The premail program itself
+.TP
+preferences
+A skeletal preferences file
+.TP
+doc.txt
+This document in ASCII format.
+.TP
+doc.html
+This document in html format.
+
+.LP
+Test to see if you can run premail. These commands should print a
+usage summary:
+
+ cd premail-0.45
+ ./premail
+
+If you get an error message reading "command not found," then you
+will have to edit the first line of premail to refer to the actual
+pathname of the perl5 interpreter. One good way to find out the
+pathname is to do "which perl5" or "which perl".
+
+On the other hand, if you get a string of syntax errors, then the
+problem is probably that you are running perl4, while premail needs perl5.
+Try to see if you can find perl5 on your machine. Otherwise, you
+may need to install perl5 yourself.
+
+If you will be using premail from the command line frequently, then
+you may want to copy (or symlink) the premail program into a
+location in your $PATH. For example, if you have permission to add
+files into /usr/local/bin, then you may consider running this
+command:
+
+ cp -p premail /usr/local/bin
+
+An easier way may simply be to make a directory $HOME/bin, put premail
+in there, and add that to your $PATH. You could, of course, also try
+bugging the sysadmin at your site to install it for you into a pulically
+available location (like /usr/local/bin as above).
+
+At this point, you are ready to test whether premail actually
+works. We are assuming that you already have PGP installed and have
+generated your own public key. Type this command, substituting in
+your own e-mail address:
+
+.RS 2
+ ./premail -t
+ To: your@own.email.addr ((encrypt-pgp))
+ Subject: Test
+
+ Does this really work?
+ .
+.RE
+
+If all goes well, you should be back at the command line within a
+couple of seconds. If it seems to hang without any disk or net
+activity, try typing randomly for a minute, under the assumption
+that PGP needs random keystrokes. This shouldn't happen if PGP is
+already set up correctly (including having generated your own
+public key), but on the chance that it isn't, hanging while waiting
+for random keystrokes is one of the more common failure modes.
+
+This is also the point at which you may get a PGP error. Two common
+problems are that premail can't find the PGP program, in which case
+you will want to add a line to your preferences file (see
+"Preferences" below), or that it can't find the public key corresponding to
+your e-mail address.
+
+If the test was successful then you should now have a PGP-encrypted message in
+your mailbox.
+
+.SS The Secrets File
+
+To create signatures, decrypt messages, or use nyms, you need to
+set up a "premail secrets" file. If you will only be using premail
+to encrypt outgoing mail, you can skip this section.
+
+The default filename is /tmp/.premail-secrets.$< , where $< is
+equal to your numeric user id. To change the filename, use a
+preferences line such as this one:
+
+ $config{'premail-secrets'} = '/mnt/cryptdisk/premail-secrets';
+
+If you don't know your numeric user id, you can find it by running
+"echo $uid" (from csh or tcsh), "echo $UID" (from sh or bash), or:
+
+ perl -e 'print "$<\n"'
+
+The premail secrets file has this format:
+
+.RS 2
+ $pgppass{'user'} = 'PGP passphrase for user';
+ $pgppass{'alternate'} = 'PGP passphrase for alternate';
+.RE
+
+However, make sure your premail secrets file has restrictive
+permissions, so other people on your system can't read your
+passphrases! This command is well recommended (substituting your
+actual user id, of course):
+
+ chmod 600 /tmp/.premail-secrets.7437
+
+.SS Logging In and Out of Premail
+
+Generally, premail stores its secrets file in the /tmp directory.
+In some cases, this is good enough security. In other cases, it
+might be better to store the file encrypted most of the time, and
+only decrypt it when necessary. To use this capability of premail,
+first set a passphrase with:
+
+ premail -setpass
+
+You will be prompted for a passphrase. You can use the same
+passphrase as for your PGP key, or a different one, depending on
+how many passphrases you want to remember. This command leaves you
+logged in with the new passphrase set.
+
+To log out:
+
+ premail -logout
+
+You might consider adding this command to your .logout file, so
+that it occurs automatically every time you log out of your
+account.
+
+To log in again:
+
+ premail -login
+
+If you are running on a system with X, then premail will
+automatically pop up a window to log in whenever the secrets are
+needed. If you are not running X, and the secrets are needed, you
+will get an error. In this case, you can log in manually and try
+the command again.
+
+.SS Preferences
+
+While premail's default configuration is designed to be sufficient
+for the the most common cases, you may want to change some of the
+configuration options. This is done by adding lines to the
+preferences file.
+
+The default location for the preferences file is
+~/.premail/preferences, where ~ represents your home directory. The
+premail distribution comes with a skeleton preferences file, but it
+does not automatically copy it into the ~/.premail directory. You
+might choose to do that yourself, or you might create one from
+scratch.
+
+The format of the preferences file is a sequence of lines such as
+the following:
+
+ $config{'option'} = 'value';
+
+All other lines (including those beginning with #) are considered
+to be comments and are ignored. Here's a typical preferences file
+(actually, the one on my home machine):
+
+.RS 3
+$config{'logfile'} = '/home/raph/premail/log';
+$config{'debug'} = 'chvl';
+$config{'movemail'} = '/home/raph/bin/movehome';
+$config{'ripem'} = '/home/raph/install/ripem/main/ripem';
+$config{'pgp'} = '/usr/local/bin/pgp';
+.RE
+
+As you can see, a major use for the preferences file is to specify
+full pathnames for the helper programs. In addition, I've set it up
+to produce a full log, which I find useful, because I'm constantly
+tracking down bugs :-)
+
+Here's a table of all the configuration options, their defaults,
+and a very brief description. More complete descriptions are found
+in the preferences file included in the premail distribution.
+
+.TP
+Option, Default
+Explanation
+.TP
+pgp, pgp
+The location of the PGP executable.
+.TP
+sendmail, /usr/lib/sendmail
+The location of the sendmail executable.
+.TP
+mixmaster, mixmaster
+The location of the Mixmaster executable (useful for more
+secure anonymous mail).
+.TP
+movemail, movemail
+The location of the movemail executable (useful for
+integrating Netscape 3.0).
+.TP
+ripem, ripem
+The location of the ripem executable (needed for S/MIME
+messages).
+.TP
+mossbin,
+The directory containing the TIS/MOSS executables (needed for MOSS
+messages).
+.TP
+post, post
+The location of the MH post executable (needed for MH
+integration).
+.TP
+geturl,
+A command for getting files from the Web. Use "lynx -source" if
+behind a firewall.
+.TP
+dead-letter, ~/dead.letter
+The file where premail stores undeliverable mail.
+.TP
+logfile,
+The location where premail stores its log, if the l debug flag is
+set.
+.TP
+storefile,
+If set, the location where premail stores outgoing mail, instead of
+calling sendmail.
+.TP
+tmpdir, /tmp
+Where premail stores its temporary files.
+.TP
+charset, iso-8859-1
+The default charset for outgoing 8-bit messages.
+.TP
+encrypt, yes
+Set to blank to disable PGP encryption to remailers.
+.TP
+ ack,
+If set, nymservers will send acknowledgements for all outgoing mail.
+.TP
+extrablank,
+If set, premail adds an extra blank on remailer messages. Useful if
+behind a broken mail proxy.
+.TP
+debug,
+Debugging flags (see section on debugging).
+.TP
+signuser,
+The user id of the default PGP secret key used to sign messages.
+.TP
+default-reply-to,
+Adds a Reply-To: header field with this address when sending
+anonymous e-mail.
+.TP
+addresses, ~/.premail/addresses
+The file containing your addresses.
+.TP
+rlist, ~/.premail/rlist
+The file where premail stores the remailer list.
+.TP
+pubring, ~/.premail/pubring.pgp
+The file where premail stores the public
+keyring for the remailers.
+.TP
+premail-secrets-pgp, ~/.premail/secrets.pgp
+The file where premail stores the encrypted
+secrets file.
+.TP
+premail-secrets, /tmp/premail-secrets.$<
+The location of your secrets file
+.TP
+rlist-url, http://kiwi.cs.berkeley.edu/rlist
+The URL for the remailer list.
+.TP
+pubring-url, http://kiwi.cs.berkeley.edu/pubring.pgp
+The URL for the remailer
+public keyring.
+.TP
+type2-list-url, http://www.jpunix.com/type2.html
+The URL for the Mixmaster type2
+list.
+.TP
+pubring-mix-url, http://www.jpunix.com/pubring.html
+The URL for the Mixmaster
+pubring.
+
+.SS Address Book
+
+Adding the extra encryption commands is not difficult, but it can
+be tedious and potentially error prone. Thus, premail provides an
+address book for specifying commands to be used with specific
+e-mail addresses.
+
+For example, let's say that one of your correspondents tells you
+that she prefers mail to be PGP encrypted. Then, instead of typing
+((encrypt-pgp)) every time you send her mail, you could add this
+line to your addresses file:
+
+ her@email.address: ((encrypt-pgp))
+
+The addresses file is usually at ~/.premail/addresses, but the
+location is a configurable option.
+
+Another example was the hackerpunks mailing list (now defunct), in
+which all of the subscribers have alpha.c2.org nyms. Since
+haqr@alpha.c2.org had this line in his addresses file, he was able
+to post to the list with just "To: hpunks":
+
+ hpunks: hackerpunks@alpha.c2.org ((chain=2;alpha=haqr))
+
+An address book entry can also expand to a list of addresses. For
+example:
+
+.RS 3
+alice: alice@crypto.com ((encrypt-pgp))
+bob: bwhite@got.net ((key=bobw@netcom.com))
+eric: eric@ecsl.org ((encrypt-pgp))
+.br
+friends: alice, bob, eric
+.RE
+
+Sending mail to friends would then do what you'd expect: send
+encrypted mail to each of alice, bob, and eric's full e-mail
+addresses.
+
+.SH INTEGRATION
+
+This section discusses integrating premail with various remailers.
+
+.SS Netscape
+
+Create symbolic links to premail called "prezilla" and
+"premailmove". To do this, make sure you are in the same directory
+as premail itself, and type:
+
+ ln -s premail prezilla
+ ln -s premail premailmove
+
+Find a working movemail. If you have emacs installed, then you
+most likely have one in /usr/lib/emacs/etc/movemail or a similar
+location. If you don't already have one, then the source (or
+possibly binary) for one is included in the Netscape Navigator
+distribution and you can build it (no need if a binary is
+included). Then, make sure premail can find it by adding a line
+such as this one to your preferences file:
+
+ $config{'movemail'} = '/usr/lib/emacs/etc/movemail';
+
+This usage assumes that you get your mail from a mail spool, as
+opposed to POP or some such. You may be able to get it to work for
+POP as well, but you need to figure out how to invoke movemail to
+move the mail from your mailbox to a file (specified as the second
+argument to the movemail script).
+
+Add this line to your .cshrc, assuming your shell is csh or
+tcsh:
+
+ setenv NS_MSG_DELIVERY_HOOK /your/path/to/prezilla
+
+Also run this command from the shell so it takes effect
+immediately. The syntax is slightly different if your shell is sh
+or bash _(note: is this right? Yes, it is.)_:
+
+ NS_MSG_DELIVERY_HOOK=/your/path/to/prezilla
+ export NS_MSG_DELIVERY_HOOK
+
+Start Netscape (exit first if it's already running). Go to the
+Options|Mail and News Preferences dialog, select the Servers tab.
+Click on "External Movemail" and set the value to
+/your/path/to/premailmove.
+
+Try sending yourself mail, and clicking on "Get Mail" from the
+Netscape Mail window. The mail should show up in the Inbox,
+correctly decoded.
+
+To view the X-Premail-Auth: header field to see the result of
+signature checking, select Options|Show All Headers from the
+Netscape Mail window.
+
+Note: as of Netscape v3.0, there is still a bug in the handling of
+the Bcc: header field, which causes it to be ignored. Do not use
+this field. Hopefully, this will be fixed in a future version of
+Netscape.
+
+Note: some 3.0 beta versions modify the PATH environment variable.
+If premail seems to work correctly from the command line, but not
+from Netscape, try setting absolute pathnames for the programs used
+by premail.
+
+.SS Pine
+
+As of Pine 3.94, premail integrates both outgoing mail and the
+decryption of plain PGP incoming mail. Unfortunately, decryption of
+MIME-based mail is not yet supported.
+
+Two Pine configuration options need to be set to integrate premail
+(i.e. from the main Pine screen, S for setup, then C for
+configure). First, sendmail-path should be set to a value similar
+to this (substituting the actual path to premail):
+
+ /your/path/to/premail -oem -t -oi
+
+Second, display_filters should be set to a value similar to this:
+
+.RS 3
+_BEGINNING("-----BEGIN PGP")_ /your/path/to/premail -decode -body
+.RE
+
+If you have trouble finding these options in the setup screen, then
+you can edit the .pinerc file directly.
+
+One caveat when using Pine: it usually tries to be "smart" and
+remove comments from e-mail addresses, which includes the
+double-paren commands such as ((encrypt-pgp)). There are a few ways
+to deal with this problem:
+
+.RS 2
+ * Use "( )" instead of (( )). _Note: I think this works, but I
+haven't tested it._
+ * Use the alternative caret syntax. These two lines mean the same
+thing:
+
+ To: raph@cs.berkeley.edu ((encrypt-key, sign))
+ To: raph@cs.berkeley.edu^encrypt-key^sign
+ * Avoid setting the encryption options on the command line
+altogether, and set them in the addresses file instead (see
+"The Address File"). You could also use the header forms.
+.RE
+
+.SS MUSH
+
+Premail integrates well with the Mail User's Shell. Add the following lines to your .mushrc:
+
+.RS 3
+set sendmail='premail -oem -i -t #Comment'
+cmd decode 'pipe !* premail -decode >>$MAIL;delete !*'
+.RE
+
+Outgoing mail will be handled automatically. Note that if you are sending
+anything with a ';' on the mush command line, it must be enclosed in "'". For
+example:
+
+.RS 3
+mail user@host ((chain=replay;hacktic))
+mail 'user@host ((chain=replay;hacktic))'
+.RE
+
+The first line above will fail, use the second line instead.
+
+For outgoing mail, simply type 'decode [msg-list]'. It will decode those
+messages, append them to the end of your mailbox. You will be notified of the
+new mail. Note that this occurs even with those messages in the list that
+premail does nothing to. Since no update has been done, you can use
+undelete to look at the old (pre-premail) versions of the messages,
+but when you quit they'll be tossed.
+
+
+.SS Other mailers
+
+This section describes how to integrate premail with MH, emacs, and
+UCBMail. With these mailers, premail will only handle outgoing mail
+automatically. To decode incoming mail, you still need to invoke
+premail -decode by hand.
+
+.SS Integrating premail with Emacs
+
+To add premail support to emacs, just add this line to your .emacs
+file:
+
+ (setq sendmail-program "/your/path/to/premail")
+
+.SS Integrating premail with MH
+
+In whatever directory you keep the premail executable, create a
+symbolic link as follows:
+
+ ln -s premail prepost
+
+Under the name "prepost", premail will masquerade as MH's post
+program rather than sendmail. You can get MH to call premail
+instead of post by adding this line to your .mh_profile:
+
+ postproc: /your/path/to/prepost
+
+One thing to keep in mind is that premail's processing is done
+before that of post. Thus, if you have MH aliases, they will get
+expanded after the call to premail. If you use only premail
+aliases, only MH aliases, or neither, this won't be a problem.
+
+Alternatively, if you have appropriate privileges, you can add this
+line to /usr/lib/mh/mtstailor:
+
+ sendmail: /your/path/to/premail
+
+You may also have to configure MH to call sendmail locally rather
+than connecting to an SMTP server. Don't do both the mtstailor and
+mh_profile methods -- that would run premail twice.
+
+.SS Installing premail with UCBmail
+
+UCBmail is a simple mailer front-end (also known as Mail and
+mailx). If, when you type "mail user@site.dom", the mailer asks you
+for a "Subject: " line, you are undoubtedly using UCBmail. If so,
+you are in luck - it integrates very easily with premail. Just add
+this line to your ~/.mailrc file:
+
+ set sendmail=/your/path/to/premail
+
+Using premail with UCBmail is not very different from using premail
+by itself, but you do get some handy features, such as including
+files and using an editor on the mail.
+
+.SH NOTES
+
+This section covers a number of techincal notes related to the
+operation of premail. This information should not be necessary for
+ordinary use.
+
+.SS Multiple recipients
+
+One of the tricky problems with mail encryption packages such as
+premail is how to deal with multiple recipients. Based on
+experience with previous versions, this version of premail tries
+very hard to "get it right." However, as a consequence, the exact
+behavior can sometimes be difficult to understand.
+
+The hard part is when some of the recipients have encryption
+specified and others don't. What premail does is to split the
+recipients up into groups. If two recipients can receive the same
+actual message, they are in the same group, otherwise not. For
+example, recipients getting an encrypted and an unencrypted message
+cannot be in the same group. However, multiple recipients appearing
+in To: and Cc: fields that use the same encryption method will be
+in the same group. A single message, encrypted to multiple
+recipients, will be sent, which is considerably more efficient than
+encrypting separately for each recipient.
+
+One subtle point is the handling of Bcc: recipients. The semantics
+of Bcc: specify that the mail be sent to each of the Bcc:
+recipients, but that none of the other recipients be able to find
+out their identity. However, encrypting to multiple recipients
+would defeat this, because it is possible to indentify all of the
+recipients of the encrypted message. Thus, each encrypted Bcc:
+recipient gets its own group.
+
+Each recipient of an anonymous message also gets its own group, for
+similar reasons.
+
+An attempt is made to make the headers in the message received by
+the recipient be the same as if no encryption were used.
+Specifically, the complete To: and Cc: header fields will be
+present, but the Bcc: field will be missing. One exception to this
+rule is anonymous messages, in which case the recipient can't see
+any information about the other recipients.
+
+.SS Error handling
+
+The goal is to handle errors in the same way as sendmail. Thus, the
+exact handling depends on the setting of the -oe command line
+option. The default (as in sendmail) is -oep, meaning that the
+error message is printed to standard out, and the mail message is
+appended to the dead letter file (the location of which is a
+configuration option).
+
+Another choice is -oem, in which case the error message and the
+mail message are packaged together and mailed back to the user.
+This is appropriate when the mailer has no way to deal with error
+messages returned from premail.
+
+One additional choice, not provided by sendmail, is -oed, which
+prints the error message on standard out, but drops the mail
+message. This is a good choice if the mailer can interpret a
+non-zero return status code as indication of an error. This is the
+mode used by Netscape (and is automatically selected when premail
+is invoked as prezilla).
+
+.SS Security issues
+
+In designing premail, usefulness and convenience were considered
+more important than top security. Nonetheless, it can provide good
+security, especially if you are aware of the security issues.
+
+One overriding assumption was that your machine is secure, and that
+the serious threats were those of eavesdroppers on the network and
+e-mail forgers. In general, premail handles passive attacks quite
+well, while containing a number of vulnerabilities to active
+attacks.
+
+Here are some potential security pitfalls with premail:
+
+.RS 2
+ * Stores secrets information on disk file.
+ * Stores (potentially sensitive) temporary files on disk.
+ * Does not check authenticity of remailer list, remailer public key
+ring, or Mixmaster information gotten from the Web.
+ * Accessing the Web signals when anonymous mail is about to be sent,
+perhaps aiding traffic analysis.
+ * Does not evaluate the trustworthiness of public keys used for
+encryption and signature checking.
+.RE
+
+.SS Useless Features
+
+Over the years, premail has accumulated a number of features of
+dubious value. One of them is support for MOSS, a nice encryption
+protocol that nevertheless failed to catch on. If you feel the urge
+to use it, documentation is available in the release notes for
+version 0.43.
+
+One potentially cool feature is a server for decoding e-mail. This
+_would_ be a useful feature if there were any mailers which used
+it. The protocol for the server was designed to be fast (much, much
+faster than invoking premail -decode separately for each message),
+as well as "crypto-neutral," meaning that it doesn't contain any
+features designed just for crypto, and that it could be used for
+other tasks, for example converting image formats or character
+sets. Thus, a client designed to use this protocol would likely be
+fully exportable from the US. If you're interested in integrating
+support for this protocol into a popular e-mail client, please get
+in touch with me.
+
+.SH Debugging
+
+If you run into trouble with premail, it might be of value to turn
+on some of the debugging options. This can be done on the command
+line, or in the .premailrc file. In the former case, add a
++debug=chvy argument to the command line. In the latter case, try:
+
+ $config{'debug'} = 'chvy';
+
+Here are the meanings of the debug options:
+
+ c: Print command line invocation.
+ h: Print headers of input message.
+ l: Debug output goes to log instead of stdout.
+ p: Print finished message, do PGP.
+ r: Print chain chosen (useful in debugging chain selection).
+ y: Print finished message, don't do PGP.
+ v: Print all kinds of verbose info.
+
+Note that +debug=p puts the encrypted message on stdout. This may
+be useful for constructing reply blocks, among other things.
+
+If there are problems with premail, then one of the best ways to
+track them down is through the log. Try setting the debug
+configuration option to chvl, setting the logfile configuration
+option (for example, to ~/.premail/log), and then examining the
+log. Also, if you're bringing bugs to my attention, it helps a lot
+if you can send me relevant excerpts from the log.
+
+.SH SEE ALSO
+
+This document is available online at
+http://www.c2.net/~raph/premail/.
+
+This is the documentation for premail 0.45.
+