/* * (c) Copyright Ascensio System SIA 2010-2024 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ "use strict"; (function(window, document){ function ZBase32Encoder() { this.EncodingTable = "ybndrfg8ejkmcpqxot1uwisza345h769"; this.DecodingTable = ("undefined" == typeof Uint8Array) ? new Array(128) : new Uint8Array(128); var ii = 0; for (ii = 0; ii < 128; ii++) this.DecodingTable[ii] = 255; var _len_32 = this.EncodingTable.length; for (ii = 0; ii < _len_32; ii++) { this.DecodingTable[this.EncodingTable.charCodeAt(ii)] = ii; } this.GetUTF16_fromUnicodeChar = function(code) { if (code < 0x10000) return String.fromCharCode(code); else { code -= 0x10000; return String.fromCharCode(0xD800 | ((code >> 10) & 0x03FF)) + String.fromCharCode(0xDC00 | (code & 0x03FF)); } }; this.GetUTF16_fromUTF8 = function(pBuffer) { var _res = ""; var lIndex = 0; var lCount = pBuffer.length; var val = 0; while (lIndex < lCount) { var byteMain = pBuffer[lIndex]; if (0x00 == (byteMain & 0x80)) { // 1 byte _res += this.GetUTF16_fromUnicodeChar(byteMain); ++lIndex; } else if (0x00 == (byteMain & 0x20)) { // 2 byte val = (((byteMain & 0x1F) << 6) | (pBuffer[lIndex + 1] & 0x3F)); _res += this.GetUTF16_fromUnicodeChar(val); lIndex += 2; } else if (0x00 == (byteMain & 0x10)) { // 3 byte val = (((byteMain & 0x0F) << 12) | ((pBuffer[lIndex + 1] & 0x3F) << 6) | (pBuffer[lIndex + 2] & 0x3F)); _res += this.GetUTF16_fromUnicodeChar(val); lIndex += 3; } else if (0x00 == (byteMain & 0x08)) { // 4 byte val = (((byteMain & 0x07) << 18) | ((pBuffer[lIndex + 1] & 0x3F) << 12) | ((pBuffer[lIndex + 2] & 0x3F) << 6) | (pBuffer[lIndex + 3] & 0x3F)); _res += this.GetUTF16_fromUnicodeChar(val); lIndex += 4; } else if (0x00 == (byteMain & 0x04)) { // 5 byte val = (((byteMain & 0x03) << 24) | ((pBuffer[lIndex + 1] & 0x3F) << 18) | ((pBuffer[lIndex + 2] & 0x3F) << 12) | ((pBuffer[lIndex + 3] & 0x3F) << 6) | (pBuffer[lIndex + 4] & 0x3F)); _res += this.GetUTF16_fromUnicodeChar(val); lIndex += 5; } else { // 6 byte val = (((byteMain & 0x01) << 30) | ((pBuffer[lIndex + 1] & 0x3F) << 24) | ((pBuffer[lIndex + 2] & 0x3F) << 18) | ((pBuffer[lIndex + 3] & 0x3F) << 12) | ((pBuffer[lIndex + 4] & 0x3F) << 6) | (pBuffer[lIndex + 5] & 0x3F)); _res += this.GetUTF16_fromUnicodeChar(val); lIndex += 5; } } return _res; }; this.GetUTF8_fromUTF16 = function(sData) { var pCur = 0; var pEnd = sData.length; var result = []; while (pCur < pEnd) { var code = sData.charCodeAt(pCur++); if (code >= 0xD800 && code <= 0xDFFF && pCur < pEnd) { code = 0x10000 + (((code & 0x3FF) << 10) | (0x03FF & sData.charCodeAt(pCur++))); } if (code < 0x80) { result.push(code); } else if (code < 0x0800) { result.push(0xC0 | (code >> 6)); result.push(0x80 | (code & 0x3F)); } else if (code < 0x10000) { result.push(0xE0 | (code >> 12)); result.push(0x80 | ((code >> 6) & 0x3F)); result.push(0x80 | (code & 0x3F)); } else if (code < 0x1FFFFF) { result.push(0xF0 | (code >> 18)); result.push(0x80 | ((code >> 12) & 0x3F)); result.push(0x80 | ((code >> 6) & 0x3F)); result.push(0x80 | (code & 0x3F)); } else if (code < 0x3FFFFFF) { result.push(0xF8 | (code >> 24)); result.push(0x80 | ((code >> 18) & 0x3F)); result.push(0x80 | ((code >> 12) & 0x3F)); result.push(0x80 | ((code >> 6) & 0x3F)); result.push(0x80 | (code & 0x3F)); } else if (code < 0x7FFFFFFF) { result.push(0xFC | (code >> 30)); result.push(0x80 | ((code >> 24) & 0x3F)); result.push(0x80 | ((code >> 18) & 0x3F)); result.push(0x80 | ((code >> 12) & 0x3F)); result.push(0x80 | ((code >> 6) & 0x3F)); result.push(0x80 | (code & 0x3F)); } } return result; }; this.Encode = function(sData) { var data = this.GetUTF8_fromUTF16(sData); var encodedResult = ""; var len = data.length; for (var i = 0; i < len; i += 5) { var byteCount = Math.min(5, len - i); var buffer = 0; for (var j = 0; j < byteCount; ++j) { buffer *= 256; buffer += data[i + j]; } var bitCount = byteCount * 8; while (bitCount > 0) { var index = 0; if (bitCount >= 5) { var _del = Math.pow(2, bitCount - 5); //var _del = 1 << (bitCount - 5); index = (buffer / _del) & 0x1f; } else { index = (buffer & (0x1f >> (5 - bitCount))); index <<= (5 - bitCount); } encodedResult += this.EncodingTable.charAt(index); bitCount -= 5; } } return encodedResult; }; this.Decode = function(data) { var result = []; var _len = data.length; var obj = { data: data, index : new Array(8) }; var cur = 0; while (cur < _len) { cur = this.CreateIndexByOctetAndMovePosition(obj, cur); var shortByteCount = 0; var buffer = 0; for (var j = 0; j < 8 && obj.index[j] != -1; ++j) { buffer *= 32; buffer += (this.DecodingTable[obj.index[j]] & 0x1f); shortByteCount++; } var bitCount = shortByteCount * 5; while (bitCount >= 8) { //var _del = 1 << (bitCount - 8); var _del = Math.pow(2, bitCount - 8); var _res = (buffer / _del) & 0xff; result.push(_res); bitCount -= 8; } } this.GetUTF16_fromUTF8(result); }; this.CreateIndexByOctetAndMovePosition = function(obj, currentPosition) { var j = 0; while (j < 8) { if (currentPosition >= obj.data.length) { obj.index[j++] = -1; continue; } if (this.IgnoredSymbol(obj.data.charCodeAt(currentPosition))) { currentPosition++; continue; } obj.index[j] = obj.data[currentPosition]; j++; currentPosition++; } return currentPosition; }; this.IgnoredSymbol = function(checkedSymbol) { return (checkedSymbol >= 128 || this.DecodingTable[checkedSymbol] == 255); }; } AscCommon.ZBase32Encoder = ZBase32Encoder; })(window, window.document);