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