codecBase64.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /** @fileOverview Bit array codec implementations.
  2. *
  3. * @author Emily Stark
  4. * @author Mike Hamburg
  5. * @author Dan Boneh
  6. */
  7. /** @namespace Base64 encoding/decoding */
  8. sjcl.codec.base64 = {
  9. /** The base64 alphabet.
  10. * @private
  11. */
  12. _chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
  13. /** Convert from a bitArray to a base64 string. */
  14. fromBits: function (arr, _noEquals, _url) {
  15. var out = "", i, bits=0, c = sjcl.codec.base64._chars, ta=0, bl = sjcl.bitArray.bitLength(arr);
  16. if (_url) c = c.substr(0,62) + '-_';
  17. for (i=0; out.length * 6 < bl; ) {
  18. out += c.charAt((ta ^ arr[i]>>>bits) >>> 26);
  19. if (bits < 6) {
  20. ta = arr[i] << (6-bits);
  21. bits += 26;
  22. i++;
  23. } else {
  24. ta <<= 6;
  25. bits -= 6;
  26. }
  27. }
  28. while ((out.length & 3) && !_noEquals) { out += "="; }
  29. return out;
  30. },
  31. /** Convert from a base64 string to a bitArray */
  32. toBits: function(str, _url) {
  33. str = str.replace(/\s|=/g,'');
  34. var out = [], i, bits=0, c = sjcl.codec.base64._chars, ta=0, x;
  35. if (_url) c = c.substr(0,62) + '-_';
  36. for (i=0; i<str.length; i++) {
  37. x = c.indexOf(str.charAt(i));
  38. if (x < 0) {
  39. throw new sjcl.exception.invalid("this isn't base64!");
  40. }
  41. if (bits > 26) {
  42. bits -= 26;
  43. out.push(ta ^ x>>>bits);
  44. ta = x << (32-bits);
  45. } else {
  46. bits += 6;
  47. ta ^= x << (32-bits);
  48. }
  49. }
  50. if (bits&56) {
  51. out.push(sjcl.bitArray.partial(bits&56, ta, 1));
  52. }
  53. return out;
  54. }
  55. };
  56. sjcl.codec.base64url = {
  57. fromBits: function (arr) { return sjcl.codec.base64.fromBits(arr,1,1); },
  58. toBits: function (str) { return sjcl.codec.base64.toBits(str,1); }
  59. };