The mandatory dependency on libiconv introduced by it makes it feasible
to support optional compilation.
Signed-off-by: Phil Sutter <phil@xxxxxx>
---
configure.ac | 12 ++++++++++++
lib/Makemodule.am | 6 +++++-
lib/bitlk/bitlk.h | 39 +++++++++++++++++++++++++++++++++++++++
lib/setup.c | 6 ++++++
src/cryptsetup.c | 14 ++++++++++++--
5 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac
index 0805bd20d88b8..8e677be810768 100644
--- a/configure.ac
+++ b/configure.ac
@@ -140,6 +140,18 @@ if test "x$enable_ssh_token" = "xyes" -a "x$enable_external_tokens" = "xno"; the
AC_MSG_ERROR([Requested LUKS2 ssh-token build, but external tokens are disabled.])
fi
+dnl ==========================================================================
+dnl BitLocker support
+
+AC_ARG_ENABLE([bitlk],
+ AS_HELP_STRING([--disable-bitlk], [disable BitLocker support]),
+ [], [enable_bitlk=yes])
+AM_CONDITIONAL(BITLK, test "x$enable_bitlk" = "xyes")
+
+if test "x$enable_bitlk" = "xyes"; then
+ AC_DEFINE(ENABLE_BITLK, 1, [Build BitLocker support])
+fi
+
dnl ==========================================================================
AM_GNU_GETTEXT([external],[need-ngettext])
diff --git a/lib/Makemodule.am b/lib/Makemodule.am
index 5b12eae84b594..ed25cce3fd2fd 100644
--- a/lib/Makemodule.am
+++ b/lib/Makemodule.am
@@ -107,5 +107,9 @@ libcryptsetup_la_SOURCES = \
lib/luks2/luks2.h \
lib/utils_blkid.c \
lib/utils_blkid.h \
- lib/bitlk/bitlk.h \
+ lib/bitlk/bitlk.h
+
+if BITLK
+libcryptsetup_la_SOURCES += \
lib/bitlk/bitlk.c
+endif
diff --git a/lib/bitlk/bitlk.h b/lib/bitlk/bitlk.h
index 57ba92e3833bf..518f97fe1a2b4 100644
--- a/lib/bitlk/bitlk.h
+++ b/lib/bitlk/bitlk.h
@@ -114,6 +114,8 @@ struct bitlk_metadata {
struct bitlk_fvek *fvek;
};
+#ifdef ENABLE_BITLK
+
int BITLK_read_sb(struct crypt_device *cd, struct bitlk_metadata *params);
int BITLK_dump(struct crypt_device *cd, struct device *device, struct bitlk_metadata *params);
@@ -142,4 +144,41 @@ void BITLK_bitlk_fvek_free(struct bitlk_fvek *fvek);
void BITLK_bitlk_vmk_free(struct bitlk_vmk *vmk);
void BITLK_bitlk_metadata_free(struct bitlk_metadata *params);
+#else
+
+static inline int
+BITLK_read_sb(struct crypt_device *cd, struct bitlk_metadata *params) { return -ENOTSUP; }
+
+static inline int
+BITLK_dump(struct crypt_device *cd, struct device *device, struct bitlk_metadata *params) { return -ENOTSUP; }
+
+static inline int
+BITLK_get_volume_key(struct crypt_device *cd,
+ const char *password,
+ size_t passwordLen,
+ const struct bitlk_metadata *params,
+ struct volume_key **open_fvek_key) { return -ENOTSUP; }
+
+static inline int
+BITLK_activate_by_passphrase(struct crypt_device *cd,
+ const char *name,
+ const char *password,
+ size_t passwordLen,
+ const struct bitlk_metadata *params,
+ uint32_t flags) { return -ENOTSUP; }
+
+static inline int
+BITLK_activate_by_volume_key(struct crypt_device *cd,
+ const char *name,
+ const char *volume_key,
+ size_t volume_key_size,
+ const struct bitlk_metadata *params,
+ uint32_t flags) { return -ENOTSUP; }
+
+static inline void BITLK_bitlk_fvek_free(struct bitlk_fvek *fvek) {}
+static inline void BITLK_bitlk_vmk_free(struct bitlk_vmk *vmk) {}
+static inline void BITLK_bitlk_metadata_free(struct bitlk_metadata *params) {}
+
+#endif
+
#endif
diff --git a/lib/setup.c b/lib/setup.c
index a5dfd843743a0..997cecf158026 100644
--- a/lib/setup.c
+++ b/lib/setup.c
@@ -320,7 +320,11 @@ static int isINTEGRITY(const char *type)
static int isBITLK(const char *type)
{
+#ifdef ENABLE_BITLK
return (type && !strcmp(CRYPT_BITLK, type));
+#else
+ return 0;
+#endif
}
static int _onlyLUKS(struct crypt_device *cd, uint32_t cdflags)
@@ -1470,8 +1474,10 @@ int crypt_init_by_name_and_header(struct crypt_device **cd,
(*cd)->type = strdup(CRYPT_TCRYPT);
else if (!strncmp(CRYPT_INTEGRITY, dmd.uuid, sizeof(CRYPT_INTEGRITY)-1))
(*cd)->type = strdup(CRYPT_INTEGRITY);
+#ifdef ENABLE_BITLK
else if (!strncmp(CRYPT_BITLK, dmd.uuid, sizeof(CRYPT_BITLK)-1))
(*cd)->type = strdup(CRYPT_BITLK);
+#endif
else
log_dbg(NULL, "Unknown UUID set, some parameters are not set.");
} else
diff --git a/src/cryptsetup.c b/src/cryptsetup.c
index e785dc3be2fd1..d4d2ddaf665ac 100644
--- a/src/cryptsetup.c
+++ b/src/cryptsetup.c
@@ -517,6 +517,7 @@ out:
return r;
}
+#ifdef ENABLE_BITLK
static int action_open_bitlk(void)
{
struct crypt_device *cd = NULL;
@@ -576,6 +577,7 @@ out:
crypt_free(cd);
return r;
}
+#endif
static int tcryptDump_with_volume_key(struct crypt_device *cd)
{
@@ -649,6 +651,7 @@ out:
return r;
}
+#ifdef ENABLE_BITLK
static int bitlkDump_with_volume_key(struct crypt_device *cd)
{
char *vk = NULL, *password = NULL;
@@ -733,6 +736,7 @@ out:
crypt_free(cd);
return r;
}
+#endif
static int action_close(void)
{
@@ -2443,10 +2447,12 @@ static int action_open(void)
if (action_argc < 2 && !ARG_SET(OPT_TEST_PASSPHRASE_ID))
goto out;
return action_open_tcrypt();
+#ifdef ENABLE_BITLK
} else if (!strcmp(device_type, "bitlk")) {
if (action_argc < 2 && !ARG_SET(OPT_TEST_PASSPHRASE_ID))
goto out;
return action_open_bitlk();
+#endif
} else
r = -ENOENT;
out:
@@ -3515,7 +3521,9 @@ static struct action_type {
{ ISLUKS_ACTION, action_isLuks, 1, 0, N_("<device>"), N_("tests <device> for LUKS partition header") },
{ LUKSDUMP_ACTION, action_luksDump, 1, 1, N_("<device>"), N_("dump LUKS partition information") },
{ TCRYPTDUMP_ACTION, action_tcryptDump, 1, 1, N_("<device>"), N_("dump TCRYPT device information") },
+#ifdef ENABLE_BITLK
{ BITLKDUMP_ACTION, action_bitlkDump, 1, 1, N_("<device>"), N_("dump BITLK device information") },
+#endif
{ SUSPEND_ACTION, action_luksSuspend, 1, 1, N_("<device>"), N_("Suspend LUKS device and wipe key (all IOs are frozen)") },
{ RESUME_ACTION, action_luksResume, 1, 1, N_("<device>"), N_("Resume suspended LUKS device") },
{ HEADERBACKUP_ACTION, action_luksBackup, 1, 1, N_("<device>"), N_("Backup LUKS device header and keyslots") },
@@ -3812,13 +3820,15 @@ int main(int argc, const char **argv)
} else if (!strcmp(aname, "tcryptOpen")) {
aname = OPEN_ACTION;
device_type = "tcrypt";
+ } else if (!strcmp(aname, "tcryptDump")) {
+ device_type = "tcrypt";
+#ifdef ENABLE_BITLK
} else if (!strcmp(aname, "bitlkOpen")) {
aname = OPEN_ACTION;
device_type = "bitlk";
- } else if (!strcmp(aname, "tcryptDump")) {
- device_type = "tcrypt";
} else if (!strcmp(aname, "bitlkDump")) {
device_type = "bitlk";
+#endif
} else if (!strcmp(aname, "remove") ||
!strcmp(aname, "plainClose") ||
!strcmp(aname, "luksClose") ||