Annotation of pgp/doc/appnote.doc, revision 1.1.1.1

1.1       root        1:         PGP 2.6 Application Note:  Integrating PGP with mailers
                      2:                     Derek Atkins <[email protected]>
                      3:                              22-May-94
                      4: 
                      5:        This document will try to describe how to create an
                      6: application around PGP version 2.6, in order to incorporate PGP into
                      7: mailers and news readers.  There are a number of changes in 2.6 which
                      8: make it easier to write wrappers for PGP.  In writing this, I may have
                      9: inadvertantly left out some functionality, some mailers, or some
                     10: machine types.  I should warn readers now that I am a UNIX person, and
                     11: that most of this document will probably be in UNIX terms.
                     12: 
                     13:        The first thing to remember is that PGP usually needs to have
                     14: a controlling TTY in order to gather information, like the password,
                     15: or for the user to answer questions, like to whether to add or sign
                     16: keys.  This is useful for text-based mail agents.  In fact, it is most
                     17: useful for agents which use files for messages, like MH.
                     18: 
                     19:        One way to use PGP is to just decrypt the message into a file
                     20: and display that file. This can be a security risk, since wiping
                     21: files off disk is not always successful, and by having the plain-text
                     22: go to a file means more time for a possible attacker to get ahold of
                     23: the plain-text of the message.
                     24: 
                     25:        A better way to accomplish this is to use filter_mode, which
                     26: is the -f option.  This tells PGP to read the message from stdin, and
                     27: to put the output onto stdout.  Unfortunately, in this manner, the
                     28: signature information is output onto stderr, so you will either lose
                     29: it, or it and all other PGP output will be put in the same stream with
                     30: the message, but this depends on your piping ability.
                     31: 
                     32:        PGP tries to send all "interesting" data to standard out, and
                     33: error messages to standard error.  This lets you pick out the
                     34: interesting information and discard the rest.  This also means that
                     35: you can use PGP in filter-mode as a back-end to some user interface,
                     36: and obtain the data in the manner.  But remember that the current
                     37: implementation of PGP uses temporary files to store intermediate data,
                     38: so you are still at a risk, although it is much less of a risk than
                     39: just decrypting into a file.
                     40: 
                     41:        This works well when dealing with a command-line mailer, or a
                     42: mailer that is run in a terminal.  There are problems with this
                     43: approach, however, if you do not have a TTY in which to get a password
                     44: to decrypt or sign messages.  It seems that there would not be a good
                     45: way around this, but then again, PEM is going to have this same
                     46: problem.  (An example that I can think of is integrating with xmh).
                     47: 
                     48:        However, there is a way around this in some cases.  PGP has
                     49: numerous ways to accept the passphrase other than just promping for
                     50: it.  One way, which is not recommended, is to use the "-z" option to
                     51: set the passphrase.  Again, this is *NOT* recommended, since some
                     52: operating systems will not allow the program to erase the process
                     53: table, and someone can retreive the pass phrase from there via a "ps"
                     54: listing of active processes.  A similar way to get the pass phrase in
                     55: is to use the PGPPASS environment variable.  Again, this has the same
                     56: problems as "-z" with regards to an attacker finding the passphrase in
                     57: the OS kernel memory of the process table..  An example of this usage
                     58: is:
                     59: 
                     60:        pgp -sat -z "This is my pass phrase" inputfile
                     61: 
                     62:        There is a better way of doing this in PGP 2.6, which is an
                     63: environment variable called "PGPPASSFD".  If this is set, it means
                     64: that the FIRST thing PGP will do is read the pass phrase from this
                     65: file descriptor.  So, for example, one can set PGPPASSFD to "0"
                     66: (zero), and then PGP will read the pass phrase from stdin as the first
                     67: thing.  This allows you to send the passphrase to PGP in a manner
                     68: invisible to someone armed with the process listing.
                     69: 
                     70:        For example, an emacs utility could grab the block to be
                     71: encrypted (or decrypted), ask the user for the pass phrase in the
                     72: mini-buffer, and then do the equivalent of this shell script, using
                     73: something like:
                     74: 
                     75:        (send-string PROCESS "PassPhrase") 
                     76:        (send-region PROCESS (point-min) (point-max))
                     77: 
                     78: ---begin---
                     79: #!/bin/sh
                     80: 
                     81: PGPPASSFD=0; export PGPPASSFD
                     82: 
                     83: (echo "PassPhraseHere"; cat filename ) | pgp -feast recipient1 recipient2...
                     84: ---end---
                     85: 
                     86:        I must admit, this is a crude script, since it doesn't strip
                     87: out stderr, which included the bannerlines and error messages, but
                     88: that is not difficult to do out of band.
                     89: 
                     90: This is an example perl script that demonstrates the use of PGPPASSFD:
                     91: 
                     92: ---begin---
                     93: #!/usr/local/bin/perl
                     94: #
                     95: # perl example for PGPPASSFD,
                     96: # encrypts stream with password 'test'
                     97: #
                     98: 
                     99: pipe(READER,WRITER);
                    100: 
                    101: if (!fork) {
                    102:        close(WRITER);
                    103:        $ENV{'PGPPASSFD'}=fileno(READER);
                    104: # the $^F (Ctrl-F) variable controls close-on-exec of files
                    105:        $=fileno(READER);
                    106:        exec "pgp -acf";
                    107:        die "can't exec pgp\n";
                    108: }
                    109: close(READER);
                    110: syswrite(WRITER, "test\n", 5);
                    111: close(WRITER);
                    112: wait
                    113: ---end---
                    114: 
                    115:        Another feature of 2.6 which can be utilized in mailer scripts
                    116: is the batchmode feature.  This is used in the key-server software
                    117: (see keyserv.doc), to allow a process to call PGP and have it perform
                    118: without prompting the user for anything.  It will take the default
                    119: answer to most questions, which may not be what the user wants.  This
                    120: is switched by adding "+batchmode" to the command line.
                    121: 
                    122:        One more mailer I should mention, and this is probably the
                    123: most important of all of them, is MIME compatibility.  In order to use
                    124: MIME, a user needs to create a proper entry for PGP.  Unfortunately
                    125: there is not yet a standard MIME content-type for PGP-MIME.  However
                    126: there is a recommended set of mailcap entries which would be useful
                    127: for using metamail:
                    128: 
                    129:        application/pgp; pgp -f < %s | metamail; needsterminal; \ 
                    130:                test=test %{encapsulation}=entity 
                    131:        application/pgp; pgp %s; needsterminal 
                    132: 
                    133:        I hope that this document has helped people understand some of
                    134: the work being done to integrate PGP with mailers.  There is some work
                    135: going on already to integrate it even more.  If you have a mailer for
                    136: which there is no PGP handler, and you want to write one, please let
                    137: me know, so that we don't duplicate work.  In addition, if you have
                    138: written a mailer application, and its not included here in the
                    139: release, again let me know.
                    140: 
                    141:        A second contact for this is Colin Plumb <[email protected]>.
                    142: 
                    143:        Have fun!
                    144: 
                    145: -derek         <[email protected]>

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.