| Index: lib/src/sha1.dart
|
| diff --git a/lib/src/sha1.dart b/lib/src/sha1.dart
|
| index 7041a6ff75c9d8f50c4641fdc41b269fafc2e4d2..098b0a841725ebf53411a2117ae247eaaba101d5 100644
|
| --- a/lib/src/sha1.dart
|
| +++ b/lib/src/sha1.dart
|
| @@ -24,64 +24,67 @@ abstract class SHA1 implements Hash {
|
| /// This is separate so that it can extend [HashBase] without leaking additional
|
| /// public memebers.
|
| class _SHA1 extends HashBase implements SHA1 {
|
| + final digest = new Uint32List(5);
|
| +
|
| /// The sixteen words from the original chunk, extended to 80 words.
|
| ///
|
| /// This is an instance variable to avoid re-allocating, but its data isn't
|
| /// used across invocations of [updateHash].
|
| - final Uint32List _w;
|
| + final Uint32List _extended;
|
|
|
| _SHA1()
|
| - : _w = new Uint32List(80),
|
| - super(16, 5, true) {
|
| - h[0] = 0x67452301;
|
| - h[1] = 0xEFCDAB89;
|
| - h[2] = 0x98BADCFE;
|
| - h[3] = 0x10325476;
|
| - h[4] = 0xC3D2E1F0;
|
| + : _extended = new Uint32List(80),
|
| + super(16) {
|
| + digest[0] = 0x67452301;
|
| + digest[1] = 0xEFCDAB89;
|
| + digest[2] = 0x98BADCFE;
|
| + digest[3] = 0x10325476;
|
| + digest[4] = 0xC3D2E1F0;
|
| }
|
|
|
| - SHA1 newInstance() {
|
| - return new _SHA1();
|
| - }
|
| + SHA1 newInstance() => new _SHA1();
|
|
|
| - void updateHash(Uint32List m) {
|
| - assert(m.length == 16);
|
| + void updateHash(Uint32List chunk) {
|
| + assert(chunk.length == 16);
|
|
|
| - var a = h[0];
|
| - var b = h[1];
|
| - var c = h[2];
|
| - var d = h[3];
|
| - var e = h[4];
|
| + var a = digest[0];
|
| + var b = digest[1];
|
| + var c = digest[2];
|
| + var d = digest[3];
|
| + var e = digest[4];
|
|
|
| for (var i = 0; i < 80; i++) {
|
| if (i < 16) {
|
| - _w[i] = m[i];
|
| + _extended[i] = chunk[i];
|
| } else {
|
| - var n = _w[i - 3] ^ _w[i - 8] ^ _w[i - 14] ^ _w[i - 16];
|
| - _w[i] = rotl32(n, 1);
|
| + _extended[i] = rotl32(
|
| + _extended[i - 3] ^ _extended[i - 8] ^ _extended[i - 14] ^
|
| + _extended[i - 16],
|
| + 1);
|
| }
|
| - var t = add32(add32(rotl32(a, 5), e), _w[i]);
|
| +
|
| + var newA = add32(add32(rotl32(a, 5), e), _extended[i]);
|
| if (i < 20) {
|
| - t = add32(add32(t, (b & c) | (~b & d)), 0x5A827999);
|
| + newA = add32(add32(newA, (b & c) | (~b & d)), 0x5A827999);
|
| } else if (i < 40) {
|
| - t = add32(add32(t, (b ^ c ^ d)), 0x6ED9EBA1);
|
| + newA = add32(add32(newA, (b ^ c ^ d)), 0x6ED9EBA1);
|
| } else if (i < 60) {
|
| - t = add32(add32(t, (b & c) | (b & d) | (c & d)), 0x8F1BBCDC);
|
| + newA = add32(add32(newA, (b & c) | (b & d) | (c & d)), 0x8F1BBCDC);
|
| } else {
|
| - t = add32(add32(t, b ^ c ^ d), 0xCA62C1D6);
|
| + newA = add32(add32(newA, b ^ c ^ d), 0xCA62C1D6);
|
| }
|
|
|
| e = d;
|
| d = c;
|
| c = rotl32(b, 30);
|
| b = a;
|
| - a = t & MASK_32;
|
| + a = newA & mask32;
|
| }
|
|
|
| - h[0] = add32(a, h[0]);
|
| - h[1] = add32(b, h[1]);
|
| - h[2] = add32(c, h[2]);
|
| - h[3] = add32(d, h[3]);
|
| - h[4] = add32(e, h[4]);
|
| + digest[0] = add32(a, digest[0]);
|
| + digest[1] = add32(b, digest[1]);
|
| + digest[2] = add32(c, digest[2]);
|
| + digest[3] = add32(d, digest[3]);
|
| + digest[4] = add32(e, digest[4]);
|
| }
|
| }
|
|
|