=begin
I'll attach a proposed fix:
- make ((|context->buffer|)) an array of the type being expected by (({SHAXXX_Transform})) (rather than a byte array), so our compiler will align it, if necessary
- remove now unneeded casts when passing the buffer to (({SHAXXX_Transform}))
- use a cast-to-uint8 version of the buffer for byte access
the actual fix:
- for platforms which are not known to accept unaligned access to words (conditions taken from ((%regint.h%))), use existing buffering code in (({SHAXXX_Update})) to align data by copying
I am not too happy about the (({PLAT_NEED_ALIGNED_WORD_ACCESS})), it appears to me that checking architecture alignment requirements should be done in ((%autoconf%)) or similar. Also, the simplistic (({ALIGNOF()})) macro will not return the minimal alignment requirement, but rather the alignment the compiler has chosen for a struct (which may be more than minimal).
At any rate, the patch does the job.
=== Test
I've done basic regression testing by
- comparing the output of the following commands between x86 with unpatched 1.8.7-p175 i386-solaris2.11 and patched 1.9.2-p180:
ruby -e "require 'digest/sha2'; 1.upto(290+20) { |i| 1.upto(290+20) { |j| d= Digest::SHA256.new; p i.to_s+' '+j.to_s; ['a' * i, 'b' * j].each {|c| d.update(c)}; p d}}" >/tmp/sha_256.out &
ruby -e "require 'digest/sha2'; 1.upto(290+20) { |i| 1.upto(290+20) { |j| d= Digest::SHA512.new; p i.to_s+' '+j.to_s; ['a' * i, 'b' * j].each {|c| d.update(c)}; p d}}" >/tmp/sha_512.out &
- checksumming the contents of Solaris 10 SPARC ((%/usr/bin%)) with the vesions given above usind:
find . -type f | ruby -e "require 'digest/sha2'; ARGF.each_line { |fname| fname = fname.chomp; begin; p fname+': '+Digest::SHA256.file(fname).hexdigest; rescue; end; } " >/tmp/ruby_hash_n
So I presume SHA2 is working OK.
((%make check%)) returns
8063 tests, 1870484 assertions, 21 failures, 35 errors, 2 skips
but none of the failures/errors is related to digest.
=end