javascript-securehash-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ .bundle/
2
+ log/*.log
3
+ pkg/
4
+ test
5
+ test/dummy/db/*.sqlite3
6
+ test/dummy/log/*.log
7
+ test/dummy/tmp/
8
+ test/dummy/.sass-cache
9
+ lib/tasks
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Declare your gem's dependencies in javascript-securehash-rails.gemspec.
4
+ # Bundler will treat runtime dependencies like base dependencies, and
5
+ # development dependencies will be added by default to the :development group.
6
+ gemspec
7
+
8
+ # jquery-rails is used by the dummy application
9
+ gem "jquery-rails"
10
+
11
+ # Declare any dependencies that are still in development here instead of in
12
+ # your gemspec. These might include edge Rails or gems from your path or
13
+ # Git. Remember to move these dependencies to your gemspec before releasing
14
+ # your gem to rubygems.org.
15
+
16
+ # To use debugger
17
+ # gem 'debugger'
@@ -0,0 +1,97 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ javascript-securehash-rails (0.0.1)
5
+ rails (~> 3.2.8)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ actionmailer (3.2.8)
11
+ actionpack (= 3.2.8)
12
+ mail (~> 2.4.4)
13
+ actionpack (3.2.8)
14
+ activemodel (= 3.2.8)
15
+ activesupport (= 3.2.8)
16
+ builder (~> 3.0.0)
17
+ erubis (~> 2.7.0)
18
+ journey (~> 1.0.4)
19
+ rack (~> 1.4.0)
20
+ rack-cache (~> 1.2)
21
+ rack-test (~> 0.6.1)
22
+ sprockets (~> 2.1.3)
23
+ activemodel (3.2.8)
24
+ activesupport (= 3.2.8)
25
+ builder (~> 3.0.0)
26
+ activerecord (3.2.8)
27
+ activemodel (= 3.2.8)
28
+ activesupport (= 3.2.8)
29
+ arel (~> 3.0.2)
30
+ tzinfo (~> 0.3.29)
31
+ activeresource (3.2.8)
32
+ activemodel (= 3.2.8)
33
+ activesupport (= 3.2.8)
34
+ activesupport (3.2.8)
35
+ i18n (~> 0.6)
36
+ multi_json (~> 1.0)
37
+ arel (3.0.2)
38
+ builder (3.0.3)
39
+ erubis (2.7.0)
40
+ hike (1.2.1)
41
+ i18n (0.6.1)
42
+ journey (1.0.4)
43
+ jquery-rails (2.1.2)
44
+ railties (>= 3.1.0, < 5.0)
45
+ thor (~> 0.14)
46
+ json (1.7.5)
47
+ mail (2.4.4)
48
+ i18n (>= 0.4.0)
49
+ mime-types (~> 1.16)
50
+ treetop (~> 1.4.8)
51
+ mime-types (1.19)
52
+ multi_json (1.3.6)
53
+ polyglot (0.3.3)
54
+ rack (1.4.1)
55
+ rack-cache (1.2)
56
+ rack (>= 0.4)
57
+ rack-ssl (1.3.2)
58
+ rack
59
+ rack-test (0.6.1)
60
+ rack (>= 1.0)
61
+ rails (3.2.8)
62
+ actionmailer (= 3.2.8)
63
+ actionpack (= 3.2.8)
64
+ activerecord (= 3.2.8)
65
+ activeresource (= 3.2.8)
66
+ activesupport (= 3.2.8)
67
+ bundler (~> 1.0)
68
+ railties (= 3.2.8)
69
+ railties (3.2.8)
70
+ actionpack (= 3.2.8)
71
+ activesupport (= 3.2.8)
72
+ rack-ssl (~> 1.3.2)
73
+ rake (>= 0.8.7)
74
+ rdoc (~> 3.4)
75
+ thor (>= 0.14.6, < 2.0)
76
+ rake (0.9.2.2)
77
+ rdoc (3.12)
78
+ json (~> 1.4)
79
+ sprockets (2.1.3)
80
+ hike (~> 1.2)
81
+ rack (~> 1.0)
82
+ tilt (~> 1.1, != 1.3.0)
83
+ sqlite3 (1.3.6)
84
+ thor (0.16.0)
85
+ tilt (1.3.3)
86
+ treetop (1.4.10)
87
+ polyglot
88
+ polyglot (>= 0.3.1)
89
+ tzinfo (0.3.33)
90
+
91
+ PLATFORMS
92
+ ruby
93
+
94
+ DEPENDENCIES
95
+ javascript-securehash-rails!
96
+ jquery-rails
97
+ sqlite3
@@ -0,0 +1,20 @@
1
+ Copyright 2012 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,6 @@
1
+ = JavascriptSecurehashRails
2
+
3
+ This project rocks and uses MIT-LICENSE.
4
+
5
+ = The author of all the JS algorithms is Paul Johnston
6
+ See more about his work at http://pajhome.org.uk/crypt/md5/index.html
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'JavascriptSecurehashRails'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require 'rake/testtask'
29
+
30
+ Rake::TestTask.new(:test) do |t|
31
+ t.libs << 'lib'
32
+ t.libs << 'test'
33
+ t.pattern = 'test/**/*_test.rb'
34
+ t.verbose = false
35
+ end
36
+
37
+
38
+ task :default => :test
@@ -0,0 +1,25 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ # Maintain your gem's version:
4
+ require "javascript-securehash-rails/version"
5
+
6
+ # Describe your gem and declare its dependencies:
7
+ Gem::Specification.new do |s|
8
+ s.name = "javascript-securehash-rails"
9
+ s.version = JavascriptSecurehashRails::VERSION
10
+ s.authors = ["Guillermo Guerrero"]
11
+ s.email = ["g.guerrero.bus@gmail.com"]
12
+ s.homepage = "https://github.com/gguerrero/javascript_securehash_rails"
13
+ s.summary = "Some Javascript Secure Hash collection as a Rails Plugin."
14
+ s.description = "Some Javascript Secure Hash collection as a Rails Plugin."
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+
18
+ s.has_rdoc = true
19
+ s.extra_rdoc_files = %w[ README.rdoc ]
20
+ s.rdoc_options += %w[ --title JavascriptSecurehashRails
21
+ --main README.rdoc
22
+ --inline-source ]
23
+
24
+ s.add_dependency "rails", ">= 3.1"
25
+ end
@@ -0,0 +1,2 @@
1
+ require 'javascript-securehash-rails/version'
2
+ require 'javascript-securehash-rails/engine'
@@ -0,0 +1,4 @@
1
+ module JavascriptSecurehashRails
2
+ class Engine < ::Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module JavascriptSecurehashRails
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,13 @@
1
+ // Full secure hash algorithm files load. All the hash decoding functions are
2
+ // available once loaded this file, i.e:
3
+ // * MD4: calcMD4("Mystring")
4
+ // * MD5: hex_md5("Mystring")
5
+ // * RIPEMD160: hex_rmd160("Mystring")
6
+ // * SHA-1: hex_sha1("Mystring")
7
+ // * SHA-256: hex_sha256("Mystring")
8
+ // * SHA-512: hex_sha512("Mystring")
9
+ //
10
+ // Get more info at secure hash JS algorithms authors site:
11
+ // http://pajhome.org.uk/crypt/md5/index.html
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,153 @@
1
+ /*
2
+ * A JavaScript implementation of the RSA Data Security, Inc. MD4 Message
3
+ * Digest Algorithm, as defined in RFC 1320.
4
+ * Copyright (C) Jerrad Pierce 2000. Distributed under the LGPL.
5
+ */
6
+
7
+ /*
8
+ * Convert a 32-bit number to a hex string with ls-byte first
9
+ */
10
+ var hex_chr = "0123456789abcdef";
11
+ function rhex(num)
12
+ {
13
+ var str = "";
14
+ for(var j = 0; j <= 3; j++)
15
+ str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) +
16
+ hex_chr.charAt((num >> (j * 8)) & 0x0F);
17
+ return str;
18
+ }
19
+
20
+ /*
21
+ * Convert a string to a sequence of 16-word blocks, stored as an array.
22
+ * Append padding bits and the length, as described in the MD5 standard.
23
+ * MD5 here is not a typo - this function is borrowed from the MD5 code.
24
+ */
25
+ function str2blks_MD5(str)
26
+ {
27
+ var nblk = ((str.length + 8) >> 6) + 1;
28
+ var blks = new Array(nblk * 16);
29
+ for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
30
+ for(i = 0; i < str.length; i++)
31
+ blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8);
32
+ blks[i >> 2] |= 0x80 << ((i % 4) * 8);
33
+ blks[nblk * 16 - 2] = str.length * 8;
34
+ return blks;
35
+ }
36
+
37
+ /*
38
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
39
+ * to work around bugs in some JS interpreters.
40
+ */
41
+ function add(x, y)
42
+ {
43
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
44
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
45
+ return (msw << 16) | (lsw & 0xFFFF);
46
+ }
47
+
48
+ /*
49
+ * Bitwise rotate a 32-bit number to the left
50
+ */
51
+ function rol(num, cnt)
52
+ {
53
+ return (num << cnt) | (num >>> (32 - cnt));
54
+ }
55
+
56
+ /*
57
+ * These functions implement the basic operation for each round of the
58
+ * algorithm.
59
+ */
60
+ function cmn(q, a, b, x, s, t)
61
+ {
62
+ return add(rol(add(add(a, q), add(x, t)), s), b);
63
+ }
64
+ function ffMD4(a, b, c, d, x, s)
65
+ {
66
+ return cmn((b & c) | ((~b) & d), a, 0, x, s, 0);
67
+ }
68
+ function ggMD4(a, b, c, d, x, s)
69
+ {
70
+ return cmn((b & c) | (b & d) | (c & d), a, 0, x, s, 1518500249);
71
+ }
72
+ function hhMD4(a, b, c, d, x, s)
73
+ {
74
+ return cmn(b ^ c ^ d, a, 0, x, s, 1859775393);
75
+ }
76
+
77
+ /*
78
+ * Take a string and return the hex representation of its MD4.
79
+ */
80
+ function calcMD4(str)
81
+ {
82
+ var x = str2blks_MD5(str);
83
+ var a = 1732584193;
84
+ var b = -271733879;
85
+ var c = -1732584194;
86
+ var d = 271733878;
87
+
88
+ for(var i = 0; i < x.length; i += 16)
89
+ {
90
+ var olda = a;
91
+ var oldb = b;
92
+ var oldc = c;
93
+ var oldd = d;
94
+
95
+ a = ffMD4(a, b, c, d, x[i+ 0], 3 );
96
+ d = ffMD4(d, a, b, c, x[i+ 1], 7 );
97
+ c = ffMD4(c, d, a, b, x[i+ 2], 11);
98
+ b = ffMD4(b, c, d, a, x[i+ 3], 19);
99
+ a = ffMD4(a, b, c, d, x[i+ 4], 3 );
100
+ d = ffMD4(d, a, b, c, x[i+ 5], 7 );
101
+ c = ffMD4(c, d, a, b, x[i+ 6], 11);
102
+ b = ffMD4(b, c, d, a, x[i+ 7], 19);
103
+ a = ffMD4(a, b, c, d, x[i+ 8], 3 );
104
+ d = ffMD4(d, a, b, c, x[i+ 9], 7 );
105
+ c = ffMD4(c, d, a, b, x[i+10], 11);
106
+ b = ffMD4(b, c, d, a, x[i+11], 19);
107
+ a = ffMD4(a, b, c, d, x[i+12], 3 );
108
+ d = ffMD4(d, a, b, c, x[i+13], 7 );
109
+ c = ffMD4(c, d, a, b, x[i+14], 11);
110
+ b = ffMD4(b, c, d, a, x[i+15], 19);
111
+
112
+ a = ggMD4(a, b, c, d, x[i+ 0], 3 );
113
+ d = ggMD4(d, a, b, c, x[i+ 4], 5 );
114
+ c = ggMD4(c, d, a, b, x[i+ 8], 9 );
115
+ b = ggMD4(b, c, d, a, x[i+12], 13);
116
+ a = ggMD4(a, b, c, d, x[i+ 1], 3 );
117
+ d = ggMD4(d, a, b, c, x[i+ 5], 5 );
118
+ c = ggMD4(c, d, a, b, x[i+ 9], 9 );
119
+ b = ggMD4(b, c, d, a, x[i+13], 13);
120
+ a = ggMD4(a, b, c, d, x[i+ 2], 3 );
121
+ d = ggMD4(d, a, b, c, x[i+ 6], 5 );
122
+ c = ggMD4(c, d, a, b, x[i+10], 9 );
123
+ b = ggMD4(b, c, d, a, x[i+14], 13);
124
+ a = ggMD4(a, b, c, d, x[i+ 3], 3 );
125
+ d = ggMD4(d, a, b, c, x[i+ 7], 5 );
126
+ c = ggMD4(c, d, a, b, x[i+11], 9 );
127
+ b = ggMD4(b, c, d, a, x[i+15], 13);
128
+
129
+ a = hhMD4(a, b, c, d, x[i+ 0], 3 );
130
+ d = hhMD4(d, a, b, c, x[i+ 8], 9 );
131
+ c = hhMD4(c, d, a, b, x[i+ 4], 11);
132
+ b = hhMD4(b, c, d, a, x[i+12], 15);
133
+ a = hhMD4(a, b, c, d, x[i+ 2], 3 );
134
+ d = hhMD4(d, a, b, c, x[i+10], 9 );
135
+ c = hhMD4(c, d, a, b, x[i+ 6], 11);
136
+ b = hhMD4(b, c, d, a, x[i+14], 15);
137
+ a = hhMD4(a, b, c, d, x[i+ 1], 3 );
138
+ d = hhMD4(d, a, b, c, x[i+ 9], 9 );
139
+ c = hhMD4(c, d, a, b, x[i+ 5], 11);
140
+ b = hhMD4(b, c, d, a, x[i+13], 15);
141
+ a = hhMD4(a, b, c, d, x[i+ 3], 3 );
142
+ d = hhMD4(d, a, b, c, x[i+11], 9 );
143
+ c = hhMD4(c, d, a, b, x[i+ 7], 11);
144
+ b = hhMD4(b, c, d, a, x[i+15], 15);
145
+
146
+ a = add(a, olda);
147
+ b = add(b, oldb);
148
+ c = add(c, oldc);
149
+ d = add(d, oldd);
150
+
151
+ }
152
+ return rhex(a) + rhex(b) + rhex(c) + rhex(d);
153
+ }
@@ -0,0 +1,379 @@
1
+ /*
2
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
3
+ * Digest Algorithm, as defined in RFC 1321.
4
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
5
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
6
+ * Distributed under the BSD License
7
+ * See http://pajhome.org.uk/crypt/md5 for more info.
8
+ */
9
+
10
+ /*
11
+ * Configurable variables. You may need to tweak these to be compatible with
12
+ * the server-side, but the defaults work in most cases.
13
+ */
14
+ var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
15
+ var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
16
+
17
+ /*
18
+ * These are the functions you'll usually want to call
19
+ * They take string arguments and return either hex or base-64 encoded strings
20
+ */
21
+ function hex_md5(s) { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
22
+ function b64_md5(s) { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }
23
+ function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }
24
+ function hex_hmac_md5(k, d)
25
+ { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
26
+ function b64_hmac_md5(k, d)
27
+ { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
28
+ function any_hmac_md5(k, d, e)
29
+ { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
30
+
31
+ /*
32
+ * Perform a simple self-test to see if the VM is working
33
+ */
34
+ function md5_vm_test()
35
+ {
36
+ return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72";
37
+ }
38
+
39
+ /*
40
+ * Calculate the MD5 of a raw string
41
+ */
42
+ function rstr_md5(s)
43
+ {
44
+ return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
45
+ }
46
+
47
+ /*
48
+ * Calculate the HMAC-MD5, of a key and some data (raw strings)
49
+ */
50
+ function rstr_hmac_md5(key, data)
51
+ {
52
+ var bkey = rstr2binl(key);
53
+ if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
54
+
55
+ var ipad = Array(16), opad = Array(16);
56
+ for(var i = 0; i < 16; i++)
57
+ {
58
+ ipad[i] = bkey[i] ^ 0x36363636;
59
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
60
+ }
61
+
62
+ var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
63
+ return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
64
+ }
65
+
66
+ /*
67
+ * Convert a raw string to a hex string
68
+ */
69
+ function rstr2hex(input)
70
+ {
71
+ try { hexcase } catch(e) { hexcase=0; }
72
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
73
+ var output = "";
74
+ var x;
75
+ for(var i = 0; i < input.length; i++)
76
+ {
77
+ x = input.charCodeAt(i);
78
+ output += hex_tab.charAt((x >>> 4) & 0x0F)
79
+ + hex_tab.charAt( x & 0x0F);
80
+ }
81
+ return output;
82
+ }
83
+
84
+ /*
85
+ * Convert a raw string to a base-64 string
86
+ */
87
+ function rstr2b64(input)
88
+ {
89
+ try { b64pad } catch(e) { b64pad=''; }
90
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
91
+ var output = "";
92
+ var len = input.length;
93
+ for(var i = 0; i < len; i += 3)
94
+ {
95
+ var triplet = (input.charCodeAt(i) << 16)
96
+ | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
97
+ | (i + 2 < len ? input.charCodeAt(i+2) : 0);
98
+ for(var j = 0; j < 4; j++)
99
+ {
100
+ if(i * 8 + j * 6 > input.length * 8) output += b64pad;
101
+ else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
102
+ }
103
+ }
104
+ return output;
105
+ }
106
+
107
+ /*
108
+ * Convert a raw string to an arbitrary string encoding
109
+ */
110
+ function rstr2any(input, encoding)
111
+ {
112
+ var divisor = encoding.length;
113
+ var i, j, q, x, quotient;
114
+
115
+ /* Convert to an array of 16-bit big-endian values, forming the dividend */
116
+ var dividend = Array(Math.ceil(input.length / 2));
117
+ for(i = 0; i < dividend.length; i++)
118
+ {
119
+ dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
120
+ }
121
+
122
+ /*
123
+ * Repeatedly perform a long division. The binary array forms the dividend,
124
+ * the length of the encoding is the divisor. Once computed, the quotient
125
+ * forms the dividend for the next step. All remainders are stored for later
126
+ * use.
127
+ */
128
+ var full_length = Math.ceil(input.length * 8 /
129
+ (Math.log(encoding.length) / Math.log(2)));
130
+ var remainders = Array(full_length);
131
+ for(j = 0; j < full_length; j++)
132
+ {
133
+ quotient = Array();
134
+ x = 0;
135
+ for(i = 0; i < dividend.length; i++)
136
+ {
137
+ x = (x << 16) + dividend[i];
138
+ q = Math.floor(x / divisor);
139
+ x -= q * divisor;
140
+ if(quotient.length > 0 || q > 0)
141
+ quotient[quotient.length] = q;
142
+ }
143
+ remainders[j] = x;
144
+ dividend = quotient;
145
+ }
146
+
147
+ /* Convert the remainders to the output string */
148
+ var output = "";
149
+ for(i = remainders.length - 1; i >= 0; i--)
150
+ output += encoding.charAt(remainders[i]);
151
+
152
+ return output;
153
+ }
154
+
155
+ /*
156
+ * Encode a string as utf-8.
157
+ * For efficiency, this assumes the input is valid utf-16.
158
+ */
159
+ function str2rstr_utf8(input)
160
+ {
161
+ var output = "";
162
+ var i = -1;
163
+ var x, y;
164
+
165
+ while(++i < input.length)
166
+ {
167
+ /* Decode utf-16 surrogate pairs */
168
+ x = input.charCodeAt(i);
169
+ y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
170
+ if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
171
+ {
172
+ x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
173
+ i++;
174
+ }
175
+
176
+ /* Encode output as utf-8 */
177
+ if(x <= 0x7F)
178
+ output += String.fromCharCode(x);
179
+ else if(x <= 0x7FF)
180
+ output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
181
+ 0x80 | ( x & 0x3F));
182
+ else if(x <= 0xFFFF)
183
+ output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
184
+ 0x80 | ((x >>> 6 ) & 0x3F),
185
+ 0x80 | ( x & 0x3F));
186
+ else if(x <= 0x1FFFFF)
187
+ output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
188
+ 0x80 | ((x >>> 12) & 0x3F),
189
+ 0x80 | ((x >>> 6 ) & 0x3F),
190
+ 0x80 | ( x & 0x3F));
191
+ }
192
+ return output;
193
+ }
194
+
195
+ /*
196
+ * Encode a string as utf-16
197
+ */
198
+ function str2rstr_utf16le(input)
199
+ {
200
+ var output = "";
201
+ for(var i = 0; i < input.length; i++)
202
+ output += String.fromCharCode( input.charCodeAt(i) & 0xFF,
203
+ (input.charCodeAt(i) >>> 8) & 0xFF);
204
+ return output;
205
+ }
206
+
207
+ function str2rstr_utf16be(input)
208
+ {
209
+ var output = "";
210
+ for(var i = 0; i < input.length; i++)
211
+ output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
212
+ input.charCodeAt(i) & 0xFF);
213
+ return output;
214
+ }
215
+
216
+ /*
217
+ * Convert a raw string to an array of little-endian words
218
+ * Characters >255 have their high-byte silently ignored.
219
+ */
220
+ function rstr2binl(input)
221
+ {
222
+ var output = Array(input.length >> 2);
223
+ for(var i = 0; i < output.length; i++)
224
+ output[i] = 0;
225
+ for(var i = 0; i < input.length * 8; i += 8)
226
+ output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
227
+ return output;
228
+ }
229
+
230
+ /*
231
+ * Convert an array of little-endian words to a string
232
+ */
233
+ function binl2rstr(input)
234
+ {
235
+ var output = "";
236
+ for(var i = 0; i < input.length * 32; i += 8)
237
+ output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
238
+ return output;
239
+ }
240
+
241
+ /*
242
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
243
+ */
244
+ function binl_md5(x, len)
245
+ {
246
+ /* append padding */
247
+ x[len >> 5] |= 0x80 << ((len) % 32);
248
+ x[(((len + 64) >>> 9) << 4) + 14] = len;
249
+
250
+ var a = 1732584193;
251
+ var b = -271733879;
252
+ var c = -1732584194;
253
+ var d = 271733878;
254
+
255
+ for(var i = 0; i < x.length; i += 16)
256
+ {
257
+ var olda = a;
258
+ var oldb = b;
259
+ var oldc = c;
260
+ var oldd = d;
261
+
262
+ a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
263
+ d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
264
+ c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
265
+ b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
266
+ a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
267
+ d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
268
+ c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
269
+ b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
270
+ a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
271
+ d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
272
+ c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
273
+ b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
274
+ a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
275
+ d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
276
+ c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
277
+ b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
278
+
279
+ a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
280
+ d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
281
+ c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
282
+ b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
283
+ a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
284
+ d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
285
+ c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
286
+ b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
287
+ a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
288
+ d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
289
+ c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
290
+ b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
291
+ a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
292
+ d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
293
+ c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
294
+ b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
295
+
296
+ a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
297
+ d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
298
+ c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
299
+ b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
300
+ a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
301
+ d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
302
+ c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
303
+ b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
304
+ a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
305
+ d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
306
+ c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
307
+ b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
308
+ a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
309
+ d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
310
+ c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
311
+ b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
312
+
313
+ a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
314
+ d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
315
+ c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
316
+ b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
317
+ a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
318
+ d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
319
+ c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
320
+ b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
321
+ a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
322
+ d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
323
+ c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
324
+ b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
325
+ a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
326
+ d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
327
+ c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
328
+ b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
329
+
330
+ a = safe_add(a, olda);
331
+ b = safe_add(b, oldb);
332
+ c = safe_add(c, oldc);
333
+ d = safe_add(d, oldd);
334
+ }
335
+ return Array(a, b, c, d);
336
+ }
337
+
338
+ /*
339
+ * These functions implement the four basic operations the algorithm uses.
340
+ */
341
+ function md5_cmn(q, a, b, x, s, t)
342
+ {
343
+ return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
344
+ }
345
+ function md5_ff(a, b, c, d, x, s, t)
346
+ {
347
+ return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
348
+ }
349
+ function md5_gg(a, b, c, d, x, s, t)
350
+ {
351
+ return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
352
+ }
353
+ function md5_hh(a, b, c, d, x, s, t)
354
+ {
355
+ return md5_cmn(b ^ c ^ d, a, b, x, s, t);
356
+ }
357
+ function md5_ii(a, b, c, d, x, s, t)
358
+ {
359
+ return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
360
+ }
361
+
362
+ /*
363
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
364
+ * to work around bugs in some JS interpreters.
365
+ */
366
+ function safe_add(x, y)
367
+ {
368
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
369
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
370
+ return (msw << 16) | (lsw & 0xFFFF);
371
+ }
372
+
373
+ /*
374
+ * Bitwise rotate a 32-bit number to the left.
375
+ */
376
+ function bit_rol(num, cnt)
377
+ {
378
+ return (num << cnt) | (num >>> (32 - cnt));
379
+ }