1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// WebSafeBase64Escape and Unescape. 6function B64_encode(bytes, opt_length) { 7 if (!opt_length) opt_length = bytes.length; 8 var b64out = 9 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'; 10 var result = ''; 11 var shift = 0; 12 var accu = 0; 13 var inputIndex = 0; 14 while (opt_length--) { 15 accu <<= 8; 16 accu |= bytes[inputIndex++]; 17 shift += 8; 18 while (shift >= 6) { 19 var i = (accu >> (shift - 6)) & 63; 20 result += b64out.charAt(i); 21 shift -= 6; 22 } 23 } 24 if (shift) { 25 accu <<= 8; 26 shift += 8; 27 var i = (accu >> (shift - 6)) & 63; 28 result += b64out.charAt(i); 29 } 30 return result; 31} 32 33// Normal base64 encode; not websafe, including padding. 34function base64_encode(bytes, opt_length) { 35 if (!opt_length) opt_length = bytes.length; 36 var b64out = 37 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 38 var result = ''; 39 var shift = 0; 40 var accu = 0; 41 var inputIndex = 0; 42 while (opt_length--) { 43 accu <<= 8; 44 accu |= bytes[inputIndex++]; 45 shift += 8; 46 while (shift >= 6) { 47 var i = (accu >> (shift - 6)) & 63; 48 result += b64out.charAt(i); 49 shift -= 6; 50 } 51 } 52 if (shift) { 53 accu <<= 8; 54 shift += 8; 55 var i = (accu >> (shift - 6)) & 63; 56 result += b64out.charAt(i); 57 } 58 while (result.length % 4) result += '='; 59 return result; 60} 61 62var B64_inmap = 63[ 64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 65 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 66 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 67 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, 0, 0, 64, 68 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 69 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 0, 0, 0, 0, 0 70]; 71 72function B64_decode(string) { 73 var bytes = []; 74 var accu = 0; 75 var shift = 0; 76 for (var i = 0; i < string.length; ++i) { 77 var c = string.charCodeAt(i); 78 if (c < 32 || c > 127 || !B64_inmap[c - 32]) return []; 79 accu <<= 6; 80 accu |= (B64_inmap[c - 32] - 1); 81 shift += 6; 82 if (shift >= 8) { 83 bytes.push((accu >> (shift - 8)) & 255); 84 shift -= 8; 85 } 86 } 87 return bytes; 88} 89