javascript-securehash-rails 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
+ }