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:
committed by
Zbigniew Jędrzejewski-Szmek
parent
77549ac1c4
commit
5d0488ab0f
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user