javascript-securehash-rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +9 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +97 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +6 -0
- data/Rakefile +38 -0
- data/javascript-securehash-rails.gemspec +25 -0
- data/lib/javascript-securehash-rails.rb +2 -0
- data/lib/javascript-securehash-rails/engine.rb +4 -0
- data/lib/javascript-securehash-rails/version.rb +3 -0
- data/vendor/assets/javascripts/securehash/index.js +13 -0
- data/vendor/assets/javascripts/securehash/md4.js +153 -0
- data/vendor/assets/javascripts/securehash/md5.js +379 -0
- data/vendor/assets/javascripts/securehash/ripemd160.js +359 -0
- data/vendor/assets/javascripts/securehash/sha1.js +330 -0
- data/vendor/assets/javascripts/securehash/sha256.js +337 -0
- data/vendor/assets/javascripts/securehash/sha512.js +496 -0
- metadata +84 -0
data/.gitignore
ADDED
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'
|
data/Gemfile.lock
ADDED
@@ -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
|
data/MIT-LICENSE
ADDED
@@ -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.
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -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,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
|
+
}
|