14d6c458bSopenharmony_ci/* 24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License. 54d6c458bSopenharmony_ci * You may obtain a copy of the License at 64d6c458bSopenharmony_ci * 74d6c458bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84d6c458bSopenharmony_ci * 94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and 134d6c458bSopenharmony_ci * limitations under the License. 144d6c458bSopenharmony_ci */ 154d6c458bSopenharmony_ci 164d6c458bSopenharmony_ci#include <cstring> 174d6c458bSopenharmony_ci 184d6c458bSopenharmony_ci#ifdef IOS_PLATFORM 194d6c458bSopenharmony_ci#include <sys/sysctl.h> 204d6c458bSopenharmony_ci#else 214d6c458bSopenharmony_ci#include <sys/sysinfo.h> 224d6c458bSopenharmony_ci#endif 234d6c458bSopenharmony_ci 244d6c458bSopenharmony_ci#include <unistd.h> 254d6c458bSopenharmony_ci#include "napi/native_api.h" 264d6c458bSopenharmony_ci#include "napi/native_node_api.h" 274d6c458bSopenharmony_ci 284d6c458bSopenharmony_ci#ifndef UTIL_JS_BASE64_H 294d6c458bSopenharmony_ci#define UTIL_JS_BASE64_H 304d6c458bSopenharmony_ci 314d6c458bSopenharmony_cinamespace OHOS::Util { 324d6c458bSopenharmony_ci 334d6c458bSopenharmony_ci enum Type { 344d6c458bSopenharmony_ci BASIC, 354d6c458bSopenharmony_ci MIME, 364d6c458bSopenharmony_ci BASIC_URL_SAFE, 374d6c458bSopenharmony_ci MIME_URL_SAFE, 384d6c458bSopenharmony_ci TYPED_FIRST = BASIC, 394d6c458bSopenharmony_ci TYPED_LAST = MIME_URL_SAFE 404d6c458bSopenharmony_ci }; 414d6c458bSopenharmony_ci 424d6c458bSopenharmony_ci struct EncodeInfo { 434d6c458bSopenharmony_ci napi_async_work worker = nullptr; 444d6c458bSopenharmony_ci napi_deferred deferred = nullptr; 454d6c458bSopenharmony_ci napi_value promise = nullptr; 464d6c458bSopenharmony_ci unsigned char *sinputEncode = nullptr; 474d6c458bSopenharmony_ci unsigned char *sinputEncoding = nullptr; 484d6c458bSopenharmony_ci size_t slength = 0; 494d6c458bSopenharmony_ci size_t soutputLen = 0; 504d6c458bSopenharmony_ci napi_env env; 514d6c458bSopenharmony_ci Type valueType = BASIC; 524d6c458bSopenharmony_ci }; 534d6c458bSopenharmony_ci 544d6c458bSopenharmony_ci struct DecodeInfo { 554d6c458bSopenharmony_ci napi_async_work worker = nullptr; 564d6c458bSopenharmony_ci napi_deferred deferred = nullptr; 574d6c458bSopenharmony_ci napi_value promise = nullptr; 584d6c458bSopenharmony_ci char *sinputDecode = nullptr; 594d6c458bSopenharmony_ci unsigned char *sinputDecoding = nullptr; 604d6c458bSopenharmony_ci size_t slength = 0; 614d6c458bSopenharmony_ci size_t decodeOutLen = 0; 624d6c458bSopenharmony_ci size_t retLen = 0; 634d6c458bSopenharmony_ci napi_env env; 644d6c458bSopenharmony_ci Type valueType = BASIC; 654d6c458bSopenharmony_ci }; 664d6c458bSopenharmony_ci 674d6c458bSopenharmony_ci enum ConverterFlags { 684d6c458bSopenharmony_ci BIT_FLG = 0x40, 694d6c458bSopenharmony_ci SIXTEEN_FLG = 0x3F, 704d6c458bSopenharmony_ci XFF_FLG = 0xFF, 714d6c458bSopenharmony_ci }; 724d6c458bSopenharmony_ci 734d6c458bSopenharmony_ci void FreeMemory(unsigned char *&address); 744d6c458bSopenharmony_ci void FreeMemory(char *&address); 754d6c458bSopenharmony_ci unsigned char *EncodeAchieves(napi_env env, EncodeInfo *encodeInfo); 764d6c458bSopenharmony_ci unsigned char *DecodeAchieves(napi_env env, DecodeInfo *decodeInfo); 774d6c458bSopenharmony_ci unsigned char *EncodeAchievesInner(unsigned char *ret, EncodeInfo *encodeInfo, 784d6c458bSopenharmony_ci const char *searchArray, size_t inputLen, const unsigned char *input); 794d6c458bSopenharmony_ci unsigned char *DecodeAchievesInner(size_t inputLen, size_t equalCount, 804d6c458bSopenharmony_ci const char *input, DecodeInfo *decodeInfo, unsigned char *retDecode); 814d6c458bSopenharmony_ci 824d6c458bSopenharmony_ci class Base64 { 834d6c458bSopenharmony_ci public: 844d6c458bSopenharmony_ci /** 854d6c458bSopenharmony_ci * Constructor of Base64. 864d6c458bSopenharmony_ci */ 874d6c458bSopenharmony_ci explicit Base64() {} 884d6c458bSopenharmony_ci 894d6c458bSopenharmony_ci /** 904d6c458bSopenharmony_ci * Destructor of Base64. 914d6c458bSopenharmony_ci */ 924d6c458bSopenharmony_ci virtual ~Base64() {} 934d6c458bSopenharmony_ci 944d6c458bSopenharmony_ci /** 954d6c458bSopenharmony_ci * Output the corresponding text after encoding the input parameters. 964d6c458bSopenharmony_ci * 974d6c458bSopenharmony_ci * @param env NAPI environment parameters. 984d6c458bSopenharmony_ci * @param src Encode the input uint8 array. 994d6c458bSopenharmony_ci */ 1004d6c458bSopenharmony_ci napi_value EncodeSync(napi_env env, napi_value src, Type valueType); 1014d6c458bSopenharmony_ci 1024d6c458bSopenharmony_ci /** 1034d6c458bSopenharmony_ci * Output the corresponding text after encoding the input parameters. 1044d6c458bSopenharmony_ci * 1054d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1064d6c458bSopenharmony_ci * @param src Encode the input uint8 array. 1074d6c458bSopenharmony_ci */ 1084d6c458bSopenharmony_ci napi_value EncodeToStringSync(napi_env env, napi_value src, Type valueType); 1094d6c458bSopenharmony_ci 1104d6c458bSopenharmony_ci /** 1114d6c458bSopenharmony_ci * Output the corresponding text after encoding the input parameters. 1124d6c458bSopenharmony_ci * 1134d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1144d6c458bSopenharmony_ci * @param src Decode the input uint8 array or string. 1154d6c458bSopenharmony_ci */ 1164d6c458bSopenharmony_ci napi_value DecodeSync(napi_env env, napi_value src, Type valueType); 1174d6c458bSopenharmony_ci 1184d6c458bSopenharmony_ci /** 1194d6c458bSopenharmony_ci * Output the corresponding text after asynchronously encoding the input parameters. 1204d6c458bSopenharmony_ci * 1214d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1224d6c458bSopenharmony_ci * @param src Asynchronously encoded input uint8 array. 1234d6c458bSopenharmony_ci */ 1244d6c458bSopenharmony_ci napi_value Encode(napi_env env, napi_value src, Type valueType); 1254d6c458bSopenharmony_ci 1264d6c458bSopenharmony_ci /** 1274d6c458bSopenharmony_ci * Output the corresponding text after asynchronously encoding the input parameters. 1284d6c458bSopenharmony_ci * 1294d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1304d6c458bSopenharmony_ci * @param src Asynchronously encoded input uint8 array. 1314d6c458bSopenharmony_ci */ 1324d6c458bSopenharmony_ci napi_value EncodeToString(napi_env env, napi_value src, Type valueType); 1334d6c458bSopenharmony_ci 1344d6c458bSopenharmony_ci /** 1354d6c458bSopenharmony_ci * Output the corresponding text after asynchronously encoding the input parameters. 1364d6c458bSopenharmony_ci * 1374d6c458bSopenharmony_ci * @param env NAPI environment parameters. 1384d6c458bSopenharmony_ci * @param src Asynchronously decode the input uint8 array or string. 1394d6c458bSopenharmony_ci */ 1404d6c458bSopenharmony_ci napi_value Decode(napi_env env, napi_value src, Type valueType); 1414d6c458bSopenharmony_ci 1424d6c458bSopenharmony_ci private: 1434d6c458bSopenharmony_ci unsigned char *DecodeAchieve(napi_env env, const char *input, size_t inputLen, Type valueType); 1444d6c458bSopenharmony_ci unsigned char *EncodeAchieve(const unsigned char *input, size_t inputLen, Type valueType); 1454d6c458bSopenharmony_ci int Finds(napi_env env, char ch, Type valueType); 1464d6c458bSopenharmony_ci size_t DecodeOut(size_t equalCount, size_t retLen); 1474d6c458bSopenharmony_ci size_t retLen = 0; 1484d6c458bSopenharmony_ci size_t decodeOutLen = 0; 1494d6c458bSopenharmony_ci size_t outputLen = 0; 1504d6c458bSopenharmony_ci unsigned char *pret = nullptr; 1514d6c458bSopenharmony_ci const unsigned char *inputEncode_ = nullptr; 1524d6c458bSopenharmony_ci const char *inputDecode_ = nullptr; 1534d6c458bSopenharmony_ci unsigned char *retDecode = nullptr; 1544d6c458bSopenharmony_ci void CreateEncodePromise(napi_env env, unsigned char *inputDecode, size_t length, Type valueType); 1554d6c458bSopenharmony_ci void CreateEncodeToStringPromise(napi_env env, unsigned char *inputDecode, size_t length, Type valueType); 1564d6c458bSopenharmony_ci void CreateDecodePromise(napi_env env, char *inputDecode, size_t length, Type valueType); 1574d6c458bSopenharmony_ci EncodeInfo *stdEncodeInfo_ = nullptr; 1584d6c458bSopenharmony_ci DecodeInfo *stdDecodeInfo_ = nullptr; 1594d6c458bSopenharmony_ci static void ReadStdEncode(napi_env env, void *data); 1604d6c458bSopenharmony_ci static void EndStdEncode(napi_env env, napi_status status, void *buffer); 1614d6c458bSopenharmony_ci static void ReadStdEncodeToString(napi_env env, void *data); 1624d6c458bSopenharmony_ci static void EndStdEncodeToString(napi_env env, napi_status status, void *buffer); 1634d6c458bSopenharmony_ci static void ReadStdDecode(napi_env env, void *data); 1644d6c458bSopenharmony_ci static void EndStdDecode(napi_env env, napi_status status, void *buffer); 1654d6c458bSopenharmony_ci unsigned char *EncodeAchieveInner(const unsigned char *input, unsigned char *ret, 1664d6c458bSopenharmony_ci const char *searchArray, size_t inputLen, Type valueType); 1674d6c458bSopenharmony_ci bool DecodeSyncInner(napi_env env, napi_value src, Type valueType); 1684d6c458bSopenharmony_ci unsigned char *DecodeAchieveInner(napi_env env, const char *input, 1694d6c458bSopenharmony_ci size_t inputLen, size_t equalCount, Type valueType); 1704d6c458bSopenharmony_ci }; 1714d6c458bSopenharmony_ci} 1724d6c458bSopenharmony_ci#endif // UTIL_JS_BASE64_H 173