| import { int2char } from "./util"; | 
| var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | 
| var b64pad = "="; | 
| export 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 | 
| export function b64tohex(s) { | 
|     var ret = ""; | 
|     var i; | 
|     var k = 0; // b64 state, 0-3 | 
|     var slop = 0; | 
|     for (i = 0; i < s.length; ++i) { | 
|         if (s.charAt(i) == b64pad) { | 
|             break; | 
|         } | 
|         var 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 | 
| export function b64toBA(s) { | 
|     // piggyback on b64tohex for now, optimize later | 
|     var h = b64tohex(s); | 
|     var i; | 
|     var a = []; | 
|     for (i = 0; 2 * i < h.length; ++i) { | 
|         a[i] = parseInt(h.substring(2 * i, 2 * i + 2), 16); | 
|     } | 
|     return a; | 
| } |