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
2509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserAdded(int32_t userId, int32_t userSerial) {
2519462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2549462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserAdded(userId, userSerial));
2559462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2569462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserRemoved(int32_t userId) {
2589462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2599462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2619462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserRemoved(userId));
2629462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2639462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2649462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserStarted(int32_t userId) {
2659462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2669462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2679462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2689462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserStarted(userId));
2699462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2709462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2719462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserStopped(int32_t userId) {
2729462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2739462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2749462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2759462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserStopped(userId));
2769462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2779462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
278401b2603516a64d3ee7804e270c966828e6b454aJeff Sharkeybinder::Status VoldNativeService::onSecureKeyguardStateChanged(bool isShowing) {
279401b2603516a64d3ee7804e270c966828e6b454aJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
280401b2603516a64d3ee7804e270c966828e6b454aJeff Sharkey    ACQUIRE_LOCK;
281401b2603516a64d3ee7804e270c966828e6b454aJeff Sharkey
282401b2603516a64d3ee7804e270c966828e6b454aJeff Sharkey    return translate(VolumeManager::Instance()->onSecureKeyguardStateChanged(isShowing));
283401b2603516a64d3ee7804e270c966828e6b454aJeff Sharkey}
284401b2603516a64d3ee7804e270c966828e6b454aJeff Sharkey
28511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::partition(const std::string& diskId, int32_t partitionType,
28611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        int32_t ratio) {
2879462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
288ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(diskId);
2899462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2909462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2919462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto disk = VolumeManager::Instance()->findDisk(diskId);
2929462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (disk == nullptr) {
2939462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find disk " + diskId);
2949462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
2959462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    switch (partitionType) {
2969462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_PUBLIC: return translate(disk->partitionPublic());
2979462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_PRIVATE: return translate(disk->partitionPrivate());
2989462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_MIXED: return translate(disk->partitionMixed(ratio));
2999462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    default: return error("Unknown type " + std::to_string(partitionType));
3009462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3019462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
302068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
3033ce18256a1e2edf830830f066e5ddb4c8203111bJeff Sharkeybinder::Status VoldNativeService::forgetPartition(const std::string& partGuid,
3043ce18256a1e2edf830830f066e5ddb4c8203111bJeff Sharkey        const std::string& fsUuid) {
3059462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
306ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_HEX(partGuid);
3073ce18256a1e2edf830830f066e5ddb4c8203111bJeff Sharkey    CHECK_ARGUMENT_HEX(fsUuid);
3089462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3099462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3103ce18256a1e2edf830830f066e5ddb4c8203111bJeff Sharkey    return translate(VolumeManager::Instance()->forgetPartition(partGuid, fsUuid));
3119462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3129462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
31311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mount(const std::string& volId, int32_t mountFlags,
31411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        int32_t mountUserId) {
3159462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
316ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3179462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3189462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3199462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3209462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3219462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3229462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3239462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3249462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    vol->setMountFlags(mountFlags);
3259462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    vol->setMountUserId(mountUserId);
3269462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3279462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    int res = vol->mount();
32883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if ((mountFlags & MOUNT_FLAG_PRIMARY) != 0) {
3299462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        VolumeManager::Instance()->setPrimary(vol);
3309462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3319462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(res);
3329462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3339462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3349462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::unmount(const std::string& volId) {
3359462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
336ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3379462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3399462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3409462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3429462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(vol->unmount());
3449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3459462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::format(const std::string& volId, const std::string& fsType) {
3479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
348ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3499462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3519462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3549462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3559462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(vol->format(fsType));
3569462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3582048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkeystatic binder::Status pathForVolId(const std::string& volId, std::string* path) {
35952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    if (volId == "private" || volId == "null") {
3602048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey        *path = "/data";
36152f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    } else {
36252f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        auto vol = VolumeManager::Instance()->findVolume(volId);
36352f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol == nullptr) {
36452f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Failed to find volume " + volId);
36552f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
36652f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol->getType() != VolumeBase::Type::kPrivate) {
36752f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Volume " + volId + " not private");
36852f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
36952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol->getState() != VolumeBase::State::kMounted) {
37052f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Volume " + volId + " not mounted");
37152f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
3722048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey        *path = vol->getPath();
3732048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey        if (path->empty()) {
3742048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey            return error("Volume " + volId + " missing path");
3752048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey        }
37652f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    }
3772048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    return ok();
3782048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey}
37952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey
3802048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkeybinder::Status VoldNativeService::benchmark(
3812048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    const std::string& volId, const android::sp<android::os::IVoldTaskListener>& listener) {
3822048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
3832048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    CHECK_ARGUMENT_ID(volId);
3842048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    ACQUIRE_LOCK;
3852048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey
3862048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    std::string path;
3872048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    auto status = pathForVolId(volId, &path);
3882048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    if (!status.isOk()) return status;
38952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey
39001a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
39101a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::Benchmark(path, listener);
39201a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
3939462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return ok();
3949462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3959462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3962048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkeybinder::Status VoldNativeService::checkEncryption(const std::string& volId) {
3972048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
3982048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    CHECK_ARGUMENT_ID(volId);
3992048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    ACQUIRE_LOCK;
4002048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey
4012048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    std::string path;
4022048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    auto status = pathForVolId(volId, &path);
4032048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    if (!status.isOk()) return status;
4042048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey    return translate(android::vold::CheckEncryption(path));
4052048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey}
4062048a2865cfa1f8c794b94eb044854f130943f9cJeff Sharkey
40711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::moveStorage(const std::string& fromVolId,
40852f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        const std::string& toVolId, const android::sp<android::os::IVoldTaskListener>& listener) {
4099462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
410ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(fromVolId);
411ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(toVolId);
4129462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
4139462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4149462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto fromVol = VolumeManager::Instance()->findVolume(fromVolId);
4159462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto toVol = VolumeManager::Instance()->findVolume(toVolId);
4169462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (fromVol == nullptr) {
4179462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + fromVolId);
4189462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    } else if (toVol == nullptr) {
4199462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + toVolId);
4209462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
42101a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey
42201a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
42301a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::MoveStorage(fromVol, toVol, listener);
42401a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
425068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return ok();
426068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
427068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
4289462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::remountUid(int32_t uid, int32_t remountMode) {
4299462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
4309462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
4319462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4329462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    std::string tmp;
4339462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    switch (remountMode) {
4349462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_NONE: tmp = "none"; break;
4359462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_DEFAULT: tmp = "default"; break;
4369462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_READ: tmp = "read"; break;
4379462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_WRITE: tmp = "write"; break;
4389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    default: return error("Unknown mode " + std::to_string(remountMode));
4399462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
4409462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->remountUid(uid, tmp));
4419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
4429462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::mkdirs(const std::string& path) {
4449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
445ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_PATH(path);
4469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
4479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4483472e52fc259b6a549acece21d4901d99d6a421fJeff Sharkey    return translate(VolumeManager::Instance()->mkdirs(path));
4499462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
4509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
45111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::createObb(const std::string& sourcePath,
45211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        const std::string& sourceKey, int32_t ownerGid, std::string* _aidl_return) {
45311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
454ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_PATH(sourcePath);
455ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_HEX(sourceKey);
45611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
45711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
45811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(
45911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey            VolumeManager::Instance()->createObb(sourcePath, sourceKey, ownerGid, _aidl_return));
46011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
46111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
46211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::destroyObb(const std::string& volId) {
46311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
464ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
46511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
46611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
46711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->destroyObb(volId));
46811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
46911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
47052f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkeybinder::Status VoldNativeService::fstrim(int32_t fstrimFlags,
47152f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        const android::sp<android::os::IVoldTaskListener>& listener) {
47211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
47311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
47411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
47501a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
47601a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::Trim(listener);
47701a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
47811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return ok();
47911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
48011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
481a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qianbinder::Status VoldNativeService::runIdleMaint(
482a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian        const android::sp<android::os::IVoldTaskListener>& listener) {
483a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    ENFORCE_UID(AID_SYSTEM);
484a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    ACQUIRE_LOCK;
485a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian
486a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    std::thread([=]() {
487a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian        android::vold::RunIdleMaint(listener);
488a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    }).detach();
489a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    return ok();
490a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian}
491a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian
492a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qianbinder::Status VoldNativeService::abortIdleMaint(
493a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian        const android::sp<android::os::IVoldTaskListener>& listener) {
494a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    ENFORCE_UID(AID_SYSTEM);
495a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    ACQUIRE_LOCK;
496a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian
497a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    std::thread([=]() {
498a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian        android::vold::AbortIdleMaint(listener);
499a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    }).detach();
500a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian    return ok();
501a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian}
502a370c14f75e97e131b06662f6bdd4691c4bce0e9Jin Qian
50311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mountAppFuse(int32_t uid, int32_t pid, int32_t mountId,
50411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        android::base::unique_fd* _aidl_return) {
50511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
50611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
50711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
50811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->mountAppFuse(uid, pid, mountId, _aidl_return));
50911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
51011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
51111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::unmountAppFuse(int32_t uid, int32_t pid, int32_t mountId) {
51211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
51311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
51411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
51511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->unmountAppFuse(uid, pid, mountId));
51611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
51711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
51883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeCheckPassword(const std::string& password) {
51983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
52083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
52183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
52283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_check_passwd(password.c_str()));
52383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
52483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
52583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeRestart() {
52683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
52783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
52883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
52983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // Spawn as thread so init can issue commands back to vold without
53083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // causing deadlock, usually as a result of prep_data_fs.
53183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    std::thread(&cryptfs_restart).detach();
53283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
53383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
53483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
53583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeComplete(int32_t* _aidl_return) {
53683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
53783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
53883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
53983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_crypto_complete();
54083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
54183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
54283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
54383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeystatic int fdeEnableInternal(int32_t passwordType, const std::string& password,
54483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t encryptionFlags) {
54583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    bool noUi = (encryptionFlags & VoldNativeService::ENCRYPTION_FLAG_NO_UI) != 0;
54683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
54783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    for (int tries = 0; tries < 2; ++tries) {
54883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int rc;
54983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (passwordType == VoldNativeService::PASSWORD_TYPE_DEFAULT) {
5507ee87cfcbef114ef50e15f3f6770cee0fe61890aPaul Lawrence            rc = cryptfs_enable_default(noUi);
55183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        } else {
5527ee87cfcbef114ef50e15f3f6770cee0fe61890aPaul Lawrence            rc = cryptfs_enable(passwordType, password.c_str(), noUi);
55383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
55483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
55583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (rc == 0) {
55683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            return 0;
55783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        } else if (tries == 0) {
5583472e52fc259b6a549acece21d4901d99d6a421fJeff Sharkey            KillProcessesWithOpenFiles(DATA_MNT_POINT, SIGKILL);
55983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
56083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
56183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
56283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return -1;
56383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
56483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
56583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeEnable(int32_t passwordType,
56683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& password, int32_t encryptionFlags) {
56783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
56883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
56983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
5700fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    LOG(DEBUG) << "fdeEnable(" << passwordType << ", *, " << encryptionFlags << ")";
57183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (e4crypt_is_native()) {
5720fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley        LOG(ERROR) << "e4crypt_is_native, fdeEnable invalid";
5730fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley        return error("e4crypt_is_native, fdeEnable invalid");
57483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
5750fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    LOG(DEBUG) << "!e4crypt_is_native, spawning fdeEnableInternal";
57683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
57783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // Spawn as thread so init can issue commands back to vold without
57883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // causing deadlock, usually as a result of prep_data_fs.
57983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    std::thread(&fdeEnableInternal, passwordType, password, encryptionFlags).detach();
58083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
58183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
58283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
58383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeChangePassword(int32_t passwordType,
58483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& password) {
58583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
58683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
58783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
58883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_changepw(passwordType, password.c_str()));
58983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
59083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
59183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeVerifyPassword(const std::string& password) {
59283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
59383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
59483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
59583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_verify_passwd(password.c_str()));
59683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
59783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
59883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetField(const std::string& key,
59983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        std::string* _aidl_return) {
60083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
60183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
60283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
60383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    char buf[PROPERTY_VALUE_MAX];
60483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (cryptfs_getfield(key.c_str(), buf, sizeof(buf)) != CRYPTO_GETFIELD_OK) {
60583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return error(StringPrintf("Failed to read field %s", key.c_str()));
60683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
60783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        *_aidl_return = buf;
60883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return ok();
60983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
61083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
61183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
61283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeSetField(const std::string& key,
61383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& value) {
61483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
61583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
61683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
61783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_setfield(key.c_str(), value.c_str()));
61883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
61983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
62083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetPasswordType(int32_t* _aidl_return) {
62183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
62283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
62383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
62483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_get_password_type();
62583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
62683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
62783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
62883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetPassword(std::string* _aidl_return) {
62983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
63083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
63183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
63283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    const char* res = cryptfs_get_password();
63383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (res != nullptr) {
63483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        *_aidl_return = res;
63583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
63683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
63783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
63883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
63983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeClearPassword() {
64083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
64183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
64283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
64383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    cryptfs_clear_password();
64483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
64583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
64683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
64783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fbeEnable() {
64883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
64983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
65083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
65183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_initialize_global_de());
65283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
65383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
65483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::mountDefaultEncrypted() {
65583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
65683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
65783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
6580fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    if (!e4crypt_is_native()) {
65983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        // Spawn as thread so init can issue commands back to vold without
66083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        // causing deadlock, usually as a result of prep_data_fs.
66183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        std::thread(&cryptfs_mount_default_encrypted).detach();
66283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
6630fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    return ok();
66483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
66583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
66683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::initUser0() {
66783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
66883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
66983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
67083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_init_user0());
67183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
67283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
67383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::isConvertibleToFbe(bool* _aidl_return) {
67483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
67583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
67683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
67783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_isConvertibleToFBE() != 0;
67883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
67983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
68083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
6810fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowleybinder::Status VoldNativeService::mountFstab(const std::string& mountPoint) {
6820fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    ENFORCE_UID(AID_SYSTEM);
6830fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    ACQUIRE_LOCK;
6840fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley
6850fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    return translateBool(e4crypt_mount_metadata_encrypted(mountPoint, false));
6860fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley}
6870fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley
6880fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowleybinder::Status VoldNativeService::encryptFstab(const std::string& mountPoint) {
6890fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    ENFORCE_UID(AID_SYSTEM);
6900fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    ACQUIRE_LOCK;
6910fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley
6920fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley    return translateBool(e4crypt_mount_metadata_encrypted(mountPoint, true));
6930fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley}
6940fd2626fc3457e4013a9949190c45aa5fb00c5d3Paul Crowley
69583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::createUserKey(int32_t userId, int32_t userSerial,
69683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        bool ephemeral) {
69783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
69883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
69983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
70083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_vold_create_user_key(userId, userSerial, ephemeral));
70183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
70283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
70383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::destroyUserKey(int32_t userId) {
70483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
70583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
70683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
70783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_destroy_user_key(userId));
70883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
70983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
71083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::addUserKeyAuth(int32_t userId, int32_t userSerial,
71183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& token, const std::string& secret) {
71283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
71383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
71483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
7153b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    return translateBool(e4crypt_add_user_key_auth(userId, userSerial, token, secret));
71683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
71783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
71883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fixateNewestUserKeyAuth(int32_t userId) {
71983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
72083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
72183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
72283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_fixate_newest_user_key_auth(userId));
72383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
72483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
72583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::unlockUserKey(int32_t userId, int32_t userSerial,
72683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& token, const std::string& secret) {
72783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
72883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
72983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
7303b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    return translateBool(e4crypt_unlock_user_key(userId, userSerial, token, secret));
73183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
73283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
73383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::lockUserKey(int32_t userId) {
73483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
73583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
73683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
73783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_lock_user_key(userId));
73883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
73983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
74083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::prepareUserStorage(const std::unique_ptr<std::string>& uuid,
74183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t userId, int32_t userSerial, int32_t flags) {
74283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
7433b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    std::string empty_string = "";
7443b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    auto uuid_ = uuid ? *uuid : empty_string;
74506f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    CHECK_ARGUMENT_HEX(uuid_);
74606f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley
74706f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    ACQUIRE_CRYPT_LOCK;
74883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_prepare_user_storage(uuid_, userId, userSerial, flags));
74983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
75083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
75183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::destroyUserStorage(const std::unique_ptr<std::string>& uuid,
75283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t userId, int32_t flags) {
75383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
7543b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    std::string empty_string = "";
7553b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    auto uuid_ = uuid ? *uuid : empty_string;
75606f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    CHECK_ARGUMENT_HEX(uuid_);
75706f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley
75806f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    ACQUIRE_CRYPT_LOCK;
75983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_destroy_user_storage(uuid_, userId, flags));
76083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
76183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
762068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}  // namespace vold
763068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}  // namespace android
764