Annotation of pgp/contrib/emacs/pgp.el4, revision 1.1

1.1     ! root        1: Date: Thu, 25 Feb 93 22:39:33 -0800
        !             2: Message-Id: <[email protected]>
        !             3: From: [email protected] (Stainless Steel Rat)
        !             4: Subject: GNU Emacs front-end for PGP
        !             5: 
        !             6: This is my first mostly-working PGP front-end for GNU Emacs. It works in
        !             7: Rmail, and should work in VM. I don't recommend using it with mh-e due to
        !             8: the radically different method of dealing with files and buffers (ie,
        !             9: decrypted buffers won't be saved). It doesn't have any of the niceties
        !            10: installed yet; I've been going for 36 hours now, and I need some sleep.
        !            11: 
        !            12: The known problems are documented; the unknown ones I want to hear about.
        !            13: 
        !            14: The decryption code could be better, except that I haven't gotten the
        !            15: process filter to work the way I want; this brute-force version works, if
        !            16: barely.
        !            17: 
        !            18: ;;; -*-Emacs-Lisp-*-
        !            19: 
        !            20: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            21: ;;; File:         pgp.el v 1.0
        !            22: ;;; Description:  PGP Public Key system front-end
        !            23: ;;; Author:       Richard Pieri, [email protected]
        !            24: ;;; Created:      Fri Dec 25 12:25:42 1992
        !            25: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            26: 
        !            27: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            28: ;;; Caveat: it is inherently insecure to use PGP or any other encryption
        !            29: ;;; system on a multi-user system. There are just too many ways for someone
        !            30: ;;; to spy on what you are doing. It is highly recommended that you keep
        !            31: ;;; your private keys (secring.pgp) on write-protected mountable floppies
        !            32: ;;; and you keep these disks in a secure place.
        !            33: ;;;
        !            34: ;;; Additionally, the distributed PGP 2.1 code won't use the PGPPASS
        !            35: ;;; environment variable. The "#ifndef UNIX" on line 423 of pgp.c must be
        !            36: ;;; changed to "#ifdef UNIX"; this may break PGP on other platforms (in fact
        !            37: ;;; I can pretty much guarantee it).
        !            38: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            39: 
        !            40: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            41: ;;; Known Bugs:
        !            42: ;;; + There is no checking to see if you have entered an invalid pass phrase
        !            43: ;;;   in pgp-decrypt-message. If you do, then everything will seem to freeze
        !            44: ;;;   as PGP awaits a valid pass phrase.
        !            45: ;;; + The encryption/decryption functions send all standard error output to
        !            46: ;;;   /dev/null: you never get to see any of the informational messages.
        !            47: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            48: 
        !            49: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            50: ;;; History:
        !            51: ;;; Stainless Steel Rat, Feb 25, 1993: rewrote the decryption code based on
        !            52: ;;;         suggestions and code written by Robert Anderson
        !            53: ;;;         <[email protected]>.
        !            54: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            55: 
        !            56: ;; This is free software; you can redistribute it and/or modify
        !            57: ;; it under the terms of the GNU General Public License as published by
        !            58: ;; the Free Software Foundation. 
        !            59: 
        !            60: ;; This software is distributed in the hope that it will be useful,
        !            61: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            62: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
        !            63: ;; GNU General Public License for more details.
        !            64: 
        !            65: ;; For a copy of the GNU General Public License write to
        !            66: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
        !            67: 
        !            68: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            69: ;;; Installation:
        !            70: ;;;
        !            71: ;;; Edit pgp-program to point to the executable for PGP on your system. Then
        !            72: ;;; byte-compile this file, put it in your load-path. Finally, put the command
        !            73: ;;; (load "pgp") in your .emacs file. Enjoy.
        !            74: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            75: 
        !            76: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            77: ;;; Variables
        !            78: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            79: 
        !            80: (defvar pgp-program "/usr/local/bin/pgp"
        !            81:   "Path to PGP program.")
        !            82: 
        !            83: (defvar pgp-path (getenv "PGPPATH")
        !            84:   "This should match your PGPPATH environment variable.")
        !            85: 
        !            86: (defvar pgp-temp (concat pgp-path "/pgptemp.pgp")
        !            87:   "Scratch file used by pgp -f.")
        !            88: 
        !            89: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            90: ;;; Functions
        !            91: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            92: 
        !            93: ;;; This still needs a bit of work because it won't work as a filter.
        !            94: ;;; At least I haven't figured out how to make it works as a filter...
        !            95: (defun pgp-insert-public-key-block ()
        !            96:   "Insert your PGP Public Key Block at point."
        !            97:   (interactive)
        !            98:   (save-window-excursion
        !            99:     ;; delete temp files
        !           100:     (if (file-exists-p pgp-temp)
        !           101:        (delete-file pgp-temp))
        !           102:     (if (file-exists-p (concat pgp-path "/pgptemp.asc"))
        !           103:        (delete-file (concat pgp-path "/pgptemp.asc")))
        !           104:     ;; extract key into temp file
        !           105:     (shell-command (concat pgp-program " -kxa $USER " pgp-temp))
        !           106:     ;; and insert into the current buffer at point
        !           107:     (insert-file (concat pgp-path "/pgptemp.asc"))
        !           108:     ))
        !           109: 
        !           110: (defun pgp-encrypt-message (userid)
        !           111:   "Encrypt from mail-header-separator to (point-max), replacing clear text
        !           112: with cyphertext and the Public Key message delimiters.
        !           113: 
        !           114: Note that this function is inherently flawed as you will never see any of
        !           115: PGP's informational messages."
        !           116:   (interactive "sRecipient's userid: ")
        !           117:   (save-window-excursion
        !           118:     (save-excursion
        !           119:       ;; set region between mail-header-separator and the end of the buffer
        !           120:       (goto-char (point-min))
        !           121:       (search-forward mail-header-separator)
        !           122:       (forward-char 1)
        !           123:       (let ((start (point))
        !           124:            (end (point-max)))
        !           125:        ;; and encypher it
        !           126:        (shell-command-on-region
        !           127:         start end (concat pgp-program " -fea " userid " 2>/dev/null") t))
        !           128:       )))
        !           129: 
        !           130: (defun pgp-decrypt-message ()
        !           131:   "Decrypt the PGP message between the BEGIN/END PGP MESSAGE delimiters,
        !           132: replacing cyphertext with clear text in the current buffer.
        !           133: 
        !           134: Note that this function is inherently flawed as you will never see any of
        !           135: PGP's informational messages.
        !           136: 
        !           137: Note that this function may be a security hole. If a pass phrase is in
        !           138: memory when GNU Emacs crashes, it will appear in the core file. Anyone with
        !           139: a half-decent grasp of hash tables will be able to extract your pass phrase
        !           140: from the core file."
        !           141:   (interactive)
        !           142:   (save-window-excursion
        !           143:     (save-excursion
        !           144:       ;; delete temp file
        !           145:       (if (file-exists-p pgp-temp)
        !           146:          (delete-file pgp-temp))
        !           147:       ;; get pass phrase and put it into the environment list
        !           148:       (let ((passphrase (pgp-read-passwd "Enter pass phrase: ")))
        !           149:        (pgp-set-passphrase passphrase)
        !           150:        ;; save buffer-read-only status, and make the buffer writable
        !           151:        (let ((buffer-status buffer-read-only))
        !           152:          ;; set a region around the PGP message and decypher it
        !           153:          (setq buffer-read-only nil)
        !           154:          (goto-char (point-min))
        !           155:          (search-forward "-----BEGIN PGP MESSAGE-----")
        !           156:          (beginning-of-line)
        !           157:          (push-mark)
        !           158:          (search-forward "-----END PGP MESSAGE-----")
        !           159:          (forward-char 1)
        !           160:          (shell-command-on-region
        !           161:           (point) (mark) (concat pgp-program " -f 2>/dev/null") t)
        !           162:          ;; clear the pass phrase from memory and restore buffer status
        !           163:          (pgp-clear-passphrase)
        !           164:          (setq buffer-read-only buffer-status))
        !           165:        ))))
        !           166: 
        !           167: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !           168: ;;; Password support. Some of this is blatantly taken from ange-ftp.el
        !           169: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !           170: 
        !           171: (defun pgp-read-passwd (prompt &optional default)
        !           172:   "Read a password from the user. Echos a . for each character typed.
        !           173: End with RET, LFD, or ESC. DEL or C-h rubs out.  ^U kills line.
        !           174: Optional DEFAULT is password to start with."
        !           175:   (let ((pass (if default default ""))
        !           176:        (c 0)
        !           177:        (echo-keystrokes 0)
        !           178:        (cursor-in-echo-area t))
        !           179:     (while (and (/= c ?\r) (/= c ?\n) (/= c ?\e))
        !           180:       (message "%s%s"
        !           181:               prompt
        !           182:               (make-string (length pass) ?.))
        !           183:       (setq c (read-char))
        !           184:       (if (= c ?\C-u)
        !           185:          (setq pass "")
        !           186:        (if (and (/= c ?\b) (/= c ?\177))
        !           187:            (setq pass (concat pass (char-to-string c)))
        !           188:          (if (> (length pass) 0)
        !           189:              (setq pass (substring pass 0 -1))))))
        !           190:     (pgp-repaint-minibuffer)
        !           191:     (substring pass 0 -1)))
        !           192: 
        !           193: (defun pgp-repaint-minibuffer ()
        !           194:   "Gross hack to set minibuf_message = 0, so that the contents of the
        !           195: minibuffer will show."
        !           196:   (if (eq (selected-window) (minibuffer-window))
        !           197:       (if (fboundp 'allocate-event)
        !           198:          ;; lemacs
        !           199:          (let ((unread-command-event (character-to-event ?\C-m
        !           200:                                                          (allocate-event)))
        !           201:                (enable-recursive-minibuffers t))
        !           202:            (read-from-minibuffer "" nil pgp-tmp-keymap nil))
        !           203:        ;; v18 GNU Emacs
        !           204:        (let ((unread-command-char ?\C-m)
        !           205:              (enable-recursive-minibuffers t))
        !           206:          (read-from-minibuffer "" nil pgp-tmp-keymap nil)))))
        !           207: 
        !           208: (defun stripstrlist (l str)
        !           209:   "Strip from list-of-strings L any string which matches STR."
        !           210:   (cond (l (cond ((string-match str (car l))
        !           211:                  (stripstrlist (cdr l) str))
        !           212:                 (t (cons (car l) (stripstrlist (cdr l) str)))))))
        !           213: 
        !           214: (defun pgp-set-passphrase (arg)
        !           215:   "Set PGPPASS environment variable from argument."
        !           216:   (interactive "sPGP pass phrase: ")
        !           217:   (setq process-environment
        !           218:        (cons (concat "PGPPASS=" arg)
        !           219:              (stripstrlist process-environment "^PGPPASS="))))
        !           220: 
        !           221: (defun pgp-clear-passphrase ()
        !           222:   "Clear PGPPASS environment variable."
        !           223:   (interactive)
        !           224:   (setq process-environment (stripstrlist process-environment "^PGPPASS=")))
        !           225: 
        !           226: --Rat                               PGP Public Key Block available upon request
        !           227: ||||| | | | |  |  |  |   |   |    |    |    |   |   |  |  |  |  | | | | | |||||
        !           228: Northeastern's Stainless Steel Rat          [email protected]
        !           229: And now we meet again, for the first time, for the last time.     --Dark Helmet

unix.superglobalmegacorp.com

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