diff --git a/BUILD.gn b/BUILD.gn index 5af0dc93c5fa4abb227e3668733fb33e7a491f68..de26b37a2f6104bfb0235684b6d28b5ab1928649 100755 --- a/BUILD.gn +++ b/BUILD.gn @@ -11,6 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import("//build/lite/config/component/lite_component.gni") import("//build/ohos.gni") config("pubilc") { @@ -19,6 +20,7 @@ config("pubilc") { sources_platform_common = [ "./src/syscap_tool.c", + "./src/create_pcid.c", "./src/endian_internal.c", ] @@ -93,7 +95,8 @@ ohos_shared_library("syscap_tool_shared") { } ohos_shared_library("syscap_interface_shared") { - include_dirs = [ "./interfaces/inner_api/include" ] + include_dirs = [ "./interfaces/inner_api/" ] + public_configs = [ ":pubilc" ] sources = [ "./interfaces/inner_api/syscap_interface.c" ] deps = [ "//third_party/bounds_checking_function:libsec_static" ] @@ -108,8 +111,40 @@ ohos_shared_library("syscap_interface_shared") { part_name = "syscap_codec" } +group("syscap_tool_bin_linux") { + deps = [ ":syscap_tool_bin(//build/toolchain/linux:clang_x64)" ] +} + +build_ext_component("generate_pcid") { + outputs = [ "$root_out_dir/PCID.sc" ] + deps = [ ":syscap_tool_bin_linux" ] + exec_path = rebase_path(root_out_dir) + preload_path = rebase_path(preloader_output_dir) + if (defined(ohos_lite)) { + cmd = "${exec_path}/clang_x64/syscap_tool" + } else { + cmd = "${exec_path}/clang_x64/developtools/syscap_codec/syscap_tool" + } + command = "chmod 777 $cmd" + command += " && $cmd -P -e -i ${preload_path}/${product_name}/system/etc/SystemCapability.json" + if (defined(ohos_lite)) { + command += " && mkdir -p $exec_path/system/etc && cp $exec_path/PCID.sc $exec_path/system/etc/PCID.sc" + } +} + +ohos_prebuilt_etc("PCID.sc") { + deps = [ ":generate_pcid" ] + source = "$root_out_dir/PCID.sc" + part_name = "syscap_codec" +} + +group("pcid_sc") { + deps = [ ":PCID.sc" ] +} + group("syscap_codec") { deps = [ + ":pcid_sc", ":syscap_interface_shared", ":syscap_tool_shared", ] diff --git a/bundle.json b/bundle.json index fb5544db9555cc20a1c944e3e031779f9af8be52..a432477445746ee4fe9fff8515c4f2197925dcb4 100755 --- a/bundle.json +++ b/bundle.json @@ -23,7 +23,9 @@ ] }, "build": { - "sub_component": [ "//developtools/syscap_codec:syscap_codec" ], + "sub_component": [ + "//developtools/syscap_codec:syscap_codec" + ], "inner_kits": [], "test": [] } diff --git a/include/create_pcid.h b/include/create_pcid.h new file mode 100644 index 0000000000000000000000000000000000000000..2f43282cd96c1b5714fbea0a66f919f44bd103ce --- /dev/null +++ b/include/create_pcid.h @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _CREATE_PCID_H +#define _CREATE_PCID_H + +#define MAX_OS_SYSCAP_NUM 960 + +typedef enum SystemCapabilityNum { + ACCOUNT_APPACCOUNT, + ACCOUNT_OSACCOUNT, + ACE_ACEENGINELITE, + AI_AIENGINE, + APPLICATIONS_CONTACTSDATA, + BARRIERFREE_ACCESSIBILITY_CORE, + BUNDLEMANAGER_BUNDLEFRAMEWORK, + BUNDLEMANAGER_BUNDLETOOL, + BUNDLEMANAGER_DISTRIBUTEDBUNDLEFRAMEWORK, + BUNDLEMANAGER_ZLIB, + COMMUNICATION_BLUETOOTH_CORE, + COMMUNICATION_NETMANAGER_CORE, + COMMUNICATION_NETMANAGER_EXTENSION, + COMMUNICATION_NETSTACK, + COMMUNICATION_SOFTBUS_CORE, + COMMUNICATION_WIFI_AP, + COMMUNICATION_WIFI_CORE, + COMMUNICATION_WIFI_HOTSPOTEXT, + COMMUNICATION_WIFI_P2P, + COMMUNICATION_WIFI_STA, + CUSTOMIZATION_CONFIGPOLICY, + CUSTOMIZATION_ENTERPRISEDEVICEMANAGER, + DISTRIBUTEDDATAMANAGER_DATAOBJECT_DISTRIBUTEDOBJECT, + DISTRIBUTEDDATAMANAGER_DATASHARE_CONSUMER, + DISTRIBUTEDDATAMANAGER_DATASHARE_CORE, + DISTRIBUTEDDATAMANAGER_DATASHARE_PROVIDER, + DISTRIBUTEDDATAMANAGER_KVSTORE_CORE, + DISTRIBUTEDDATAMANAGER_KVSTORE_DISTRIBUTEDKVSTORE, + DISTRIBUTEDDATAMANAGER_KVSTORE_LITE, + DISTRIBUTEDDATAMANAGER_PREFERENCES_CORE, + DISTRIBUTEDDATAMANAGER_RELATIONALSTORE_CORE, + DISTRIBUTEDHARDWARE_DEVICEMANAGER, + DISTRIBUTEDHARDWARE_DISTRIBUTED_CAMERA, + DISTRIBUTEDHARDWARE_DISTRIBUTED_HARDWARE_FWK, + DISTRIBUTEDHARDWARE_DISTRIBUTED_SCREEN, + FILEMANAGEMENT_FILEMANAGERSERVICE, + FILEMANAGEMENT_REMOTEFILESHARE, + GLOBAL_RESOURCEMANAGER, + GRAPHIC_GRAPHIC2D_NATIVEDRAWING, + GRAPHIC_GRAPHIC2D_NATIVEWINDOW, + GRAPHIC_GRAPHIC2D_WEBGL, + GRAPHIC_GRAPHIC2D_WEBGL2, + GRAPHIC_SURFACE, + GRAPHIC_UI, + GRAPHIC_UTILS, + GRAPHIC_WMS, + HIVIEWDFX_HIAPPEVENT, + HIVIEWDFX_HIDUMPER, + HIVIEWDFX_HILOG, + HIVIEWDFX_HILOGLITE, + HIVIEWDFX_HIPROFILER_HIDEBUG, + HIVIEWDFX_HISYSEVENT, + HIVIEWDFX_HITRACE, + HIVIEWDFX_HIVIEW, + HIVIEWDFX_HIVIEW_FAULTLOGGER, + I18N, + GLOBAL_I18N, + KERNEL_LITEOS_A, + LOCATION_LOCATION, + MISCSERVICES_DOWNLOAD, + MISCSERVICES_INPUTMETHOD, + MISCSERVICES_PASTEBOARD, + MISCSERVICES_SCREENLOCK, + MISCSERVICES_TIME, + MISCSERVICES_UPLOAD, + MISCSERVICES_WALLPAPER, + MSDP_DEVICESTATUS, + MULTIMEDIA_MEDIALIBRARY, + MULTIMEDIA_MEDIA_AUDIOPLAYER, + MULTIMEDIA_MEDIA_AUDIORECORDER, + MULTIMEDIA_MEDIA_CODEC, + MULTIMEDIA_MEDIA_CORE, + MULTIMEDIA_MEDIA_MUXER, + MULTIMEDIA_IMAGE, + MULTIMEDIA_IMAGE_CORE, + MULTIMEDIA_IMAGE_IMAGESOURCE, + MULTIMEDIA_IMAGE_IMAGEPACKER, + MULTIMEDIA_IMAGE_IMAGERECEIVER, + MULTIMEDIA_MEDIA_SPLITER, + MULTIMEDIA_MEDIA_VIDEOPLAYER, + MULTIMEDIA_MEDIA_VIDEORECORDER, + MULTIMODALINPUT_INPUT, + NOTIFICATION_COMMONEVENT, + NOTIFICATION_EMITTER, + NOTIFICATION_NOTIFICATION, + NOTIFICATION_REMINDERAGENT, + POWERMANAGER_BATTERYMANAGER_CORE, + POWERMANAGER_BATTERYMANAGER_EXTENSION, + POWERMANAGER_BATTERYMANAGER_LITE, + POWERMANAGER_BATTERYSTATISTICS, + POWERMANAGER_DISPLAYPOWERMANAGER, + POWERMANAGER_POWERMANAGER_CORE, + POWERMANAGER_POWERMANAGER_EXTENSION, + POWERMANAGER_POWERMANAGER_LITE, + POWERMANAGER_THERMALMANAGER, + RESOURCESCHEDULE_BACKGROUNDTASKMANAGER_CONTINUOUSTASK, + RESOURCESCHEDULE_BACKGROUNDTASKMANAGER_TRANSIENTTASK, + RESOURCESCHEDULE_USAGESTATISTICS_APP, + RESOURCESCHEDULE_USAGESTATISTICS_APPGROUP, + RESOURCESCHEDULE_WORKSCHEDULER, + SECURITY_ACCESSTOKEN, + SECURITY_APPVERIFY, + SECURITY_DATATRANSITMANAGER, + SECURITY_DEVICEAUTH, + SECURITY_DEVICESECURITYLEVEL, + SECURITY_HUKS, + SENSORS_MISCDEVICE, + SENSORS_SENSOR, + SENSORS_SENSOR_LITE, + TELEPHONY_CALLMANAGER, + TELEPHONY_CELLULARCALL, + TELEPHONY_CELLULARDATA, + TELEPHONY_CORESERVICE, + TELEPHONY_DATASTORAGE, + TELEPHONY_DCALL, + TELEPHONY_SMSMMS, + TELEPHONY_STATEREGISTRY, + TEST_UITEST, + TEST_WUKONG, + UPDATER_RAW, + UPDATE_UPDATESERVICE, + USB_USBMANAGER, + USERIAM_AUTHEXECUTORMANAGER, + USERIAM_USERAUTH_CORE, + USERIAM_USERAUTH_FACEAUTH, + USERIAM_USERAUTH_PINAUTH, + USERIAM_USERIDM, +} SyscapNum; + +typedef struct SystemCapabilityWithNum { + char syscapStr[128]; + int32_t num; +} SyscapWithNum; + +typedef struct ProductCompatibilityID { + uint16_t apiVersion : 15; + uint16_t apiVersionType : 1; + uint16_t systemType : 3; + uint16_t reserved : 13; + uint32_t manufacturerID; + uint8_t osSyscap[MAX_OS_SYSCAP_NUM / 8]; +} PCIDMain; + +int32_t CreatePCID(char *inputFile, char *outDirPath); +int32_t DecodePCID(char *inputFile, char *outDirPath); + +#endif \ No newline at end of file diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 8b239c274e8904cd3946dc67a8bcdd33a661d832..32bc89780beb01b6db3d9439c1b9b748ace03f1b 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -19,10 +19,16 @@ #include #include #include +#include +#include +#include "create_pcid.h" #include "syscap_interface.h" #define PCID_OUT_BUFFER 32 #define MAX_SYSCAP_STR_LEN 128 +#define OS_SYSCAP_BYTES 120 +#define BITS_OF_BYTE 8 +#define PCID_MAIN_LEN 128 #define PRINT_ERR(...) \ do { \ @@ -30,38 +36,344 @@ printf(__VA_ARGS__); \ } while (0) -bool EncodeOsSyscap(int output[32]) +static char *inputFile = "/system/etc/PCID.sc"; + +static const SyscapWithNum arraySyscap[] = { + {"SystemCapability.Account.AppAccount", ACCOUNT_APPACCOUNT}, + {"SystemCapability.Account.OsAccount", ACCOUNT_OSACCOUNT}, + {"SystemCapability.Ace.AceEngineLite", ACE_ACEENGINELITE}, + {"SystemCapability.Ai.AiEngine", AI_AIENGINE}, + {"SystemCapability.Applications.ContactsData", APPLICATIONS_CONTACTSDATA}, + {"SystemCapability.Barrierfree.Accessibility.Core", BARRIERFREE_ACCESSIBILITY_CORE}, + {"SystemCapability.BundleManager.BundleFramework", BUNDLEMANAGER_BUNDLEFRAMEWORK}, + {"SystemCapability.BundleManager.BundleTool", BUNDLEMANAGER_BUNDLETOOL}, + {"SystemCapability.BundleManager.DistributedBundleFramework", BUNDLEMANAGER_DISTRIBUTEDBUNDLEFRAMEWORK}, + {"SystemCapability.BundleManager.Zlib", BUNDLEMANAGER_ZLIB}, + {"SystemCapability.Communication.Bluetooth.Core", COMMUNICATION_BLUETOOTH_CORE}, + {"SystemCapability.Communication.NetManager.Core", COMMUNICATION_NETMANAGER_CORE}, + {"SystemCapability.Communication.NetManager.Extension", COMMUNICATION_NETMANAGER_EXTENSION}, + {"SystemCapability.Communication.NetStack", COMMUNICATION_NETSTACK}, + {"SystemCapability.Communication.SoftBus.Core", COMMUNICATION_SOFTBUS_CORE}, + {"SystemCapability.Communication.WiFi.AP", COMMUNICATION_WIFI_AP}, + {"SystemCapability.Communication.WiFi.Core", COMMUNICATION_WIFI_CORE}, + {"SystemCapability.Communication.WiFi.HotspotExt", COMMUNICATION_WIFI_HOTSPOTEXT}, + {"SystemCapability.Communication.WiFi.P2P", COMMUNICATION_WIFI_P2P}, + {"SystemCapability.Communication.WiFi.STA", COMMUNICATION_WIFI_STA}, + {"SystemCapability.Customization.ConfigPolicy", CUSTOMIZATION_CONFIGPOLICY}, + {"SystemCapability.Customization.EnterpriseDeviceManager", CUSTOMIZATION_ENTERPRISEDEVICEMANAGER}, + {"SystemCapability.DistributedDataManager.DataObject.DistributedObject", DISTRIBUTEDDATAMANAGER_DATAOBJECT_DISTRIBUTEDOBJECT}, + {"SystemCapability.DistributedDataManager.DataShare.Consumer", DISTRIBUTEDDATAMANAGER_DATASHARE_CONSUMER}, + {"SystemCapability.DistributedDataManager.DataShare.Core", DISTRIBUTEDDATAMANAGER_DATASHARE_CORE}, + {"SystemCapability.DistributedDataManager.DataShare.Provider", DISTRIBUTEDDATAMANAGER_DATASHARE_PROVIDER}, + {"SystemCapability.DistributedDataManager.KVStore.Core", DISTRIBUTEDDATAMANAGER_KVSTORE_CORE}, + {"SystemCapability.DistributedDataManager.KVStore.DistributedKVStore", DISTRIBUTEDDATAMANAGER_KVSTORE_DISTRIBUTEDKVSTORE}, + {"SystemCapability.DistributedDataManager.KVStore.Lite", DISTRIBUTEDDATAMANAGER_KVSTORE_LITE}, + {"SystemCapability.DistributedDataManager.Preferences.Core", DISTRIBUTEDDATAMANAGER_PREFERENCES_CORE}, + {"SystemCapability.DistributedDataManager.RelationalStore.Core", DISTRIBUTEDDATAMANAGER_RELATIONALSTORE_CORE}, + {"SystemCapability.DistributedHardware.DeviceManager", DISTRIBUTEDHARDWARE_DEVICEMANAGER}, + {"SystemCapability.distributedhardware.distributed_camera", DISTRIBUTEDHARDWARE_DISTRIBUTED_CAMERA}, + {"SystemCapability.distributedhardware.distributed_hardware_fwk", DISTRIBUTEDHARDWARE_DISTRIBUTED_HARDWARE_FWK}, + {"SystemCapability.distributedhardware.distributed_screen", DISTRIBUTEDHARDWARE_DISTRIBUTED_SCREEN}, + {"SystemCapability.FileManagement.FileManagerService", FILEMANAGEMENT_FILEMANAGERSERVICE}, + {"SystemCapability.FileManagement.RemoteFileShare", FILEMANAGEMENT_REMOTEFILESHARE}, + {"SystemCapability.Global.ResourceManager", GLOBAL_RESOURCEMANAGER}, + {"SystemCapability.Graphic.Graphic2D.NativeDrawing", GRAPHIC_GRAPHIC2D_NATIVEDRAWING}, + {"SystemCapability.Graphic.Graphic2D.NativeWindow", GRAPHIC_GRAPHIC2D_NATIVEDRAWING}, + {"SystemCapability.Graphic.Graphic2D.WebGL", GRAPHIC_GRAPHIC2D_WEBGL}, + {"SystemCapability.Graphic.Graphic2D.WebGL2", GRAPHIC_GRAPHIC2D_WEBGL2}, + {"SystemCapability.Graphic.Surface", GRAPHIC_SURFACE}, + {"SystemCapability.Graphic.UI", GRAPHIC_UI}, + {"SystemCapability.Graphic.Utils", GRAPHIC_UTILS}, + {"SystemCapability.Graphic.Wms", GRAPHIC_WMS}, + {"SystemCapability.HiviewDFX.HiAppEvent", HIVIEWDFX_HIAPPEVENT}, + {"SystemCapability.HiviewDFX.HiDumper", HIVIEWDFX_HIDUMPER}, + {"SystemCapability.HiviewDFX.HiLog", HIVIEWDFX_HILOG}, + {"SystemCapability.HiviewDFX.HiLogLite", HIVIEWDFX_HILOGLITE}, + {"SystemCapability.HiviewDFX.HiProfiler.HiDebug", HIVIEWDFX_HIPROFILER_HIDEBUG}, + {"SystemCapability.HiviewDFX.HiSysEvent", HIVIEWDFX_HISYSEVENT}, + {"SystemCapability.HiviewDFX.HiTrace", HIVIEWDFX_HITRACE}, + {"SystemCapability.HiviewDFX.Hiview", HIVIEWDFX_HIVIEW}, + {"SystemCapability.HiviewDFX.Hiview.FaultLogger", HIVIEWDFX_HIVIEW_FAULTLOGGER}, + {"SystemCapability.I18N", I18N}, + {"SystemCapability.Global.I18n", GLOBAL_I18N}, + {"SystemCapability.Kernel.liteos-a", KERNEL_LITEOS_A}, + {"SystemCapability.Location.Location", LOCATION_LOCATION}, + {"SystemCapability.MiscServices.download", MISCSERVICES_DOWNLOAD}, + {"SystemCapability.Miscservices.InputMethod", MISCSERVICES_INPUTMETHOD}, + {"SystemCapability.Miscservices.Pasteboard", MISCSERVICES_PASTEBOARD}, + {"SystemCapability.MiscServices.ScreenLock", MISCSERVICES_SCREENLOCK}, + {"SystemCapability.MiscServices.Time", MISCSERVICES_TIME}, + {"SystemCapability.MiscServices.Upload", MISCSERVICES_UPLOAD}, + {"SystemCapability.MiscServices.Wallpaper", MISCSERVICES_WALLPAPER}, + {"SystemCapability.Msdp.DeviceStatus", MSDP_DEVICESTATUS}, + {"SystemCapability.Multimedia.MediaLibrary", MULTIMEDIA_MEDIALIBRARY}, + {"SystemCapability.Multimedia.Media.AudioPlayer", MULTIMEDIA_MEDIA_AUDIOPLAYER}, + {"SystemCapability.Multimedia.Media.AudioRecorder", MULTIMEDIA_MEDIA_AUDIORECORDER}, + {"SystemCapability.Multimedia.Media.Codec", MULTIMEDIA_MEDIA_CODEC}, + {"SystemCapability.Multimedia.Media.Core", MULTIMEDIA_MEDIA_CORE}, + {"SystemCapability.Multimedia.Media.Muxer", MULTIMEDIA_MEDIA_MUXER}, + {"SystemCapability.Multimedia.Image", MULTIMEDIA_IMAGE}, + {"SystemCapability.Multimedia.Image.Core", MULTIMEDIA_IMAGE_CORE}, + {"SystemCapability.Multimedia.Image.ImageSource", MULTIMEDIA_IMAGE_IMAGESOURCE}, + {"SystemCapability.Multimedia.Image.ImagePacker", MULTIMEDIA_IMAGE_IMAGEPACKER}, + {"SystemCapability.Multimedia.Image.ImageReceiver", MULTIMEDIA_IMAGE_IMAGERECEIVER}, + {"SystemCapability.Multimedia.Media.Spliter", MULTIMEDIA_MEDIA_SPLITER}, + {"SystemCapability.Multimedia.Media.VideoPlayer", MULTIMEDIA_MEDIA_VIDEOPLAYER}, + {"SystemCapability.Multimedia.Media.VideoRecorder", MULTIMEDIA_MEDIA_VIDEORECORDER}, + {"SystemCapability.multimodalinput.input", MULTIMODALINPUT_INPUT}, + {"SystemCapability.Notification.CommonEvent", NOTIFICATION_COMMONEVENT}, + {"SystemCapability.Notification.Emitter", NOTIFICATION_EMITTER}, + {"SystemCapability.Notification.Notification", NOTIFICATION_NOTIFICATION}, + {"SystemCapability.Notification.ReminderAgent", NOTIFICATION_REMINDERAGENT}, + {"SystemCapability.PowerManager.BatteryManager.Core", POWERMANAGER_BATTERYMANAGER_CORE}, + {"SystemCapability.PowerManager.BatteryManager.Extension", POWERMANAGER_BATTERYMANAGER_EXTENSION}, + {"SystemCapability.PowerManager.BatteryManager.Lite", POWERMANAGER_BATTERYMANAGER_LITE}, + {"SystemCapability.PowerManager.BatteryStatistics", POWERMANAGER_BATTERYSTATISTICS}, + {"SystemCapability.PowerManager.DisplayPowerManager", POWERMANAGER_DISPLAYPOWERMANAGER}, + {"SystemCapability.PowerManager.PowerManager.Core", POWERMANAGER_POWERMANAGER_CORE}, + {"SystemCapability.PowerManager.PowerManager.Extension", POWERMANAGER_POWERMANAGER_EXTENSION}, + {"SystemCapability.PowerManager.PowerManager.Lite", POWERMANAGER_POWERMANAGER_LITE}, + {"SystemCapability.PowerManager.ThermalManager", POWERMANAGER_THERMALMANAGER}, + {"SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask", RESOURCESCHEDULE_BACKGROUNDTASKMANAGER_CONTINUOUSTASK}, + {"SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask", RESOURCESCHEDULE_BACKGROUNDTASKMANAGER_TRANSIENTTASK}, + {"SystemCapability.ResourceSchedule.UsageStatistics.App", RESOURCESCHEDULE_USAGESTATISTICS_APP}, + {"SystemCapability.ResourceSchedule.UsageStatistics.AppGroup", RESOURCESCHEDULE_USAGESTATISTICS_APPGROUP}, + {"SystemCapability.ResourceSchedule.WorkScheduler", RESOURCESCHEDULE_WORKSCHEDULER}, + {"SystemCapability.Security.AccessToken", SECURITY_ACCESSTOKEN}, + {"SystemCapability.Security.AppVerify", SECURITY_APPVERIFY}, + {"SystemCapability.Security.DataTransitManager", SECURITY_DATATRANSITMANAGER}, + {"SystemCapability.Security.DeviceAuth", SECURITY_DEVICEAUTH}, + {"SystemCapability.Security.DeviceSecurityLevel", SECURITY_DEVICESECURITYLEVEL}, + {"SystemCapability.Security.Huks", SECURITY_HUKS}, + {"SystemCapability.Sensors.MiscDevice", SENSORS_MISCDEVICE}, + {"SystemCapability.Sensors.Sensor", SENSORS_SENSOR}, + {"SystemCapability.Sensors.Sensor_lite", SENSORS_SENSOR_LITE}, + {"SystemCapability.Telephony.CallManager", TELEPHONY_CALLMANAGER}, + {"SystemCapability.Telephony.CellularCall", TELEPHONY_CELLULARCALL}, + {"SystemCapability.Telephony.CellularData", TELEPHONY_CELLULARDATA}, + {"SystemCapability.Telephony.CoreService", TELEPHONY_CORESERVICE}, + {"SystemCapability.Telephony.DataStorage", TELEPHONY_DATASTORAGE}, + {"SystemCapability.Telephony.DCall", TELEPHONY_DCALL}, + {"SystemCapability.Telephony.SmsMms", TELEPHONY_SMSMMS}, + {"SystemCapability.Telephony.StateRegistry", TELEPHONY_STATEREGISTRY}, + {"SystemCapability.Test.UiTest", TEST_UITEST}, + {"SystemCapability.Test.WuKong", TEST_WUKONG}, + {"SystemCapability.Updater.Raw", UPDATER_RAW}, + {"SystemCapability.Update.UpdateService", UPDATE_UPDATESERVICE}, + {"SystemCapability.USB.USBManager", USB_USBMANAGER}, + {"SystemCapability.UserIAM.AuthExecutorManager", USERIAM_AUTHEXECUTORMANAGER}, + {"SystemCapability.UserIAM.UserAuth.Core", USERIAM_USERAUTH_CORE}, + {"SystemCapability.UserIAM.UserAuth.FaceAuth", USERIAM_USERAUTH_FACEAUTH}, + {"SystemCapability.UserIAM.UserAuth.PinAuth", USERIAM_USERAUTH_PINAUTH}, + {"SystemCapability.UserIAM.UserIdm", USERIAM_USERIDM} +}; + +static void FreeContextBuffer(char *contextBuffer) { - uint8_t *outputArray = (uint8_t *)malloc(sizeof(int) * PCID_OUT_BUFFER); - if (outputArray == NULL) { - PRINT_ERR("malloc failed."); + (void)free(contextBuffer); +} + +static uint32_t GetFileContext(char **contextBufPtr, uint32_t *bufferLen) +{ + uint32_t ret; + FILE *fp = NULL; + struct stat statBuf; + char *contextBuffer = NULL; + ret = stat(inputFile, &statBuf); + if (ret != 0) { + PRINT_ERR("get file(%s) st_mode failed, errno = %d\n", inputFile, errno); + return -1; + } + if (!(statBuf.st_mode & S_IRUSR)) { + PRINT_ERR("don't have permission to read the file(%s)\n", inputFile); + return -1; + } + contextBuffer = (char *)malloc(statBuf.st_size + 1); + if (contextBuffer == NULL) { + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", (int32_t)statBuf.st_size + 1, errno); + return -1; + } + fp = fopen(inputFile, "rb"); + if (fp == NULL) { + PRINT_ERR("open file(%s) failed, errno = %d\n", inputFile, errno); + FreeContextBuffer(contextBuffer); + return -1; + } + ret = fread(contextBuffer, statBuf.st_size, 1, fp); + if (ret != 1) { + PRINT_ERR("read file(%s) failed, errno = %d\n", inputFile, errno); + FreeContextBuffer(contextBuffer); + (void)fclose(fp); + return -1; + } + contextBuffer[statBuf.st_size] = '\0'; + (void)fclose(fp); + + *contextBufPtr = contextBuffer; + *bufferLen = statBuf.st_size + 1; + return 0; +} + +bool EncodeOsSyscap(int **output) +{ + int32_t ret; + int32_t res; + char *contextBuffer = NULL; + int *outputArray = NULL; + uint32_t bufferLen; + + ret = GetFileContext(&contextBuffer, &bufferLen); + if (ret != 0) { + PRINT_ERR("GetFileContext failed, input file : rk3568.sc\n"); return false; } - (void)memset_s(outputArray, sizeof(int) * PCID_OUT_BUFFER, 0, sizeof(int) * PCID_OUT_BUFFER); - uint16_t countBytes = PCID_OUT_BUFFER * sizeof(int); - for (uint16_t i = 0; i < countBytes; i++) { - outputArray[i] |= 0XFF; + outputArray = (int *)malloc(PCID_MAIN_LEN); + if (outputArray == NULL) { + PRINT_ERR("malloc buffer failed, size = %d\n", PCID_MAIN_LEN); + return false; } - int ret = memcpy_s(output, sizeof(int) * PCID_OUT_BUFFER, outputArray, sizeof(int) * PCID_OUT_BUFFER); - if (ret != 0) { + (void)memset_s(outputArray, PCID_MAIN_LEN, 0, PCID_MAIN_LEN); + + res = memcpy_s(outputArray, PCID_MAIN_LEN, contextBuffer, PCID_MAIN_LEN); + if (res != 0) { PRINT_ERR("memcpy_s failed."); + FreeContextBuffer(contextBuffer); free(outputArray); return false; } - free(outputArray); + + FreeContextBuffer(contextBuffer); + *output = outputArray; return true; } -bool EncodePrivateSyscap(char *output, int *outputLen) +bool EncodePrivateSyscap(char **output, int *outputLen) { - static char syscapStr[MAX_SYSCAP_STR_LEN] = "Systemcapability.Ai.AiEngine"; - int ret = strcpy_s(output, MAX_SYSCAP_STR_LEN, syscapStr); + int32_t ret; + int32_t res; + char *contextBuffer = NULL; + char *outputStr = NULL; + uint32_t bufferLen; + + ret = GetFileContext(&contextBuffer, &bufferLen); if (ret != 0) { + PRINT_ERR("GetFileContext failed, input file : rk3568.sc\n"); + return false; + } + + *outputLen = bufferLen - MAX_SYSCAP_STR_LEN - 1; + outputStr = (char *)malloc(*outputLen); + if (outputStr == NULL) { + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", *outputLen, errno); + return false; + } + (void)memset_s(outputStr, *outputLen, 0, *outputLen); + res = strncpy_s(outputStr, *outputLen + 1, contextBuffer + MAX_SYSCAP_STR_LEN, *outputLen); + if (res != 0) { PRINT_ERR("strcpy_s failed."); + FreeContextBuffer(contextBuffer); + return false; + } + + FreeContextBuffer(contextBuffer); + *output = outputStr; + return true; +} + +bool DecodeOsSyscap(int input[32], char (**output)[128], int *outputCnt) +{ + errno_t nRet = 0; + uint16_t indexOfSyscap[OS_SYSCAP_BYTES * OS_SYSCAP_BYTES] = {0}; + int countOfSyscap = 0, i, j; + + uint8_t *osSyscap = (uint8_t *)(input + 2); // 2, int[2] of pcid header + + for (i = 0; i < OS_SYSCAP_BYTES; i++) { + for (j = 0; j < BITS_OF_BYTE; j++) { + if (osSyscap[i] & (0x01 << j)) { + indexOfSyscap[countOfSyscap++] = i * BITS_OF_BYTE + j; + } + } + } + + *outputCnt = countOfSyscap; + char (*strSyscap)[MAX_SYSCAP_STR_LEN] = NULL; + strSyscap= (char (*)[MAX_SYSCAP_STR_LEN])malloc(countOfSyscap * MAX_SYSCAP_STR_LEN); + if (strSyscap == NULL) { + PRINT_ERR("malloc failed."); + *outputCnt = 0; return false; } - *outputLen = strlen(syscapStr); + (void)memset_s(strSyscap, countOfSyscap * MAX_SYSCAP_STR_LEN, \ + 0, countOfSyscap * MAX_SYSCAP_STR_LEN); + char **strSyscapBak = (char **)strSyscap; + + for (i = 0; i < countOfSyscap; i++) { + for (j = 0; j < sizeof(arraySyscap) / sizeof(SyscapWithNum); j++) { + if (arraySyscap[j].num == indexOfSyscap[i]) { + nRet = strcpy_s(*strSyscap, MAX_SYSCAP_STR_LEN, arraySyscap[j].syscapStr); + if (nRet != EOK) { + printf("strcpy_s failed. error = %d\n", nRet); + *outputCnt = 0; + free(strSyscap); + return false; + } + strSyscap++; + break; + } + } + } + + *output = (char (*)[MAX_SYSCAP_STR_LEN])strSyscapBak; + return true; +} + +bool DecodePrivateSyscap(char *input, char (**output)[128], int *outputCnt) +{ + char (*outputArray)[MAX_SYSCAP_STR_LEN] = NULL; + char *inputStr = input; + uint16_t bufferLen; + int syscapCnt = 0, ret; + + while (*inputStr != '\0') { + if (*inputStr == ',') { + syscapCnt++; + } + inputStr++; + } + inputStr = input; + + bufferLen = MAX_SYSCAP_STR_LEN * syscapCnt; + outputArray = (char (*)[MAX_SYSCAP_STR_LEN])malloc(bufferLen); + if (outputArray == NULL) { + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", bufferLen, errno); + syscapCnt = 0; + return false; + } + (void)memset_s(outputArray, bufferLen, 0, bufferLen); + char **outputArrayBak = (char **)outputArray; + char priSyscapStr[MAX_SYSCAP_STR_LEN - 17] = {0}; // 17. size of "SystemCapability." + char *tempPriSyscapStr = priSyscapStr; + while (*inputStr != '\0') { + if (*inputStr == ',') { + *tempPriSyscapStr = '\0'; + ret = sprintf_s(*outputArray, MAX_SYSCAP_STR_LEN, "SystemCapability.%s", priSyscapStr); + if (ret == -1) { + PRINT_ERR("sprintf_s failed\n"); + *outputCnt = 0; + free(outputArray); + return false; + } + tempPriSyscapStr = priSyscapStr; + outputArray++; + inputStr++; + continue; + } + *tempPriSyscapStr++ = *inputStr++; + } + *outputCnt = syscapCnt; + *output = (char (*)[MAX_SYSCAP_STR_LEN])outputArrayBak; return true; } \ No newline at end of file diff --git a/interfaces/inner_api/syscap_interface.h b/interfaces/inner_api/syscap_interface.h index 1649a960d0f4a8b276e6be3292c590527ecd42e0..c4f4f4b4765ef01ba4c12ab9b329a8a2c4661fb4 100644 --- a/interfaces/inner_api/syscap_interface.h +++ b/interfaces/inner_api/syscap_interface.h @@ -34,10 +34,10 @@ typedef struct ProductCompatibilityIDHead { } PCIDHead; // to do -bool EncodeOsSyscap(int output[32]); -bool DecodeOsSyscap(int input[32], char **output, int *outputCnt, int** outputLen); -bool EncodePrivateSyscap(char *output, int *outputLen); -bool DecodePrivateSyscap(char *input, int inputLen, char *output, int *outputCnt, int **outputLen); +bool EncodeOsSyscap(int **output); +bool DecodeOsSyscap(int input[32], char (**output)[128], int *outputCnt); +bool EncodePrivateSyscap(char **output, int *outputLen); +bool DecodePrivateSyscap(char *input, char (**output)[128], int *outputCnt); #ifdef __cplusplus #if __cplusplus diff --git a/src/create_pcid.c b/src/create_pcid.c new file mode 100644 index 0000000000000000000000000000000000000000..e97d96a8cdf4c630a6533874e52cbc6781eb1b32 --- /dev/null +++ b/src/create_pcid.c @@ -0,0 +1,609 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "securec.h" +#include "cJSON.h" +#include "endian_internal.h" +#include "create_pcid.h" + +#define SINGLE_FEAT_LENGTH (32 * 8) +#define PER_SYSCAP_LEN_MAX 128 +#define PRIVATE_SYSCAP_SIZE 1000 +#define BITS_OF_ONE_BYTE 8 +#define BYTES_OF_OS_SYSCAP 120 + +#define PRINT_ERR(...) \ + do { \ + printf("ERROR: in file %s at line %d -> ", __FILE__, __LINE__); \ + printf(__VA_ARGS__); \ + } while (0) + +/* ensure sort by num */ +static SyscapWithNum arraySyscap[] = { + {"SystemCapability.Account.AppAccount", ACCOUNT_APPACCOUNT}, + {"SystemCapability.Account.OsAccount", ACCOUNT_OSACCOUNT}, + {"SystemCapability.Ace.AceEngineLite", ACE_ACEENGINELITE}, + {"SystemCapability.Ai.AiEngine", AI_AIENGINE}, + {"SystemCapability.Applications.ContactsData", APPLICATIONS_CONTACTSDATA}, + {"SystemCapability.Barrierfree.Accessibility.Core", BARRIERFREE_ACCESSIBILITY_CORE}, + {"SystemCapability.BundleManager.BundleFramework", BUNDLEMANAGER_BUNDLEFRAMEWORK}, + {"SystemCapability.BundleManager.BundleTool", BUNDLEMANAGER_BUNDLETOOL}, + {"SystemCapability.BundleManager.DistributedBundleFramework", BUNDLEMANAGER_DISTRIBUTEDBUNDLEFRAMEWORK}, + {"SystemCapability.BundleManager.Zlib", BUNDLEMANAGER_ZLIB}, + {"SystemCapability.Communication.Bluetooth.Core", COMMUNICATION_BLUETOOTH_CORE}, + {"SystemCapability.Communication.NetManager.Core", COMMUNICATION_NETMANAGER_CORE}, + {"SystemCapability.Communication.NetManager.Extension", COMMUNICATION_NETMANAGER_EXTENSION}, + {"SystemCapability.Communication.NetStack", COMMUNICATION_NETSTACK}, + {"SystemCapability.Communication.SoftBus.Core", COMMUNICATION_SOFTBUS_CORE}, + {"SystemCapability.Communication.WiFi.AP", COMMUNICATION_WIFI_AP}, + {"SystemCapability.Communication.WiFi.Core", COMMUNICATION_WIFI_CORE}, + {"SystemCapability.Communication.WiFi.HotspotExt", COMMUNICATION_WIFI_HOTSPOTEXT}, + {"SystemCapability.Communication.WiFi.P2P", COMMUNICATION_WIFI_P2P}, + {"SystemCapability.Communication.WiFi.STA", COMMUNICATION_WIFI_STA}, + {"SystemCapability.Customization.ConfigPolicy", CUSTOMIZATION_CONFIGPOLICY}, + {"SystemCapability.Customization.EnterpriseDeviceManager", CUSTOMIZATION_ENTERPRISEDEVICEMANAGER}, + {"SystemCapability.DistributedDataManager.DataObject.DistributedObject", DISTRIBUTEDDATAMANAGER_DATAOBJECT_DISTRIBUTEDOBJECT}, + {"SystemCapability.DistributedDataManager.DataShare.Consumer", DISTRIBUTEDDATAMANAGER_DATASHARE_CONSUMER}, + {"SystemCapability.DistributedDataManager.DataShare.Core", DISTRIBUTEDDATAMANAGER_DATASHARE_CORE}, + {"SystemCapability.DistributedDataManager.DataShare.Provider", DISTRIBUTEDDATAMANAGER_DATASHARE_PROVIDER}, + {"SystemCapability.DistributedDataManager.KVStore.Core", DISTRIBUTEDDATAMANAGER_KVSTORE_CORE}, + {"SystemCapability.DistributedDataManager.KVStore.DistributedKVStore", DISTRIBUTEDDATAMANAGER_KVSTORE_DISTRIBUTEDKVSTORE}, + {"SystemCapability.DistributedDataManager.KVStore.Lite", DISTRIBUTEDDATAMANAGER_KVSTORE_LITE}, + {"SystemCapability.DistributedDataManager.Preferences.Core", DISTRIBUTEDDATAMANAGER_PREFERENCES_CORE}, + {"SystemCapability.DistributedDataManager.RelationalStore.Core", DISTRIBUTEDDATAMANAGER_RELATIONALSTORE_CORE}, + {"SystemCapability.DistributedHardware.DeviceManager", DISTRIBUTEDHARDWARE_DEVICEMANAGER}, + {"SystemCapability.distributedhardware.distributed_camera", DISTRIBUTEDHARDWARE_DISTRIBUTED_CAMERA}, + {"SystemCapability.distributedhardware.distributed_hardware_fwk", DISTRIBUTEDHARDWARE_DISTRIBUTED_HARDWARE_FWK}, + {"SystemCapability.distributedhardware.distributed_screen", DISTRIBUTEDHARDWARE_DISTRIBUTED_SCREEN}, + {"SystemCapability.FileManagement.FileManagerService", FILEMANAGEMENT_FILEMANAGERSERVICE}, + {"SystemCapability.FileManagement.RemoteFileShare", FILEMANAGEMENT_REMOTEFILESHARE}, + {"SystemCapability.Global.ResourceManager", GLOBAL_RESOURCEMANAGER}, + {"SystemCapability.Graphic.Graphic2D.NativeDrawing", GRAPHIC_GRAPHIC2D_NATIVEDRAWING}, + {"SystemCapability.Graphic.Graphic2D.NativeWindow", GRAPHIC_GRAPHIC2D_NATIVEDRAWING}, + {"SystemCapability.Graphic.Graphic2D.WebGL", GRAPHIC_GRAPHIC2D_WEBGL}, + {"SystemCapability.Graphic.Graphic2D.WebGL2", GRAPHIC_GRAPHIC2D_WEBGL2}, + {"SystemCapability.Graphic.Surface", GRAPHIC_SURFACE}, + {"SystemCapability.Graphic.UI", GRAPHIC_UI}, + {"SystemCapability.Graphic.Utils", GRAPHIC_UTILS}, + {"SystemCapability.Graphic.Wms", GRAPHIC_WMS}, + {"SystemCapability.HiviewDFX.HiAppEvent", HIVIEWDFX_HIAPPEVENT}, + {"SystemCapability.HiviewDFX.HiDumper", HIVIEWDFX_HIDUMPER}, + {"SystemCapability.HiviewDFX.HiLog", HIVIEWDFX_HILOG}, + {"SystemCapability.HiviewDFX.HiLogLite", HIVIEWDFX_HILOGLITE}, + {"SystemCapability.HiviewDFX.HiProfiler.HiDebug", HIVIEWDFX_HIPROFILER_HIDEBUG}, + {"SystemCapability.HiviewDFX.HiSysEvent", HIVIEWDFX_HISYSEVENT}, + {"SystemCapability.HiviewDFX.HiTrace", HIVIEWDFX_HITRACE}, + {"SystemCapability.HiviewDFX.Hiview", HIVIEWDFX_HIVIEW}, + {"SystemCapability.HiviewDFX.Hiview.FaultLogger", HIVIEWDFX_HIVIEW_FAULTLOGGER}, + {"SystemCapability.I18N", I18N}, + {"SystemCapability.Global.I18n", GLOBAL_I18N}, + {"SystemCapability.Kernel.liteos-a", KERNEL_LITEOS_A}, + {"SystemCapability.Location.Location", LOCATION_LOCATION}, + {"SystemCapability.MiscServices.download", MISCSERVICES_DOWNLOAD}, + {"SystemCapability.Miscservices.InputMethod", MISCSERVICES_INPUTMETHOD}, + {"SystemCapability.Miscservices.Pasteboard", MISCSERVICES_PASTEBOARD}, + {"SystemCapability.MiscServices.ScreenLock", MISCSERVICES_SCREENLOCK}, + {"SystemCapability.MiscServices.Time", MISCSERVICES_TIME}, + {"SystemCapability.MiscServices.Upload", MISCSERVICES_UPLOAD}, + {"SystemCapability.MiscServices.Wallpaper", MISCSERVICES_WALLPAPER}, + {"SystemCapability.Msdp.DeviceStatus", MSDP_DEVICESTATUS}, + {"SystemCapability.Multimedia.MediaLibrary", MULTIMEDIA_MEDIALIBRARY}, + {"SystemCapability.Multimedia.Media.AudioPlayer", MULTIMEDIA_MEDIA_AUDIOPLAYER}, + {"SystemCapability.Multimedia.Media.AudioRecorder", MULTIMEDIA_MEDIA_AUDIORECORDER}, + {"SystemCapability.Multimedia.Media.Codec", MULTIMEDIA_MEDIA_CODEC}, + {"SystemCapability.Multimedia.Media.Core", MULTIMEDIA_MEDIA_CORE}, + {"SystemCapability.Multimedia.Media.Muxer", MULTIMEDIA_MEDIA_MUXER}, + {"SystemCapability.Multimedia.Image", MULTIMEDIA_IMAGE}, + {"SystemCapability.Multimedia.Image.Core", MULTIMEDIA_IMAGE_CORE}, + {"SystemCapability.Multimedia.Image.ImageSource", MULTIMEDIA_IMAGE_IMAGESOURCE}, + {"SystemCapability.Multimedia.Image.ImagePacker", MULTIMEDIA_IMAGE_IMAGEPACKER}, + {"SystemCapability.Multimedia.Image.ImageReceiver", MULTIMEDIA_IMAGE_IMAGERECEIVER}, + {"SystemCapability.Multimedia.Media.Spliter", MULTIMEDIA_MEDIA_SPLITER}, + {"SystemCapability.Multimedia.Media.VideoPlayer", MULTIMEDIA_MEDIA_VIDEOPLAYER}, + {"SystemCapability.Multimedia.Media.VideoRecorder", MULTIMEDIA_MEDIA_VIDEORECORDER}, + {"SystemCapability.multimodalinput.input", MULTIMODALINPUT_INPUT}, + {"SystemCapability.Notification.CommonEvent", NOTIFICATION_COMMONEVENT}, + {"SystemCapability.Notification.Emitter", NOTIFICATION_EMITTER}, + {"SystemCapability.Notification.Notification", NOTIFICATION_NOTIFICATION}, + {"SystemCapability.Notification.ReminderAgent", NOTIFICATION_REMINDERAGENT}, + {"SystemCapability.PowerManager.BatteryManager.Core", POWERMANAGER_BATTERYMANAGER_CORE}, + {"SystemCapability.PowerManager.BatteryManager.Extension", POWERMANAGER_BATTERYMANAGER_EXTENSION}, + {"SystemCapability.PowerManager.BatteryManager.Lite", POWERMANAGER_BATTERYMANAGER_LITE}, + {"SystemCapability.PowerManager.BatteryStatistics", POWERMANAGER_BATTERYSTATISTICS}, + {"SystemCapability.PowerManager.DisplayPowerManager", POWERMANAGER_DISPLAYPOWERMANAGER}, + {"SystemCapability.PowerManager.PowerManager.Core", POWERMANAGER_POWERMANAGER_CORE}, + {"SystemCapability.PowerManager.PowerManager.Extension", POWERMANAGER_POWERMANAGER_EXTENSION}, + {"SystemCapability.PowerManager.PowerManager.Lite", POWERMANAGER_POWERMANAGER_LITE}, + {"SystemCapability.PowerManager.ThermalManager", POWERMANAGER_THERMALMANAGER}, + {"SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask", RESOURCESCHEDULE_BACKGROUNDTASKMANAGER_CONTINUOUSTASK}, + {"SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask", RESOURCESCHEDULE_BACKGROUNDTASKMANAGER_TRANSIENTTASK}, + {"SystemCapability.ResourceSchedule.UsageStatistics.App", RESOURCESCHEDULE_USAGESTATISTICS_APP}, + {"SystemCapability.ResourceSchedule.UsageStatistics.AppGroup", RESOURCESCHEDULE_USAGESTATISTICS_APPGROUP}, + {"SystemCapability.ResourceSchedule.WorkScheduler", RESOURCESCHEDULE_WORKSCHEDULER}, + {"SystemCapability.Security.AccessToken", SECURITY_ACCESSTOKEN}, + {"SystemCapability.Security.AppVerify", SECURITY_APPVERIFY}, + {"SystemCapability.Security.DataTransitManager", SECURITY_DATATRANSITMANAGER}, + {"SystemCapability.Security.DeviceAuth", SECURITY_DEVICEAUTH}, + {"SystemCapability.Security.DeviceSecurityLevel", SECURITY_DEVICESECURITYLEVEL}, + {"SystemCapability.Security.Huks", SECURITY_HUKS}, + {"SystemCapability.Sensors.MiscDevice", SENSORS_MISCDEVICE}, + {"SystemCapability.Sensors.Sensor", SENSORS_SENSOR}, + {"SystemCapability.Sensors.Sensor_lite", SENSORS_SENSOR_LITE}, + {"SystemCapability.Telephony.CallManager", TELEPHONY_CALLMANAGER}, + {"SystemCapability.Telephony.CellularCall", TELEPHONY_CELLULARCALL}, + {"SystemCapability.Telephony.CellularData", TELEPHONY_CELLULARDATA}, + {"SystemCapability.Telephony.CoreService", TELEPHONY_CORESERVICE}, + {"SystemCapability.Telephony.DataStorage", TELEPHONY_DATASTORAGE}, + {"SystemCapability.Telephony.DCall", TELEPHONY_DCALL}, + {"SystemCapability.Telephony.SmsMms", TELEPHONY_SMSMMS}, + {"SystemCapability.Telephony.StateRegistry", TELEPHONY_STATEREGISTRY}, + {"SystemCapability.Test.UiTest", TEST_UITEST}, + {"SystemCapability.Test.WuKong", TEST_WUKONG}, + {"SystemCapability.Updater.Raw", UPDATER_RAW}, + {"SystemCapability.Update.UpdateService", UPDATE_UPDATESERVICE}, + {"SystemCapability.USB.USBManager", USB_USBMANAGER}, + {"SystemCapability.UserIAM.AuthExecutorManager", USERIAM_AUTHEXECUTORMANAGER}, + {"SystemCapability.UserIAM.UserAuth.Core", USERIAM_USERAUTH_CORE}, + {"SystemCapability.UserIAM.UserAuth.FaceAuth", USERIAM_USERAUTH_FACEAUTH}, + {"SystemCapability.UserIAM.UserAuth.PinAuth", USERIAM_USERAUTH_PINAUTH}, + {"SystemCapability.UserIAM.UserIdm", USERIAM_USERIDM} +}; + +static void FreeContextBuffer(char *contextBuffer) +{ + (void)free(contextBuffer); +} + +static uint32_t GetFileContext(char *inputFile, char **contextBufPtr, uint32_t *contextBufLen) +{ + uint32_t ret; + FILE *fp = NULL; + struct stat statBuf; + char *contextBuffer = NULL; + + ret = stat(inputFile, &statBuf); + if (ret != 0) { + PRINT_ERR("get file(%s) st_mode failed, errno = %d\n", inputFile, errno); + return -1; + } + if (!(statBuf.st_mode & S_IRUSR)) { + PRINT_ERR("don't have permission to read the file(%s)\n", inputFile); + return -1; + } + contextBuffer = (char *)malloc(statBuf.st_size + 1); + if (contextBuffer == NULL) { + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", (int32_t)statBuf.st_size + 1, errno); + return -1; + } + fp = fopen(inputFile, "rb"); + if (fp == NULL) { + PRINT_ERR("open file(%s) failed, errno = %d\n", inputFile, errno); + FreeContextBuffer(contextBuffer); + return -1; + } + ret = fread(contextBuffer, statBuf.st_size, 1, fp); + if (ret != 1) { + PRINT_ERR("read file(%s) failed, errno = %d\n", inputFile, errno); + FreeContextBuffer(contextBuffer); + (void)fclose(fp); + return -1; + } + contextBuffer[statBuf.st_size] = '\0'; + (void)fclose(fp); + + *contextBufPtr = contextBuffer; + *contextBufLen = statBuf.st_size + 1; + return 0; +} + +static int32_t ConvertedContextSaveAsFile(char *outDirPath, const char *filename, \ + char *convertedBuffer, uint32_t contextBufLen) +{ + int32_t ret; + FILE *fp = NULL; + char fileFullPath[PATH_MAX] = {0}; + int32_t pathLen = strlen(outDirPath); + + ret = strncpy_s(fileFullPath, PATH_MAX, outDirPath, pathLen + 1); + if (ret != 0) { + PRINT_ERR("strncpy_s failed, source string:%s, len = %d, errno = %d\n", outDirPath, pathLen + 1, errno); + return -1; + } + + if (fileFullPath[pathLen - 1] != '/' && fileFullPath[pathLen - 1] != '\\') { + fileFullPath[pathLen] = '/'; + } + + ret = strncat_s(fileFullPath, PATH_MAX, filename, strlen(filename) + 1); + if (ret != 0) { + PRINT_ERR("strncat_s failed, (%s, %d, %s, %d), errno = %d\n", + fileFullPath, PATH_MAX, filename, (int32_t)strlen(filename) + 1, errno); + return -1; + } + + fp = fopen(fileFullPath, "wb"); + if (fp == NULL) { + PRINT_ERR("can`t create file(%s), errno = %d\n", fileFullPath, errno); + return -1; + } + + ret = fwrite(convertedBuffer, contextBufLen, 1, fp); + if (ret != 1) { + PRINT_ERR("can`t write file(%s),errno = %d\n", fileFullPath, errno); + (void)fclose(fp); + return -1; + } + + (void)fclose(fp); + + return 0; +} + +static cJSON *CreateWholeSyscapJsonObj(void) +{ + size_t numOfSyscapAll = sizeof(arraySyscap) / sizeof(SyscapWithNum); + cJSON *root = cJSON_CreateObject(); + for (size_t i = 0; i < numOfSyscapAll; i++) { + cJSON_AddItemToObject(root, arraySyscap[i].syscapStr, cJSON_CreateNumber(arraySyscap[i].num)); + } + return root; +} + +int32_t CreatePCID(char *inputFile, char *outDirPath) +{ + uint8_t sectorOfBits, posOfBits; + int32_t ret, i; + uint32_t contextBufLen, osCapSize, privateCapSize; + errno_t nRet = 0; + char *contextBuffer = NULL; + char *systemType = NULL; + cJSON *jsonRootObj = NULL; + cJSON *jsonSyscapObj = NULL; + cJSON *jsonOsSyscapObj = NULL; + cJSON *jsonPriSyscapObj = NULL; + cJSON *jsonArrayItem = NULL; + cJSON *osCapIndex = NULL; + cJSON *allOsSyscapObj = CreateWholeSyscapJsonObj(); + + ret = GetFileContext(inputFile, &contextBuffer, &contextBufLen); + if (ret != 0) { + PRINT_ERR("GetFileContext failed, input file : %s\n", inputFile); + return -1; + } + + jsonRootObj = cJSON_ParseWithLength(contextBuffer, contextBufLen); + if (jsonRootObj == NULL) { + PRINT_ERR("cJSON_Parse failed, context buffer is:\n%s\n", contextBuffer); + ret = -1; + goto FREE_CONVERT_OUT; + } + + jsonSyscapObj = cJSON_GetObjectItem(jsonRootObj, "syscap"); + if (jsonSyscapObj == NULL || !cJSON_IsObject(jsonSyscapObj)) { + PRINT_ERR("get \"syscap\" object failed, jsonSyscapObj = %p\n", jsonSyscapObj); + ret = -1; + goto FREE_CONVERT_OUT; + } + + jsonOsSyscapObj = cJSON_GetObjectItem(jsonSyscapObj, "os"); + if (jsonOsSyscapObj == NULL || !cJSON_IsArray(jsonOsSyscapObj)) { + PRINT_ERR("get \"os\" array failed, jsonOsSyscapObj = %p\n", jsonOsSyscapObj); + ret = -1; + goto FREE_CONVERT_OUT; + } + osCapSize = cJSON_GetArraySize(jsonOsSyscapObj); + if (osCapSize < 0) { + PRINT_ERR("get \"os\" array size failed\n"); + ret = -1; + goto FREE_CONVERT_OUT; + } + + jsonPriSyscapObj = cJSON_GetObjectItem(jsonSyscapObj, "private"); + if (jsonPriSyscapObj != NULL && cJSON_IsArray(jsonPriSyscapObj)) { + privateCapSize = cJSON_GetArraySize(jsonPriSyscapObj); + } else if (jsonPriSyscapObj == NULL) { + privateCapSize = 0; + } else { + PRINT_ERR("get \"private\" array failed, jsonPriSyscapObj = %p\n", jsonPriSyscapObj); + ret = -1; + goto FREE_CONVERT_OUT; + } + + uint16_t allPriSyscapStrLen = 0; + for (i = 0; i < privateCapSize; i++) { + jsonArrayItem = cJSON_GetArrayItem(jsonPriSyscapObj, i); + allPriSyscapStrLen += strlen(strchr(jsonArrayItem->valuestring, '.') + 1); + allPriSyscapStrLen++; // for separator ',' + } + if ((allPriSyscapStrLen + 1) > PRIVATE_SYSCAP_SIZE) { + PRINT_ERR("context of \"pri\" array is too many\n"); + ret = -1; + goto FREE_CONVERT_OUT; + } + + uint16_t PCIDLength = sizeof(PCIDMain) + allPriSyscapStrLen + 1; + PCIDMain *PCIDBuffer = (PCIDMain *)malloc(PCIDLength); + if (PCIDBuffer == NULL) { + PRINT_ERR("malloc for pcid buffer failed\n"); + ret = -1; + goto FREE_CONVERT_OUT; + } + (void)memset_s(PCIDBuffer, PCIDLength, 0, PCIDLength); + + // process os syscap + for (i = 0; i < osCapSize; i++) { + jsonArrayItem = cJSON_GetArrayItem(jsonOsSyscapObj, i); + osCapIndex = cJSON_GetObjectItem(allOsSyscapObj, jsonArrayItem->valuestring); + sectorOfBits = (osCapIndex->valueint) / BITS_OF_ONE_BYTE; + posOfBits = (osCapIndex->valueint) % BITS_OF_ONE_BYTE; + if (sectorOfBits >= BYTES_OF_OS_SYSCAP) { + PRINT_ERR("num of \"os syscap\" is out of 960\n"); + ret = -1; + goto FREE_PCID_BUFFER_OUT; + } + PCIDBuffer->osSyscap[sectorOfBits] |= 1 << (posOfBits); + } + + // process private syscap + char *priSyscapHead = (char *)(PCIDBuffer + 1); + char *priSyscapStr = NULL; + for (i = 0; i < privateCapSize; i++) { + jsonArrayItem = cJSON_GetArrayItem(jsonPriSyscapObj, i); + priSyscapStr = strchr(jsonArrayItem->valuestring, '.') + 1; + nRet = strcat_s(priSyscapHead, PRIVATE_SYSCAP_SIZE - 1, priSyscapStr); + nRet += strcat_s(priSyscapHead, PRIVATE_SYSCAP_SIZE - 1, ","); + if (nRet != EOK) { + PRINT_ERR("strcat_s \"pri\" string is failed\n"); + ret = -1; + goto FREE_PCID_BUFFER_OUT; + } + } + + jsonSyscapObj = cJSON_GetObjectItem(jsonRootObj, "api_version"); + if (jsonSyscapObj == NULL || !cJSON_IsNumber(jsonSyscapObj)) { + PRINT_ERR("get \"api_version\" failed, jsonSyscapObj = %p\n", jsonSyscapObj); + ret = -1; + goto FREE_PCID_BUFFER_OUT; + } + PCIDBuffer->apiVersion = HtonsInter((uint16_t)jsonSyscapObj->valueint); + PCIDBuffer->apiVersionType = 0; + + jsonSyscapObj = cJSON_GetObjectItem(jsonRootObj, "system_type"); + if (jsonSyscapObj == NULL || !cJSON_IsString(jsonSyscapObj)) { + PRINT_ERR("get \"system_type\" failed, jsonSyscapObj = %p\n", jsonSyscapObj); + ret = -1; + goto FREE_PCID_BUFFER_OUT; + } + systemType = jsonSyscapObj->valuestring; + PCIDBuffer->systemType = !strcmp(systemType, "mini") ? 0b001 : + (!strcmp(systemType, "small") ? 0b010 : + (!strcmp(systemType, "standard") ? 0b100 : 0)); + if (PCIDBuffer->systemType == 0) { + PRINT_ERR("\"system_type\" is invaild, systemType = \"%s\"\n", systemType); + ret = -1; + goto FREE_PCID_BUFFER_OUT; + } + + jsonSyscapObj = cJSON_GetObjectItem(jsonRootObj, "manufacturer_id"); + if (jsonSyscapObj == NULL || !cJSON_IsNumber(jsonSyscapObj)) { + PRINT_ERR("get \"manufacturer_id\" failed, jsonSyscapObj = %p\n", jsonSyscapObj); + ret = -1; + goto FREE_PCID_BUFFER_OUT; + } + PCIDBuffer->manufacturerID = HtonlInter((uint32_t)jsonSyscapObj->valueint); + + const char pcidFileName[] = "PCID.sc"; + ret = ConvertedContextSaveAsFile(outDirPath, pcidFileName, (char *)PCIDBuffer, PCIDLength); + if (ret != 0) { + PRINT_ERR("ConvertedContextSaveAsFile failed, outDirPath:%s, filename:%s\n", outDirPath, pcidFileName); + ret = -1; + goto FREE_PCID_BUFFER_OUT; + } + +FREE_PCID_BUFFER_OUT: + free(PCIDBuffer); +FREE_CONVERT_OUT: + free(allOsSyscapObj); + FreeContextBuffer(contextBuffer); + return ret; +} + +int32_t DecodePCID(char *inputFile, char *outDirPath) +{ + int32_t ret, i, j; + errno_t nRet = 0; + char *contextBuffer = NULL; + uint8_t osSyscap[BYTES_OF_OS_SYSCAP] = {0}; + uint16_t indexOfSyscap[960] = {0}; + uint32_t contextBufLen, countOfSyscap = 0; + + ret = GetFileContext(inputFile, &contextBuffer, &contextBufLen); + if (ret != 0) { + PRINT_ERR("GetFileContext failed, input file : %s\n", inputFile); + return -1; + } + + PCIDMain *pcidMain = (PCIDMain *)contextBuffer; + + /* api version */ + if (pcidMain->apiVersionType != 0) { + PRINT_ERR("prase file failed, apiVersionType is invaild, input file : %s\n", inputFile); + ret = -1; + goto FREE_CONTEXT_OUT; + } + + /* system type */ + char *systemType = pcidMain->systemType == 0b001 ? "mini" : + (pcidMain->systemType == 0b010 ? "small" : + (pcidMain->systemType == 0b100 ? "standard" : NULL)); + if (systemType == NULL) { + PRINT_ERR("prase file failed, systemType is invaild, %d\n", pcidMain->systemType); + ret = -1; + goto FREE_CONTEXT_OUT; + } + + cJSON *capVectorPtr = cJSON_CreateArray(); + if (capVectorPtr == NULL) { + PRINT_ERR("cJSON_CreateArray failed\n"); + ret = -1; + goto FREE_CONTEXT_OUT; + } + + nRet = memcpy_s(osSyscap, BYTES_OF_OS_SYSCAP, (uint8_t *)pcidMain + 8, BYTES_OF_OS_SYSCAP); // 8, bytes of pcid header + if (EOK != nRet) { + PRINT_ERR("memcpy_s failed."); + ret = -1; + goto FREE_VECTOR_OUT; + } + for (i = 0; i < BYTES_OF_OS_SYSCAP; i++) { + for (j = 0; j < BITS_OF_ONE_BYTE; j++) { + if (osSyscap[i] & (0x01 << j)) { + indexOfSyscap[countOfSyscap++] = i * BITS_OF_ONE_BYTE + j; + } + } + } + for (i = 0; i < countOfSyscap; i++) { + for (j = 0; j < sizeof(arraySyscap) / sizeof(SyscapWithNum); j++) { + if (arraySyscap[j].num == indexOfSyscap[i]) { + if (!cJSON_AddItemToArray(capVectorPtr, cJSON_CreateString(arraySyscap[j].syscapStr))) { + printf("cJSON_AddItemToArray or cJSON_CreateString failed\n"); + ret = -1; + goto FREE_VECTOR_OUT; + } + } + } + } + + cJSON *sysCapObjectPtr = cJSON_CreateObject(); + if (sysCapObjectPtr == NULL) { + PRINT_ERR("cJSON_CreateObject failed\n"); + ret = -1; + goto FREE_CONTEXT_OUT; + } + if (!cJSON_AddItemToObject(sysCapObjectPtr, "os", capVectorPtr)) { + PRINT_ERR("cJSON_AddItemToObject failed\n"); + ret = -1; + goto FREE_VECTOR_OUT; + } + // private syscap + capVectorPtr = cJSON_CreateArray(); + if (capVectorPtr == NULL) { + PRINT_ERR("cJSON_CreateArray failed\n"); + ret = -1; + goto FREE_SYSCAP_OUT; + } + + char *ptrPrivateSyscap = (char *)(pcidMain + 1); + uint16_t privateSyscapLen = contextBufLen - sizeof(PCIDMain) - 1; + char priSyscapStr[PER_SYSCAP_LEN_MAX] = {0}; + char *tempPriSyscapStr = priSyscapStr; + char fullPriSyscapStr[PER_SYSCAP_LEN_MAX] = {0}; + if (privateSyscapLen < 0) { + PRINT_ERR("parse private syscap failed."); + ret = -1; + goto FREE_VECTOR_OUT; + } else if (privateSyscapLen == 0) { + goto SKIP_GET_PRIVATE; + } + + while (*ptrPrivateSyscap != '\0') { + if (*ptrPrivateSyscap == ',') { + *tempPriSyscapStr = '\0'; + ret = sprintf_s(fullPriSyscapStr, PER_SYSCAP_LEN_MAX, "SystemCapability.%s", priSyscapStr); + if (ret == -1) { + printf("sprintf_s failed\n"); + goto FREE_VECTOR_OUT; + } + if (!cJSON_AddItemToArray(capVectorPtr, cJSON_CreateString(fullPriSyscapStr))) { + printf("cJSON_AddItemToArray or cJSON_CreateString failed\n"); + ret = -1; + goto FREE_VECTOR_OUT; + } + tempPriSyscapStr = priSyscapStr; + ptrPrivateSyscap++; + continue; + } + *tempPriSyscapStr++ = *ptrPrivateSyscap++; + } + if (!cJSON_AddItemToObject(sysCapObjectPtr, "private", capVectorPtr)) { + PRINT_ERR("cJSON_AddItemToObject failed\n"); + ret = -1; + goto FREE_VECTOR_OUT; + } + +SKIP_GET_PRIVATE: + capVectorPtr = NULL; + // create json root + cJSON *jsonRootObj = cJSON_CreateObject(); + if (jsonRootObj == NULL) { + PRINT_ERR("cJSON_CreateObject failed\n"); + ret = -1; + goto FREE_SYSCAP_OUT; + } + + if (!cJSON_AddNumberToObject(jsonRootObj, "api_version", NtohsInter(pcidMain->apiVersion))) { + PRINT_ERR("cJSON_AddNumberToObject failed\n"); + ret = -1; + goto FREE_ROOT_OUT; + } + if (!cJSON_AddNumberToObject(jsonRootObj, "manufacturer_id", NtohlInter(pcidMain->manufacturerID))) { + PRINT_ERR("cJSON_AddNumberToObject failed\n"); + ret = -1; + goto FREE_ROOT_OUT; + } + if (!cJSON_AddStringToObject(jsonRootObj, "system_type", systemType)) { + PRINT_ERR("cJSON_AddStringToObject failed\n"); + ret = -1; + goto FREE_ROOT_OUT; + } + if (!cJSON_AddItemToObject(jsonRootObj, "syscap", sysCapObjectPtr)) { + PRINT_ERR("cJSON_AddItemToObject failed\n"); + ret = -1; + goto FREE_ROOT_OUT; + } + sysCapObjectPtr = NULL; + + char *convertedBuffer = cJSON_Print(jsonRootObj); + + const char outputFileName[] = "PCID.json"; + ret = ConvertedContextSaveAsFile(outDirPath, outputFileName, convertedBuffer, strlen(convertedBuffer)); + if (ret != 0) { + PRINT_ERR("ConvertedContextSaveAsFile failed, outDirPath:%s, filename:%s\n", outDirPath, outputFileName); + goto FREE_CONVERT_OUT; + } + +FREE_CONVERT_OUT: + free(convertedBuffer); +FREE_ROOT_OUT: + cJSON_Delete(jsonRootObj); +FREE_SYSCAP_OUT: + cJSON_Delete(sysCapObjectPtr); +FREE_VECTOR_OUT: + cJSON_Delete(capVectorPtr); +FREE_CONTEXT_OUT: + FreeContextBuffer(contextBuffer); + return ret; +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 339b1ba035e97bc27c08887bdf583ecb51944a46..8b4160e04eb02dce91bb7ca9441e7761aceb9e71 100755 --- a/src/main.c +++ b/src/main.c @@ -20,6 +20,7 @@ #include #include #include "syscap_tool.h" +#include "create_pcid.h" int main(int argc, char **argv) { @@ -35,14 +36,14 @@ int main(int argc, char **argv) while (1) { static struct option long_options[] = { - {"help", no_argument, 0, 'h' }, - {"RPCID", no_argument, 0, 'R' }, - {"PCID", no_argument, 0, 'P' }, - {"encode", no_argument, 0, 'e' }, - {"decode", no_argument, 0, 'd' }, - {"input", required_argument, 0, 'i' }, - {"output", required_argument, 0, 'o' }, - {0, 0, 0, 0 } + {"help", no_argument, 0, 'h' }, + {"RPCID", no_argument, 0, 'R' }, + {"PCID", no_argument, 0, 'P' }, + {"encode", no_argument, 0, 'e' }, + {"decode", no_argument, 0, 'd' }, + {"input", required_argument, 0, 'i' }, + {"output", required_argument, 0, 'o' }, + {0, 0, 0, 0 } }; int32_t flag = getopt_long(argc, argv, "hRPedi:o:", long_options, &optIndex); @@ -79,9 +80,9 @@ int main(int argc, char **argv) } else if (rpcid && !pcid && !encode && decode && inputfile && !help) { ret = RPCIDDecode(inputfile, outputpath); } else if (!rpcid && pcid && encode && !decode && inputfile && !help) { - ret = PCIDEncode(inputfile, outputpath); + ret = CreatePCID(inputfile, outputpath); } else if (!rpcid && pcid && !encode && decode && inputfile && !help) { - ret = PCIDDecode(inputfile, outputpath); + ret = DecodePCID(inputfile, outputpath); } else { printf("syscap_tool -R/P -e/d -i filepath [-o outpath]\n"); printf("-h, --help : how to use\n"); diff --git a/test/syscap_tool_test.c b/test/syscap_tool_test.c index 1215ad6b950df43c9bc54b39ae0d2a08598d3a62..acf45d1f3226c35abd497b082e3e60d4c1808713 100755 --- a/test/syscap_tool_test.c +++ b/test/syscap_tool_test.c @@ -23,6 +23,7 @@ #include #include #include "syscap_tool.h" +#include "create_pcid.h" char *g_testFilePcid = "{\n \"api_version\": 0,\n \"manufacturer_id\": 0,\n \"product\": \"rk3568\",\n" \ " \"syscap\": {\n \"os\": [\n \"SystemCapability.Account.AppAccount\",\n" \ @@ -61,6 +62,7 @@ int main(int argc, char **argv) (void)unlink(pcidFileName); (void)unlink(rpcidFileName); (void)unlink("./rk3568.sc"); + (void)unlink("./newPCID.sc"); (void)unlink("./rpcid.sc"); (void)unlink("./rk3568.json"); @@ -110,6 +112,22 @@ int main(int argc, char **argv) } passCnt++; printf("pass\n"); + printf("5.test pcid.json encode to new PCID.sc\n"); + ret = CreatePCID("./newPCID.sc", "./"); + if (ret != 0) { + printf(" error: new pcid.sc encode failed\n"); + exit(passCnt); + } + passCnt++; + printf("pass\n"); + printf("6.test new pcid.sc decode to pcid.json\n"); + ret = PCIDDecode("./newPCID.sc", "./"); + if (ret != 0) { + printf(" error: new pcid.sc decode failed\n"); + exit(passCnt); + } + passCnt++; + printf("pass\n"); exit(passCnt); } (void)wait(&status); @@ -117,6 +135,7 @@ int main(int argc, char **argv) (void)unlink(pcidFileName); (void)unlink(rpcidFileName); (void)unlink("./rk3568.sc"); + (void)unlink("./newPCID.sc"); (void)unlink("./rpcid.sc"); (void)unlink("./rk3568.json");