From 253368a0726120efa57664cdd1d088af099a3d81 Mon Sep 17 00:00:00 2001 From: Ethan Yonker Date: Tue, 25 Nov 2014 15:00:52 -0600 Subject: Reduce libs needed for decrypt and clean up old decypt files Trim cryptfs.c to remove functions that TWRP does not use for decrypt and remove the need for libfs_mgr from cryptfs.c by passing some items to cryptfs.c from the partition manager. Add support for new fstab flags: encryptable and forceencrypt=/path/to/cryptokey For example: flags=forceencrypt=/dev/block/platform/sdhci-tegra.3/by-name/MD1 Note that "footer" is the default, so you do not need to set this flag on devices that use the footer for the crypto key. Also add mounttodecrypt if you need to mount a partition during the decrypt cycle for firmware of proprietary libs. Clean up decrypt and only support one version Android 5.0 lollipop decrypt should be backwards compatible with older versions so we will only support one version, 1.3 that came with 5.0 lollipop. Remove support for Samsung TouchWiz decrypt. It does not work with the latest versions of Samsung encryption anyway and it has not been updated to work with any AOSP decryption higher than 1.1 Change-Id: I2d9c6e31df50268c91ee642c2fa090f901d9d5c9 --- crypto/crypttools/getfooter.c | 219 ------------------------------------------ 1 file changed, 219 deletions(-) delete mode 100644 crypto/crypttools/getfooter.c (limited to 'crypto/crypttools/getfooter.c') diff --git a/crypto/crypttools/getfooter.c b/crypto/crypttools/getfooter.c deleted file mode 100644 index aa7f88e84..000000000 --- a/crypto/crypttools/getfooter.c +++ /dev/null @@ -1,219 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../fs_mgr/include/fs_mgr.h" -#include "cryptfs.h" - -#include "cutils/properties.h" - -#ifndef PROPERTY_VALUE_MAX -#define PROPERTY_VALUE_MAX 255 -#endif -#ifndef FSTAB_PREFIX -#define FSTAB_PREFIX "/fstab." -#endif -#ifndef KEY_IN_FOOTER -#define KEY_IN_FOOTER "footer" -#endif - -struct fstab *fstab; - -static unsigned int get_blkdev_size(int fd) -{ - unsigned int nr_sec; - - if ( (ioctl(fd, BLKGETSIZE, &nr_sec)) == -1) { - nr_sec = 0; - } - - return nr_sec; -} - -int get_crypt_ftr_info(char **metadata_fname, off64_t *off) -{ - static int cached_data = 0; - static off64_t cached_off = 0; - static char cached_metadata_fname[PROPERTY_VALUE_MAX] = ""; - int fd; - char key_loc[PROPERTY_VALUE_MAX]; - char real_blkdev[PROPERTY_VALUE_MAX]; - unsigned int nr_sec; - int rc = -1; - - fs_mgr_get_crypt_info(fstab, key_loc, real_blkdev, sizeof(key_loc)); - - if (!strcmp(key_loc, KEY_IN_FOOTER)) { - if ( (fd = open(real_blkdev, O_RDWR)) < 0) { - printf("Cannot open real block device %s\n", real_blkdev); - return -1; - } - - if ((nr_sec = get_blkdev_size(fd))) { - /* If it's an encrypted Android partition, the last 16 Kbytes contain the - * encryption info footer and key, and plenty of bytes to spare for future - * growth. - */ - strlcpy(cached_metadata_fname, real_blkdev, sizeof(cached_metadata_fname)); - cached_off = ((off64_t)nr_sec * 512) - CRYPT_FOOTER_OFFSET; - cached_data = 1; - } else { - printf("Cannot get size of block device %s\n", real_blkdev); - } - close(fd); - } else { - strlcpy(cached_metadata_fname, key_loc, sizeof(cached_metadata_fname)); - cached_off = 0; - cached_data = 1; - } - - if (cached_data) { - if (metadata_fname) { - *metadata_fname = cached_metadata_fname; - } - if (off) { - *off = cached_off; - } - rc = 0; - } - - return rc; -} - -int get_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr) -{ - int fd; - unsigned int nr_sec, cnt; - off64_t starting_off; - int rc = -1; - char *fname = NULL; - struct stat statbuf; - - if (get_crypt_ftr_info(&fname, &starting_off)) { - printf("Unable to get crypt_ftr_info\n"); - return -1; - } - if (fname[0] != '/') { - printf("Unexpected value for crypto key location '%s'\n", fname); - //return -1; - } - if ( (fd = open(fname, O_RDWR)) < 0) { - printf("Cannot open footer file %s for get\n", fname); - return -1; - } - - /* Make sure it's 16 Kbytes in length */ - fstat(fd, &statbuf); - if (S_ISREG(statbuf.st_mode) && (statbuf.st_size != 0x4000)) { - printf("footer file %s is not the expected size!\n", fname); - close(fd); - return -1; - } - - /* Seek to the start of the crypt footer */ - if (lseek64(fd, starting_off, SEEK_SET) == -1) { - printf("Cannot seek to real block device footer\n"); - close(fd); - return -1; - } - - if ( (cnt = read(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) { - printf("Cannot read real block device footer\n"); - close(fd); - return -1; - } - close(fd); - return 0; -} - -int main(void) -{ - char key_loc[PROPERTY_VALUE_MAX]; - char blk_dev[PROPERTY_VALUE_MAX]; - char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)]; - struct stat st; - struct crypt_mnt_ftr crypt_ftr; - int fdout; - - printf("This tool comes with no warranties whatsoever.\n"); - printf("http://teamw.in\n\n"); - strcpy(fstab_filename, FSTAB_PREFIX); - property_get("ro.hardware", fstab_filename + sizeof(FSTAB_PREFIX) - 1, ""); - - if (stat(fstab_filename, &st) != 0) { - printf("Cannot locate fstab file '%s'\n", fstab_filename); - return -1; - } - - fstab = fs_mgr_read_fstab(fstab_filename); - if (!fstab) { - printf("failed to open %s\n", fstab_filename); - return -1; - } - - fs_mgr_get_crypt_info(fstab, key_loc, blk_dev, sizeof(blk_dev)); - - if (get_crypt_ftr_and_key(&crypt_ftr)) { - printf("Error getting crypt footer and key\n"); - return -1; - } - - if ( (fdout = open("/footerfile", O_WRONLY | O_CREAT, 0644)) < 0) { - printf("Cannot open output file /footerfile\n"); - return -1; - } - if (write(fdout, (void*) &crypt_ftr, sizeof(struct crypt_mnt_ftr)) != sizeof(struct crypt_mnt_ftr)) { - printf("Failed to write footer.\n"); - } - close(fdout); - - if (!strcmp(key_loc, KEY_IN_FOOTER)) { - unsigned int nr_sec, cnt; - off64_t off = 0; - char buffer[CRYPT_FOOTER_OFFSET]; - int fd; - - printf("\n\nDumping footer from '%s'...\n", blk_dev); - if ( (fd = open(blk_dev, O_RDONLY)) < 0) { - printf("Cannot open real block device %s\n", blk_dev); - return -1; - } - - if ((nr_sec = get_blkdev_size(fd))) { - off = ((off64_t)nr_sec * 512) - CRYPT_FOOTER_OFFSET; - } else { - printf("Cannot get size of block device %s\n", blk_dev); - close(fd); - return -1; - } - printf("Size is %llu, offset is %llu\n", ((off64_t)nr_sec * 512), off); - if (lseek64(fd, off, SEEK_SET) == -1) { - printf("Cannot seek to real block device footer\n"); - close(fd); - return -1; - } - - if ( (cnt = read(fd, buffer, sizeof(buffer))) != sizeof(buffer)) { - printf("Cannot read real block device footer\n"); - close(fd); - return -1; - } - close(fd); - if ( (fdout = open("/footerdump", O_WRONLY | O_CREAT, 0644)) < 0) { - printf("Cannot open output file /footerdump\n"); - return -1; - } - if (write(fdout, buffer, sizeof(buffer)) != sizeof(buffer)) { - printf("Failed to write footer.\n"); - } - close(fdout); - } - - return 0; -} -- cgit v1.2.3