From 4bf1887c787a025aad2fbafe382e556e85ac73b0 Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Mon, 30 Mar 2015 11:30:21 -0700 Subject: [PATCH] Securely encrypt the master key Remove unencrypted link since it is easier to manage directly Move creation of key to vold Start vold early so this is possible in a timely fashion This is one of four changes to enable this functionality: https://android-review.googlesource.com/#/c/144586/ https://android-review.googlesource.com/#/c/144663/ https://android-review.googlesource.com/#/c/144672/ https://android-review.googlesource.com/#/c/144673/ Bug: 18151196 Change-Id: Idb17d1f1a724c6ec509d181ae4427113e9d3b5e6 --- fs_mgr/fs_mgr.c | 12 +----------- init/builtins.cpp | 45 +++++++++++++++------------------------------ rootdir/init.rc | 8 +++++--- 3 files changed, 21 insertions(+), 44 deletions(-) diff --git a/fs_mgr/fs_mgr.c b/fs_mgr/fs_mgr.c index 273a2ec0f..1dd071c42 100644 --- a/fs_mgr/fs_mgr.c +++ b/fs_mgr/fs_mgr.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include @@ -480,16 +480,6 @@ static int handle_encryptable(struct fstab *fstab, const struct fstab_rec* rec) return FS_MGR_MNTALL_FAIL; } - // Link it to the normal place so ext4_crypt functions work normally - strlcat(tmp_mnt, "/unencrypted", sizeof(tmp_mnt)); - char link_path[PATH_MAX]; - strlcpy(link_path, rec->mount_point, sizeof(link_path)); - strlcat(link_path, "/unencrypted", sizeof(link_path)); - if (symlink(tmp_mnt, link_path)) { - ERROR("Error creating symlink to unencrypted directory\n"); - return FS_MGR_MNTALL_FAIL; - } - return FS_MGR_MNTALL_DEV_NON_DEFAULT_FILE_ENCRYPTED; } diff --git a/init/builtins.cpp b/init/builtins.cpp index 3bbaf8336..d0e56ec0c 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include @@ -385,18 +385,6 @@ static int wipe_data_via_recovery() while (1) { pause(); } // never reached } -/* - * Callback to make a directory from the ext4 code - */ -static int do_mount_alls_make_dir(const char* dir) -{ - if (make_dir(dir, 0700) && errno != EEXIST) { - return -1; - } - - return 0; -} - /* * This function might request a reboot, in which case it will * not return. @@ -465,22 +453,6 @@ int do_mount_all(int nargs, char **args) ret = wipe_data_via_recovery(); /* If reboot worked, there is no return. */ } else if (ret == FS_MGR_MNTALL_DEV_DEFAULT_FILE_ENCRYPTED) { - // We have to create the key files here. Only init can call make_dir, - // and we can't do it from fs_mgr as then fs_mgr would depend on - // make_dir creating a circular dependency. - fstab = fs_mgr_read_fstab(args[1]); - for (int i = 0; i < fstab->num_entries; ++i) { - if (fs_mgr_is_file_encrypted(&fstab->recs[i])) { - if (e4crypt_create_device_key(fstab->recs[i].mount_point, - do_mount_alls_make_dir)) { - ERROR("Could not create device key on %s" - " - continue unencrypted\n", - fstab->recs[i].mount_point); - } - } - } - fs_mgr_free_fstab(fstab); - if (e4crypt_install_keyring()) { return -1; } @@ -849,10 +821,23 @@ int do_wait(int nargs, char **args) return -1; } +/* + * Callback to make a directory from the ext4 code + */ +static int do_installkeys_ensure_dir_exists(const char* dir) +{ + if (make_dir(dir, 0700) && errno != EEXIST) { + return -1; + } + + return 0; +} + int do_installkey(int nargs, char **args) { if (nargs == 2) { - return e4crypt_install_key(args[1]); + return e4crypt_create_device_key(args[1], + do_installkeys_ensure_dir_exists); } return -1; diff --git a/rootdir/init.rc b/rootdir/init.rc index a5ea60aaa..b353d9d4c 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -226,14 +226,17 @@ on post-fs mkdir /cache/lost+found 0770 root root on post-fs-data - installkey /data - # We chown/chmod /data again so because mount is run as root + defaults chown system system /data chmod 0771 /data # We restorecon /data in case the userdata partition has been reset. restorecon /data + # Make sure we have the device encryption key + start logd + start vold + installkey /data + # Start bootcharting as soon as possible after the data partition is # mounted to collect more data. mkdir /data/bootchart 0755 shell shell @@ -454,7 +457,6 @@ on property:vold.decrypt=trigger_restart_min_framework class_start main on property:vold.decrypt=trigger_restart_framework - installkey /data class_start main class_start late_start