Add trampoline_encmnt
This commit is contained in:
@@ -214,6 +214,11 @@ include $(multirom_local_path)/kexec-tools/Android.mk
|
||||
# adbd
|
||||
include $(multirom_local_path)/adbd/Android.mk
|
||||
|
||||
# trampoline_encmnt
|
||||
ifeq ($(MR_ENCRYPTION),true)
|
||||
include $(multirom_local_path)/trampoline_encmnt/Android.mk
|
||||
endif
|
||||
|
||||
# We need static libtruetype but it isn't in standard android makefile :(
|
||||
LOCAL_PATH := external/freetype/
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
15
log.h
15
log.h
@@ -17,10 +17,17 @@
|
||||
#ifndef _INIT_LOG_H_
|
||||
#define _INIT_LOG_H_
|
||||
|
||||
#include <cutils/klog.h>
|
||||
#ifdef LOG_TO_STDOUT
|
||||
#include <stdio.h>
|
||||
#define ERROR(fmt, ...) fprintf(stderr, MR_LOG_TAG ": " fmt "\n", ##__VA_ARGS__)
|
||||
#define NOTICE(fmt, ...) printf(MR_LOG_TAG ": " fmt "\n", ##__VA_ARGS__)
|
||||
#define INFO(fmt, ...) printf(MR_LOG_TAG ": " fmt "\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#include <cutils/klog.h>
|
||||
|
||||
#define ERROR(x...) KLOG_ERROR(MR_LOG_TAG, x)
|
||||
#define NOTICE(x...) KLOG_NOTICE(MR_LOG_TAG, x)
|
||||
#define INFO(x...) KLOG_INFO(MR_LOG_TAG, x)
|
||||
#define ERROR(x...) KLOG_ERROR(MR_LOG_TAG, x)
|
||||
#define NOTICE(x...) KLOG_NOTICE(MR_LOG_TAG, x)
|
||||
#define INFO(x...) KLOG_INFO(MR_LOG_TAG, x)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -13,11 +13,10 @@ LOCAL_SRC_FILES:= \
|
||||
LOCAL_MODULE:= trampoline
|
||||
LOCAL_MODULE_TAGS := eng
|
||||
|
||||
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
||||
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
|
||||
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := libcutils libc
|
||||
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
||||
|
||||
LOCAL_CFLAGS += -DMR_LOG_TAG=\"trampoline\"
|
||||
|
||||
@@ -41,4 +40,8 @@ else
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(MR_ENCRYPTION),true)
|
||||
LOCAL_CFLAGS += -DMR_ENCRYPTION
|
||||
endif
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
|
||||
@@ -56,7 +56,7 @@ static void *adb_thread_work(void *mrom_path)
|
||||
int enabled = adb_is_enabled((char*)mrom_path);
|
||||
free(mrom_path);
|
||||
|
||||
if(enabled != 0)
|
||||
if(enabled == 0)
|
||||
return NULL;
|
||||
|
||||
adb_init_usb();
|
||||
@@ -226,5 +226,5 @@ int adb_is_enabled(char *mrom_path)
|
||||
char *cmd[] = { busybox_path, "grep", "^enable_adb=1$", cfg, NULL };
|
||||
sprintf(cfg, "%s/multirom.ini", mrom_path);
|
||||
|
||||
return run_cmd(cmd) == 0 ? 0 : -1;
|
||||
return run_cmd(cmd) == 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
21
trampoline_encmnt/Android.mk
Normal file
21
trampoline_encmnt/Android.mk
Normal file
@@ -0,0 +1,21 @@
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE:= trampoline_encmnt
|
||||
LOCAL_MODULE_TAGS := eng
|
||||
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
|
||||
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)
|
||||
LOCAL_SHARED_LIBRARIES := libcutils libcryptfslollipop
|
||||
|
||||
mr_twrp_path := bootable/recovery
|
||||
LOCAL_C_INCLUDES += $(multirom_local_path) $(mr_twrp_path) $(mr_twrp_path)/crypto/scrypt/lib/crypto external/openssl/include
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
encmnt.c \
|
||||
../fstab.c \
|
||||
../containers.c \
|
||||
../util.c \
|
||||
|
||||
LOCAL_CFLAGS += -DMR_LOG_TAG=\"trampoline_encmnt\"
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
225
trampoline_encmnt/encmnt.c
Normal file
225
trampoline_encmnt/encmnt.c
Normal file
@@ -0,0 +1,225 @@
|
||||
/*
|
||||
* This file is part of MultiROM.
|
||||
*
|
||||
* MultiROM is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MultiROM is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with MultiROM. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "../log.h"
|
||||
#include "../fstab.h"
|
||||
|
||||
#include "crypto/lollipop/cryptfs.h"
|
||||
|
||||
#define CMD_NONE 0
|
||||
#define CMD_DECRYPT 1
|
||||
#define CMD_REMOVE 2
|
||||
#define CMD_PWTYPE 3
|
||||
|
||||
static int get_footer_from_opts(char *output, size_t output_size, const char *opts2)
|
||||
{
|
||||
char *r, *saveptr;
|
||||
char *dup = strdup(opts2);
|
||||
int res = -1;
|
||||
|
||||
r = strtok_r(dup, ",", &saveptr);
|
||||
while(r)
|
||||
{
|
||||
if(strncmp(r, "encryptable=", sizeof("encryptable=")-1) == 0)
|
||||
{
|
||||
snprintf(output, output_size, "%s", r + sizeof("encryptable=") - 1);
|
||||
res = 0;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
r = strtok_r(NULL, ",", &saveptr);
|
||||
}
|
||||
|
||||
exit:
|
||||
free(dup);
|
||||
return res;
|
||||
}
|
||||
|
||||
static void print_help(char *argv[]) {
|
||||
printf("Usage: %s COMMAND ARGUMENTS\n"
|
||||
"Available commands:\n"
|
||||
" decrypt PASSWORD - mount encrypted data partition to /realdata using PASSWORD\n"
|
||||
" remove - unmounts encrypted data\n"
|
||||
" pwtype - prints password type as integer\n",
|
||||
argv[0]);
|
||||
}
|
||||
|
||||
static int handle_pwtype(int stdout_fd)
|
||||
{
|
||||
if(cryptfs_check_footer() < 0)
|
||||
{
|
||||
ERROR("cryptfs_check_footer failed!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int pwtype = cryptfs_get_password_type();
|
||||
if(pwtype < 0)
|
||||
{
|
||||
ERROR("cryptfs_get_password_type failed!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
char buff[32];
|
||||
snprintf(buff, sizeof(buff), "%d\n", pwtype);
|
||||
write(stdout_fd, buff, strlen(buff));
|
||||
fsync(stdout_fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int handle_decrypt(int stdout_fd, char *password)
|
||||
{
|
||||
DIR *d;
|
||||
struct dirent *de;
|
||||
char buff[256];
|
||||
int res = -1;
|
||||
|
||||
if(cryptfs_check_footer() < 0)
|
||||
{
|
||||
ERROR("cryptfs_check_footer failed!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(cryptfs_check_passwd(password) < 0)
|
||||
{
|
||||
ERROR("cryptfs_check_passwd failed!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
d = opendir("/dev/block/");
|
||||
if(!d)
|
||||
{
|
||||
ERROR("Failed to open /dev/block, wth? %s", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
// find the block device
|
||||
while((de = readdir(d)))
|
||||
{
|
||||
if(de->d_type == DT_BLK && strncmp(de->d_name, "dm-", 3) == 0)
|
||||
{
|
||||
snprintf(buff, sizeof(buff), "/dev/block/%s\n", de->d_name);
|
||||
write(stdout_fd, buff, strlen(buff));
|
||||
fsync(stdout_fd);
|
||||
res = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
closedir(d);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int handle_remove(void)
|
||||
{
|
||||
if(delete_crypto_blk_dev("userdata") < 0)
|
||||
{
|
||||
ERROR("delete_crypto_blk_dev failed!");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
int res = 1;
|
||||
int cmd = CMD_NONE;
|
||||
int stdout_fd;
|
||||
char footer_location[256];
|
||||
struct fstab *fstab;
|
||||
struct fstab_part *p;
|
||||
char *argument = NULL;
|
||||
|
||||
for(i = 1; i < argc; ++i)
|
||||
{
|
||||
if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))
|
||||
{
|
||||
print_help(argv);
|
||||
return 0;
|
||||
}
|
||||
else if(cmd == CMD_NONE)
|
||||
{
|
||||
if(strcmp(argv[i], "decrypt") == 0)
|
||||
cmd = CMD_DECRYPT;
|
||||
else if(strcmp(argv[i], "remove") == 0)
|
||||
cmd = CMD_REMOVE;
|
||||
else if(strcmp(argv[i], "pwtype") == 0)
|
||||
cmd = CMD_PWTYPE;
|
||||
}
|
||||
else if(!argument)
|
||||
{
|
||||
argument = argv[i];
|
||||
}
|
||||
}
|
||||
|
||||
if(argc == 1 || cmd == CMD_NONE || (cmd == CMD_DECRYPT && !argument))
|
||||
{
|
||||
print_help(argv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
fstab = fstab_auto_load();
|
||||
if(!fstab)
|
||||
{
|
||||
ERROR("Failed to load fstab!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
p = fstab_find_first_by_path(fstab, "/data");
|
||||
if(!p)
|
||||
{
|
||||
ERROR("Failed to find /data partition in fstab\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if(get_footer_from_opts(footer_location, sizeof(footer_location), p->options2) < 0)
|
||||
goto exit;
|
||||
|
||||
INFO("Setting encrypted partition data to %s %s %s\n", p->device, footer_location, p->type);
|
||||
set_partition_data(p->device, footer_location, p->type);
|
||||
|
||||
// cryptfs prints informations, we don't want that
|
||||
stdout_fd = dup(1);
|
||||
freopen("/dev/null", "a", stdout);
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case CMD_PWTYPE:
|
||||
if(handle_pwtype(stdout_fd) < 0)
|
||||
goto exit;
|
||||
break;
|
||||
case CMD_DECRYPT:
|
||||
if(handle_decrypt(stdout_fd, argument) < 0)
|
||||
goto exit;
|
||||
break;
|
||||
case CMD_REMOVE:
|
||||
if(handle_remove() < 0)
|
||||
goto exit;
|
||||
break;
|
||||
}
|
||||
|
||||
res = 0;
|
||||
exit:
|
||||
fstab_destroy(fstab);
|
||||
return res;
|
||||
}
|
||||
Reference in New Issue
Block a user