From 52cbbdaf38000b8abb97e8fea2ab76906b223adb Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Fri, 23 Nov 2012 13:01:43 +0100 Subject: [PATCH] TCRYPT: move all header handling into library. Add warning about unsupported modes. --- lib/setup.c | 18 ++++++++---------- lib/tcrypt/tcrypt.c | 26 ++++++++++++++++++++++++++ lib/tcrypt/tcrypt.h | 3 +++ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/lib/setup.c b/lib/setup.c index e24da5e..dec7fcd 100644 --- a/lib/setup.c +++ b/lib/setup.c @@ -46,6 +46,10 @@ struct crypt_device { int password_verify; int rng_type; + // FIXME: switch to union + // FIXME: privatre binary headers and access it properly + // through sub-library (LUKS1, TCRYPT) + /* used in CRYPT_LUKS1 */ struct luks_phdr hdr; uint64_t PBKDF2_per_sec; @@ -2426,11 +2430,8 @@ uint64_t crypt_get_data_offset(struct crypt_device *cd) if (isLOOPAES(cd->type)) return cd->loopaes_hdr.offset; - if (isTCRYPT(cd->type)) { // FIXME: system vol. - if (!cd->tcrypt_hdr.d.mk_offset) - return 1; - return (cd->tcrypt_hdr.d.mk_offset / cd->tcrypt_hdr.d.sector_size); - } + if (isTCRYPT(cd->type)) + return TCRYPT_get_data_offset(&cd->tcrypt_hdr); return 0; } @@ -2446,11 +2447,8 @@ uint64_t crypt_get_iv_offset(struct crypt_device *cd) if (isLOOPAES(cd->type)) return cd->loopaes_hdr.skip; - if (isTCRYPT(cd->type)) { - if (!cd->tcrypt_hdr.d.mk_offset) - return 0; - return (cd->tcrypt_hdr.d.mk_offset / cd->tcrypt_hdr.d.sector_size); - } + if (isTCRYPT(cd->type)) + return TCRYPT_get_iv_offset(&cd->tcrypt_hdr); return 0; } diff --git a/lib/tcrypt/tcrypt.c b/lib/tcrypt/tcrypt.c index 23052e8..7d8c6b7 100644 --- a/lib/tcrypt/tcrypt.c +++ b/lib/tcrypt/tcrypt.c @@ -519,6 +519,17 @@ int TCRYPT_activate(struct crypt_device *cd, } }; + if (!hdr->d.version) { + log_dbg("TCRYPT: this function is not supported without encrypted header load."); + return -ENOTSUP; + } + + if (hdr->d.sector_size && hdr->d.sector_size != SECTOR_SIZE) { + log_err(cd, _("Activation is not supported for %d sector size.\n"), + hdr->d.sector_size); + return -ENOTSUP; + } + if (strstr(params->mode, "-tcrypt")) { log_err(cd, _("Kernel doesn't support activation for this TCRYPT legacy mode.\n")); return -ENOTSUP; @@ -698,3 +709,18 @@ int TCRYPT_init_by_name(struct crypt_device *cd, const char *name, tcrypt_params->cipher = strdup(cipher); return 0; } + +uint64_t TCRYPT_get_data_offset(struct tcrypt_phdr *hdr) +{ + // FIXME: system vol. + if (!hdr->d.mk_offset) + return 1; + return (hdr->d.mk_offset / hdr->d.sector_size); +} + +uint64_t TCRYPT_get_iv_offset(struct tcrypt_phdr *hdr) +{ + if (!hdr->d.mk_offset) + return 0; + return (hdr->d.mk_offset / hdr->d.sector_size); +} diff --git a/lib/tcrypt/tcrypt.h b/lib/tcrypt/tcrypt.h index 0987bb4..40e3c2e 100644 --- a/lib/tcrypt/tcrypt.h +++ b/lib/tcrypt/tcrypt.h @@ -84,4 +84,7 @@ int TCRYPT_activate(struct crypt_device *cd, int TCRYPT_deactivate(struct crypt_device *cd, const char *name); +uint64_t TCRYPT_get_data_offset(struct tcrypt_phdr *hdr); +uint64_t TCRYPT_get_iv_offset(struct tcrypt_phdr *hdr); + #endif -- 2.7.4