trampoline: Add new pre/post encrypt hooks, fake system properties library

These are needed on Snapdragon 810 where an extra daemon (qseecomd) must
be started prior to decryption, and where the decryption library polls
a system property to make sure that daemon is running

Also fix missing fonts log spam in trampoline_encmnt by symlinking the one available font
This commit is contained in:
Zhuowei Zhang
2016-02-10 19:59:48 -08:00
parent 4d02af6e26
commit 42d2dcb3cf
6 changed files with 80 additions and 5 deletions

View File

@@ -41,6 +41,11 @@ void mrom_hook_fixup_bootimg_cmdline(char *bootimg_cmdline, size_t bootimg_cmdli
int mrom_hook_has_kexec(void); int mrom_hook_has_kexec(void);
#endif #endif
#if MR_DEVICE_HOOKS >= 6
void tramp_hook_encryption_setup(void);
void tramp_hook_encryption_cleanup(void);
#endif
#endif /* MR_DEVICE_HOOKS */ #endif /* MR_DEVICE_HOOKS */
#endif /* MR_DEVICE_HOOKS_H */ #endif /* MR_DEVICE_HOOKS_H */

View File

@@ -14,7 +14,7 @@ endif
multirom_extra_dep := multirom_extra_dep :=
ifeq ($(MR_ENCRYPTION),true) ifeq ($(MR_ENCRYPTION),true)
multirom_extra_dep += trampoline_encmnt linker multirom_extra_dep += trampoline_encmnt linker libmultirom_fake_properties
else else
MR_ENCRYPTION := false MR_ENCRYPTION := false
endif endif
@@ -59,6 +59,7 @@ $(MULTIROM_ZIP_TARGET): multirom trampoline signapk bbootimg mrom_kexec_static m
cp -a $(TARGET_OUT_SHARED_LIBRARIES)/libm.so $(MULTIROM_INST_DIR)/multirom/enc/; \ cp -a $(TARGET_OUT_SHARED_LIBRARIES)/libm.so $(MULTIROM_INST_DIR)/multirom/enc/; \
cp -a $(TARGET_OUT_SHARED_LIBRARIES)/libstdc++.so $(MULTIROM_INST_DIR)/multirom/enc/; \ cp -a $(TARGET_OUT_SHARED_LIBRARIES)/libstdc++.so $(MULTIROM_INST_DIR)/multirom/enc/; \
cp -a $(TARGET_OUT_SHARED_LIBRARIES)/libc++.so $(MULTIROM_INST_DIR)/multirom/enc/; \ cp -a $(TARGET_OUT_SHARED_LIBRARIES)/libc++.so $(MULTIROM_INST_DIR)/multirom/enc/; \
cp -a $(TARGET_OUT_SHARED_LIBRARIES)/libmultirom_fake_properties.so $(MULTIROM_INST_DIR)/multirom/enc/; \
if [ -n "$(MR_ENCRYPTION_SETUP_SCRIPT)" ]; then sh "$(ANDROID_BUILD_TOP)/$(MR_ENCRYPTION_SETUP_SCRIPT)" "$(ANDROID_BUILD_TOP)" "$(MULTIROM_INST_DIR)/multirom/enc"; fi; \ if [ -n "$(MR_ENCRYPTION_SETUP_SCRIPT)" ]; then sh "$(ANDROID_BUILD_TOP)/$(MR_ENCRYPTION_SETUP_SCRIPT)" "$(ANDROID_BUILD_TOP)" "$(MULTIROM_INST_DIR)/multirom/enc"; fi; \
fi fi

View File

@@ -40,4 +40,8 @@ ifeq ($(MR_ENCRYPTION),true)
LOCAL_SRC_FILES += encryption.c LOCAL_SRC_FILES += encryption.c
endif endif
ifeq ($(MR_ENCRYPTION_FAKE_PROPERTIES),true)
LOCAL_CFLAGS += -DMR_ENCRYPTION_FAKE_PROPERTIES
endif
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)

View File

@@ -30,12 +30,23 @@
#include "../lib/log.h" #include "../lib/log.h"
#include "encryption.h" #include "encryption.h"
#include "../trampoline_encmnt/encmnt_defines.h" #include "../trampoline_encmnt/encmnt_defines.h"
#include "../hooks.h"
static char encmnt_cmd_arg[64] = { 0 }; static char encmnt_cmd_arg[64] = { 0 };
static char *const encmnt_cmd[] = { "/mrom_enc/trampoline_encmnt", encmnt_cmd_arg, NULL }; static char *const encmnt_cmd[] = { "/mrom_enc/trampoline_encmnt", encmnt_cmd_arg, NULL };
#ifdef MR_ENCRYPTION_FAKE_PROPERTIES
static char *const encmnt_envp[] = { "LD_LIBRARY_PATH=/mrom_enc/", "LD_PRELOAD=/mrom_enc/libmultirom_fake_properties.so", NULL };
#else
static char *const encmnt_envp[] = { "LD_LIBRARY_PATH=/mrom_enc/", NULL }; static char *const encmnt_envp[] = { "LD_LIBRARY_PATH=/mrom_enc/", NULL };
#endif
static int g_decrypted = 0; static int g_decrypted = 0;
#ifdef __LP64__
#define LINKER_PATH "/system/bin/linker64"
#else
#define LINKER_PATH "/system/bin/linker"
#endif
int encryption_before_mount(struct fstab *fstab) int encryption_before_mount(struct fstab *fstab)
{ {
int exit_code = -1; int exit_code = -1;
@@ -43,10 +54,13 @@ int encryption_before_mount(struct fstab *fstab)
int res = ENC_RES_ERR; int res = ENC_RES_ERR;
mkdir_recursive("/system/bin", 0755); mkdir_recursive("/system/bin", 0755);
remove("/system/bin/linker"); remove(LINKER_PATH);
symlink("/mrom_enc/linker", "/system/bin/linker"); symlink("/mrom_enc/linker", LINKER_PATH);
chmod("/mrom_enc/linker", 0775); chmod("/mrom_enc/linker", 0775);
chmod("/mrom_enc/trampoline_encmnt", 0775); chmod("/mrom_enc/trampoline_encmnt", 0775);
// some fonts not in ramdisk to save space, so use regular instead
symlink("/mrom_enc/res/Roboto-Regular.ttf", "/mrom_enc/res/Roboto-Italic.ttf");
symlink("/mrom_enc/res/Roboto-Regular.ttf", "/mrom_enc/res/Roboto-Medium.ttf");
remove("/vendor"); remove("/vendor");
symlink("/mrom_enc/vendor", "/vendor"); symlink("/mrom_enc/vendor", "/vendor");
@@ -59,6 +73,10 @@ int encryption_before_mount(struct fstab *fstab)
ERROR("Mounting /firmware for encryption failed with %s\n", strerror(errno)); ERROR("Mounting /firmware for encryption failed with %s\n", strerror(errno));
} }
#if MR_DEVICE_HOOKS >= 6
tramp_hook_encryption_setup();
#endif
INFO("Running trampoline_encmnt\n"); INFO("Running trampoline_encmnt\n");
strcpy(encmnt_cmd_arg, "decrypt"); strcpy(encmnt_cmd_arg, "decrypt");
@@ -122,12 +140,15 @@ void encryption_destroy(void)
} }
// Make sure we're removing our symlink and not ROM's linker // Make sure we're removing our symlink and not ROM's linker
if(lstat("/system/bin/linker", &info) >= 0 && S_ISLNK(info.st_mode)) if(lstat(LINKER_PATH, &info) >= 0 && S_ISLNK(info.st_mode))
remove("/system/bin/linker"); remove(LINKER_PATH);
} }
int encryption_cleanup(void) int encryption_cleanup(void)
{ {
#if MR_DEVICE_HOOKS >= 6
tramp_hook_encryption_cleanup();
#endif
remove("/vendor"); remove("/vendor");
if(access("/firmware", R_OK) >= 0 && umount("/firmware") < 0) if(access("/firmware", R_OK) >= 0 && umount("/firmware") < 0)

View File

@@ -27,3 +27,14 @@ LOCAL_SRC_FILES := \
include $(multirom_local_path)/device_defines.mk include $(multirom_local_path)/device_defines.mk
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_MODULE := libmultirom_fake_properties
LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES += $(multirom_local_path)
LOCAL_SRC_FILES := fake_properties.c
include $(multirom_local_path)/device_defines.mk
include $(BUILD_SHARED_LIBRARY)

View File

@@ -0,0 +1,33 @@
/*
* 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 <stdlib.h>
#include <string.h>
#include <sys/system_properties.h>
/* MultiROM doesn't initialize the property service,
* but decryption on Nexus 6P waits for one property to become true
* so we hardcode it here
*/
int property_get(const char *key, char *value, const char *default_value)
{
if (!strcmp(key, "sys.listeners.registered"))
default_value = "true";
if (default_value)
strncpy(value, default_value, PROP_VALUE_MAX);
return strlen(value);
}