From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Ken Manheimer Newsgroups: gmane.emacs.devel Subject: Re: pgg symmetric encryption patch Date: Sat, 8 Oct 2005 15:16:29 -0400 Message-ID: <2cd46e7f0510081216w48adeb9bj4a3984ce7fe0e84e@mail.gmail.com> References: <2cd46e7f0510031250u66ea1349yb437d539ce4027ef@mail.gmail.com> <20051006090152.GB4494@kenny.sha-bang.local> <2cd46e7f0510061541w73bb6a92wb6d22829b6e804ae@mail.gmail.com> <20051007100014.GB4850@kenny.sha-bang.local> <2cd46e7f0510071106k3d4d3e6agc36f16a37d8b6bc6@mail.gmail.com> <20051007214952.GA30235@kenny.sha-bang.local> <20051008103627.GA1218@kenny.sha-bang.local> <2cd46e7f0510081131h14e2bbeaga7f1a33ebd6347c8@mail.gmail.com> Reply-To: Ken Manheimer NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_14419_29679848.1128798989222" X-Trace: sea.gmane.org 1128799064 23590 80.91.229.2 (8 Oct 2005 19:17:44 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sat, 8 Oct 2005 19:17:44 +0000 (UTC) Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Oct 08 21:17:33 2005 Return-path: Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1EOKBY-0008Be-PF for ged-emacs-devel@m.gmane.org; Sat, 08 Oct 2005 21:16:47 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EOKBW-0007X0-A0 for ged-emacs-devel@m.gmane.org; Sat, 08 Oct 2005 15:16:42 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1EOKBL-0007Wk-Qg for emacs-devel@gnu.org; Sat, 08 Oct 2005 15:16:31 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1EOKBK-0007WY-8h for emacs-devel@gnu.org; Sat, 08 Oct 2005 15:16:31 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EOKBK-0007WV-50 for emacs-devel@gnu.org; Sat, 08 Oct 2005 15:16:30 -0400 Original-Received: from [64.233.162.207] (helo=zproxy.gmail.com) by monty-python.gnu.org with esmtp (Exim 4.34) id 1EOKBJ-0000Qb-PB for emacs-devel@gnu.org; Sat, 08 Oct 2005 15:16:30 -0400 Original-Received: by zproxy.gmail.com with SMTP id k1so527239nzf for ; Sat, 08 Oct 2005 12:16:29 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:in-reply-to:mime-version:content-type:references; b=LefiCZ4a8DflXsXFLP+Ym98CgkVzAYep9PYlqRIDDGuHf9v1d5CpYcTjoQPRJmLuLfD7/IbED3Y30/N9bY3PPZZEc+W4zZMFiZwuCKT62gUEhA8wGWAmYvEzWPflmxb4RV4OumZWACIiVZfsYjzFTr05DoFIggFLvyboa2/qQyA= Original-Received: by 10.36.82.13 with SMTP id f13mr990804nzb; Sat, 08 Oct 2005 12:16:29 -0700 (PDT) Original-Received: by 10.36.36.11 with HTTP; Sat, 8 Oct 2005 12:16:29 -0700 (PDT) Original-To: Simon Josefsson , Ken Manheimer , "sascha schwab (symmetric encryption patches)" , "Daiki Ueno (pgg author)" , "Richard M. Stallman" , emacs-devel@gnu.org In-Reply-To: <2cd46e7f0510081131h14e2bbeaga7f1a33ebd6347c8@mail.gmail.com> X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:43698 Archived-At: ------=_Part_14419_29679848.1128798989222 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline damn! i'm absolutely sure i attached it that time. (i even ditched the first attachment and reattached a new copy, when i noticed a revision to add.) i'm going to try again as an attachment, and if it doesn't go through i'll send it inline. ---------- Forwarded message ---------- From: Ken Manheimer Date: Oct 8, 2005 2:31 PM Subject: Re: pgg symmetric encryption patch To: Simon Josefsson , Ken Manheimer , "sascha schwab (symmetric encryption patches)" , "Daiki Ueno (pgg author)" , "Richard M. Stallman" , emacs-devel@gnu.org On 10/8/05, Sascha Wilde wrote: > On Sat, Oct 08, 2005 at 10:48:27AM +0200, Simon Josefsson wrote: > > It seems you are making some progress here. For simplicity, could you > > post the complete patch (preferably in unified diff format) against > > Emacs CVS you want to have installed? Unless somebody else has > > already taken care of this... > > I attached the complete patch against the latest cvs checkout. i've got another take on the cumulative patch, with the addition of some refinements i would like to add. the patch is against the gnu.org repository, and incorporates recent checkins there as of a few minutes ago. here are the details of my further refinements, which are included in this patch. their purpose is to enable external management of the passphrases, including prompting and caching, while still using the pgg encryption and cache mechanisms. the changes have two thrusts: - extend the (generic pgg and gpg scheme) encryption and decryption routines to take an optional passphrase argument, and when provided, use its value instead of prompting for the passphrase - extend the passphrase caching and prompting routines to take an optiona= l 'notruncate' argument, to enable caching of passphrases for keys beside= s those that have the format of the short pgp packet key id. i think that these, together, will enable me to do the passphrase handling and extend it to symmetric keys, while still leveraging the features of the pgg mechanism (in particular, passphrase expiration). i am pretty sure it's all backwards compatible - all the additional functionality hinges on using the new optional arguments, there should be no operational changes if you don't use them. (i am very puzzled about why the passphrase cache was restricted to the length of the short pgp packet key ids. seems like you want to couple the passphrases with the user identity for which the message is being encoded, in the case of key-pair ciphers, or some arbitrary string for symmetric ciphers - eg, file name is what i want to use for symmetric keys in allout, since the symmetric keys are associated with the files. but once again i don't know the pgp territory well enough to wade in, and want to minimize the chance of inadvertantly breaking anything. if this approach is deemed to be fine, i can easily provide an additional patch to adjust the pgg-pgp and pgg-pgp5 modules similarly. ken ken.manheimer@gmail.com ------=_Part_14419_29679848.1128798989222 Content-Type: application/octet-stream; name=emacs-pgg-symmetric.patch-05 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="emacs-pgg-symmetric.patch-05" Index: man/pgg.texi =================================================================== RCS file: /cvsroot/emacs/emacs/man/pgg.texi,v retrieving revision 1.5 diff -u -r1.5 pgg.texi --- man/pgg.texi 16 Sep 2005 22:11:00 -0000 1.5 +++ man/pgg.texi 8 Oct 2005 10:31:09 -0000 @@ -98,6 +98,8 @@ @lisp (autoload 'pgg-encrypt-region "pgg" "Encrypt the current region." t) +(autoload 'pgg-encrypt-symmetric-region "pgg" + "Encrypt the current region with symmetric algorithm." t) (autoload 'pgg-decrypt-region "pgg" "Decrypt the current region." t) (autoload 'pgg-sign-region "pgg" @@ -140,6 +142,13 @@ with GnuPG. @end deffn +@deffn Command pgg-encrypt-symmetric-region start end +Encrypt the current region between @var{start} and @var{end} using a +symmetric cipher. After invocation you are asked for a passphrase. + +This is currently only implemented for GnuPG. +@end deffn + @deffn Command pgg-decrypt-region start end Decrypt the current region between @var{start} and @var{end}. If decryption is successful, it replaces the current region contents (in @@ -305,6 +314,13 @@ @var{recipients}. If @var{sign} is non-@code{nil}, do a combined sign and encrypt. If encryption is successful, it returns @code{t}, otherwise @code{nil}. +@end deffn + +@deffn Method pgg-scheme-encrypt-symmetric-region scheme start end +Encrypt the current region between @var{start} and @var{end} using a +symmetric cipher and a passphrases. If encryption is successful, it +returns @code{t}, otherwise @code{nil}. This function is currently only +implemented for GnuPG. @end deffn @deffn Method pgg-scheme-decrypt-region scheme start end Index: man/ChangeLog =================================================================== RCS file: /cvsroot/emacs/emacs/man/ChangeLog,v retrieving revision 1.683 diff -u -r1.683 ChangeLog --- man/ChangeLog 8 Oct 2005 02:55:16 -0000 1.683 +++ man/ChangeLog 8 Oct 2005 10:31:12 -0000 @@ -10,6 +10,14 @@ * building.texi (GDB Graphical Interface): Add variables and functions to indices. Be more precise. +2005-10-06 Sascha Wilde + + * pgg.texi (How to use): Added autoload line for + `pgg-encrypt-symmetric-region'. + (User Commands): Description of `pgg-encrypt-symmetric-region'. + (Backend methods): Describe new funktion + `pgg-scheme-encrypt-symmetric-region'. + 2005-10-05 Nick Roberts * speedbar.texi (GDB): Describe use of watch expressions. Index: ChangeLog =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/gnus/ChangeLog,v retrieving revision 1.392 diff -u -r1.392 ChangeLog --- ChangeLog 8 Oct 2005 08:45:31 -0000 1.392 +++ ChangeLog 8 Oct 2005 17:58:09 -0000 @@ -1,3 +1,41 @@ + +2005-10-08 Ken Manheimer + + * pgg.el (pgg-encrypt-region, pgg-encrypt-symmetric-region, + pgg-encrypt-symmetric, pgg-encrypt, pgg-decrypt-region, + pgg-decrypt, pgg-sign-region, pgg-sign): + add optional 'passphrase' argument to all these routines, so the + passphrase can be managed externally and then passed in to the + system. + + * pgg.el (pgg-read-passphrase, pgg-add-passphrase-cache, + pgg-remove-passphrase-cache): add optional 'notruncate' argument, + so the passphrase cache can be used reliably with identifiers + besides a pgp packet's key id. + + * pgg-gpg.el (pgg-pgp-encrypt-region, + pgg-pgp-encrypt-symmetric-region, pgg-pgp-encrypt-symmetric, + pgg-pgp-encrypt, pgg-pgp-decrypt-region, pgg-pgp-decrypt, + pgg-pgp-sign-region, pgg-pgp-sign): add optional 'passphrase' + argument to all these routines, so the passphrase can be managed + externally and passed in to the system. + + * pgg-gpg.el (pgg-gpg-possibly-cache-passphrase): add optional + 'notruncate' argument, so the passphrase cache can be used + reliably with identifiers besides a pgp packet's key id. + +2005-10-06 Sascha Wilde + + * pgg-gpg.el (pgg-gpg-encrypt-symmetric-region): New function for + symmetric encryption. + (pgg-gpg-symmetric-key-p): New function to check for an symmetric + encrypted session key. + (pgg-gpg-decrypt-region): When decrypting a symmetric encrypted + message ask for the passphrase in a proper way. + + * pgg.el (pgg-encrypt-symmetric,pgg-encrypt-symmetric-region): + New user commands for symmetric encryption. + 2005-01-21 Derek Atkins (tiny change) * pgg-pgp.el (pgg-pgp-decrypt-region): Use passphrase cache. Index: pgg-gpg.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/gnus/pgg-gpg.el,v retrieving revision 1.7 diff -u -r1.7 pgg-gpg.el --- pgg-gpg.el 8 Oct 2005 08:43:33 -0000 1.7 +++ pgg-gpg.el 8 Oct 2005 17:58:09 -0000 @@ -4,6 +4,7 @@ ;; 2005 Free Software Foundation, Inc. ;; Author: Daiki Ueno +;; Symmetric encryption added by: Sascha Wilde ;; Created: 1999/10/28 ;; Keywords: PGP, OpenPGP, GnuPG @@ -96,7 +97,7 @@ (delete-file output-file-name)) (set-default-file-modes orig-mode)))) -(defun pgg-gpg-possibly-cache-passphrase (passphrase &optional key) +(defun pgg-gpg-possibly-cache-passphrase (passphrase &optional key notruncate) (if (and pgg-cache-passphrase (progn (goto-char (point-min)) @@ -108,7 +109,8 @@ (if (re-search-forward "^\\[GNUPG:] NEED_PASSPHRASE\\(_PIN\\)? \\w+ ?\\w*" nil t) (substring (match-string 0) -8)))) - passphrase))) + passphrase + notruncate))) (defvar pgg-gpg-all-secret-keys 'unknown) @@ -139,18 +141,23 @@ nil t) (substring (match-string 2) 8))))) -(defun pgg-gpg-encrypt-region (start end recipients &optional sign) +(defun pgg-gpg-encrypt-region (start end recipients &optional sign passphrase) "Encrypt the current region between START and END. -If optional argument SIGN is non-nil, do a combined sign and encrypt." + +If optional argument SIGN is non-nil, do a combined sign and encrypt. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id)) - (passphrase - (when sign - (pgg-read-passphrase - (format "GnuPG passphrase for %s: " pgg-gpg-user-id) - pgg-gpg-user-id))) + (passphrase (or passphrase + (when sign + (pgg-read-passphrase + (format "GnuPG passphrase for %s: " + pgg-gpg-user-id) + pgg-gpg-user-id)))) (args (append - (list "--batch" "--armor" "--always-trust" "--encrypt") + (list "--batch" "--textmode" "--armor" "--always-trust" "--encrypt") (if sign (list "--sign" "--local-user" pgg-gpg-user-id)) (if recipients (apply #'nconc @@ -169,8 +176,25 @@ (pgg-gpg-possibly-cache-passphrase passphrase))) (pgg-process-when-success))) -(defun pgg-gpg-decrypt-region (start end) - "Decrypt the current region between START and END." +(defun pgg-gpg-encrypt-symmetric-region (start end &optional passphrase) + "Encrypt the current region between START and END with symmetric cipher. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." + (let* ((passphrase (or passphrase + (pgg-read-passphrase + "GnuPG passphrase for symmetric encryption: "))) + (args + (append (list "--batch" "--textmode" "--armor" "--symmetric" )))) + (pgg-as-lbt start end 'CRLF + (pgg-gpg-process-region start end passphrase pgg-gpg-program args)) + (pgg-process-when-success))) + +(defun pgg-gpg-decrypt-region (start end &optional passphrase) + "Decrypt the current region between START and END. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." (let* ((current-buffer (current-buffer)) (message-keys (with-temp-buffer (insert-buffer-substring current-buffer) @@ -178,16 +202,27 @@ (secret-keys (pgg-gpg-lookup-all-secret-keys)) (key (pgg-gpg-select-matching-key message-keys secret-keys)) (pgg-gpg-user-id (or key pgg-gpg-user-id pgg-default-user-id)) - (passphrase - (pgg-read-passphrase - (format "GnuPG passphrase for %s: " pgg-gpg-user-id) - pgg-gpg-user-id)) + (passphrase (or passphrase + (pgg-read-passphrase + (format (if (pgg-gpg-symmetric-key-p message-keys) + "Passphrase for symmetric decryption: " + "GnuPG passphrase for %s: ") + pgg-gpg-user-id) + pgg-gpg-user-id))) (args '("--batch" "--decrypt"))) (pgg-gpg-process-region start end passphrase pgg-gpg-program args) (with-current-buffer pgg-errors-buffer (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id) (goto-char (point-min)) (re-search-forward "^\\[GNUPG:] DECRYPTION_OKAY\\>" nil t)))) + +(defun pgg-gpg-symmetric-key-p (message-keys) + "Check if MESSAGE-KEYS contains a symmetric encryption indicator." + (let (result) + (dolist (key message-keys result) + (when (and (eq (car key) 3) + (member '(symmetric-key-algorithm) key)) + (setq result key))))) (defun pgg-gpg-select-matching-key (message-keys secret-keys) "Choose a key from MESSAGE-KEYS that matches one of the keys in SECRET-KEYS." Index: pgg.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/gnus/pgg.el,v retrieving revision 1.8 diff -u -r1.8 pgg.el --- pgg.el 26 Aug 2005 00:02:05 -0000 1.8 +++ pgg.el 8 Oct 2005 17:58:10 -0000 @@ -4,6 +4,7 @@ ;; 2005 Free Software Foundation, Inc. ;; Author: Daiki Ueno +;; Symmetric encryption added by: Sascha Wilde ;; Created: 1999/10/28 ;; Keywords: PGP @@ -81,9 +82,10 @@ (defvar pgg-passphrase-cache (make-vector 7 0)) -(defun pgg-read-passphrase (prompt &optional key) +(defun pgg-read-passphrase (prompt &optional key notruncate) (or (and pgg-cache-passphrase - key (setq key (pgg-truncate-key-identifier key)) + key (or (not notruncate) + (setq key (pgg-truncate-key-identifier key))) (symbol-value (intern-soft key pgg-passphrase-cache))) (read-passwd prompt))) @@ -159,15 +161,15 @@ (pgg-run-at-time-1 time repeat function args)) (defalias 'pgg-run-at-time 'run-at-time))) -(defun pgg-add-passphrase-cache (key passphrase) - (setq key (pgg-truncate-key-identifier key)) +(defun pgg-add-passphrase-cache (key passphrase &optional notruncate) + (if (not notruncate) (setq key (pgg-truncate-key-identifier key))) (set (intern key pgg-passphrase-cache) passphrase) (pgg-run-at-time pgg-passphrase-cache-expiry nil #'pgg-remove-passphrase-cache key)) -(defun pgg-remove-passphrase-cache (key) +(defun pgg-remove-passphrase-cache (key &optional notruncate) (let ((passphrase (symbol-value (intern-soft key pgg-passphrase-cache)))) (when passphrase (fillarray passphrase ?_) @@ -222,52 +224,101 @@ ;;; ;;;###autoload -(defun pgg-encrypt-region (start end rcpts &optional sign) +(defun pgg-encrypt-region (start end rcpts &optional sign passphrase) "Encrypt the current region between START and END for RCPTS. -If optional argument SIGN is non-nil, do a combined sign and encrypt." + +If optional argument SIGN is non-nil, do a combined sign and encrypt. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." (interactive (list (region-beginning)(region-end) (split-string (read-string "Recipients: ") "[ \t,]+"))) (let ((status (pgg-save-coding-system start end (pgg-invoke "encrypt-region" (or pgg-scheme pgg-default-scheme) - (point-min) (point-max) rcpts sign)))) + (point-min) (point-max) rcpts sign passphrase)))) + (when (interactive-p) + (pgg-display-output-buffer start end status)) + status)) + +;;;###autoload +(defun pgg-encrypt-symmetric-region (start end &optional passphrase) + "Encrypt the current region between START and END symmetric with passphrase. + +If optional PASSPHRASE is not specified, it will be obtained from the +cache or user." + (interactive "r") + (let ((status + (pgg-save-coding-system start end + (pgg-invoke "encrypt-symmetric-region" + (or pgg-scheme pgg-default-scheme) + (point-min) (point-max) passphrase)))) + (when (interactive-p) + (pgg-display-output-buffer start end status)) + status)) + +;;;###autoload +(defun pgg-encrypt-symmetric (&optional start end passphrase) + "Encrypt the current buffer using a symmetric, rather than key-pair, cipher. + +If optional arguments START and END are specified, only encrypt within +the region. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." + (interactive) + (let* ((start (or start (point-min))) + (end (or end (point-max))) + (status (pgg-encrypt-symmetric-region start end passphrase))) (when (interactive-p) (pgg-display-output-buffer start end status)) status)) ;;;###autoload -(defun pgg-encrypt (rcpts &optional sign start end) +(defun pgg-encrypt (rcpts &optional sign start end passphrase) "Encrypt the current buffer for RCPTS. + If optional argument SIGN is non-nil, do a combined sign and encrypt. + If optional arguments START and END are specified, only encrypt within -the region." +the region. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." (interactive (list (split-string (read-string "Recipients: ") "[ \t,]+"))) (let* ((start (or start (point-min))) (end (or end (point-max))) - (status (pgg-encrypt-region start end rcpts sign))) + (status (pgg-encrypt-region start end rcpts sign passphrase))) (when (interactive-p) (pgg-display-output-buffer start end status)) status)) ;;;###autoload -(defun pgg-decrypt-region (start end) - "Decrypt the current region between START and END." +(defun pgg-decrypt-region (start end &optional passphrase) + "Decrypt the current region between START and END. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." (interactive "r") (let* ((buf (current-buffer)) (status (pgg-save-coding-system start end (pgg-invoke "decrypt-region" (or pgg-scheme pgg-default-scheme) - (point-min) (point-max))))) + (point-min) (point-max) passphrase)))) (when (interactive-p) (pgg-display-output-buffer start end status)) status)) ;;;###autoload -(defun pgg-decrypt (&optional start end) +(defun pgg-decrypt (&optional start end passphrase) "Decrypt the current buffer. + If optional arguments START and END are specified, only decrypt within -the region." +the region. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." (interactive "") (let* ((start (or start (point-min))) (end (or end (point-max))) @@ -277,38 +328,52 @@ status)) ;;;###autoload -(defun pgg-sign-region (start end &optional cleartext) +(defun pgg-sign-region (start end &optional cleartext passphrase) "Make the signature from text between START and END. + If the optional 3rd argument CLEARTEXT is non-nil, it does not create a detached signature. + If this function is called interactively, CLEARTEXT is enabled -and the the output is displayed." +and the the output is displayed. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." (interactive "r") (let ((status (pgg-save-coding-system start end (pgg-invoke "sign-region" (or pgg-scheme pgg-default-scheme) (point-min) (point-max) - (or (interactive-p) cleartext))))) + (or (interactive-p) cleartext) + passphrase)))) (when (interactive-p) (pgg-display-output-buffer start end status)) status)) ;;;###autoload -(defun pgg-sign (&optional cleartext start end) +(defun pgg-sign (&optional cleartext start end passphrase) "Sign the current buffer. + If the optional argument CLEARTEXT is non-nil, it does not create a detached signature. + If optional arguments START and END are specified, only sign data within the region. + If this function is called interactively, CLEARTEXT is enabled -and the the output is displayed." +and the the output is displayed. + +If optional PASSPHRASE is not specified, it will be obtained from the +passphrase cache or user." (interactive "") (let* ((start (or start (point-min))) (end (or end (point-max))) - (status (pgg-sign-region start end (or (interactive-p) cleartext)))) + (status (pgg-sign-region start end + (or (interactive-p) cleartext) + passphrase))) (when (interactive-p) (pgg-display-output-buffer start end status)) status)) - + ;;;###autoload (defun pgg-verify-region (start end &optional signature fetch) "Verify the current region between START and END. ------=_Part_14419_29679848.1128798989222 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel ------=_Part_14419_29679848.1128798989222--