Function: mml-smime-openssl-verify
mml-smime-openssl-verify is a byte-compiled function defined in
mml-smime.el.gz.
Signature
(mml-smime-openssl-verify HANDLE CTL)
Source Code
;; Defined in /usr/src/emacs/lisp/gnus/mml-smime.el.gz
(defun mml-smime-openssl-verify (handle ctl)
(with-temp-buffer
(insert-buffer-substring (mm-handle-multipart-original-buffer ctl))
(goto-char (point-min))
(insert (format "Content-Type: %s; " (mm-handle-media-type ctl)))
(insert (format "protocol=\"%s\"; "
(mm-handle-multipart-ctl-parameter ctl 'protocol)))
(insert (format "micalg=\"%s\"; "
(mm-handle-multipart-ctl-parameter ctl 'micalg)))
(insert (format "boundary=\"%s\"\n\n"
(mm-handle-multipart-ctl-parameter ctl 'boundary)))
(when (get-buffer smime-details-buffer)
(kill-buffer smime-details-buffer))
(let ((buf (current-buffer))
(good-signature (smime-noverify-buffer))
(good-certificate (and (or smime-CA-file smime-CA-directory)
(smime-verify-buffer)))
addresses openssl-output)
(setq openssl-output (with-current-buffer smime-details-buffer
(buffer-string)))
(if (not good-signature)
(progn
;; we couldn't verify message, fail with openssl output as message
(mm-sec-error
'gnus-info "Failed"
'gnus-details
(concat "OpenSSL failed to verify message integrity:\n"
"-------------------------------------------\n"
openssl-output)))
;; verify mail addresses in mail against those in certificate
(when (and (smime-pkcs7-region (point-min) (point-max))
(smime-pkcs7-certificates-region (point-min) (point-max)))
(with-temp-buffer
(insert-buffer-substring buf)
(goto-char (point-min))
(while (re-search-forward "-----END CERTIFICATE-----" nil t)
(when (smime-pkcs7-email-region (point-min) (point))
(setq addresses (append (smime-buffer-as-string-region
(point-min) (point))
addresses)))
(delete-region (point-min) (point)))
(setq addresses (mapcar #'downcase addresses))))
(if (not (member (downcase (or (mm-handle-multipart-from ctl) ""))
addresses))
(mm-sec-error 'gnus-info "Sender address forged")
(if good-certificate
(mm-sec-status 'gnus-info "Ok (sender authenticated)")
(mm-sec-status 'gnus-info "Ok (sender not trusted)")))
(mm-sec-status
'gnus-details
(concat "Sender claimed to be: " (mm-handle-multipart-from ctl) "\n"
(if addresses
(concat "Addresses in certificate: "
(mapconcat #'identity addresses ", "))
"No addresses found in certificate. (Requires OpenSSL 0.9.6 or later.)")
"\n" "\n"
"OpenSSL output:\n"
"---------------\n" openssl-output "\n"
"Certificate(s) inside S/MIME signature:\n"
"---------------------------------------\n"
(buffer-string) "\n")))))
handle)