1365d9939Sopenharmony_ci/* 2365d9939Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3365d9939Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4365d9939Sopenharmony_ci * you may not use this file except in compliance with the License. 5365d9939Sopenharmony_ci * You may obtain a copy of the License at 6365d9939Sopenharmony_ci * 7365d9939Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8365d9939Sopenharmony_ci * 9365d9939Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10365d9939Sopenharmony_ci * miscservices under the License is miscservices on an "AS IS" BASIS, 11365d9939Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12365d9939Sopenharmony_ci * See the License for the specific language governing permissions and 13365d9939Sopenharmony_ci * limitations under the License. 14365d9939Sopenharmony_ci */ 15365d9939Sopenharmony_ci 16365d9939Sopenharmony_ci#include "screenlockmanager_fuzzer.h" 17365d9939Sopenharmony_ci 18365d9939Sopenharmony_ci#include <cstddef> 19365d9939Sopenharmony_ci#include <cstdint> 20365d9939Sopenharmony_ci 21365d9939Sopenharmony_ci#include "message_parcel.h" 22365d9939Sopenharmony_ci#include "screenlock_app_manager.h" 23365d9939Sopenharmony_ci#include "screenlock_callback.h" 24365d9939Sopenharmony_ci#include "screenlock_manager.h" 25365d9939Sopenharmony_ci#include "screenlock_manager_interface.h" 26365d9939Sopenharmony_ci#include "screenlock_system_ability.h" 27365d9939Sopenharmony_ci#include "screenlock_system_ability_callback.h" 28365d9939Sopenharmony_ci 29365d9939Sopenharmony_ciusing namespace OHOS::ScreenLock; 30365d9939Sopenharmony_ci 31365d9939Sopenharmony_cinamespace OHOS { 32365d9939Sopenharmony_ciconstexpr size_t THRESHOLD = 10; 33365d9939Sopenharmony_ciconstexpr int32_t OFFSET = 4; 34365d9939Sopenharmony_ciconstexpr size_t LENGTH = 1; 35365d9939Sopenharmony_ciconstexpr size_t RANDNUM_ZERO = 0; 36365d9939Sopenharmony_ciconstexpr size_t RANDNUM_ONE = 1; 37365d9939Sopenharmony_ciconstexpr size_t RANDNUM_TWO = 2; 38365d9939Sopenharmony_ci 39365d9939Sopenharmony_ciuint32_t ConvertToUint32(const uint8_t *ptr) 40365d9939Sopenharmony_ci{ 41365d9939Sopenharmony_ci if (ptr == nullptr) { 42365d9939Sopenharmony_ci return 0; 43365d9939Sopenharmony_ci } 44365d9939Sopenharmony_ci uint32_t bigvar = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]); 45365d9939Sopenharmony_ci return bigvar; 46365d9939Sopenharmony_ci} 47365d9939Sopenharmony_ci 48365d9939Sopenharmony_cibool FuzzScreenlockManager(const uint8_t *rawData, size_t size) 49365d9939Sopenharmony_ci{ 50365d9939Sopenharmony_ci uint32_t code = ConvertToUint32(rawData); 51365d9939Sopenharmony_ci EventListener eventListener; 52365d9939Sopenharmony_ci if (code == RANDNUM_ZERO) { 53365d9939Sopenharmony_ci return ScreenLockManager::GetInstance()->IsScreenLocked(); 54365d9939Sopenharmony_ci } 55365d9939Sopenharmony_ci if (code == RANDNUM_ONE) { 56365d9939Sopenharmony_ci return ScreenLockManager::GetInstance()->GetSecure(); 57365d9939Sopenharmony_ci } 58365d9939Sopenharmony_ci if (code == RANDNUM_TWO) { 59365d9939Sopenharmony_ci sptr<ScreenlockCallback> listener_ = new ScreenlockCallback(eventListener); 60365d9939Sopenharmony_ci int32_t ret = ScreenLockManager::GetInstance()->Lock(listener_); 61365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 62365d9939Sopenharmony_ci } 63365d9939Sopenharmony_ci return true; 64365d9939Sopenharmony_ci} 65365d9939Sopenharmony_ci 66365d9939Sopenharmony_cibool UnlockFuzzTest(const uint8_t *rawData, size_t size) 67365d9939Sopenharmony_ci{ 68365d9939Sopenharmony_ci EventListener eventListener; 69365d9939Sopenharmony_ci sptr<ScreenlockCallback> listener_ = new ScreenlockCallback(eventListener); 70365d9939Sopenharmony_ci if (size < LENGTH) { 71365d9939Sopenharmony_ci return true; 72365d9939Sopenharmony_ci } 73365d9939Sopenharmony_ci int32_t ret = ScreenLockManager::GetInstance()->Unlock(static_cast<Action>(rawData[0] % 3), listener_); 74365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 75365d9939Sopenharmony_ci} 76365d9939Sopenharmony_ci 77365d9939Sopenharmony_cibool IsLockedFuzzTest(const uint8_t *rawData, size_t size) 78365d9939Sopenharmony_ci{ 79365d9939Sopenharmony_ci if (size < LENGTH) { 80365d9939Sopenharmony_ci return true; 81365d9939Sopenharmony_ci } 82365d9939Sopenharmony_ci bool isLocked = static_cast<bool>(rawData[0] % 2); 83365d9939Sopenharmony_ci int32_t ret = ScreenLockManager::GetInstance()->IsLocked(isLocked); 84365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 85365d9939Sopenharmony_ci} 86365d9939Sopenharmony_ci 87365d9939Sopenharmony_cibool FuzzScreenlockAppManager(const uint8_t *rawData, size_t size) 88365d9939Sopenharmony_ci{ 89365d9939Sopenharmony_ci uint32_t code = ConvertToUint32(rawData); 90365d9939Sopenharmony_ci rawData = rawData + OFFSET; 91365d9939Sopenharmony_ci size = size - OFFSET; 92365d9939Sopenharmony_ci EventListener eventListener; 93365d9939Sopenharmony_ci if (code == RANDNUM_ZERO) { 94365d9939Sopenharmony_ci sptr<ScreenlockSystemAbilityCallback> listener_ = new ScreenlockSystemAbilityCallback(eventListener); 95365d9939Sopenharmony_ci int32_t ret = ScreenLockAppManager::GetInstance()->OnSystemEvent(listener_); 96365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 97365d9939Sopenharmony_ci } 98365d9939Sopenharmony_ci if (code == RANDNUM_ONE) { 99365d9939Sopenharmony_ci int param = 0; 100365d9939Sopenharmony_ci std::string event(reinterpret_cast<const char *>(rawData), size); 101365d9939Sopenharmony_ci int32_t ret = ScreenLockAppManager::GetInstance()->SendScreenLockEvent(event, param); 102365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 103365d9939Sopenharmony_ci } 104365d9939Sopenharmony_ci return true; 105365d9939Sopenharmony_ci} 106365d9939Sopenharmony_ci 107365d9939Sopenharmony_cibool FuzzScreenlockIsDisabled(const uint8_t *rawData, size_t size) 108365d9939Sopenharmony_ci{ 109365d9939Sopenharmony_ci if (size < LENGTH) { 110365d9939Sopenharmony_ci return true; 111365d9939Sopenharmony_ci } 112365d9939Sopenharmony_ci int32_t userId = 100; 113365d9939Sopenharmony_ci bool isDisabled = static_cast<bool>(rawData[0] % 2); 114365d9939Sopenharmony_ci int32_t ret = ScreenLockAppManager::GetInstance()->IsScreenLockDisabled(userId, isDisabled); 115365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 116365d9939Sopenharmony_ci} 117365d9939Sopenharmony_ci 118365d9939Sopenharmony_cibool FuzzScreenlockSetDisabled(const uint8_t *rawData, size_t size) 119365d9939Sopenharmony_ci{ 120365d9939Sopenharmony_ci if (size < LENGTH) { 121365d9939Sopenharmony_ci return true; 122365d9939Sopenharmony_ci } 123365d9939Sopenharmony_ci int32_t userId = 100; 124365d9939Sopenharmony_ci bool isDisabled = static_cast<bool>(rawData[0] % 2); 125365d9939Sopenharmony_ci int32_t ret = ScreenLockAppManager::GetInstance()->SetScreenLockDisabled(isDisabled, userId); 126365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 127365d9939Sopenharmony_ci} 128365d9939Sopenharmony_ci 129365d9939Sopenharmony_cibool FuzzScreenlockSetAuthState(const uint8_t *rawData, size_t size) 130365d9939Sopenharmony_ci{ 131365d9939Sopenharmony_ci if (size < LENGTH) { 132365d9939Sopenharmony_ci return true; 133365d9939Sopenharmony_ci } 134365d9939Sopenharmony_ci int32_t userId = 100; 135365d9939Sopenharmony_ci int32_t authState = 2; 136365d9939Sopenharmony_ci std::string authToken = "test"; 137365d9939Sopenharmony_ci int32_t ret = ScreenLockAppManager::GetInstance()->SetScreenLockAuthState(authState, userId, authToken); 138365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 139365d9939Sopenharmony_ci} 140365d9939Sopenharmony_ci 141365d9939Sopenharmony_cibool FuzzScreenlockGetAuthState(const uint8_t *rawData, size_t size) 142365d9939Sopenharmony_ci{ 143365d9939Sopenharmony_ci if (size < LENGTH) { 144365d9939Sopenharmony_ci return true; 145365d9939Sopenharmony_ci } 146365d9939Sopenharmony_ci int32_t userId = 100; 147365d9939Sopenharmony_ci int32_t authState = 2; 148365d9939Sopenharmony_ci int32_t ret = ScreenLockAppManager::GetInstance()->GetScreenLockAuthState(userId, authState); 149365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 150365d9939Sopenharmony_ci} 151365d9939Sopenharmony_ci 152365d9939Sopenharmony_cibool FuzzScreenlockRequestStrongAuth(const uint8_t *rawData, size_t size) 153365d9939Sopenharmony_ci{ 154365d9939Sopenharmony_ci if (size < LENGTH) { 155365d9939Sopenharmony_ci return true; 156365d9939Sopenharmony_ci } 157365d9939Sopenharmony_ci int32_t userId = 100; 158365d9939Sopenharmony_ci int reasonFlag = 1; 159365d9939Sopenharmony_ci int32_t ret = ScreenLockAppManager::GetInstance()->RequestStrongAuth(reasonFlag, userId); 160365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 161365d9939Sopenharmony_ci} 162365d9939Sopenharmony_ci 163365d9939Sopenharmony_cibool FuzzScreenlockGetStrongAuth(const uint8_t *rawData, size_t size) 164365d9939Sopenharmony_ci{ 165365d9939Sopenharmony_ci if (size < LENGTH) { 166365d9939Sopenharmony_ci return true; 167365d9939Sopenharmony_ci } 168365d9939Sopenharmony_ci int32_t userId = 100; 169365d9939Sopenharmony_ci int reasonFlag = 1; 170365d9939Sopenharmony_ci int32_t ret = ScreenLockAppManager::GetInstance()->GetStrongAuth(userId, reasonFlag); 171365d9939Sopenharmony_ci return ret == E_SCREENLOCK_OK; 172365d9939Sopenharmony_ci} 173365d9939Sopenharmony_ci 174365d9939Sopenharmony_ci} // namespace OHOS 175365d9939Sopenharmony_ci 176365d9939Sopenharmony_ci/* Fuzzer entry point */ 177365d9939Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 178365d9939Sopenharmony_ci{ 179365d9939Sopenharmony_ci if (size < OHOS::THRESHOLD) { 180365d9939Sopenharmony_ci return 0; 181365d9939Sopenharmony_ci } 182365d9939Sopenharmony_ci 183365d9939Sopenharmony_ci /* Run your code on data */ 184365d9939Sopenharmony_ci OHOS::FuzzScreenlockManager(data, size); 185365d9939Sopenharmony_ci OHOS::UnlockFuzzTest(data, size); 186365d9939Sopenharmony_ci OHOS::IsLockedFuzzTest(data, size); 187365d9939Sopenharmony_ci OHOS::FuzzScreenlockAppManager(data, size); 188365d9939Sopenharmony_ci OHOS::FuzzScreenlockIsDisabled(data, size); 189365d9939Sopenharmony_ci OHOS::FuzzScreenlockSetDisabled(data, size); 190365d9939Sopenharmony_ci OHOS::FuzzScreenlockSetAuthState(data, size); 191365d9939Sopenharmony_ci OHOS::FuzzScreenlockGetAuthState(data, size); 192365d9939Sopenharmony_ci OHOS::FuzzScreenlockRequestStrongAuth(data, size); 193365d9939Sopenharmony_ci OHOS::FuzzScreenlockGetStrongAuth(data, size); 194365d9939Sopenharmony_ci return 0; 195365d9939Sopenharmony_ci}