• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.9.5/emacs-92/emacs/lisp/

Lines Matching +defs:pgg +defs:gpg +defs:symmetric +defs:key

0 ;;; pgg-gpg.el --- GnuPG support for PGG.
7 ;; Symmetric encryption and gpg-agent support added by:
32 (require 'cl) ; for gpg macros
33 (require 'pgg))
35 (defgroup pgg-gpg ()
37 :group 'pgg)
39 (defcustom pgg-gpg-program "gpg"
41 :group 'pgg-gpg
44 (defcustom pgg-gpg-extra-args nil
46 :group 'pgg-gpg
49 (defcustom pgg-gpg-recipient-argument "--recipient"
51 :group 'pgg-gpg
55 (defcustom pgg-gpg-use-agent t
56 "Whether to use gnupg agent for key caching."
57 :group 'pgg-gpg
60 (defvar pgg-gpg-user-id nil
63 (defun pgg-gpg-process-region (start end passphrase program args)
64 (let* ((use-agent (and (null passphrase) (pgg-gpg-use-agent-p)))
65 (output-file-name (pgg-make-temp-file "pgg-output"))
72 ,@pgg-gpg-extra-args ,@args))
73 (output-buffer pgg-output-buffer)
74 (errors-buffer pgg-errors-buffer)
94 (if pgg-passphrase-coding-system
100 pgg-passphrase-coding-system 'unix)))
101 (pgg-clear-string passphrase-with-newline))
116 (let ((coding-system-for-read (if pgg-text-mode
126 (pgg-clear-string passphrase-with-newline))
128 (pgg-clear-string encoded-passphrase-with-new-line))
135 (defun pgg-gpg-possibly-cache-passphrase (passphrase &optional key notruncate)
137 pgg-cache-passphrase
141 (pgg-add-passphrase-to-cache
142 (or key
151 (defvar pgg-gpg-all-secret-keys 'unknown)
153 (defun pgg-gpg-lookup-all-secret-keys ()
154 "Return all secret keys present in secret key ring."
155 (when (eq pgg-gpg-all-secret-keys 'unknown)
156 (setq pgg-gpg-all-secret-keys '())
160 (apply #'call-process pgg-gpg-program nil t nil args)
165 pgg-gpg-all-secret-keys)))))
166 pgg-gpg-all-secret-keys)
168 (defun pgg-gpg-lookup-key (string &optional type)
174 (apply #'call-process pgg-gpg-program nil t nil args)
180 (defun pgg-gpg-lookup-key-owner (string &optional all)
181 "Search keys associated with STRING and return owner of identified key.
183 The value may be just the bare key id, or it may be a combination of the
184 user name associated with the key and the key id, with the key id enclosed
191 (key-regexp (concat "^\\(sec\\|pub\\)"
195 (apply #'call-process pgg-gpg-program nil t nil args)
197 (if (re-search-forward key-regexp
201 (defun pgg-gpg-key-id-from-key-owner (key-owner)
202 (cond ((not key-owner) nil)
203 ;; Extract bare key id from outermost paired angle brackets, if any:
204 ((string-match "[^<]*<\\(.+\\)>[^>]*" key-owner)
205 (substring key-owner (match-beginning 1)(match-end 1)))
206 (key-owner)))
208 (defun pgg-gpg-encrypt-region (start end recipients &optional sign passphrase)
215 (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
217 (when (and sign (not (pgg-gpg-use-agent-p)))
218 (pgg-read-passphrase
220 pgg-gpg-user-id)
221 pgg-gpg-user-id))))
225 (if pgg-text-mode (list "--textmode"))
226 (if sign (list "--sign" "--local-user" pgg-gpg-user-id))
227 (if (or recipients pgg-encrypt-for-me)
230 (list pgg-gpg-recipient-argument rcpt))
232 (if pgg-encrypt-for-me
233 (list pgg-gpg-user-id)))))))))
234 (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
236 (with-current-buffer pgg-errors-buffer
238 (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
240 (pgg-gpg-possibly-cache-passphrase passphrase)))
241 (pgg-process-when-success)))
243 (defun pgg-gpg-encrypt-symmetric-region (start end &optional passphrase)
244 "Encrypt the current region between START and END with symmetric cipher.
249 (when (not (pgg-gpg-use-agent-p))
250 (pgg-read-passphrase
251 "GnuPG passphrase for symmetric encryption: "))))
253 (append (list "--batch" "--armor" "--symmetric" )
254 (if pgg-text-mode (list "--textmode")))))
255 (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
256 (pgg-process-when-success)))
258 (defun pgg-gpg-decrypt-region (start end &optional passphrase)
266 (pgg-decode-armor-region (point-min) (point-max))))
267 (secret-keys (pgg-gpg-lookup-all-secret-keys))
269 ;; any but the first secret key for which the message is
272 (key (pgg-gpg-select-matching-key message-keys secret-keys))
273 (key-owner (and key (pgg-gpg-lookup-key-owner key t)))
274 (key-id (pgg-gpg-key-id-from-key-owner key-owner))
275 (pgg-gpg-user-id (or key-id key
276 pgg-gpg-user-id pgg-default-user-id))
278 (when (not (pgg-gpg-use-agent-p))
279 (pgg-read-passphrase
280 (format (if (pgg-gpg-symmetric-key-p message-keys)
281 "Passphrase for symmetric decryption: "
283 (or key-owner "??"))
284 pgg-gpg-user-id))))
286 (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
287 (with-current-buffer pgg-errors-buffer
288 (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
293 (defun pgg-gpg-symmetric-key-p (message-keys)
294 "True if decoded armor MESSAGE-KEYS has symmetric encryption indicator."
296 (dolist (key message-keys result)
297 (when (and (eq (car key) 3)
298 (member '(symmetric-key-algorithm) key))
299 (setq result key)))))
301 (defun pgg-gpg-select-matching-key (message-keys secret-keys)
302 "Choose a key from MESSAGE-KEYS that matches one of the keys in SECRET-KEYS."
303 (loop for message-key in message-keys
304 for message-key-id = (and (equal (car message-key) 1)
305 (cdr (assq 'key-identifier
306 (cdr message-key))))
307 for key = (and message-key-id (pgg-lookup-key message-key-id 'encrypt))
308 when (and key (member key secret-keys)) return key))
310 (defun pgg-gpg-sign-region (start end &optional cleartext passphrase)
312 (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
314 (when (not (pgg-gpg-use-agent-p))
315 (pgg-read-passphrase
317 pgg-gpg-user-id)
318 pgg-gpg-user-id))))
322 "--local-user" pgg-gpg-user-id)
323 (if pgg-text-mode (list "--textmode"))))
326 (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
327 (with-current-buffer pgg-errors-buffer
329 (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
331 (pgg-gpg-possibly-cache-passphrase passphrase))
332 (pgg-process-when-success)))
334 (defun pgg-gpg-verify-region (start end &optional signature)
340 (pgg-gpg-process-region start end nil pgg-gpg-program args)
341 (with-current-buffer pgg-errors-buffer
343 (while (re-search-forward "^gpg: \\(.*\\)\n" nil t)
344 (with-current-buffer pgg-output-buffer
345 (insert-buffer-substring pgg-errors-buffer
351 (defun pgg-gpg-insert-key ()
352 "Insert public key at point."
353 (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
355 pgg-gpg-user-id)))
356 (pgg-gpg-process-region (point)(point) nil pgg-gpg-program args)
357 (insert-buffer-substring pgg-output-buffer)))
359 (defun pgg-gpg-snarf-keys-region (start end)
362 (pgg-gpg-process-region start end nil pgg-gpg-program args)
363 (set-buffer pgg-errors-buffer)
370 (insert (format "Imported %d key(s).
371 \tArmor contains %d key(s) [%d bad, %d old].\n"
381 (append-to-buffer pgg-output-buffer (point-min)(point-max))
382 (pgg-process-when-success)))
384 (defun pgg-gpg-update-agent ()
385 "Try to connet to gpg-agent and send UPDATESTARTUPTTY."
392 (make-network-process :name "gpg-agent-process"
399 ;; We can't check, so assume gpg-agent is up.
402 (defun pgg-gpg-use-agent-p ()
403 "Return t if `pgg-gpg-use-agent' is t and gpg-agent is available."
404 (and pgg-gpg-use-agent (pgg-gpg-update-agent)))
406 (provide 'pgg-gpg)
409 ;;; pgg-gpg.el ends here