diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2011-05-19 02:31:04 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2011-05-19 02:31:04 -0400 |
| commit | af055136c23652f1cf1ef0beac1b94d79cc1ddb6 (patch) | |
| tree | c4de7f3bfe91303423e19552f850d432b03133c6 /crypto/base64.js | |
| parent | 53fb8167efe4100bf20df3bec5d6b844f4bf1617 (diff) | |
| download | alias-af055136c23652f1cf1ef0beac1b94d79cc1ddb6.tar.gz | |
Started to play around with js crypto code
test.js implements the basic functionality
(recommand to load it in v8 (d8 test.js --shell)
Diffstat (limited to 'crypto/base64.js')
| -rw-r--r-- | crypto/base64.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/crypto/base64.js b/crypto/base64.js new file mode 100644 index 0000000..f5b168c --- /dev/null +++ b/crypto/base64.js @@ -0,0 +1,71 @@ +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); + } + 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; + 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; +} |
