15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* ***** BEGIN LICENSE BLOCK ***** 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Version: MPL 1.1/GPL 2.0/LGPL 2.1 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * The contents of this file are subject to the Mozilla Public License Version 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.1 (the "License"); you may not use this file except in compliance with 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the License. You may obtain a copy of the License at 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * http://www.mozilla.org/MPL/ 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Software distributed under the License is distributed on an "AS IS" basis, 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * for the specific language governing rights and limitations under the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * The Original Code is Mozilla XML-RPC Client component. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * The Initial Developer of the Original Code is 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Digital Creations 2, Inc. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Portions created by the Initial Developer are Copyright (C) 2000 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Initial Developer. All Rights Reserved. 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Contributor(s): 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Martijn Pieters <mj@digicool.com> (original author) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Samuel Sieb <samuel@sieb.net> 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Alternatively, the contents of this file may be used under the terms of 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * either the GNU General Public License Version 2 or later (the "GPL"), or 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in which case the provisions of the GPL or the LGPL are applicable instead 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * of those above. If you wish to allow use of your version of this file only 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * under the terms of either the GPL or the LGPL, and not to allow others to 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * use your version of this file under the terms of the MPL, indicate your 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * decision by deleting the provisions above and replace them with the notice 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * and other provisions required by the GPL or the LGPL. If you do not delete 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the provisions above, a recipient may use your version of this file under 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the terms of any one of the MPL, the GPL or the LGPL. 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ***** END LICENSE BLOCK ***** */ 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// From: http://lxr.mozilla.org/mozilla/source/extensions/xml-rpc/src/nsXmlRpcClient.js#956 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* Convert data (an array of integers) to a Base64 string. */ 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var toBase64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var base64Pad = '='; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function toBase64(data) { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = ''; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var length = data.length; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var i; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Convert every three bytes to 4 ascii characters. 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (i = 0; i < (length - 2); i += 3) { 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += toBase64Table[data.charCodeAt(i) >> 2]; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i+1) >> 4)]; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += toBase64Table[((data.charCodeAt(i+1) & 0x0f) << 2) + (data.charCodeAt(i+2) >> 6)]; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += toBase64Table[data.charCodeAt(i+2) & 0x3f]; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Convert the remaining 1 or 2 bytes, pad out to 4 characters. 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (length%3) { 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) i = length - (length%3); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += toBase64Table[data.charCodeAt(i) >> 2]; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if ((length%3) == 2) { 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i+1) >> 4)]; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += toBase64Table[(data.charCodeAt(i+1) & 0x0f) << 2]; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += base64Pad; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += toBase64Table[(data.charCodeAt(i) & 0x03) << 4]; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += base64Pad + base64Pad; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* Convert Base64 data to a string */ 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var toBinaryTable = [ 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)]; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function base64ToString(data) { 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = ''; 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var leftbits = 0; // number of bits decoded, but yet to be appended 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var leftdata = 0; // bits decoded, but yet to be appended 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Convert one by one. 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < data.length; i++) { 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var c = toBinaryTable[data.charCodeAt(i) & 0x7f]; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var padding = (data.charCodeAt(i) == base64Pad.charCodeAt(0)); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Skip illegal characters and whitespace 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (c == -1) continue; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Collect data into leftdata, update bitcount 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leftdata = (leftdata << 6) | c; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leftbits += 6; 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we have 8 or more bits, append 8 bits to the result 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (leftbits >= 8) { 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leftbits -= 8; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Append if not padding. 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!padding) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += String.fromCharCode((leftdata >> leftbits) & 0xff); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leftdata &= (1 << leftbits) - 1; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there are any bits left, the base64 string was corrupted 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (leftbits) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw Components.Exception('Corrupted base64 string'); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var str = ""; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)for ( var i = 0; i < 8192; i++ ) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) str += String.fromCharCode( (25 * Math.random()) + 97 ); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)for ( var i = 8192; i <= 16384; i *= 2 ) { 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var base64; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base64 = toBase64(str); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base64ToString(base64); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Double the string 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) str += str; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)toBinaryTable = null; 136