]>
Commit | Line | Data |
---|---|---|
e516cc76 CP |
1 | qwebirc.util.crypto.getARC4Stream = function(key, length) { |
2 | var s = []; | |
3 | ||
4 | var keyint = []; | |
5 | for(var i=0;i<key.length;i++) | |
6 | keyint.push(key.charCodeAt(i)); | |
7 | ||
8 | for(var i=0;i<256;i++) | |
9 | s[i] = i; | |
10 | ||
11 | var j = 0; | |
12 | for(var i=0;i<256;i++) { | |
13 | j = (j + s[i] + keyint[i % key.length]) & 255; | |
14 | var w = s[i]; s[i] = s[j]; s[j] = w; | |
15 | } | |
16 | ||
17 | var output = []; | |
18 | var i = 0; | |
19 | var j = 0; | |
20 | for(var k=0;k<length;k++) { | |
21 | i = (i + 1) & 255; | |
22 | j = (j + s[i]) & 255; | |
23 | ||
24 | var w = s[i]; s[i] = s[j]; s[j] = w; | |
25 | output.push(s[(s[i] + s[j]) & 255]); | |
26 | } | |
27 | return output; | |
28 | } | |
29 | ||
30 | qwebirc.util.crypto.xorStreams = function(data, prngstream) { | |
31 | if(data.length != prngstream.length) | |
32 | return; | |
33 | ||
34 | var output = []; | |
35 | for(var i=0;i<data.length;i++) | |
36 | output.push(String.fromCharCode(data.charCodeAt(i) ^ prngstream[i])); | |
37 | ||
38 | return output.join(""); | |
39 | } | |
40 | ||
41 | qwebirc.util.crypto.ARC4 = function(key, data) { | |
42 | var prngstream = qwebirc.util.crypto.getARC4Stream(key, data.length + 1024); | |
43 | /* burn first 1024 bytes */ | |
44 | prngstream = prngstream.slice(1024); | |
45 | ||
46 | return qwebirc.util.crypto.xorStreams(data, prngstream); | |
47 | } |