Add Samsung TouchWiz decryption

Change-Id: I418680e59372160dabfe3e2d5f0208229aa151ae
diff --git a/crypto/cryptfs/Android.mk b/crypto/cryptfs/Android.mk
new file mode 100644
index 0000000..3267c93
--- /dev/null
+++ b/crypto/cryptfs/Android.mk
@@ -0,0 +1,53 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+	cryptfs.c
+
+LOCAL_CFLAGS:= -g -c -W -I../fs_mgr/include
+LOCAL_CFLAGS += -DTW_INCLUDE_CRYPTO
+LOCAL_CFLAGS += -DCRYPTO_FS_TYPE=\"$(TW_CRYPTO_FS_TYPE)\"
+LOCAL_CFLAGS += -DCRYPTO_REAL_BLKDEV=\"$(TW_CRYPTO_REAL_BLKDEV)\"
+LOCAL_CFLAGS += -DCRYPTO_MNT_POINT=\"$(TW_CRYPTO_MNT_POINT)\"
+LOCAL_CFLAGS += -DCRYPTO_FS_OPTIONS=\"$(TW_CRYPTO_FS_OPTIONS)\"
+LOCAL_CFLAGS += -DCRYPTO_FS_FLAGS=\"$(TW_CRYPTO_FS_FLAGS)\"
+LOCAL_CFLAGS += -DCRYPTO_KEY_LOC=\"$(TW_CRYPTO_KEY_LOC)\"
+ifdef TW_CRYPTO_SD_REAL_BLKDEV
+    LOCAL_CFLAGS += -DCRYPTO_SD_REAL_BLKDEV=\"$(TW_CRYPTO_SD_REAL_BLKDEV)\"
+    LOCAL_CFLAGS += -DCRYPTO_SD_FS_TYPE=\"$(TW_CRYPTO_SD_FS_TYPE)\"
+endif
+ifneq ($(TW_INTERNAL_STORAGE_PATH),)
+	LOCAL_CFLAGS += -DTW_INTERNAL_STORAGE_PATH=$(TW_INTERNAL_STORAGE_PATH)
+endif
+ifneq ($(TW_INTERNAL_STORAGE_MOUNT_POINT),)
+	LOCAL_CFLAGS += -DTW_INTERNAL_STORAGE_MOUNT_POINT=$(TW_INTERNAL_STORAGE_MOUNT_POINT)
+endif
+ifneq ($(TW_EXTERNAL_STORAGE_PATH),)
+	LOCAL_CFLAGS += -DTW_EXTERNAL_STORAGE_PATH=$(TW_EXTERNAL_STORAGE_PATH)
+endif
+ifneq ($(TW_EXTERNAL_STORAGE_MOUNT_POINT),)
+	LOCAL_CFLAGS += -DTW_EXTERNAL_STORAGE_MOUNT_POINT=$(TW_EXTERNAL_STORAGE_MOUNT_POINT)
+endif
+
+LOCAL_C_INCLUDES += system/extras/ext4_utils external/openssl/include
+LOCAL_MODULE:=cryptfs
+LOCAL_MODULE_TAGS:= eng
+LOCAL_SHARED_LIBRARIES += libc libcutils
+LOCAL_SHARED_LIBRARIES += libcrypto
+
+
+#LOCAL_LDFLAGS += -L$(TARGET_OUT_SHARED_LIBRARIES) -lsec_km -lsec_ecryptfs -ldl
+LOCAL_LDFLAGS += -ldl
+
+LOCAL_STATIC_LIBRARIES += libmtdutils
+LOCAL_STATIC_LIBRARIES += libminadbd libminzip libunz
+LOCAL_STATIC_LIBRARIES += libminuitwrp libpixelflinger_static libpng libjpegtwrp libgui
+LOCAL_SHARED_LIBRARIES += libz libc libstlport libcutils libstdc++ libmincrypt libext4_utils
+LOCAL_STATIC_LIBRARIES += libcrypt_samsung
+
+
+LOCAL_STATIC_LIBRARIES += $(TARGET_RECOVERY_UI_LIB)
+#LOCAL_STATIC_LIBRARIES += libfs_mgrtwrp
+LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/utilities
+include $(BUILD_EXECUTABLE)
diff --git a/crypto/cryptfs/cryptfs.c b/crypto/cryptfs/cryptfs.c
new file mode 100644
index 0000000..59e7add
--- /dev/null
+++ b/crypto/cryptfs/cryptfs.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2013 a3955269 all rights reversed, no rights reserved.
+ */
+
+#define TW_INCLUDE_CRYPTO_SAMSUNG
+#include "../ics/cryptfs.c"
+
+int dm_remove_device(const char *name)
+{
+    int r;
+    r = delete_crypto_blk_dev(name);
+    if(!r)
+        printf("crypto block device '%s' deleted.\n", name);
+    else
+        printf("deleting crypto block device '%s' failed. [%d - %s]\n", name, r, strerror(errno));
+    return r;
+}
+
+int ecryptfs_test(const char *pw)
+{
+   char pwbuf[256];
+   int r;
+
+   strcpy(pwbuf, pw);
+   // 0: building options without file encryption filtering.
+   // 1: building options with media files filtering.
+   // 2: building options with all new files filtering.
+   r = mount_ecryptfs_drive(pwbuf, "/emmc", "/emmc", 0);
+   printf("mount_ecryptfs_drive: %d\n", r);
+   r = mount("/dev/block/mmcblk1", "/emmc", "vfat", MS_RDONLY, "");
+   printf("mount: %d\n", r);
+
+   r = umount("/emmc");///dev/block/mmcblk1");
+   printf("umount: %d\n", r);
+
+   //r = unmount_ecryptfs_drive("/emmc");
+   //printf("unmount_ecryptfs_drive: %d\n", r);
+
+   return r;
+}
+
+int main(int argc, char* argv[])
+{
+    if(argc < 2)
+    {
+        printf("no args!\n");
+        return 1;
+    }
+
+    property_set("ro.crypto.state", "encrypted");
+
+    property_set("ro.crypto.fs_type", CRYPTO_FS_TYPE);
+    property_set("ro.crypto.fs_real_blkdev", CRYPTO_REAL_BLKDEV);
+    property_set("ro.crypto.fs_mnt_point", CRYPTO_MNT_POINT);
+    property_set("ro.crypto.fs_options", CRYPTO_FS_OPTIONS);
+    property_set("ro.crypto.fs_flags", CRYPTO_FS_FLAGS);
+    property_set("ro.crypto.keyfile.userdata", CRYPTO_KEY_LOC);
+
+#ifdef CRYPTO_SD_FS_TYPE
+    property_set("ro.crypto.sd_fs_type", CRYPTO_SD_FS_TYPE);
+    property_set("ro.crypto.sd_fs_real_blkdev", CRYPTO_SD_REAL_BLKDEV);
+    property_set("ro.crypto.sd_fs_mnt_point", EXPAND(TW_INTERNAL_STORAGE_PATH));
+#endif
+
+    property_set("rw.km_fips_status", "ready");
+
+    delete_crypto_blk_dev("userdata");
+    delete_crypto_blk_dev("sdcard");
+    delete_crypto_blk_dev("emmc");
+
+    cryptfs_check_passwd(argv[1]);
+
+    return 0;
+};