/* * test_persist_encryption.c -- bug-1877: persist_init() warned "WAL/snapshot * stored unencrypted" on every start without looking, so the warning also * fired on encrypted storage. persist_dev_is_dmcrypt() now checks the WAL's * block device in sysfs for a dm-crypt (LUKS) layer, directly or under LVM * (via `slaves`); the warning stays for storage it cannot show is encrypted. */ #include #include #include #include #include #include #include #include "persist.h" static char g_sysfs[256]; static void mkdirs(const char* rel) { char path[512]; char cmd[640]; snprintf(path, sizeof(path), "%s/%s", g_sysfs, rel); snprintf(cmd, sizeof(cmd), "mkdir -p '%s'", path); TEST_ASSERT_EQUAL_INT(0, system(cmd)); } static void put(const char* rel, const char* text) { char path[512]; FILE* fp; snprintf(path, sizeof(path), "%s/%s", g_sysfs, rel); fp = fopen(path, "w"); TEST_ASSERT_NOT_NULL(fp); fputs(text, fp); fclose(fp); } static void fake_sysfs(void) { char cmd[300]; snprintf(g_sysfs, sizeof(g_sysfs), "/tmp/test_persist_enc.%d", (int)getpid()); snprintf(cmd, sizeof(cmd), "rm -rf %s", g_sysfs); TEST_ASSERT_EQUAL_INT(0, system(cmd)); /* 259:2 nvme0n1p2, a plain partition */ mkdirs("dev/block/259:2"); mkdirs("class/block/nvme0n1p2"); put("class/block/nvme0n1p2/dev", "259:2\n"); /* 253:0 dm-0 = LUKS on nvme0n1p2 */ mkdirs("dev/block/253:0/dm"); mkdirs("dev/block/253:0/slaves/nvme0n1p2"); put("dev/block/253:0/dm/uuid", "CRYPT-LUKS2-0123abcd-luks-0123\n"); mkdirs("class/block/dm-0"); put("class/block/dm-0/dev", "253:0\n"); /* 253:1 dm-1 = LVM volume on dm-0 */ mkdirs("dev/block/253:1/dm"); mkdirs("dev/block/253:1/slaves/dm-0"); put("dev/block/253:1/dm/uuid", "LVM-abcdefabcdef\n"); /* 253:2 dm-2 = LVM volume straight on the plain partition */ mkdirs("dev/block/253:2/dm"); mkdirs("dev/block/253:2/slaves/nvme0n1p2"); put("dev/block/253:2/dm/uuid", "LVM-fedcbafedcba\n"); } static void drop_sysfs(void) { char cmd[300]; snprintf(cmd, sizeof(cmd), "rm -rf %s", g_sysfs); TEST_ASSERT_EQUAL_INT(0, system(cmd)); } static void test_luks_device_is_encrypted(void) { fake_sysfs(); TEST_ASSERT_EQUAL_INT(1, persist_dev_is_dmcrypt(g_sysfs, 253, 0)); drop_sysfs(); } static void test_lvm_on_luks_is_encrypted(void) { fake_sysfs(); TEST_ASSERT_EQUAL_INT(1, persist_dev_is_dmcrypt(g_sysfs, 253, 1)); drop_sysfs(); } static void test_plain_partition_and_plain_lvm_are_not(void) { fake_sysfs(); TEST_ASSERT_EQUAL_INT(0, persist_dev_is_dmcrypt(g_sysfs, 259, 2)); TEST_ASSERT_EQUAL_INT(0, persist_dev_is_dmcrypt(g_sysfs, 253, 2)); drop_sysfs(); } static void test_unknown_device_is_not_claimed_encrypted(void) { fake_sysfs(); TEST_ASSERT_EQUAL_INT(0, persist_dev_is_dmcrypt(g_sysfs, 8, 99)); drop_sysfs(); } void test_persist_encryption(void) { UnitySetTestFile(__FILE__); RUN_TEST(test_luks_device_is_encrypted); RUN_TEST(test_lvm_on_luks_is_encrypted); RUN_TEST(test_plain_partition_and_plain_lvm_are_not); RUN_TEST(test_unknown_device_is_not_claimed_encrypted); }