On Tue, Oct 04, 2005 at 12:53:30PM +0200, Sascha Wilde wrote: > I'll try to find the time to make this a proper feature of pgg. (I > also added the original author to the cc, so he might add his > thoughts)
I attached a more complete patch, including documentation and
changelog entries.
Any comments, bug-fixes, flames are highly appreciated.
cheers
sascha
ps. I have no write access to CVS, so if there are no objections,
please commit.
--
Sascha Wilde
"Liebet eure Feinde, vielleicht schadet das ihrem Ruf"
(Stanislaw Jerzy Lec)
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 5 Oct 2005 16:09:13 -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
[EMAIL PROTECTED] 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.
[EMAIL PROTECTED] 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,10 @@
@var{recipients}. If @var{sign} is [EMAIL PROTECTED], do a combined sign
and encrypt. If encryption is successful, it returns @code{t},
otherwise @code{nil}.
+
+If @var{recipients} equals @code{:symmetric} a symmetric cipher together
+with a passphrase is used and @var{sign} is ignored. This feature 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.681
diff -u -r1.681 ChangeLog
--- man/ChangeLog 4 Oct 2005 22:52:16 -0000 1.681
+++ man/ChangeLog 5 Oct 2005 16:09:16 -0000
@@ -1,3 +1,11 @@
+2005-10-05 Sascha Wilde <[EMAIL PROTECTED]>
+
+ * 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 symmetric encryption feature in
+ `pgg-scheme-encrypt-region'.
+
2005-10-05 Nick Roberts <[EMAIL PROTECTED]>
* speedbar.texi (GDB): Describe use of watch expressions.
Index: lisp/gnus/pgg.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/gnus/pgg.el,v
retrieving revision 1.8
diff -u -r1.8 pgg.el
--- lisp/gnus/pgg.el 26 Aug 2005 00:02:05 -0000 1.8
+++ lisp/gnus/pgg.el 5 Oct 2005 16:09:17 -0000
@@ -4,6 +4,7 @@
;; 2005 Free Software Foundation, Inc.
;; Author: Daiki Ueno <[EMAIL PROTECTED]>
+;; Symmetric encryption added by: Sascha Wilde <[EMAIL PROTECTED]>
;; Created: 1999/10/28
;; Keywords: PGP
@@ -232,6 +233,34 @@
(pgg-save-coding-system start end
(pgg-invoke "encrypt-region" (or pgg-scheme pgg-default-scheme)
(point-min) (point-max) rcpts sign))))
+ (when (interactive-p)
+ (pgg-display-output-buffer start end status))
+ status))
+
+;;;###autoload
+(defun pgg-encrypt-symmetric-region (start end)
+ "Encrypt the current region between START and END symmetric with passphrase."
+ (interactive "r")
+ (when (not (member (or pgg-scheme pgg-default-scheme)
+ pgg-symmetric-encryption-schemes))
+ (error "Symmetric encryption is not implemented for selected scheme."))
+ (let ((status
+ (pgg-save-coding-system start end
+ (pgg-invoke "encrypt-region" (or pgg-scheme pgg-default-scheme)
+ (point-min) (point-max) :symmetric))))
+ (when (interactive-p)
+ (pgg-display-output-buffer start end status))
+ status))
+
+;;;###autoload
+(defun pgg-encrypt-symmetric (&optional start end)
+ "Encrypt the current buffer symmetric with passphrase.
+If optional arguments START and END are specified, only encrypt within
+the region."
+ (interactive)
+ (let* ((start (or start (point-min)))
+ (end (or end (point-max)))
+ (status (pgg-encrypt-symmetric-region start end)))
(when (interactive-p)
(pgg-display-output-buffer start end status))
status))
Index: lisp/gnus/pgg-gpg.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/gnus/pgg-gpg.el,v
retrieving revision 1.6
diff -u -r1.6 pgg-gpg.el
--- lisp/gnus/pgg-gpg.el 6 Aug 2005 19:51:42 -0000 1.6
+++ lisp/gnus/pgg-gpg.el 5 Oct 2005 16:09:17 -0000
@@ -4,6 +4,7 @@
;; 2005 Free Software Foundation, Inc.
;; Author: Daiki Ueno <[EMAIL PROTECTED]>
+;; Symmetric encryption added by: Sascha Wilde <[EMAIL PROTECTED]>
;; Created: 1999/10/28
;; Keywords: PGP, OpenPGP, GnuPG
@@ -141,24 +142,32 @@
(defun pgg-gpg-encrypt-region (start end recipients &optional sign)
"Encrypt the current region between START and END.
+If recipients is :symmetric do symmetric encryption
If optional argument SIGN is non-nil, do a combined sign and encrypt."
(let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
+ (symmetric-encryption (eq recipients :symmetric))
(passphrase
- (when sign
- (pgg-read-passphrase
- (format "GnuPG passphrase for %s: " pgg-gpg-user-id)
- pgg-gpg-user-id)))
+ (if symmetric-encryption
+ (pgg-read-passphrase
+ "GnuPG passphrase for symmetric encryption: ")
+ (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" "--armor" "--always-trust"
+ (if symmetric-encryption "--symmetric" "--encrypt"))
(if sign (list "--sign" "--local-user" pgg-gpg-user-id))
- (if recipients
- (apply #'nconc
- (mapcar (lambda (rcpt)
- (list pgg-gpg-recipient-argument rcpt))
- (append recipients
- (if pgg-encrypt-for-me
- (list pgg-gpg-user-id)))))))))
+ (if symmetric-encryption
+ nil
+ (if recipients
+ (apply #'nconc
+ (mapcar (lambda (rcpt)
+ (list pgg-gpg-recipient-argument rcpt))
+ (append recipients
+ (if pgg-encrypt-for-me
+ (list pgg-gpg-user-id))))))))))
(pgg-as-lbt start end 'CRLF
(pgg-gpg-process-region start end passphrase pgg-gpg-program args))
(when sign
@@ -180,7 +189,10 @@
(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)
+ (format (if (pgg-gpg-symmetric-key-p message-keys)
+ "Passphrase for symmetric dencryption: "
+ "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)
@@ -188,6 +200,13 @@
(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."
+ (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: lisp/gnus/pgg-def.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/gnus/pgg-def.el,v
retrieving revision 1.7
diff -u -r1.7 pgg-def.el
--- lisp/gnus/pgg-def.el 6 Aug 2005 19:51:42 -0000 1.7
+++ lisp/gnus/pgg-def.el 5 Oct 2005 16:09:17 -0000
@@ -3,6 +3,7 @@
;; Copyright (C) 1999, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
;; Author: Daiki Ueno <[EMAIL PROTECTED]>
+;; Symmetric encryption added by: Sascha Wilde <[EMAIL PROTECTED]>
;; Created: 1999/11/02
;; Keywords: PGP, OpenPGP, GnuPG
@@ -83,6 +84,9 @@
(defvar pgg-scheme nil
"Current scheme of PGP implementation.")
+
+(defconst pgg-symmetric-encryption-schemes '(gpg)
+ "Schemes of PGP implementation for which symmetric encrypt is implemented.")
(defmacro pgg-truncate-key-identifier (key)
`(if (> (length ,key) 8) (substring ,key 8) ,key))
Index: lisp/gnus/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/gnus/ChangeLog,v
retrieving revision 1.388
diff -u -r1.388 ChangeLog
--- lisp/gnus/ChangeLog 4 Oct 2005 22:51:06 -0000 1.388
+++ lisp/gnus/ChangeLog 5 Oct 2005 16:09:19 -0000
@@ -1,3 +1,15 @@
+2005-10-05 Sascha Wilde <[EMAIL PROTECTED]>
+
+ * pgg-def.el (pgg-symmetric-encryption-schemes): List of schemes
+ with symmetric encryption support.
+
+ * pgg-gpg.el (pgg-gpg-encrypt-region): Added symmetric encryption.
+ (pgg-gpg-symmetric-key-p): New function to check for an symmetric
+ encrypted session key.
+
+ * pgg.el (pgg-encrypt-symmetric,pgg-encrypt-symmetric-region):
+ New user commands for symmetric encryption.
+
2005-10-04 Reiner Steib <[EMAIL PROTECTED]>
* mm-url.el (mm-url-predefined-programs): Add switches for curl.
pgpOnK6ftc5hS.pgp
Description: PGP signature
_______________________________________________ Emacs-devel mailing list [email protected] http://lists.gnu.org/mailman/listinfo/emacs-devel
