121 lines
2.9 KiB
C++
121 lines
2.9 KiB
C++
|
#define TAG "ext4_utils"
|
||
|
|
||
|
#include "ext4_crypt.h"
|
||
|
|
||
|
#include <string>
|
||
|
#include <fstream>
|
||
|
#include <map>
|
||
|
|
||
|
#include <errno.h>
|
||
|
#include <sys/mount.h>
|
||
|
|
||
|
#include <cutils/klog.h>
|
||
|
#include <cutils/properties.h>
|
||
|
|
||
|
#include "unencrypted_properties.h"
|
||
|
|
||
|
namespace {
|
||
|
std::map<std::string, std::string> s_password_store;
|
||
|
}
|
||
|
|
||
|
bool e4crypt_non_default_key(const char* dir)
|
||
|
{
|
||
|
int type = e4crypt_get_password_type(dir);
|
||
|
|
||
|
// ext4enc:TODO Use consts, not 1 here
|
||
|
return type != -1 && type != 1;
|
||
|
}
|
||
|
|
||
|
int e4crypt_get_password_type(const char* path)
|
||
|
{
|
||
|
UnencryptedProperties props(path);
|
||
|
if (props.Get<std::string>(properties::key).empty()) {
|
||
|
KLOG_INFO(TAG, "No master key, so not ext4enc\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return props.Get<int>(properties::type, 1);
|
||
|
}
|
||
|
|
||
|
int e4crypt_change_password(const char* path, int crypt_type,
|
||
|
const char* password)
|
||
|
{
|
||
|
// ext4enc:TODO Encrypt master key with password securely. Store hash of
|
||
|
// master key for validation
|
||
|
UnencryptedProperties props(path);
|
||
|
if ( props.Set(properties::password, password)
|
||
|
&& props.Set(properties::type, crypt_type))
|
||
|
return 0;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
int e4crypt_crypto_complete(const char* path)
|
||
|
{
|
||
|
KLOG_INFO(TAG, "ext4 crypto complete called on %s\n", path);
|
||
|
if (UnencryptedProperties(path).Get<std::string>(properties::key).empty()) {
|
||
|
KLOG_INFO(TAG, "No master key, so not ext4enc\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int e4crypt_check_passwd(const char* path, const char* password)
|
||
|
{
|
||
|
UnencryptedProperties props(path);
|
||
|
if (props.Get<std::string>(properties::key).empty()) {
|
||
|
KLOG_INFO(TAG, "No master key, so not ext4enc\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
auto actual_password = props.Get<std::string>(properties::password);
|
||
|
|
||
|
if (actual_password == password) {
|
||
|
s_password_store[path] = password;
|
||
|
return 0;
|
||
|
} else {
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int e4crypt_restart(const char* path)
|
||
|
{
|
||
|
int rc = 0;
|
||
|
|
||
|
KLOG_INFO(TAG, "ext4 restart called on %s\n", path);
|
||
|
property_set("vold.decrypt", "trigger_reset_main");
|
||
|
KLOG_INFO(TAG, "Just asked init to shut down class main\n");
|
||
|
sleep(2);
|
||
|
|
||
|
std::string tmp_path = std::string() + path + "/tmp_mnt";
|
||
|
|
||
|
// ext4enc:TODO add retry logic
|
||
|
rc = umount(tmp_path.c_str());
|
||
|
if (rc) {
|
||
|
KLOG_ERROR(TAG, "umount %s failed with rc %d, msg %s\n",
|
||
|
tmp_path.c_str(), rc, strerror(errno));
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
// ext4enc:TODO add retry logic
|
||
|
rc = umount(path);
|
||
|
if (rc) {
|
||
|
KLOG_ERROR(TAG, "umount %s failed with rc %d, msg %s\n",
|
||
|
path, rc, strerror(errno));
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
const char* e4crypt_get_password(const char* path)
|
||
|
{
|
||
|
// ext4enc:TODO scrub password after timeout
|
||
|
auto i = s_password_store.find(path);
|
||
|
if (i == s_password_store.end()) {
|
||
|
return 0;
|
||
|
} else {
|
||
|
return i->second.c_str();
|
||
|
}
|
||
|
}
|