+(defun epa-exit-buffer ()
+ (interactive)
+ (funcall epa-exit-buffer-function))
+
+(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))))
+ (message "Verifying %s..." (file-name-nondirectory file))
+ (epg-verify-file context file plain)
+ (message "Verifying %s...done" (file-name-nondirectory file))
+ (message "%s"
+ (epg-verify-result-to-string
+ (epg-context-result-for context 'verify)))))
+
+(defun epa-sign-file (file detached)
+ (interactive
+ (list (expand-file-name (read-file-name "File: "))
+ (y-or-n-p "Make a detached signature? ")))
+ (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 (not (null detached)))
+ (message "Signing %s...done" (file-name-nondirectory file))))
+
+(defun epa-encrypt-file (file recipients)
+ (interactive
+ (list (expand-file-name (read-file-name "File: "))
+ (epa-select-keys (epg-make-context) "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))))
+
+(defun epa-delete-keys (keys)
+ (interactive
+ (let ((keys (epa-marked-keys)))
+ (unless keys
+ (error "No keys selected"))
+ (list keys)))
+ (let ((context (epg-make-context)))
+ (message "Deleting...")
+ (epg-delete-keys context keys)
+ (apply #'epa-list-keys epa-list-keys-arguments)
+ (message "Deleting...done")))
+
+(defun epa-import-keys (file)
+ (interactive "fFile: ")
+ (let ((context (epg-make-context)))
+ (message "Importing %s..." (file-name-nondirectory file))
+ (epg-import-keys-from-file context (expand-file-name file))
+ (apply #'epa-list-keys epa-list-keys-arguments)
+ (message "Importing %s...done" (file-name-nondirectory file))))
+
+(defun epa-export-keys (keys file)
+ (interactive
+ (let ((keys (epa-marked-keys))
+ default-name)
+ (unless keys
+ (error "No keys selected"))
+ (setq default-name
+ (expand-file-name
+ (concat (epg-sub-key-id (car (epg-key-sub-key-list (car keys))))
+ ".gpg")
+ default-directory))
+ (list keys
+ (expand-file-name
+ (read-file-name
+ (concat "To file (default "
+ (file-name-nondirectory default-name)
+ ") ")
+ (file-name-directory default-name)
+ default-name)))))
+ (let ((context (epg-make-context)))
+ (message "Exporting to %s..." (file-name-nondirectory file))
+ (epg-export-keys-to-file context keys file)
+ (message "Exporting to %s...done" (file-name-nondirectory file))))
+
+(defun epa-sign-keys (keys &optional local)
+ (interactive
+ (let ((keys (epa-marked-keys)))
+ (unless keys
+ (error "No keys selected"))
+ (list keys current-prefix-arg)))
+ (let ((context (epg-make-context)))
+ (message "Signing keys...")
+ (epg-sign-keys context keys local)
+ (message "Signing keys...done")))
+