Improve remounting sdcard with ecryptfs

This commit is contained in:
Dees_Troy
2013-01-09 18:42:36 +00:00
parent 9c754053b0
commit 85f44ed751
4 changed files with 43 additions and 17 deletions
+7 -9
View File
@@ -659,6 +659,7 @@ int cryptfs_check_passwd(const char *passwd)
int rc2 = 1;
#ifndef RECOVERY_SDCARD_ON_DATA
#ifdef TW_INTERNAL_STORAGE_PATH
// internal storage for non data/media devices
if(!rc) {
strcpy(pwbuf, passwd);
@@ -667,6 +668,7 @@ int cryptfs_check_passwd(const char *passwd)
EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT));
}
#endif
#endif
#ifdef TW_EXTERNAL_STORAGE_PATH
printf("Temp mounting /data\n");
// mount data so mount_ecryptfs_drive can access edk in /data/system/
@@ -674,21 +676,17 @@ int cryptfs_check_passwd(const char *passwd)
// external sd
char decrypt_external[256], external_blkdev[256];
property_get("ro.crypto.external_encrypted", decrypt_external, "0");
// First we have to mount the external storage
if (!rc2 && strcmp(decrypt_external, "1") == 0) {
printf("Mounting external...\n");
property_get("ro.crypto.external_blkdev", external_blkdev, "");
rc2 = mount(
external_blkdev, EXPAND(TW_EXTERNAL_STORAGE_PATH),
"vfat", MS_RDONLY, "");
}
// Mount the external storage as ecryptfs so that ecryptfs can act as a pass-through
if (!rc2) {
if (!rc2 && strcmp(decrypt_external, "1") == 0) {
printf("Mounting external with ecryptfs...\n");
strcpy(pwbuf, passwd);
rc2 = mount_ecryptfs_drive(
pwbuf, EXPAND(TW_EXTERNAL_STORAGE_PATH),
EXPAND(TW_EXTERNAL_STORAGE_PATH), 0);
if (rc2 == 0)
property_set("ro.crypto.external_use_ecryptfs", "1");
else
property_set("ro.crypto.external_use_ecryptfs", "0");
} else {
printf("Unable to mount external storage with ecryptfs.\n");
umount(EXPAND(TW_EXTERNAL_STORAGE_PATH));
+20 -2
View File
@@ -44,6 +44,9 @@
extern "C" {
#include "mtdutils/mtdutils.h"
#include "mtdutils/mounts.h"
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
#include "crypto/libcrypt_samsung/include/libcrypt_samsung.h"
#endif
}
using namespace std;
@@ -87,6 +90,9 @@ TWPartition::TWPartition(void) {
Fstab_File_System = "";
Format_Block_Size = 0;
Ignore_Blkid = false;
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
EcryptFS_Password = "";
#endif
}
TWPartition::~TWPartition(void) {
@@ -684,9 +690,9 @@ bool TWPartition::Mount(bool Display_Error) {
return false;
} else
return true;
} else if (Fstab_File_System == "exfat") {
} else if (Current_File_System == "exfat" && TWFunc::Path_Exists("/sbin/exfat-fuse")) {
string cmd = "/sbin/exfat-fuse " + Actual_Block_Device + " " + Mount_Point;
LOGI("cmd: %s\n", cmd.c_str());
LOGI("cmd: %s\n", cmd.c_str());
string result;
if (TWFunc::Exec_Cmd(cmd, result) != 0)
return false;
@@ -698,6 +704,18 @@ bool TWPartition::Mount(bool Display_Error) {
LOGI("Actual block device: '%s', current file system: '%s'\n", Actual_Block_Device.c_str(), Current_File_System.c_str());
return false;
} else {
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
if (EcryptFS_Password.size() > 0) {
if (mount_ecryptfs_drive(EcryptFS_Password.c_str(), Mount_Point.c_str(), Mount_Point.c_str(), 0) != 0) {
if (Display_Error)
LOGE("Unable to mount ecryptfs for '%s'\n", Mount_Point.c_str());
else
LOGI("Unable to mount ecryptfs for '%s'\n", Mount_Point.c_str());
} else {
LOGI("Successfully mounted ecryptfs for '%s'\n", Mount_Point.c_str());
}
}
#endif
if (Removable)
Update_Size(Display_Error);
+13 -6
View File
@@ -1596,7 +1596,7 @@ int TWPartitionManager::Decrypt_Device(string Password) {
efs = 0;
#ifdef TW_EXTERNAL_STORAGE_PATH
TWPartition* sdcard = Find_Partition_By_Path(EXPAND(TW_EXTERNAL_STORAGE_PATH));
if (sdcard) {
if (sdcard && sdcard->Mount(false)) {
property_set("ro.crypto.external_encrypted", "1");
property_set("ro.crypto.external_blkdev", sdcard->Actual_Block_Device.c_str());
} else {
@@ -1639,12 +1639,19 @@ int TWPartitionManager::Decrypt_Device(string Password) {
emmc->Setup_File_System(false);
ui_print("Internal SD successfully decrypted, new block device: '%s'\n", crypto_blkdev_sd);
}
#ifdef TW_EXTERNAL_STORAGE_PATH
sdcard->Is_Decrypted = true;
sdcard->Setup_File_System(false);
#endif //ifdef TW_EXTERNAL_STORAGE_PATH
#endif //ifdef CRYPTO_SD_FS_TYPE
#ifdef TW_EXTERNAL_STORAGE_PATH
char is_external_decrypted[255];
property_get("ro.crypto.external_use_ecryptfs", is_external_decrypted, "0");
if (strcmp(is_external_decrypted, "1") == 0) {
sdcard->Is_Decrypted = true;
sdcard->EcryptFS_Password = Password;
sdcard->Decrypted_Block_Device = sdcard->Actual_Block_Device;
} else {
sdcard->Is_Decrypted = false;
sdcard->Decrypted_Block_Device = "";
}
#endif //ifdef TW_EXTERNAL_STORAGE_PATH
// Sleep for a bit so that the device will be ready
sleep(1);
+3
View File
@@ -107,6 +107,9 @@ protected:
string Fstab_File_System; // File system from the recovery.fstab
int Format_Block_Size; // Block size for formatting
bool Ignore_Blkid; // Ignore blkid results due to superblocks lying to us on certain devices / partitions
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
string EcryptFS_Password; // Have to store the encryption password to remount
#endif
private:
bool Process_Flags(string Flags, bool Display_Error); // Process custom fstab flags