舌足らずなブログ: あれ? がようやく解決したのでメモ。
こっちもxyzzyのエンコーディング指定と同じミスでした。
sha1.elはそれなりに長い文字列を受け取ると外部プロセスに処理を投げるので、その時の入力をバイナリ指定にしないといけないらしい。
(defun sha1-file (filename)
  (require 'sha1)
  (let ((coding-system-for-write 'binary))
    (with-temp-buffer
      (insert-file-contents filename)
      (sha1 (buffer-string)))))
ちなみにEmacs内部で処理する場合はエンコーディング指定は要らない。
(let ((sha1-use-external nil))
  (with-temp-buffer
    (insert-file-contents FILENAME)
    (sha1 (buffer-string))))