2000-10-28 Simon Josefsson <sj@extundo.com>
+ * smime.el (smime-dns-server): New variable.
+ (smime-mail-to-domain):
+ (smime-cert-by-dns): New functions.
+
* dig.el: New file.
2000-10-28 10:09:41 ShengHuo ZHU <zsh@cs.rochester.edu>
;;; Code:
+(require 'dig)
+(eval-when-compile (require 'cl))
+
(defgroup smime nil
"S/MIME configuration.")
:type 'string
:group 'smime)
+(defcustom smime-dns-server nil
+ "DNS server to query certificates from.
+If nil, use system defaults."
+ :type '(choice (const :tag "System defaults")
+ string)
+ :group 'dig)
+
;; OpenSSL wrappers.
(defun smime-call-openssl-region (b e buf &rest args)
(and (listp (car-safe smime-keys))
(caar smime-keys))))))))
+;; Find certificates
+
+(defun smime-mail-to-domain (mailaddr)
+ (if (string-match "@" mailaddr)
+ (replace-match "." 'fixedcase 'literal mailaddr)
+ mailaddr))
+
+(defun smime-cert-by-dns (mail)
+ (let* ((dig-dns-server smime-dns-server)
+ (digbuf (dig-invoke (smime-mail-to-domain mail) "cert" nil nil "+vc"))
+ (retbuf (generate-new-buffer (format "*certificate for %s*" mail)))
+ (certrr (with-current-buffer digbuf
+ (dig-extract-rr (smime-mail-to-domain mail) "cert")))
+ (cert (and certrr (dig-rr-get-pkix-cert certrr))))
+ (if cert
+ (with-current-buffer retbuf
+ (insert "-----BEGIN CERTIFICATE-----\n")
+ (let ((i 0) (len (length cert)))
+ (while (> (- len 64) i)
+ (insert (substring cert i (+ i 64)) "\n")
+ (setq i (+ i 64)))
+ (insert (substring cert i len) "\n"))
+ (insert "-----END CERTIFICATE-----\n"))
+ (kill-buffer retbuf)
+ (setq retbuf nil))
+ (kill-buffer digbuf)
+ retbuf))
+
;; User interface.
(defvar smime-buffer "*SMIME*")