113acfde9Sopenharmony_ci/*
213acfde9Sopenharmony_ci * Copyright (C) 2021-2024 Huawei Device Co., Ltd.
313acfde9Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
413acfde9Sopenharmony_ci * you may not use this file except in compliance with the License.
513acfde9Sopenharmony_ci * You may obtain a copy of the License at
613acfde9Sopenharmony_ci *
713acfde9Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
813acfde9Sopenharmony_ci *
913acfde9Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1013acfde9Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1113acfde9Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1213acfde9Sopenharmony_ci * See the License for the specific language governing permissions and
1313acfde9Sopenharmony_ci * limitations under the License.
1413acfde9Sopenharmony_ci */
1513acfde9Sopenharmony_ci
1613acfde9Sopenharmony_ci#include <functional>
1713acfde9Sopenharmony_ci#include <iostream>
1813acfde9Sopenharmony_ci#include <map>
1913acfde9Sopenharmony_ci#include <string>
2013acfde9Sopenharmony_ci#include <vector>
2113acfde9Sopenharmony_ci
2213acfde9Sopenharmony_ci#include "client/storage_manager_client.h"
2313acfde9Sopenharmony_ci#include "storage_daemon_client.h"
2413acfde9Sopenharmony_ci#include "storage_service_log.h"
2513acfde9Sopenharmony_ci#include "utils/file_utils.h"
2613acfde9Sopenharmony_ci
2713acfde9Sopenharmony_ciconstexpr int32_t ARG_CNT_2 = 2;
2813acfde9Sopenharmony_ciconstexpr size_t INDEX_1 = 1;
2913acfde9Sopenharmony_ciconstexpr size_t INDEX_2 = 2;
3013acfde9Sopenharmony_ci
3113acfde9Sopenharmony_ci#ifdef SDC_TEST_ENABLE
3213acfde9Sopenharmony_ciconstexpr int32_t ARG_CNT_4 = 4;
3313acfde9Sopenharmony_ciconstexpr int32_t ARG_CNT_5 = 5;
3413acfde9Sopenharmony_ciconstexpr int32_t ARG_CNT_6 = 6;
3513acfde9Sopenharmony_ciconstexpr size_t INDEX_3 = 3;
3613acfde9Sopenharmony_ciconstexpr size_t INDEX_4 = 4;
3713acfde9Sopenharmony_ciconstexpr size_t INDEX_5 = 5;
3813acfde9Sopenharmony_ci#endif
3913acfde9Sopenharmony_ci
4013acfde9Sopenharmony_cistatic int32_t InitGlobalKey(const std::vector<std::string> &args)
4113acfde9Sopenharmony_ci{
4213acfde9Sopenharmony_ci    (void)args;
4313acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::InitGlobalKey();
4413acfde9Sopenharmony_ci}
4513acfde9Sopenharmony_ci
4613acfde9Sopenharmony_cistatic int32_t InitMainUser(const std::vector<std::string> &args)
4713acfde9Sopenharmony_ci{
4813acfde9Sopenharmony_ci    (void)args;
4913acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::InitGlobalUserKeys();
5013acfde9Sopenharmony_ci}
5113acfde9Sopenharmony_ci
5213acfde9Sopenharmony_ci#ifdef SDC_TEST_ENABLE
5313acfde9Sopenharmony_cistatic int32_t GenerateUserKeys(const std::vector<std::string> &args)
5413acfde9Sopenharmony_ci{
5513acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_5) {
5613acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 5, please retry");
5713acfde9Sopenharmony_ci        return -EINVAL;
5813acfde9Sopenharmony_ci    }
5913acfde9Sopenharmony_ci    uint32_t userId;
6013acfde9Sopenharmony_ci    uint32_t flags;
6113acfde9Sopenharmony_ci    // 3 means take the fourth argument of args, 4 means take the fifth argument of args
6213acfde9Sopenharmony_ci    if ((OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) ||
6313acfde9Sopenharmony_ci        (OHOS::StorageDaemon::StringToUint32(args[INDEX_4], flags) == false)) {
6413acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
6513acfde9Sopenharmony_ci        return -EINVAL;
6613acfde9Sopenharmony_ci    }
6713acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::GenerateUserKeys(userId, flags);
6813acfde9Sopenharmony_ci}
6913acfde9Sopenharmony_ci
7013acfde9Sopenharmony_cistatic int32_t PrepareUserSpace(const std::vector<std::string> &args)
7113acfde9Sopenharmony_ci{
7213acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_5) {
7313acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 5, please retry");
7413acfde9Sopenharmony_ci        return -EINVAL;
7513acfde9Sopenharmony_ci    }
7613acfde9Sopenharmony_ci    uint32_t userId;
7713acfde9Sopenharmony_ci    uint32_t flags;
7813acfde9Sopenharmony_ci    // 3 means take the fourth argument of args, 4 means take the fifth argument of args
7913acfde9Sopenharmony_ci    if ((OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) ||
8013acfde9Sopenharmony_ci        (OHOS::StorageDaemon::StringToUint32(args[INDEX_4], flags) == false)) {
8113acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
8213acfde9Sopenharmony_ci        return -EINVAL;
8313acfde9Sopenharmony_ci    }
8413acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::PrepareUserDirs(userId, flags);
8513acfde9Sopenharmony_ci}
8613acfde9Sopenharmony_ci
8713acfde9Sopenharmony_cistatic int32_t DeleteUserKeys(const std::vector<std::string> &args)
8813acfde9Sopenharmony_ci{
8913acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
9013acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
9113acfde9Sopenharmony_ci        return -EINVAL;
9213acfde9Sopenharmony_ci    }
9313acfde9Sopenharmony_ci    uint32_t userId;
9413acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
9513acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
9613acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
9713acfde9Sopenharmony_ci        return -EINVAL;
9813acfde9Sopenharmony_ci    }
9913acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::DeleteUserKeys(userId);
10013acfde9Sopenharmony_ci}
10113acfde9Sopenharmony_ci
10213acfde9Sopenharmony_cistatic int32_t DestroyUserSpace(const std::vector<std::string> &args)
10313acfde9Sopenharmony_ci{
10413acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_5) {
10513acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 5, please retry");
10613acfde9Sopenharmony_ci        return -EINVAL;
10713acfde9Sopenharmony_ci    }
10813acfde9Sopenharmony_ci    uint32_t userId;
10913acfde9Sopenharmony_ci    uint32_t flags;
11013acfde9Sopenharmony_ci    // 3 means take the fourth argument of args, 4 means take the fifth argument of args
11113acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false ||
11213acfde9Sopenharmony_ci        OHOS::StorageDaemon::StringToUint32(args[INDEX_4], flags) == false) {
11313acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
11413acfde9Sopenharmony_ci        return -EINVAL;
11513acfde9Sopenharmony_ci    }
11613acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::DestroyUserDirs(userId, flags);
11713acfde9Sopenharmony_ci}
11813acfde9Sopenharmony_ci
11913acfde9Sopenharmony_cistatic int32_t UpdateUserAuth(const std::vector<std::string> &args)
12013acfde9Sopenharmony_ci{
12113acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_5) {
12213acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 5, please retry");
12313acfde9Sopenharmony_ci        return -EINVAL;
12413acfde9Sopenharmony_ci    }
12513acfde9Sopenharmony_ci    uint32_t userId;
12613acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
12713acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
12813acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
12913acfde9Sopenharmony_ci        return -EINVAL;
13013acfde9Sopenharmony_ci    }
13113acfde9Sopenharmony_ci
13213acfde9Sopenharmony_ci    // 4 means take the fifth argument of args, 5 means take the sixth argument of args
13313acfde9Sopenharmony_ci    if (args.size() == ARG_CNT_6) {
13413acfde9Sopenharmony_ci        std::vector<uint8_t> oldSecret(args[INDEX_4].begin(), args[INDEX_4].end());
13513acfde9Sopenharmony_ci        std::vector<uint8_t> newSecret(args[INDEX_5].begin(), args[INDEX_5].end());
13613acfde9Sopenharmony_ci        return OHOS::StorageDaemon::StorageDaemonClient::UpdateUserAuth(userId, 0, {}, oldSecret, newSecret);
13713acfde9Sopenharmony_ci    }
13813acfde9Sopenharmony_ci    std::vector<uint8_t> newSecret(args[INDEX_4].begin(), args[INDEX_4].end());
13913acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::UpdateUserAuth(userId, 0, {}, {}, newSecret);
14013acfde9Sopenharmony_ci}
14113acfde9Sopenharmony_ci
14213acfde9Sopenharmony_cistatic int32_t ActiveUserKey(const std::vector<std::string> &args)
14313acfde9Sopenharmony_ci{
14413acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
14513acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
14613acfde9Sopenharmony_ci        return -EINVAL;
14713acfde9Sopenharmony_ci    }
14813acfde9Sopenharmony_ci    uint32_t userId;
14913acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
15013acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
15113acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
15213acfde9Sopenharmony_ci        return -EINVAL;
15313acfde9Sopenharmony_ci    }
15413acfde9Sopenharmony_ci    // 4 means take the fifth argument of args
15513acfde9Sopenharmony_ci    if (args.size() == ARG_CNT_5) {
15613acfde9Sopenharmony_ci        std::vector<uint8_t> secret(args[INDEX_4].begin(), args[INDEX_4].end());
15713acfde9Sopenharmony_ci        return OHOS::StorageDaemon::StorageDaemonClient::ActiveUserKey(userId, {}, secret);
15813acfde9Sopenharmony_ci    }
15913acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::ActiveUserKey(userId, {}, {});
16013acfde9Sopenharmony_ci}
16113acfde9Sopenharmony_ci
16213acfde9Sopenharmony_cistatic int32_t InactiveUserKey(const std::vector<std::string> &args)
16313acfde9Sopenharmony_ci{
16413acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
16513acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
16613acfde9Sopenharmony_ci        return -EINVAL;
16713acfde9Sopenharmony_ci    }
16813acfde9Sopenharmony_ci    uint32_t userId;
16913acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
17013acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
17113acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
17213acfde9Sopenharmony_ci        return -EINVAL;
17313acfde9Sopenharmony_ci    }
17413acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::InactiveUserKey(userId);
17513acfde9Sopenharmony_ci}
17613acfde9Sopenharmony_ci
17713acfde9Sopenharmony_cistatic int32_t LockUserScreen(const std::vector<std::string> &args)
17813acfde9Sopenharmony_ci{
17913acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
18013acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
18113acfde9Sopenharmony_ci        return -EINVAL;
18213acfde9Sopenharmony_ci    }
18313acfde9Sopenharmony_ci    uint32_t userId;
18413acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
18513acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
18613acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
18713acfde9Sopenharmony_ci        return -EINVAL;
18813acfde9Sopenharmony_ci    }
18913acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::LockUserScreen(userId);
19013acfde9Sopenharmony_ci}
19113acfde9Sopenharmony_ci
19213acfde9Sopenharmony_cistatic int32_t UnlockUserScreen(const std::vector<std::string> &args)
19313acfde9Sopenharmony_ci{
19413acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
19513acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
19613acfde9Sopenharmony_ci        return -EINVAL;
19713acfde9Sopenharmony_ci    }
19813acfde9Sopenharmony_ci    uint32_t userId;
19913acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
20013acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
20113acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
20213acfde9Sopenharmony_ci        return -EINVAL;
20313acfde9Sopenharmony_ci    }
20413acfde9Sopenharmony_ci    // 4 means take the fifth argument of args
20513acfde9Sopenharmony_ci    if (args.size() == ARG_CNT_5) {
20613acfde9Sopenharmony_ci        std::vector<uint8_t> secret(args[INDEX_4].begin(), args[INDEX_4].end());
20713acfde9Sopenharmony_ci        return OHOS::StorageDaemon::StorageDaemonClient::UnlockUserScreen(userId, {}, secret);
20813acfde9Sopenharmony_ci    }
20913acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::UnlockUserScreen(userId, {}, {});
21013acfde9Sopenharmony_ci}
21113acfde9Sopenharmony_ci
21213acfde9Sopenharmony_ciint32_t GetFileEncryptStatus(const std::vector<std::string> &args)
21313acfde9Sopenharmony_ci{
21413acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_5) {
21513acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
21613acfde9Sopenharmony_ci        return -EINVAL;
21713acfde9Sopenharmony_ci    }
21813acfde9Sopenharmony_ci    uint32_t userId;
21913acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
22013acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
22113acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
22213acfde9Sopenharmony_ci        return -EINVAL;
22313acfde9Sopenharmony_ci    }
22413acfde9Sopenharmony_ci    uint32_t judge;
22513acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_4], judge) == false) {
22613acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
22713acfde9Sopenharmony_ci        return -EINVAL;
22813acfde9Sopenharmony_ci    }
22913acfde9Sopenharmony_ci    bool isEncrypted = true;
23013acfde9Sopenharmony_ci    bool judgeFlag = judge != 0;
23113acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::GetFileEncryptStatus(userId, isEncrypted, judgeFlag);
23213acfde9Sopenharmony_ci}
23313acfde9Sopenharmony_ci
23413acfde9Sopenharmony_cistatic int32_t EnableFscrypt(const std::vector<std::string> &args)
23513acfde9Sopenharmony_ci{
23613acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
23713acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
23813acfde9Sopenharmony_ci        return -EINVAL;
23913acfde9Sopenharmony_ci    }
24013acfde9Sopenharmony_ci    auto option = args[INDEX_3]; // cmd no.3 param is the option
24113acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::FscryptEnable(option);
24213acfde9Sopenharmony_ci}
24313acfde9Sopenharmony_ci
24413acfde9Sopenharmony_cistatic int32_t UpdateKeyContext(const std::vector<std::string> &args)
24513acfde9Sopenharmony_ci{
24613acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
24713acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
24813acfde9Sopenharmony_ci        return -EINVAL;
24913acfde9Sopenharmony_ci    }
25013acfde9Sopenharmony_ci    uint32_t userId;
25113acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
25213acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
25313acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
25413acfde9Sopenharmony_ci        return -EINVAL;
25513acfde9Sopenharmony_ci    }
25613acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::UpdateKeyContext(userId);
25713acfde9Sopenharmony_ci}
25813acfde9Sopenharmony_ci
25913acfde9Sopenharmony_cistatic int32_t GenerateAppkey(const std::vector<std::string> &args)
26013acfde9Sopenharmony_ci{
26113acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
26213acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
26313acfde9Sopenharmony_ci        return -EINVAL;
26413acfde9Sopenharmony_ci    }
26513acfde9Sopenharmony_ci    uint32_t userId;
26613acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
26713acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
26813acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
26913acfde9Sopenharmony_ci        return -EINVAL;
27013acfde9Sopenharmony_ci    }
27113acfde9Sopenharmony_ci    uint32_t hashId = 0;
27213acfde9Sopenharmony_ci    std::string keyId;
27313acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::GenerateAppkey(userId, hashId, keyId);
27413acfde9Sopenharmony_ci}
27513acfde9Sopenharmony_ci
27613acfde9Sopenharmony_cistatic int32_t DeleteAppkey(const std::vector<std::string> &args)
27713acfde9Sopenharmony_ci{
27813acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
27913acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
28013acfde9Sopenharmony_ci        return -EINVAL;
28113acfde9Sopenharmony_ci    }
28213acfde9Sopenharmony_ci    uint32_t userId;
28313acfde9Sopenharmony_ci    // 3 means take the fourth argument of args
28413acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
28513acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
28613acfde9Sopenharmony_ci        return -EINVAL;
28713acfde9Sopenharmony_ci    }
28813acfde9Sopenharmony_ci    std::string keyId = args[INDEX_4];
28913acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::DeleteAppkey(userId, keyId);
29013acfde9Sopenharmony_ci}
29113acfde9Sopenharmony_ci
29213acfde9Sopenharmony_cistatic int32_t CreateRecoverKey(const std::vector<std::string> &args)
29313acfde9Sopenharmony_ci{
29413acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
29513acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
29613acfde9Sopenharmony_ci        return -EINVAL;
29713acfde9Sopenharmony_ci    }
29813acfde9Sopenharmony_ci    uint32_t userId;
29913acfde9Sopenharmony_ci    uint32_t userType;
30013acfde9Sopenharmony_ci
30113acfde9Sopenharmony_ci    if (!OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId)) {
30213acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
30313acfde9Sopenharmony_ci        return -EINVAL;
30413acfde9Sopenharmony_ci    }
30513acfde9Sopenharmony_ci    if (!OHOS::StorageDaemon::StringToUint32(args[INDEX_4], userType)) {
30613acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
30713acfde9Sopenharmony_ci        return -EINVAL;
30813acfde9Sopenharmony_ci    }
30913acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::CreateRecoverKey(userId, userType, {}, {});
31013acfde9Sopenharmony_ci}
31113acfde9Sopenharmony_ci
31213acfde9Sopenharmony_cistatic int32_t SetRecoverKey(const std::vector<std::string> &args)
31313acfde9Sopenharmony_ci{
31413acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
31513acfde9Sopenharmony_ci        LOGE("SetRecoverKey Parameter nums is less than 4, please retry");
31613acfde9Sopenharmony_ci        return -EINVAL;
31713acfde9Sopenharmony_ci    }
31813acfde9Sopenharmony_ci
31913acfde9Sopenharmony_ci    std::vector<uint8_t> key(args[INDEX_3].begin(), args[INDEX_3].end());
32013acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::SetRecoverKey(key);
32113acfde9Sopenharmony_ci}
32213acfde9Sopenharmony_ci
32313acfde9Sopenharmony_cistatic int32_t StopUser(const std::vector<std::string> &args)
32413acfde9Sopenharmony_ci{
32513acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
32613acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
32713acfde9Sopenharmony_ci        return -EINVAL;
32813acfde9Sopenharmony_ci    }
32913acfde9Sopenharmony_ci    uint32_t userId;
33013acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
33113acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
33213acfde9Sopenharmony_ci        return -EINVAL;
33313acfde9Sopenharmony_ci    }
33413acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::StopUser(userId);
33513acfde9Sopenharmony_ci}
33613acfde9Sopenharmony_ci
33713acfde9Sopenharmony_cistatic int32_t StartUser(const std::vector<std::string> &args)
33813acfde9Sopenharmony_ci{
33913acfde9Sopenharmony_ci    if (args.size() < ARG_CNT_4) {
34013acfde9Sopenharmony_ci        LOGE("Parameter nums is less than 4, please retry");
34113acfde9Sopenharmony_ci        return -EINVAL;
34213acfde9Sopenharmony_ci    }
34313acfde9Sopenharmony_ci    uint32_t userId;
34413acfde9Sopenharmony_ci    if (OHOS::StorageDaemon::StringToUint32(args[INDEX_3], userId) == false) {
34513acfde9Sopenharmony_ci        LOGE("Parameter input error, please retry");
34613acfde9Sopenharmony_ci        return -EINVAL;
34713acfde9Sopenharmony_ci    }
34813acfde9Sopenharmony_ci    return OHOS::StorageDaemon::StorageDaemonClient::StartUser(userId);
34913acfde9Sopenharmony_ci}
35013acfde9Sopenharmony_ci#endif
35113acfde9Sopenharmony_ci
35213acfde9Sopenharmony_cistatic const auto g_fscryptCmdHandler = std::map<std::string,
35313acfde9Sopenharmony_ci    std::function<int32_t(const std::vector<std::string> &)>> {
35413acfde9Sopenharmony_ci    {"init_global_key", InitGlobalKey},
35513acfde9Sopenharmony_ci    {"init_main_user", InitMainUser},
35613acfde9Sopenharmony_ci#ifdef SDC_TEST_ENABLE
35713acfde9Sopenharmony_ci    {"generate_user_keys", GenerateUserKeys},
35813acfde9Sopenharmony_ci    {"prepare_user_space", PrepareUserSpace},
35913acfde9Sopenharmony_ci    {"delete_user_keys", DeleteUserKeys},
36013acfde9Sopenharmony_ci    {"destroy_user_space", DestroyUserSpace},
36113acfde9Sopenharmony_ci    {"update_user_auth", UpdateUserAuth},
36213acfde9Sopenharmony_ci    {"active_user_key", ActiveUserKey},
36313acfde9Sopenharmony_ci    {"inactive_user_key", InactiveUserKey},
36413acfde9Sopenharmony_ci    {"enable", EnableFscrypt},
36513acfde9Sopenharmony_ci    {"update_key_context", UpdateKeyContext},
36613acfde9Sopenharmony_ci    {"lock_user_screen", LockUserScreen},
36713acfde9Sopenharmony_ci    {"unlock_user_screen", UnlockUserScreen},
36813acfde9Sopenharmony_ci    {"generate_app_key", GenerateAppkey},
36913acfde9Sopenharmony_ci    {"delete_app_key", DeleteAppkey},
37013acfde9Sopenharmony_ci    {"Get_unlock_status", GetFileEncryptStatus},
37113acfde9Sopenharmony_ci    {"create_recover_key", CreateRecoverKey},
37213acfde9Sopenharmony_ci    {"set_recover_key", SetRecoverKey},
37313acfde9Sopenharmony_ci    {"stop_user", StopUser},
37413acfde9Sopenharmony_ci    {"start_user", StartUser},
37513acfde9Sopenharmony_ci#endif
37613acfde9Sopenharmony_ci};
37713acfde9Sopenharmony_ci
37813acfde9Sopenharmony_cistatic int HandleFileCrypt(const std::string &cmd, const std::vector<std::string> &args)
37913acfde9Sopenharmony_ci{
38013acfde9Sopenharmony_ci    LOGI("fscrypt cmd: %{public}s", cmd.c_str());
38113acfde9Sopenharmony_ci
38213acfde9Sopenharmony_ci    auto handler = g_fscryptCmdHandler.find(cmd);
38313acfde9Sopenharmony_ci    if (handler == g_fscryptCmdHandler.end()) {
38413acfde9Sopenharmony_ci        LOGE("Unknown fscrypt cmd: %{public}s", cmd.c_str());
38513acfde9Sopenharmony_ci        return -EINVAL;
38613acfde9Sopenharmony_ci    }
38713acfde9Sopenharmony_ci    auto ret = handler->second(args);
38813acfde9Sopenharmony_ci    if (ret != 0) {
38913acfde9Sopenharmony_ci        LOGE("fscrypt cmd: %{public}s failed, ret: %{public}d", cmd.c_str(), ret);
39013acfde9Sopenharmony_ci    } else {
39113acfde9Sopenharmony_ci        LOGI("fscrypt cmd: %{public}s success", cmd.c_str());
39213acfde9Sopenharmony_ci    }
39313acfde9Sopenharmony_ci    return ret;
39413acfde9Sopenharmony_ci}
39513acfde9Sopenharmony_ci
39613acfde9Sopenharmony_ciint main(int argc, char **argv)
39713acfde9Sopenharmony_ci{
39813acfde9Sopenharmony_ci    LOGI("sdc start");
39913acfde9Sopenharmony_ci    std::vector<std::string> args(argv, argv + argc);
40013acfde9Sopenharmony_ci
40113acfde9Sopenharmony_ci    if (argc < ARG_CNT_2) {
40213acfde9Sopenharmony_ci        LOGE("usage: sdc <subsystem> [cmd]");
40313acfde9Sopenharmony_ci        return 0;
40413acfde9Sopenharmony_ci    }
40513acfde9Sopenharmony_ci
40613acfde9Sopenharmony_ci    int ret = 0;
40713acfde9Sopenharmony_ci    // no.1 param is the cmd
40813acfde9Sopenharmony_ci    if (args[INDEX_1] == "filecrypt") {
40913acfde9Sopenharmony_ci        ret = HandleFileCrypt(args[INDEX_2], args); // no.2 param is the cmd
41013acfde9Sopenharmony_ci    } else {
41113acfde9Sopenharmony_ci        LOGE("Unknown subsystem: %{public}s", args[INDEX_1].c_str()); // no.1 param is the cmd
41213acfde9Sopenharmony_ci        ret = -EINVAL;
41313acfde9Sopenharmony_ci    }
41413acfde9Sopenharmony_ci
41513acfde9Sopenharmony_ci    LOGI("sdc end");
41613acfde9Sopenharmony_ci    std::cout << "ret: " << ret << std::endl;
41713acfde9Sopenharmony_ci    return ret;
41813acfde9Sopenharmony_ci}
419