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