Closed GoogleCodeExporter closed 8 years ago
You're right. Hash functions like SHA and MD5 append the message length in bits
to the end of the message. By definition, that length is a 64-bit number. But
several JS implementations, including CryptoJS, counted using only a 32-bit
number. That decision was partly for simplicity, partly because it was hard to
imagine using JavaScript to hash 512 MB or more. Nonetheless, it's a flaw, and
I'll have it corrected.
Original comment by Jeff.Mott.OR
on 4 Sep 2012 at 11:11
My colegue found a solution. Change the line 135 of the sha256.js file from:
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
to:
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal /
4294967296);
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal & 0xFFFFFFFF;
(Sorry I don't have the diff file...)
Original comment by rcsilv...@gmail.com
on 4 Sep 2012 at 11:18
Yes, that's definitely an improvement. JavaScript numbers are 64-bit floating
point (aka double), so we get 53-bits before we start losing precision. Your
colleague increased possible message lengths from 32 to 53-bits. I'll also look
into a fix to get the full 64-bits.
Original comment by Jeff.Mott.OR
on 5 Sep 2012 at 12:31
I think I'm seeing this issue for SHA1 and MD5. 53bits doesn't sound to shabby.
Not sure anyone wants to hash more than a petabyte in js anytime soon. I
definitely don't need the full two exabytes ;-)
Original comment by hacker.s...@gmail.com
on 27 Sep 2012 at 12:03
Latest release includes your colleague's solution.
Original comment by Jeff.Mott.OR
on 7 Jan 2013 at 1:57
Great! Many thanks!
Original comment by rcsilv...@gmail.com
on 7 Jan 2013 at 3:48
Original issue reported on code.google.com by
rcsilv...@gmail.com
on 4 Sep 2012 at 10:40Attachments: