forked from rachanon/stdbWeb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.7 KiB
74 lines
1.7 KiB
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ |
|
*/ |
|
var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
|
var b64pad="="; |
|
|
|
function hex2b64(h) { |
|
var i; |
|
var c; |
|
var ret = ""; |
|
for(i = 0; i+3 <= h.length; i+=3) { |
|
c = parseInt(h.substring(i,i+3),16); |
|
ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63); |
|
} |
|
if(i+1 == h.length) { |
|
c = parseInt(h.substring(i,i+1),16); |
|
ret += b64map.charAt(c << 2); |
|
} |
|
else if(i+2 == h.length) { |
|
c = parseInt(h.substring(i,i+2),16); |
|
ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4); |
|
} |
|
if (b64pad) while((ret.length & 3) > 0) ret += b64pad; |
|
return ret; |
|
} |
|
|
|
// convert a base64 string to hex |
|
function b64tohex(s) { |
|
var ret = "" |
|
var i; |
|
var k = 0; // b64 state, 0-3 |
|
var slop; |
|
var v; |
|
for(i = 0; i < s.length; ++i) { |
|
if(s.charAt(i) == b64pad) break; |
|
v = b64map.indexOf(s.charAt(i)); |
|
if(v < 0) continue; |
|
if(k == 0) { |
|
ret += int2char(v >> 2); |
|
slop = v & 3; |
|
k = 1; |
|
} |
|
else if(k == 1) { |
|
ret += int2char((slop << 2) | (v >> 4)); |
|
slop = v & 0xf; |
|
k = 2; |
|
} |
|
else if(k == 2) { |
|
ret += int2char(slop); |
|
ret += int2char(v >> 2); |
|
slop = v & 3; |
|
k = 3; |
|
} |
|
else { |
|
ret += int2char((slop << 2) | (v >> 4)); |
|
ret += int2char(v & 0xf); |
|
k = 0; |
|
} |
|
} |
|
if(k == 1) |
|
ret += int2char(slop << 2); |
|
return ret; |
|
} |
|
|
|
// convert a base64 string to a byte/number array |
|
function b64toBA(s) { |
|
//piggyback on b64tohex for now, optimize later |
|
var h = b64tohex(s); |
|
var i; |
|
var a = new Array(); |
|
for(i = 0; 2*i < h.length; ++i) { |
|
a[i] = parseInt(h.substring(2*i,2*i+2),16); |
|
} |
|
return a; |
|
}
|
|
|