(define md5 (digest-by-name "md5")) (define sha1 (digest-by-name "sha1")) (define sha256 (digest-by-name "sha256")) (define digests (digest-list)) (test-assert "Digest list is not empty" (pair? digests)) (for-each (lambda (name) (test-assert (format "~a digest in list" name) (member name digests)) (test-assert (format "~a digest available" name) (digest-by-name name))) '("md5" "sha1" "sha256")) (test-assert "Bogus digest" (not (digest-by-name "sha42"))) (test "Digest sizes" '(16 20 32) (map digest-size (list md5 sha1 sha256))) (test "Digest block sizes" '(64 64 64) (map digest-block-size (list md5 sha1 sha256))) (let ((ctx (digest-context-allocate!))) (digest-context-init! ctx md5) (digest-context-update! ctx (make-blob 0)) (test "Low-level API works" "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e" (digest-context-final! ctx)) (digest-context-reset! ctx) (digest-context-init! ctx md5) (digest-context-update! ctx (make-blob 0)) (test "Resetting the context works" "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e" (digest-context-final! ctx)) (digest-context-free! ctx) (test-error "Error when accessing freed context" (digest-context-init! ctx md5))) (test "Port API works" "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e" (call-with-output-string (lambda (out) (let ((out (open-digest-port md5 out))) (display "" out) (close-output-port out))))) (test "MD5 hash (empty)" "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e" (string-digest md5 "")) (test "MD5 hash (short)" "\x90\x01\x50\x98\x3c\xd2\x4f\xb0\xd6\x96\x3f\x7d\x28\xe1\x7f\x72" (string-digest md5 "abc")) (test "MD5 hash (long)" "\xc3\xfc\xd3\xd7\x61\x92\xe4\x00\x7d\xfb\x49\x6c\xca\x67\xe1\x3b" (string-digest md5 "abcdefghijklmnopqrstuvwxyz")) (test "SHA1 hash (empty)" "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18\x90\xaf\xd8\x07\x09" (string-digest sha1 "")) (test "SHA1 hash (short)" "\xbf\x36\xed\x5d\x74\x72\x7d\xfd\x5d\x78\x54\xec\x6b\x1d\x49\x46\x8d\x8e\xe8\xaa" (string-digest sha1 "\xdf\x4b\xd2")) (test "SHA1 hash (long)" "\x8b\xb8\xc0\xd8\x15\xa9\xc6\x8a\x1d\x29\x10\xf3\x9d\x94\x26\x03\xd8\x07\xfb\xcc" (string-digest sha1 "\x63\xa3\xcc\x83\xfd\x1e\xc1\xb6\x68\x0e\x99\x74\xa0\x51\x4e\x1a\x9e\xce\xbb\x6a")) (test "SHA256 hash (empty)" "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" (string-digest sha256 "")) (test "SHA256 hash (short)" "\xdf\xf2\xe7\x30\x91\xf6\xc0\x5e\x52\x88\x96\xc4\xc8\x31\xb9\x44\x86\x53\xdc\x2f\xf0\x43\x52\x8f\x67\x69\x43\x7b\xc7\xb9\x75\xc2" (string-digest sha256 "\xb4\x19\x0e")) (test "SHA256 hash (long)" "\x6d\xd5\x2b\x0d\x8b\x48\xcc\x81\x46\xce\xbd\x02\x16\xfb\xf5\xf6\xef\x7e\xea\xfc\x0f\xf2\xff\x9d\x14\x22\xd6\x34\x55\x55\xa1\x42" (string-digest sha256 "\xc1\xef\x39\xce\xe5\x8e\x78\xf6\xfc\xdc\x12\xe0\x58\xb7\xf9\x02\xac\xd1\xa9\x3b")) (define test-file (create-temporary-file)) (on-exit (lambda () (delete-file* test-file))) (test "File MD5 hash (empty)" "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e" (file-digest md5 test-file)) (test "File SHA1 hash (empty)" "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18\x90\xaf\xd8\x07\x09" (file-digest sha1 test-file)) (test "File SHA256 hash (empty)" "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" (file-digest sha256 test-file))