integritysetup: regularize conversion of integrity alg.

The number of integrity algorithms we handle whose names differ between
integritysetup and dm-integrity continually increases, so let's drop the
ad hoc conversion and use string tables.
This commit is contained in:
David Tardon
2026-03-20 17:12:29 +01:00
committed by Zbigniew Jędrzejewski-Szmek
parent 77549ac1c4
commit 5d0488ab0f
3 changed files with 59 additions and 37 deletions
+22 -15
View File
@@ -6,15 +6,24 @@
#include "integrity-util.h"
#include "log.h"
#include "percent-util.h"
#include "string-table.h"
#include "string-util.h"
#include "strv.h"
#include "time-util.h"
static int supported_integrity_algorithm(char *user_supplied) {
if (!STR_IN_SET(user_supplied, "crc32", "crc32c", "xxhash64", "sha1", "sha256", "hmac-sha256", "hmac-sha512", "phmac-sha256", "phmac-sha512"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unsupported integrity algorithm (%s)", user_supplied);
return 0;
}
/* Integrity algorithm names used by integritysetup/integritytab */
static const char* const integrity_algorithm_table[_INTEGRITY_ALGORITHM_MAX] = {
[INTEGRITY_ALGORITHM_CRC32] = "crc32",
[INTEGRITY_ALGORITHM_CRC32C] = "crc32c",
[INTEGRITY_ALGORITHM_XXHASH64] = "xxhash64",
[INTEGRITY_ALGORITHM_SHA1] = "sha1",
[INTEGRITY_ALGORITHM_SHA256] = "sha256",
[INTEGRITY_ALGORITHM_HMAC_SHA256] = "hmac-sha256",
[INTEGRITY_ALGORITHM_HMAC_SHA512] = "hmac-sha512",
[INTEGRITY_ALGORITHM_PHMAC_SHA256] = "phmac-sha256",
[INTEGRITY_ALGORITHM_PHMAC_SHA512] = "phmac-sha512",
};
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(integrity_algorithm, IntegrityAlgorithm);
int parse_integrity_options(
const char *options,
@@ -22,7 +31,7 @@ int parse_integrity_options(
int *ret_percent,
usec_t *ret_commit_time,
char **ret_data_device,
char **ret_integrity_alg) {
IntegrityAlgorithm *ret_integrity_alg) {
int r;
for (;;) {
@@ -73,14 +82,12 @@ int parse_integrity_options(
return log_oom();
}
} else if ((val = startswith(word, "integrity-algorithm="))) {
r = supported_integrity_algorithm(val);
if (r < 0)
return r;
if (ret_integrity_alg) {
r = free_and_strdup(ret_integrity_alg, val);
if (r < 0)
return log_oom();
}
IntegrityAlgorithm a = integrity_algorithm_from_string(val);
if (a < 0)
return log_error_errno(a, "Unsupported integrity algorithm (%s)", val);
if (ret_integrity_alg)
*ret_integrity_alg = a;
} else
log_warning("Encountered unknown option '%s', ignoring.", word);
}
+15 -5
View File
@@ -3,16 +3,26 @@
#include "shared-forward.h"
typedef enum {
INTEGRITY_ALGORITHM_CRC32,
INTEGRITY_ALGORITHM_CRC32C,
INTEGRITY_ALGORITHM_XXHASH64,
INTEGRITY_ALGORITHM_SHA1,
INTEGRITY_ALGORITHM_SHA256,
INTEGRITY_ALGORITHM_HMAC_SHA256,
INTEGRITY_ALGORITHM_HMAC_SHA512,
INTEGRITY_ALGORITHM_PHMAC_SHA256,
INTEGRITY_ALGORITHM_PHMAC_SHA512,
_INTEGRITY_ALGORITHM_MAX,
_INTEGRITY_ALGORITHM_INVALID = -EINVAL,
} IntegrityAlgorithm;
int parse_integrity_options(
const char *options,
uint32_t *ret_activate_flags,
int *ret_percent,
usec_t *ret_commit_time,
char **ret_data_device,
char **ret_integrity_alg);
IntegrityAlgorithm *ret_integrity_alg);
#define DM_HMAC_256 "hmac(sha256)"
#define DM_HMAC_512 "hmac(sha512)"
#define DM_PHMAC_256 "phmac(sha256)"
#define DM_PHMAC_512 "phmac(sha512)"
#define DM_MAX_KEY_SIZE 4096 /* Maximum size of key allowed for dm-integrity */
+22 -17
View File
@@ -12,6 +12,7 @@
#include "main-func.h"
#include "path-util.h"
#include "pretty-print.h"
#include "string-table.h"
#include "string-util.h"
#include "time-util.h"
#include "verbs.h"
@@ -20,10 +21,24 @@ static uint32_t arg_activate_flags;
static int arg_percent;
static usec_t arg_commit_time;
static char *arg_existing_data_device;
static char *arg_integrity_algorithm;
static IntegrityAlgorithm arg_integrity_algorithm = _INTEGRITY_ALGORITHM_INVALID;
STATIC_DESTRUCTOR_REGISTER(arg_existing_data_device, freep);
STATIC_DESTRUCTOR_REGISTER(arg_integrity_algorithm, freep);
/* Integrity algorithm names used by dm-integrity */
static const char* const dm_integrity_algorithm_table[_INTEGRITY_ALGORITHM_MAX] = {
[INTEGRITY_ALGORITHM_CRC32] = "crc32",
[INTEGRITY_ALGORITHM_CRC32C] = "crc32c",
[INTEGRITY_ALGORITHM_XXHASH64] = "xxhash64",
[INTEGRITY_ALGORITHM_SHA1] = "sha1",
[INTEGRITY_ALGORITHM_SHA256] = "sha256",
[INTEGRITY_ALGORITHM_HMAC_SHA256] = "hmac(sha256)",
[INTEGRITY_ALGORITHM_HMAC_SHA512] = "hmac(sha512)",
[INTEGRITY_ALGORITHM_PHMAC_SHA256] = "phmac(sha256)",
[INTEGRITY_ALGORITHM_PHMAC_SHA512] = "phmac(sha512)",
};
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(dm_integrity_algorithm, IntegrityAlgorithm);
static int help(void) {
_cleanup_free_ char *link = NULL;
@@ -72,21 +87,11 @@ static int load_key_file(
}
static const char *integrity_algorithm_select(const void *key_file_buf) {
/* To keep a bit of sanity for end users, the subset of integrity
* algorithms we support will match what is used in integritysetup */
if (arg_integrity_algorithm) {
if (streq(arg_integrity_algorithm, "hmac-sha256"))
return DM_HMAC_256;
if (streq(arg_integrity_algorithm, "hmac-sha512"))
return DM_HMAC_512;
if (streq(arg_integrity_algorithm, "phmac-sha256"))
return DM_PHMAC_256;
if (streq(arg_integrity_algorithm, "phmac-sha512"))
return DM_PHMAC_512;
return arg_integrity_algorithm;
} else if (key_file_buf)
return DM_HMAC_256;
return "crc32c";
IntegrityAlgorithm a = arg_integrity_algorithm >= 0
? arg_integrity_algorithm
: (key_file_buf ? INTEGRITY_ALGORITHM_HMAC_SHA256 : INTEGRITY_ALGORITHM_CRC32C);
return dm_integrity_algorithm_to_string(a);
}
static int verb_attach(int argc, char *argv[], uintptr_t _data, void *userdata) {