Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 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.
| |
| 2 static List<int> digest(List<int> input, | |
| 3 [int offset = 0, | |
| 4 int len = null]) { | |
| 5 var input_len = input.length; | |
| 6 if ((offset < 0) || (offset > input_len)) { | |
| 7 throw new IllegalArgumentException("Invalid offset ($offset)."); | |
| 8 } | |
| 9 if (len == null) { | |
| 10 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.
| |
| 11 } | |
| 12 if ((len < 0) || ((offset + len) > input_len)) { | |
| 13 throw new IllegalArgumentException("Invalid length ($len) for " | |
| 14 "offset ($offset) and input length (input_len)."); | |
| 15 } | |
| 16 | |
| 17 // Round up to 512 bit size. | |
| 18 var m_len = _roundUp((len * _BITS_PER_BYTE) + 65, _BITS_PER_CHUNK); | |
| 19 m_len = m_len ~/ _BITS_PER_WORD; | |
| 20 var m = new List<int>(m_len); | |
| 21 | |
| 22 _bytesToWords(input, offset, len, m, 0, m_len); | |
| 23 | |
| 24 var l = len * 8; | |
| 25 var w = new List<int>(80); | |
| 26 var H0 = 0x67452301; | |
| 27 var H1 = 0xEFCDAB89; | |
| 28 var H2 = 0x98BADCFE; | |
| 29 var H3 = 0x10325476; | |
| 30 var H4 = 0xC3D2E1F0; | |
| 31 | |
| 32 m[l >> 5] |= 0x80 << (24 - l % 32); | |
| 33 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
| |
| 34 | |
| 35 for (var i = 0; i < m_len; i += 16) { | |
| 36 var a = H0; | |
| 37 var b = H1; | |
| 38 var c = H2; | |
| 39 var d = H3; | |
| 40 var e = H4; | |
| 41 | |
| 42 for (var j = 0; j < 80; j++) { | |
| 43 if (j < 16) { | |
| 44 w[j] = m[i + j]; | |
| 45 } else { | |
| 46 var n = w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16]; | |
| 47 w[j] = _rotl32(n, 1); | |
| 48 } | |
| 49 | |
| 50 var t = _rotl32(a, 5) + e + w[j] + | |
| 51 ((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.
| |
| 52 (j < 40) ? ((b ^ c ^ d) + 0x6ED9EBA1) : | |
| 53 (j < 60) ? (((b & c) | (b & d) | (c & d)) + 0x8F1BBCDC) : | |
| 54 ((b ^ c ^ d) + 0xCA62C1D6)); | |
| 55 e = d; | |
| 56 d = c; | |
| 57 c = _rotl32(b, 30); | |
| 58 b = a; | |
| 59 a = t & _MASK_32; | |
| 60 } | |
| 61 H0 = _add32(H0, a); | |
| 62 H1 = _add32(H1, b); | |
| 63 H2 = _add32(H2, c); | |
| 64 H3 = _add32(H3, d); | |
| 65 H4 = _add32(H4, e); | |
| 66 } | |
| 67 return _wordsToBytes([H0, H1, H2, H3, H4]); | |
| 68 } | |
| 69 | |
| 70 static final int _BITS_PER_CHUNK = 512; | |
| 71 } | |
| 72 | |
| OLD | NEW |