+(defun epa-decrypt-file (file)
+ (interactive "fFile: ")
+ (let* ((default-name (file-name-sans-extension file))
+ (plain (expand-file-name
+ (read-file-name
+ (concat "To file (default "
+ (file-name-nondirectory default-name)
+ ") ")
+ (file-name-directory default-name)
+ default-name)))
+ (context (epg-make-context)))
+ (message "Decrypting %s..." (file-name-nondirectory file))
+ (epg-decrypt-file context file plain)
+ (message "Decrypting %s...done" (file-name-nondirectory file))))
+
+(defun epa-verify-file (file)
+ (interactive "fFile: ")
+ (let* ((context (epg-make-context))
+ (plain (if (equal (file-name-extension file) "sig")
+ (file-name-sans-extension file)))
+ signature)
+ (message "Verifying %s..." (file-name-nondirectory file))
+ (epg-verify-file context file plain)
+ (setq signature (reverse (epg-context-result-for context 'verify)))
+ (with-output-to-temp-buffer "*epa-verify-file*"
+ (set-buffer standard-output)
+ (while signature
+ (insert (format "%s: %s %s %s\n"
+ (epg-signature-status (car signature))
+ (epg-signature-key-id (car signature))
+ (epg-signature-user-id (car signature))
+ (epg-signature-validity (car signature))))
+ (setq signature (cdr signature))))
+ (shrink-window-if-larger-than-buffer
+ (get-buffer-window "*epa-verify-file*"))
+ (message "Verifying %s...done" (file-name-nondirectory file))))
+
+(defun epa-sign-file (file detached)
+ (interactive
+ (list (expand-file-name (read-file-name "File: "))
+ current-prefix-arg))
+ (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 (if detached 'detached))
+ (message "Signing %s...done" (file-name-nondirectory file))))
+
+(defun epa-encrypt-file (file recipients)
+ (interactive
+ (list (expand-file-name (read-file-name "File: "))
+ (mapcar (lambda (key)
+ (epg-sub-key-id
+ (car (epg-key-sub-key-list key))))
+ (epa-select-keys "Select recipents for encryption.
+If no one is selected, symmetric encryption will be performed. "))))
+ (let ((cipher (concat file ".gpg"))
+ (context (epg-make-context)))
+ (message "Encrypting %s..." (file-name-nondirectory file))
+ (epg-encrypt-file context
+ file
+ recipients
+ cipher)
+ (message "Encrypting %s...done" (file-name-nondirectory file))))
+