VoldNativeService.cpp revision a370c14f75e97e131b06662f6bdd4691c4bce0e9
1068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey/*
2068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * Copyright (C) 2017 The Android Open Source Project
3068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey *
4068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * you may not use this file except in compliance with the License.
6068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * You may obtain a copy of the License at
7068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey *
8068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey *
10068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * Unless required by applicable law or agreed to in writing, software
11068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * See the License for the specific language governing permissions and
14068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * limitations under the License.
15068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey */
16068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
1767b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey#define ATRACE_TAG ATRACE_TAG_PACKAGE_MANAGER
1867b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey
19068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include "VoldNativeService.h"
2001a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey#include "Benchmark.h"
212048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey#include "CheckEncryption.h"
222048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey#include "IdleMaint.h"
2301a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey#include "MoveStorage.h"
2483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#include "Process.h"
252048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey#include "VolumeManager.h"
26068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
2783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#include "cryptfs.h"
2883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#include "Ext4Crypt.h"
2983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#include "MetadataCrypt.h"
3083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
31068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <fstream>
3201a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey#include <thread>
33068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
34068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/logging.h>
35068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/stringprintf.h>
36068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/strings.h>
373b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley#include <ext4_utils/ext4_crypt.h>
3811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey#include <fs_mgr.h>
39068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <private/android_filesystem_config.h>
4067b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey#include <utils/Trace.h>
41068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
42068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyusing android::base::StringPrintf;
43068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyusing std::endl;
44068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
45068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace android {
46068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace vold {
47068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
48068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace {
49068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
50068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyconstexpr const char* kDump = "android.permission.DUMP";
51068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
52068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatic binder::Status ok() {
53068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return binder::Status::ok();
54068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
55068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
56068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatic binder::Status exception(uint32_t code, const std::string& msg) {
57068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return binder::Status::fromExceptionCode(code, String8(msg.c_str()));
58068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
59068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeystatic binder::Status error(const std::string& msg) {
619462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    PLOG(ERROR) << msg;
629462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return binder::Status::fromServiceSpecificError(errno, String8(msg.c_str()));
639462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
649462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
6583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeystatic binder::Status translate(int status) {
669462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (status == 0) {
679462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return binder::Status::ok();
689462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    } else {
6911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        return binder::Status::fromServiceSpecificError(status);
709462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
719462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
729462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
7383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeystatic binder::Status translateBool(bool status) {
7483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (status) {
7583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return binder::Status::ok();
7683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
7783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return binder::Status::fromServiceSpecificError(status);
7883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
7983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
8083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
81068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status checkPermission(const char* permission) {
82068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    pid_t pid;
83068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    uid_t uid;
84068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
85068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (checkCallingPermission(String16(permission), reinterpret_cast<int32_t*>(&pid),
86068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey            reinterpret_cast<int32_t*>(&uid))) {
87068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return ok();
88068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    } else {
89068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return exception(binder::Status::EX_SECURITY,
90068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey                StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission));
91068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }
92068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
93068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
94068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status checkUid(uid_t expectedUid) {
95068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    uid_t uid = IPCThreadState::self()->getCallingUid();
96068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (uid == expectedUid || uid == AID_ROOT) {
97068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return ok();
98068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    } else {
99068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return exception(binder::Status::EX_SECURITY,
100068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey                StringPrintf("UID %d is not expected UID %d", uid, expectedUid));
101068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }
102068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
103068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
104ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentId(const std::string& id) {
105ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (id.empty()) {
106ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return exception(binder::Status::EX_ILLEGAL_ARGUMENT, "Missing ID");
107ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
108ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    for (const char& c : id) {
109ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        if (!std::isalnum(c) && c != ':' && c != ',') {
110ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey            return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
111ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey                    StringPrintf("ID %s is malformed", id.c_str()));
112ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        }
113ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
114ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    return ok();
115ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
116ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
117ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentPath(const std::string& path) {
118ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (path.empty()) {
119ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return exception(binder::Status::EX_ILLEGAL_ARGUMENT, "Missing path");
120ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
121ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (path[0] != '/') {
122ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
123ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey                StringPrintf("Path %s is relative", path.c_str()));
124ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
12501a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    if ((path + '/').find("/../") != std::string::npos) {
12601a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
12701a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey                StringPrintf("Path %s is shady", path.c_str()));
12801a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }
129ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    for (const char& c : path) {
130ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        if (c == '\0' || c == '\n') {
131ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey            return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
132ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey                    StringPrintf("Path %s is malformed", path.c_str()));
133ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        }
134ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
135ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    return ok();
136ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
137ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
138ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentHex(const std::string& hex) {
139ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    // Empty hex strings are allowed
140ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    for (const char& c : hex) {
141ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        if (!std::isxdigit(c) && c != ':' && c != '-') {
142ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey            return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
143ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey                    StringPrintf("Hex %s is malformed", hex.c_str()));
144ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        }
145ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
146ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    return ok();
147ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
148ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
149068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#define ENFORCE_UID(uid) {                                  \
150068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    binder::Status status = checkUid((uid));                \
151068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (!status.isOk()) {                                   \
152068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return status;                                      \
153068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }                                                       \
154068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
155068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
156ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_ID(id) {                             \
157ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    binder::Status status = checkArgumentId((id));          \
158ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (!status.isOk()) {                                   \
159ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return status;                                      \
160ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }                                                       \
161ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
162ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
163ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_PATH(path) {                         \
164ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    binder::Status status = checkArgumentPath((path));      \
165ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (!status.isOk()) {                                   \
166ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return status;                                      \
167ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }                                                       \
168ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
169ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
170ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_HEX(hex) {                           \
171ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    binder::Status status = checkArgumentHex((hex));        \
172ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (!status.isOk()) {                                   \
173ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return status;                                      \
174ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }                                                       \
175ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
176ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
17783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#define ACQUIRE_LOCK \
17867b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey    std::lock_guard<std::mutex> lock(VolumeManager::Instance()->getLock()); \
17967b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey    ATRACE_CALL();
18083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
18183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#define ACQUIRE_CRYPT_LOCK \
18267b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey    std::lock_guard<std::mutex> lock(VolumeManager::Instance()->getCryptLock()); \
18367b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey    ATRACE_CALL();
1849462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
185068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}  // namespace
186068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
187068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatus_t VoldNativeService::start() {
188068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    IPCThreadState::self()->disableBackgroundScheduling(true);
189068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    status_t ret = BinderService<VoldNativeService>::publish();
190068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (ret != android::OK) {
191068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return ret;
192068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }
193068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    sp<ProcessState> ps(ProcessState::self());
194068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    ps->startThreadPool();
195068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    ps->giveThreadPoolName();
196068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return android::OK;
197068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
198068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
199068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatus_t VoldNativeService::dump(int fd, const Vector<String16> & /* args */) {
200068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    auto out = std::fstream(StringPrintf("/proc/self/fd/%d", fd));
201068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    const binder::Status dump_permission = checkPermission(kDump);
202068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (!dump_permission.isOk()) {
203068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        out << dump_permission.toString8() << endl;
204068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return PERMISSION_DENIED;
205068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }
206068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
2079462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
208068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    out << "vold is happy!" << endl;
209068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    out.flush();
210068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return NO_ERROR;
211068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
212068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
213814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkeybinder::Status VoldNativeService::setListener(
214814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey        const android::sp<android::os::IVoldListener>& listener) {
215814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
216814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey    ACQUIRE_LOCK;
217814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey
218814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey    VolumeManager::Instance()->setListener(listener);
219814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey    return ok();
220814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey}
221814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey
222cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkeybinder::Status VoldNativeService::monitor() {
223cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
224cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey
225cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    // Simply acquire/release each lock for watchdog
226cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    {
227cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey        ACQUIRE_LOCK;
228cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    }
229cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    {
230cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey        ACQUIRE_CRYPT_LOCK;
231cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    }
232cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey
233cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    return ok();
234cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey}
235cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey
236068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status VoldNativeService::reset() {
237068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2399462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2409462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->reset());
2419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2429462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::shutdown() {
2449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2459462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->shutdown());
2489462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2499462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
25011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mountAll() {
2519462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
25411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    struct fstab* fstab = fs_mgr_read_fstab_default();
25511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    int res = fs_mgr_mount_all(fstab, MOUNT_MODE_DEFAULT);
25611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    fs_mgr_free_fstab(fstab);
25711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(res);
2589462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2599462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserAdded(int32_t userId, int32_t userSerial) {
2619462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2629462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2639462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2649462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserAdded(userId, userSerial));
2659462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2669462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2679462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserRemoved(int32_t userId) {
2689462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2699462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2709462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2719462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserRemoved(userId));
2729462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2739462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2749462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserStarted(int32_t userId) {
2759462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2769462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2779462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2789462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserStarted(userId));
2799462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2809462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2819462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserStopped(int32_t userId) {
2829462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2839462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2849462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2859462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserStopped(userId));
2869462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2879462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
28811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::partition(const std::string& diskId, int32_t partitionType,
28911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        int32_t ratio) {
2909462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
291ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(diskId);
2929462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2939462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2949462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto disk = VolumeManager::Instance()->findDisk(diskId);
2959462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (disk == nullptr) {
2969462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find disk " + diskId);
2979462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
2989462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    switch (partitionType) {
2999462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_PUBLIC: return translate(disk->partitionPublic());
3009462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_PRIVATE: return translate(disk->partitionPrivate());
3019462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_MIXED: return translate(disk->partitionMixed(ratio));
3029462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    default: return error("Unknown type " + std::to_string(partitionType));
3039462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3049462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
305068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
3063ce18256a1e2edf830830f066e5ddb4c8203111bJeff Sharkeybinder::Status VoldNativeService::forgetPartition(const std::string& partGuid,
3073ce18256a1e2edf830830f066e5ddb4c8203111bJeff Sharkey        const std::string& fsUuid) {
3089462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
309ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_HEX(partGuid);
3103ce18256a1e2edf830830f066e5ddb4c8203111bJeff Sharkey    CHECK_ARGUMENT_HEX(fsUuid);
3119462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3129462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3133ce18256a1e2edf830830f066e5ddb4c8203111bJeff Sharkey    return translate(VolumeManager::Instance()->forgetPartition(partGuid, fsUuid));
3149462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3159462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
31611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mount(const std::string& volId, int32_t mountFlags,
31711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        int32_t mountUserId) {
3189462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
319ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3209462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3219462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3229462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3239462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3249462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3259462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3269462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3279462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    vol->setMountFlags(mountFlags);
3289462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    vol->setMountUserId(mountUserId);
3299462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3309462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    int res = vol->mount();
33183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if ((mountFlags & MOUNT_FLAG_PRIMARY) != 0) {
3329462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        VolumeManager::Instance()->setPrimary(vol);
3339462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3349462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(res);
3359462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3369462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3379462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::unmount(const std::string& volId) {
3389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
339ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3409462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3429462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3459462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(vol->unmount());
3479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3489462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3499462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::format(const std::string& volId, const std::string& fsType) {
3509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
351ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3549462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3559462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3569462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3589462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(vol->format(fsType));
3599462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3612048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkeystatic binder::Status pathForVolId(const std::string& volId, std::string* path) {
36252f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    if (volId == "private" || volId == "null") {
3632048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey        *path = "/data";
36452f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    } else {
36552f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        auto vol = VolumeManager::Instance()->findVolume(volId);
36652f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol == nullptr) {
36752f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Failed to find volume " + volId);
36852f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
36952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol->getType() != VolumeBase::Type::kPrivate) {
37052f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Volume " + volId + " not private");
37152f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
37252f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol->getState() != VolumeBase::State::kMounted) {
37352f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Volume " + volId + " not mounted");
37452f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
3752048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey        *path = vol->getPath();
3762048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey        if (path->empty()) {
3772048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey            return error("Volume " + volId + " missing path");
3782048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey        }
37952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    }
3802048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    return ok();
3812048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey}
38252f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey
3832048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkeybinder::Status VoldNativeService::benchmark(
3842048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    const std::string& volId, const android::sp<android::os::IVoldTaskListener>& listener) {
3852048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
3862048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    CHECK_ARGUMENT_ID(volId);
3872048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    ACQUIRE_LOCK;
3882048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey
3892048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    std::string path;
3902048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    auto status = pathForVolId(volId, &path);
3912048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    if (!status.isOk()) return status;
39252f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey
39301a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
39401a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::Benchmark(path, listener);
39501a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
3969462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return ok();
3979462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3989462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3992048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkeybinder::Status VoldNativeService::checkEncryption(const std::string& volId) {
4002048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
4012048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    CHECK_ARGUMENT_ID(volId);
4022048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    ACQUIRE_LOCK;
4032048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey
4042048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    std::string path;
4052048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    auto status = pathForVolId(volId, &path);
4062048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    if (!status.isOk()) return status;
4072048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    return translate(android::vold::CheckEncryption(path));
4082048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey}
4092048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey
41011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::moveStorage(const std::string& fromVolId,
41152f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        const std::string& toVolId, const android::sp<android::os::IVoldTaskListener>& listener) {
4129462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
413ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(fromVolId);
414ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(toVolId);
4159462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
4169462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4179462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto fromVol = VolumeManager::Instance()->findVolume(fromVolId);
4189462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto toVol = VolumeManager::Instance()->findVolume(toVolId);
4199462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (fromVol == nullptr) {
4209462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + fromVolId);
4219462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    } else if (toVol == nullptr) {
4229462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + toVolId);
4239462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
42401a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey
42501a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
42601a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::MoveStorage(fromVol, toVol, listener);
42701a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
428068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return ok();
429068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
430068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
4319462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::remountUid(int32_t uid, int32_t remountMode) {
4329462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
4339462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
4349462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4359462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    std::string tmp;
4369462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    switch (remountMode) {
4379462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_NONE: tmp = "none"; break;
4389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_DEFAULT: tmp = "default"; break;
4399462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_READ: tmp = "read"; break;
4409462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_WRITE: tmp = "write"; break;
4419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    default: return error("Unknown mode " + std::to_string(remountMode));
4429462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
4439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->remountUid(uid, tmp));
4449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
4459462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::mkdirs(const std::string& path) {
4479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
448ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_PATH(path);
4499462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
4509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4513472e52fc259b6a549acece21d4901d99d6a421fJeff Sharkey    return translate(VolumeManager::Instance()->mkdirs(path));
4529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
4539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
45411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::createObb(const std::string& sourcePath,
45511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        const std::string& sourceKey, int32_t ownerGid, std::string* _aidl_return) {
45611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
457ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_PATH(sourcePath);
458ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_HEX(sourceKey);
45911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
46011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
46111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(
46211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey            VolumeManager::Instance()->createObb(sourcePath, sourceKey, ownerGid, _aidl_return));
46311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
46411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
46511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::destroyObb(const std::string& volId) {
46611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
467ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
46811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
46911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
47011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->destroyObb(volId));
47111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
47211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
47352f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkeybinder::Status VoldNativeService::fstrim(int32_t fstrimFlags,
47452f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        const android::sp<android::os::IVoldTaskListener>& listener) {
47511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
47611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
47711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
47801a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
47901a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::Trim(listener);
48001a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
48111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return ok();
48211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
48311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
484a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qianbinder::Status VoldNativeService::runIdleMaint(
485a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian        const android::sp<android::os::IVoldTaskListener>& listener) {
486a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    ENFORCE_UID(AID_SYSTEM);
487a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    ACQUIRE_LOCK;
488a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian
489a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    std::thread([=]() {
490a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian        android::vold::RunIdleMaint(listener);
491a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    }).detach();
492a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    return ok();
493a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian}
494a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian
495a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qianbinder::Status VoldNativeService::abortIdleMaint(
496a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian        const android::sp<android::os::IVoldTaskListener>& listener) {
497a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    ENFORCE_UID(AID_SYSTEM);
498a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    ACQUIRE_LOCK;
499a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian
500a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    std::thread([=]() {
501a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian        android::vold::AbortIdleMaint(listener);
502a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    }).detach();
503a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    return ok();
504a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian}
505a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian
50611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mountAppFuse(int32_t uid, int32_t pid, int32_t mountId,
50711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        android::base::unique_fd* _aidl_return) {
50811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
50911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
51011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
51111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->mountAppFuse(uid, pid, mountId, _aidl_return));
51211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
51311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
51411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::unmountAppFuse(int32_t uid, int32_t pid, int32_t mountId) {
51511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
51611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
51711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
51811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->unmountAppFuse(uid, pid, mountId));
51911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
52011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
52183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeCheckPassword(const std::string& password) {
52283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
52383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
52483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
52583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_check_passwd(password.c_str()));
52683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
52783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
52883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeRestart() {
52983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
53083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
53183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
53283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // Spawn as thread so init can issue commands back to vold without
53383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // causing deadlock, usually as a result of prep_data_fs.
53483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    std::thread(&cryptfs_restart).detach();
53583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
53683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
53783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
53883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeComplete(int32_t* _aidl_return) {
53983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
54083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
54183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
54283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_crypto_complete();
54383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
54483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
54583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
54683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeystatic int fdeEnableInternal(int32_t passwordType, const std::string& password,
54783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t encryptionFlags) {
54883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    bool noUi = (encryptionFlags & VoldNativeService::ENCRYPTION_FLAG_NO_UI) != 0;
54983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
55083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    std::string how;
55183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if ((encryptionFlags & VoldNativeService::ENCRYPTION_FLAG_IN_PLACE) != 0) {
55283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        how = "inplace";
55383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else if ((encryptionFlags & VoldNativeService::ENCRYPTION_FLAG_WIPE) != 0) {
55483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        how = "wipe";
55583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
55683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        LOG(ERROR) << "Missing encryption flag";
55783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return -1;
55883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
55983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
56083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    for (int tries = 0; tries < 2; ++tries) {
56183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int rc;
56283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (passwordType == VoldNativeService::PASSWORD_TYPE_DEFAULT) {
56383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            rc = cryptfs_enable_default(how.c_str(), noUi);
56483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        } else {
56583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            rc = cryptfs_enable(how.c_str(), passwordType, password.c_str(), noUi);
56683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
56783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
56883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (rc == 0) {
56983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            return 0;
57083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        } else if (tries == 0) {
5713472e52fc259b6a549acece21d4901d99d6a421fJeff Sharkey            KillProcessesWithOpenFiles(DATA_MNT_POINT, SIGKILL);
57283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
57383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
57483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
57583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return -1;
57683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
57783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
57883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeEnable(int32_t passwordType,
57983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& password, int32_t encryptionFlags) {
58083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
58183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
58283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
58383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (e4crypt_is_native()) {
58483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (passwordType != PASSWORD_TYPE_DEFAULT) {
58583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            return error("Unexpected password type");
58683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
58783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (encryptionFlags != (ENCRYPTION_FLAG_IN_PLACE | ENCRYPTION_FLAG_NO_UI)) {
58883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            return error("Unexpected flags");
58983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
59083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return translateBool(e4crypt_enable_crypto());
59183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
59283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
59383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // Spawn as thread so init can issue commands back to vold without
59483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // causing deadlock, usually as a result of prep_data_fs.
59583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    std::thread(&fdeEnableInternal, passwordType, password, encryptionFlags).detach();
59683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
59783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
59883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
59983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeChangePassword(int32_t passwordType,
60083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& password) {
60183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
60283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
60383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
60483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_changepw(passwordType, password.c_str()));
60583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
60683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
60783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeVerifyPassword(const std::string& password) {
60883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
60983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
61083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
61183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_verify_passwd(password.c_str()));
61283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
61383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
61483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetField(const std::string& key,
61583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        std::string* _aidl_return) {
61683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
61783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
61883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
61983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    char buf[PROPERTY_VALUE_MAX];
62083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (cryptfs_getfield(key.c_str(), buf, sizeof(buf)) != CRYPTO_GETFIELD_OK) {
62183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return error(StringPrintf("Failed to read field %s", key.c_str()));
62283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
62383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        *_aidl_return = buf;
62483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return ok();
62583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
62683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
62783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
62883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeSetField(const std::string& key,
62983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& value) {
63083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
63183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
63283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
63383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_setfield(key.c_str(), value.c_str()));
63483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
63583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
63683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetPasswordType(int32_t* _aidl_return) {
63783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
63883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
63983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
64083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_get_password_type();
64183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
64283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
64383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
64483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetPassword(std::string* _aidl_return) {
64583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
64683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
64783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
64883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    const char* res = cryptfs_get_password();
64983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (res != nullptr) {
65083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        *_aidl_return = res;
65183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
65283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
65383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
65483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
65583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeClearPassword() {
65683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
65783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
65883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
65983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    cryptfs_clear_password();
66083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
66183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
66283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
66383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fbeEnable() {
66483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
66583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
66683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
66783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_initialize_global_de());
66883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
66983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
67083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::mountDefaultEncrypted() {
67183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
67283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
67383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
67483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (e4crypt_is_native()) {
67583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return translateBool(e4crypt_mount_metadata_encrypted());
67683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
67783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        // Spawn as thread so init can issue commands back to vold without
67883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        // causing deadlock, usually as a result of prep_data_fs.
67983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        std::thread(&cryptfs_mount_default_encrypted).detach();
68083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return ok();
68183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
68283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
68383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
68483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::initUser0() {
68583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
68683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
68783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
68883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_init_user0());
68983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
69083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
69183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::isConvertibleToFbe(bool* _aidl_return) {
69283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
69383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
69483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
69583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_isConvertibleToFBE() != 0;
69683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
69783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
69883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
69983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::createUserKey(int32_t userId, int32_t userSerial,
70083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        bool ephemeral) {
70183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
70283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
70383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
70483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_vold_create_user_key(userId, userSerial, ephemeral));
70583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
70683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
70783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::destroyUserKey(int32_t userId) {
70883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
70983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
71083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
71183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_destroy_user_key(userId));
71283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
71383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
71483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::addUserKeyAuth(int32_t userId, int32_t userSerial,
71583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& token, const std::string& secret) {
71683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
71783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
71883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
7193b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    return translateBool(e4crypt_add_user_key_auth(userId, userSerial, token, secret));
72083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
72183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
72283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fixateNewestUserKeyAuth(int32_t userId) {
72383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
72483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
72583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
72683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_fixate_newest_user_key_auth(userId));
72783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
72883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
72983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::unlockUserKey(int32_t userId, int32_t userSerial,
73083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& token, const std::string& secret) {
73183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
73283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
73383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
7343b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    return translateBool(e4crypt_unlock_user_key(userId, userSerial, token, secret));
73583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
73683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
73783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::lockUserKey(int32_t userId) {
73883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
73983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
74083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
74183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_lock_user_key(userId));
74283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
74383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
74483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::prepareUserStorage(const std::unique_ptr<std::string>& uuid,
74583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t userId, int32_t userSerial, int32_t flags) {
74683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
7473b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    std::string empty_string = "";
7483b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    auto uuid_ = uuid ? *uuid : empty_string;
74906f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    CHECK_ARGUMENT_HEX(uuid_);
75006f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley
75106f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    ACQUIRE_CRYPT_LOCK;
75283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_prepare_user_storage(uuid_, userId, userSerial, flags));
75383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
75483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
75583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::destroyUserStorage(const std::unique_ptr<std::string>& uuid,
75683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t userId, int32_t flags) {
75783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
7583b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    std::string empty_string = "";
7593b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    auto uuid_ = uuid ? *uuid : empty_string;
76006f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    CHECK_ARGUMENT_HEX(uuid_);
76106f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley
76206f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    ACQUIRE_CRYPT_LOCK;
76383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_destroy_user_storage(uuid_, userId, flags));
76483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
76583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
76683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::secdiscard(const std::string& path) {
76783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
76801a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    CHECK_ARGUMENT_PATH(path);
76983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
77083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
7713b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    return translateBool(e4crypt_secdiscard(path));
77283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
77383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
774068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}  // namespace vold
775068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}  // namespace android
776