var hexcase = 0;
var b64pad = "";
function
hex_sha1(s) {
return rstr2hex(rstr_sha1(str2rstr_utf8(s))); }
function
b64_sha1(s) {
return rstr2b64(rstr_sha1(str2rstr_utf8(s))); }
function any_sha1(s, e) { return
rstr2any(rstr_sha1(str2rstr_utf8(s)), e); }
function hex_hmac_sha1(k, d) { return
rstr2hex(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)));
}
function b64_hmac_sha1(k, d) { return
rstr2b64(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)));
}
function any_hmac_sha1(k, d, e) { return
rstr2any(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)), e);
}
function sha1_vm_test()
{
return hex_sha1("abc").toLowerCase() ==
"a9993e364706816aba3e25717850c26c9cd0d89d";
}
function rstr_sha1(s)
{
return binb2rstr(binb_sha1(rstr2binb(s),
s.length * 8));
}
function rstr_hmac_sha1(key, data)
{
var bkey = rstr2binb(key);
if(bkey.length > 16) bkey =
binb_sha1(bkey, key.length * 8);
var ipad = Array(16), opad = Array(16);
for(var i = 0; i < 16; i++)
{
ipad[i] =
bkey[i] ^ 0x36363636;
opad[i] =
bkey[i] ^ 0x5C5C5C5C;
}
var hash =
binb_sha1(ipad.concat(rstr2binb(data)), 512 + data.length *
8);
return binb2rstr(binb_sha1(opad.concat(hash),
512 + 160));
}
function rstr2hex(input)
{
try { hexcase } catch(e) { hexcase=0; }
var hex_tab = hexcase ? "0123456789ABCDEF" :
"0123456789abcdef";
var output = "";
var x;
for(var i = 0; i < input.length;
i++)
{
x =
input.charCodeAt(i);
output +=
hex_tab.charAt((x >>>
4) & 0x0F)
+ hex_tab.charAt(
x
& 0x0F);
}
return output;
}
function rstr2b64(input)
{
try { b64pad } catch(e) { b64pad=''; }
var tab =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var output = "";
var len = input.length;
for(var i = 0; i < len; i +=
3)
{
var triplet
= (input.charCodeAt(i) << 16)
| (i + 1 < len ? input.charCodeAt(i+1)
<< 8 : 0)
| (i + 2 < len ?
input.charCodeAt(i+2)
: 0);
for(var j =
0; j < 4; j++)
{
if(i * 8 + j * 6 > input.length * 8) output +=
b64pad;
else output += tab.charAt((triplet
>>> 6*(3-j))
& 0x3F);
}
}
return output;
}
function rstr2any(input, encoding)
{
var divisor = encoding.length;
var remainders = Array();
var i, q, x, quotient;
var dividend = Array(Math.ceil(input.length /
2));
for(i = 0; i < dividend.length;
i++)
{
dividend[i]
= (input.charCodeAt(i * 2) << 8) |
input.charCodeAt(i * 2 + 1);
}
while(dividend.length > 0)
{
quotient =
Array();
x = 0;
for(i = 0; i
< dividend.length; i++)
{
x = (x << 16) + dividend[i];
q = Math.floor(x / divisor);
x -= q * divisor;
if(quotient.length > 0 || q >
0)
quotient[quotient.length] = q;
}
remainders[remainders.length] = x;
dividend =
quotient;
}
var output = "";
for(i = remainders.length - 1; i
>= 0; i--)
output +=
encoding.charAt(remainders[i]);
var full_length = Math.ceil(input.length * 8
/
(Math.log(encoding.length) / Math.log(2)))
for(i = output.length; i <
full_length; i++)
output =
encoding[0] + output;
return output;
}
function str2rstr_utf8(input)
{
var output = "";
var i = -1;
var x, y;
while(++i <
input.length)
{
x =
input.charCodeAt(i);
y = i + 1
< input.length ? input.charCodeAt(i + 1) : 0;
if(0xD800
<= x && x
<= 0xDBFF && 0xDC00
<= y && y
<= 0xDFFF)
{
x = 0x10000 + ((x & 0x03FF)
<< 10) + (y &
0x03FF);
i++;
}
if(x
<= 0x7F)
output += String.fromCharCode(x);
else if(x
<= 0x7FF)
output += String.fromCharCode(0xC0 | ((x
>>> 6 )
& 0x1F),
0x80 | (
x
& 0x3F));
else if(x
<= 0xFFFF)
output += String.fromCharCode(0xE0 | ((x
>>> 12)
& 0x0F),
0x80 | ((x >>> 6 )
& 0x3F),
0x80 | (
x
& 0x3F));
else if(x
<= 0x1FFFFF)
output += String.fromCharCode(0xF0 | ((x
>>> 18)
& 0x07),
0x80 | ((x >>> 12)
& 0x3F),
0x80 | ((x >>> 6 )
& 0x3F),