diff --git a/sha1.html b/sha1.html new file mode 100644 index 0000000..b970d9b --- /dev/null +++ b/sha1.html @@ -0,0 +1,14 @@ + + + + + Sha1 + + + + + + blah + + + diff --git a/sha1.js b/sha1.js new file mode 100644 index 0000000..7af694d --- /dev/null +++ b/sha1.js @@ -0,0 +1,85 @@ +function char_code_to_bytes(code) +{ + var result = []; + do + { + result.push(code & 0xff); + code = code >> 8; + } while (code); + return result.reverse(); +} + +function str_to_bytes(str) +{ + var result = []; + for (var i = 0; i < str.length; i++) + { + result = result.concat( char_code_to_bytes(str.charCodeAt(i)) ); + }; + return result; +} + +function num_to_big_endian_64(num) +{ + return [ + (num & 0xff00000000000000) >>> 56, + (num & 0x00ff000000000000) >>> 48, + (num & 0x0000ff0000000000) >>> 40, + (num & 0x000000ff00000000) >>> 32, + (num & 0x00000000ff000000) >>> 24, + (num & 0x0000000000ff0000) >>> 16, + (num & 0x000000000000ff00) >>> 8, + (num & 0x00000000000000ff) + ]; +} + +function bytes_to_big_endian_32(array) +{ + var result = []; + for (var i = 0; i < (array.length/4); i++) + { + result.push((array[i*4+0] << 24) | (array[i*4+1] << 16) | (array[i*4+2] << 8) | array[i*4+3]); + }; + return result; +} + +function sha1(text) +{ + // get text into byte array + var message = str_to_bytes(text); + var message_size_in_bits = message.length * 8; + + // Initialize variables: + var h0 = 0x67452301; + var h1 = 0xEFCDAB89; + var h2 = 0x98BADCFE; + var h3 = 0x10325476; + var h4 = 0xC3D2E1F0; + + // Pre-processing: + + // append the bit '1' to the message + message.push(0x80); + + // append (0 <= k < 512) bits '0', so that the resulting message length (in bits) is congruent to 448 = -64 (mod 512) + while ((message.length + 8) % 64) + message.push(0); + + // append length of message (before pre-processing), in bits, as 64-bit big-endian integer + message = message.concat(num_to_big_endian_64(message_size_in_bits)); + + // Process the message in successive 512-bit chunks: + + // break message into 512-bit chunks + for (var i_chunk = 0; i_chunk < (message.length/8); i_chunk++) + { + // break chunk into sixteen 32-bit big-endian words w[i], 0 <= i <= 15 + var w = bytes_to_big_endian_32(message); + }; + + return message; +} + +str_to_bytes("A\u1242B\u4123C"); // [65, 18, 66, 66, 65, 35, 67] + +sha1("The quick brown fox jumps over the lazy dog"); // 2fd4e1c6 7a2d28fc ed849ee1 bb76e739 1b93eb12