Chromium Code Reviews| Index: crypto/sha1.dart |
| =================================================================== |
| --- crypto/sha1.dart (revision 0) |
| +++ crypto/sha1.dart (revision 0) |
| @@ -0,0 +1,72 @@ |
| +class SHA1 { |
|
Mads Ager (google)
2012/04/24 09:57:46
Copyright.
Søren Gjesse
2012/04/24 10:30:56
Shouldn't we define an interface common for all ha
Ivan Posva
2012/04/24 13:02:36
Since this has only a static method an implementin
Ivan Posva
2012/04/24 13:02:36
Done.
|
| + static List<int> digest(List<int> input, |
| + [int offset = 0, |
| + int len = null]) { |
| + var input_len = input.length; |
| + if ((offset < 0) || (offset > input_len)) { |
| + throw new IllegalArgumentException("Invalid offset ($offset)."); |
| + } |
| + if (len == null) { |
| + len = input_len - offset; |
|
Ivan Posva
2012/04/24 09:23:53
It might be bad form to overwrite the input, what
Søren Gjesse
2012/04/24 10:30:56
I have no problem with that.
|
| + } |
| + if ((len < 0) || ((offset + len) > input_len)) { |
| + throw new IllegalArgumentException("Invalid length ($len) for " |
| + "offset ($offset) and input length (input_len)."); |
| + } |
| + |
| + // Round up to 512 bit size. |
| + var m_len = _roundUp((len * _BITS_PER_BYTE) + 65, _BITS_PER_CHUNK); |
| + m_len = m_len ~/ _BITS_PER_WORD; |
| + var m = new List<int>(m_len); |
| + |
| + _bytesToWords(input, offset, len, m, 0, m_len); |
| + |
| + var l = len * 8; |
| + var w = new List<int>(80); |
| + var H0 = 0x67452301; |
| + var H1 = 0xEFCDAB89; |
| + var H2 = 0x98BADCFE; |
| + var H3 = 0x10325476; |
| + var H4 = 0xC3D2E1F0; |
| + |
| + m[l >> 5] |= 0x80 << (24 - l % 32); |
| + m[(((l + 64) >> 9) << 4) + 15] = l; |
|
Søren Gjesse
2012/04/24 10:30:56
If length is larger than (2^32 - 1) it should be s
Ivan Posva
2012/04/24 13:02:36
Added a TODO to deal with this once we support arr
|
| + |
| + for (var i = 0; i < m_len; i += 16) { |
| + var a = H0; |
| + var b = H1; |
| + var c = H2; |
| + var d = H3; |
| + var e = H4; |
| + |
| + for (var j = 0; j < 80; j++) { |
| + if (j < 16) { |
| + w[j] = m[i + j]; |
| + } else { |
| + var n = w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16]; |
| + w[j] = _rotl32(n, 1); |
| + } |
| + |
| + var t = _rotl32(a, 5) + e + w[j] + |
| + ((j < 20) ? (((b & c) | (~b & d)) + 0x5A827999) : |
|
Mads Ager (google)
2012/04/24 09:57:46
I would prefer the more readable version with if s
Ivan Posva
2012/04/24 13:02:36
Done.
|
| + (j < 40) ? ((b ^ c ^ d) + 0x6ED9EBA1) : |
| + (j < 60) ? (((b & c) | (b & d) | (c & d)) + 0x8F1BBCDC) : |
| + ((b ^ c ^ d) + 0xCA62C1D6)); |
| + e = d; |
| + d = c; |
| + c = _rotl32(b, 30); |
| + b = a; |
| + a = t & _MASK_32; |
| + } |
| + H0 = _add32(H0, a); |
| + H1 = _add32(H1, b); |
| + H2 = _add32(H2, c); |
| + H3 = _add32(H3, d); |
| + H4 = _add32(H4, e); |
| + } |
| + return _wordsToBytes([H0, H1, H2, H3, H4]); |
| + } |
| + |
| + static final int _BITS_PER_CHUNK = 512; |
| +} |
| + |