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}