Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Side by Side Diff: crypto/sha1.dart

Issue 10196011: - Add lib/crypto. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698