mirror of
https://github.com/pmai/md5.git
synced 2025-12-21 14:34:29 +01:00
Enhance test code for incremental sums and portable character codes.
Previously the test cases relied on ASCII coding for characters, and didn't test incremental byte by byte checksum calculations.
This commit is contained in:
74
md5.lisp
74
md5.lisp
@ -685,28 +685,64 @@ according to the test suite in Appendix A.5 of RFC 1321")
|
|||||||
"AList of test input strings and stringified message-digests
|
"AList of test input strings and stringified message-digests
|
||||||
according to my additional test suite")
|
according to my additional test suite")
|
||||||
|
|
||||||
|
#+md5-testing
|
||||||
|
(defconstant +ascii-map+
|
||||||
|
'((#\A . 65) (#\B . 66) (#\C . 67) (#\D . 68) (#\E . 69) (#\F . 70)
|
||||||
|
(#\G . 71) (#\H . 72) (#\I . 73) (#\J . 74) (#\K . 75) (#\L . 76)
|
||||||
|
(#\M . 77) (#\N . 78) (#\O . 79) (#\P . 80) (#\Q . 81) (#\R . 82)
|
||||||
|
(#\S . 83) (#\T . 84) (#\U . 85) (#\V . 86) (#\W . 87) (#\X . 88)
|
||||||
|
(#\Y . 89) (#\Z . 90) (#\a . 97) (#\b . 98) (#\c . 99) (#\d . 100)
|
||||||
|
(#\e . 101) (#\f . 102) (#\g . 103) (#\h . 104) (#\i . 105) (#\j . 106)
|
||||||
|
(#\k . 107) (#\l . 108) (#\m . 109) (#\n . 110) (#\o . 111) (#\p . 112)
|
||||||
|
(#\q . 113) (#\r . 114) (#\s . 115) (#\t . 116) (#\u . 117) (#\v . 118)
|
||||||
|
(#\w . 119) (#\x . 120) (#\y . 121) (#\z . 122) (#\0 . 48) (#\1 . 49)
|
||||||
|
(#\2 . 50) (#\3 . 51) (#\4 . 52) (#\5 . 53) (#\6 . 54) (#\7 . 55)
|
||||||
|
(#\8 . 56) (#\9 . 57) (#\Space . 32))
|
||||||
|
"AList mapping string characters to ASCII codes for safe binary testing.")
|
||||||
|
|
||||||
#+md5-testing
|
#+md5-testing
|
||||||
(defun test-with-testsuite (testsuite)
|
(defun test-with-testsuite (testsuite)
|
||||||
(loop for count from 1
|
(flet ((to-vector (string)
|
||||||
for (source . md5-string) in testsuite
|
(loop with result = (make-array (list (length string))
|
||||||
for md5-digest = (md5sum-sequence source)
|
:element-type '(unsigned-byte 8))
|
||||||
for md5-result-string = (format nil "~(~{~2,'0X~}~)"
|
for char across string
|
||||||
(map 'list #'identity md5-digest))
|
for byte = (or (cdr (assoc char +ascii-map+))
|
||||||
do
|
(error "Missing Char in +ascii-map+: ~S" char))
|
||||||
(format
|
for index upfrom 0
|
||||||
|
do (setf (aref result index) byte)
|
||||||
|
finally (return result)))
|
||||||
|
(incremental-md5sum (input)
|
||||||
|
(loop with state = (make-md5-state)
|
||||||
|
for index from 0 below (length input)
|
||||||
|
do (update-md5-state state input :start index :end (1+ index))
|
||||||
|
finally (return (finalize-md5-state state)))))
|
||||||
|
(loop for count from 1
|
||||||
|
for (source . md5-string) in testsuite
|
||||||
|
for binary-source = (to-vector source)
|
||||||
|
for md5-digest = (md5sum-sequence binary-source)
|
||||||
|
for md5-digest-inc = (incremental-md5sum binary-source)
|
||||||
|
for md5-result-string = (format nil "~(~{~2,'0X~}~)"
|
||||||
|
(map 'list #'identity md5-digest))
|
||||||
|
for md5-result-string-inc = (format nil
|
||||||
|
"~(~{~2,'0X~}~)"
|
||||||
|
(map 'list #'identity md5-digest-inc))
|
||||||
|
do
|
||||||
|
(format
|
||||||
*trace-output*
|
*trace-output*
|
||||||
"~2&Test-Case ~D:~% Input: ~S~% Required: ~A~% Returned: ~A~%"
|
"~2&Test-Case ~D:~% Input: ~S~% Required: ~A~% Returned: ~A~% ~
|
||||||
count source md5-string md5-result-string)
|
Returned incrementally: ~A~%"
|
||||||
when (string= md5-string md5-result-string)
|
count source md5-string md5-result-string md5-result-string-inc)
|
||||||
do (format *trace-output* " OK~%")
|
when (and (string= md5-string md5-result-string)
|
||||||
else
|
(string= md5-string md5-result-string-inc))
|
||||||
count 1 into failed
|
do (format *trace-output* " OK~%")
|
||||||
and do (format *trace-output* " FAILED~%")
|
else
|
||||||
finally
|
count 1 into failed
|
||||||
(format *trace-output*
|
and do (format *trace-output* " FAILED~%")
|
||||||
"~2&~[All ~D test cases succeeded~:;~:*~D of ~D test cases failed~].~%"
|
finally
|
||||||
failed (1- count))
|
(format *trace-output*
|
||||||
(return (zerop failed))))
|
"~2&~[All ~D test cases succeeded~:;~:*~D of ~D test cases failed~].~%"
|
||||||
|
failed (1- count))
|
||||||
|
(return (zerop failed)))))
|
||||||
|
|
||||||
#+md5-testing
|
#+md5-testing
|
||||||
(defun test-rfc1321 ()
|
(defun test-rfc1321 ()
|
||||||
|
|||||||
Reference in New Issue
Block a user