enc-base64.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. (function () {
  2. // Shortcuts
  3. var C = CryptoJS;
  4. var C_lib = C.lib;
  5. var WordArray = C_lib.WordArray;
  6. var C_enc = C.enc;
  7. /**
  8. * Base64 encoding strategy.
  9. */
  10. var Base64 = C_enc.Base64 = {
  11. /**
  12. * Converts a word array to a Base64 string.
  13. *
  14. * @param {WordArray} wordArray The word array.
  15. *
  16. * @return {string} The Base64 string.
  17. *
  18. * @static
  19. *
  20. * @example
  21. *
  22. * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
  23. */
  24. stringify: function (wordArray) {
  25. // Shortcuts
  26. var words = wordArray.words;
  27. var sigBytes = wordArray.sigBytes;
  28. var map = this._map;
  29. // Clamp excess bits
  30. wordArray.clamp();
  31. // Convert
  32. var base64Chars = [];
  33. for (var i = 0; i < sigBytes; i += 3) {
  34. var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  35. var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
  36. var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
  37. var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
  38. for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
  39. base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
  40. }
  41. }
  42. // Add padding
  43. var paddingChar = map.charAt(64);
  44. if (paddingChar) {
  45. while (base64Chars.length % 4) {
  46. base64Chars.push(paddingChar);
  47. }
  48. }
  49. return base64Chars.join('');
  50. },
  51. /**
  52. * Converts a Base64 string to a word array.
  53. *
  54. * @param {string} base64Str The Base64 string.
  55. *
  56. * @return {WordArray} The word array.
  57. *
  58. * @static
  59. *
  60. * @example
  61. *
  62. * var wordArray = CryptoJS.enc.Base64.parse(base64String);
  63. */
  64. parse: function (base64Str) {
  65. // Shortcuts
  66. var base64StrLength = base64Str.length;
  67. var map = this._map;
  68. var reverseMap = this._reverseMap;
  69. if (!reverseMap) {
  70. reverseMap = this._reverseMap = [];
  71. for (var j = 0; j < map.length; j++) {
  72. reverseMap[map.charCodeAt(j)] = j;
  73. }
  74. }
  75. // Ignore padding
  76. var paddingChar = map.charAt(64);
  77. if (paddingChar) {
  78. var paddingIndex = base64Str.indexOf(paddingChar);
  79. if (paddingIndex !== -1) {
  80. base64StrLength = paddingIndex;
  81. }
  82. }
  83. // Convert
  84. return parseLoop(base64Str, base64StrLength, reverseMap);
  85. },
  86. _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  87. };
  88. function parseLoop(base64Str, base64StrLength, reverseMap) {
  89. var words = [];
  90. var nBytes = 0;
  91. for (var i = 0; i < base64StrLength; i++) {
  92. if (i % 4) {
  93. var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
  94. var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
  95. var bitsCombined = bits1 | bits2;
  96. words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
  97. nBytes++;
  98. }
  99. }
  100. return WordArray.create(words, nBytes);
  101. }
  102. }());