(require 'epa) (require 'dired) (defvar epa-dired-map (let ((keymap (make-sparse-keymap))) (define-key keymap "d" 'epa-dired-do-decrypt) (define-key keymap "v" 'epa-dired-do-verify) (define-key keymap "s" 'epa-dired-do-sign) (define-key keymap "e" 'epa-dired-do-encrypt) keymap)) (fset 'epa-dired-prefix epa-dired-map) (defun epa-dired-setup () (add-hook 'dired-mode-hook 'epa-dired-mode-hook)) (defun epa-dired-mode-hook () (define-key dired-mode-map ":" 'epa-dired-prefix)) (defun epa-dired-decrypt-file (file) (let ((context (epg-make-context))) (message "Decrypting %s..." (file-name-nondirectory file)) (epg-decrypt-file context file) (message "Decrypting %s...done" (file-name-nondirectory file)))) (defun epa-dired-do-decrypt () (interactive) (let ((file-list (dired-get-marked-files))) (while file-list (epa-dired-decrypt-file (car file-list)) (setq file-list (cdr file-list))))) (defun epa-dired-verify-file (file) (let* ((context (epg-make-context)) (plain (if (equal (file-name-extension file) "sig") (file-name-sans-extension file)))) (message "Verifying %s..." (file-name-nondirectory file)) (epg-verify-file context file plain) (message "Verifying %s...done" (file-name-nondirectory file)))) (defun epa-dired-do-verify () (interactive) (let ((file-list (dired-get-marked-files))) (while file-list (epa-dired-verify-file (car file-list)) (setq file-list (cdr file-list))))) (defun epa-dired-sign-file (file detached) (let ((signature (concat file (if detached ".sig" ".gpg"))) (context (epg-make-context))) (message "Signing %s..." (file-name-nondirectory file)) (epg-sign-file context file signature) (message "Signing %s...done" (file-name-nondirectory file)))) (defun epa-dired-do-sign (&optional detached) (interactive "p") (let ((file-list (dired-get-marked-files))) (while file-list (epa-dired-sign-file (expand-file-name (car file-list)) detached) (setq file-list (cdr file-list))) (revert-buffer))) (defun epa-dired-encrypt-file (keys file) (let ((cipher (concat file ".gpg")) (context (epg-make-context))) (message "Encrypting %s..." (file-name-nondirectory file)) (epg-encrypt-file context file (mapcar (lambda (key) (epg-sub-key-id (car (epg-key-sub-key-list key)))) keys) cipher) (message "Encrypting %s...done" (file-name-nondirectory file)))) (defun epa-dired-do-encrypt () (interactive) (let ((file-list (dired-get-marked-files))) (while file-list (epa-ask-keys "Select keys for encryption. \ If no keys are selected, symmetric encryption will be performed. " #'epa-dired-encrypt-file nil (expand-file-name (car file-list))) (setq file-list (cdr file-list))))) (provide 'epa-dired) ;;; epa-dired.el ends here