diff options
author | Ethan Yonker <dees_troy@teamw.in> | 2014-11-25 22:00:52 +0100 |
---|---|---|
committer | Dees Troy <dees_troy@teamw.in> | 2014-12-04 17:30:16 +0100 |
commit | 253368a0726120efa57664cdd1d088af099a3d81 (patch) | |
tree | 56cf3b08cdf70d016a2411fba977f7cd143bc265 /crypto/crypttools | |
parent | bootable recovery: we upgraded to 5.0.1 (diff) | |
download | android_bootable_recovery-253368a0726120efa57664cdd1d088af099a3d81.tar android_bootable_recovery-253368a0726120efa57664cdd1d088af099a3d81.tar.gz android_bootable_recovery-253368a0726120efa57664cdd1d088af099a3d81.tar.bz2 android_bootable_recovery-253368a0726120efa57664cdd1d088af099a3d81.tar.lz android_bootable_recovery-253368a0726120efa57664cdd1d088af099a3d81.tar.xz android_bootable_recovery-253368a0726120efa57664cdd1d088af099a3d81.tar.zst android_bootable_recovery-253368a0726120efa57664cdd1d088af099a3d81.zip |
Diffstat (limited to 'crypto/crypttools')
-rw-r--r-- | crypto/crypttools/Android.mk | 15 | ||||
-rw-r--r-- | crypto/crypttools/getfooter.c | 219 |
2 files changed, 0 insertions, 234 deletions
diff --git a/crypto/crypttools/Android.mk b/crypto/crypttools/Android.mk deleted file mode 100644 index fc62583c4..000000000 --- a/crypto/crypttools/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) -ifeq ($(TW_INCLUDE_JB_CRYPTO), true) -LOCAL_SRC_FILES:= \ - getfooter.c -LOCAL_CFLAGS:= -g -c -W -LOCAL_MODULE:=getfooter -LOCAL_MODULE_TAGS:= eng -LOCAL_STATIC_LIBRARIES += libfs_mgrtwrp libc libcutils -LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES -LOCAL_MODULE_PATH := $(PRODUCT_OUT)/utilities -LOCAL_FORCE_STATIC_EXECUTABLE := true -LOCAL_C_INCLUDES := $(commands_recovery_local_path)/crypto/jb/ -include $(BUILD_EXECUTABLE) -endif
\ No newline at end of file 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 <sys/types.h> -#include <unistd.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <sys/ioctl.h> -#include <linux/dm-ioctl.h> -#include <sys/mount.h> -#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; -} |