mirror of
https://git.code.sf.net/p/linux-ima/ima-evm-utils
synced 2025-04-27 22:32:31 +02:00
ima-evm-utils: Allow EVM verify to determine hash algo
Previously for EVM verify you should specify `--hashalgo' option while for IMA ima_verify you didn't. Allow EVM verify to determine hash algo from signature. Also, this makes two previously static functions to become exportable and renamed: get_hash_algo_from_sig -> imaevm_hash_algo_from_sig get_hash_algo_by_id -> imaevm_hash_algo_by_id This is needed because EVM hash is calculated (in calc_evm_hash) outside of library. imaevm_hash_algo_by_id() will now return NULL if algo is not found. Signed-off-by: Vitaly Chikunov <vt@altlinux.org> Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
This commit is contained in:
parent
90176e835a
commit
cf1b8fda8d
18
src/evmctl.c
18
src/evmctl.c
@ -810,14 +810,10 @@ static int verify_evm(const char *file)
|
||||
{
|
||||
unsigned char hash[MAX_DIGEST_SIZE];
|
||||
unsigned char sig[MAX_SIGNATURE_SIZE];
|
||||
int sig_hash_algo;
|
||||
int mdlen;
|
||||
int len;
|
||||
|
||||
mdlen = calc_evm_hash(file, hash);
|
||||
if (mdlen <= 1)
|
||||
return mdlen;
|
||||
assert(mdlen <= sizeof(hash));
|
||||
|
||||
len = lgetxattr(file, xattr_evm, sig, sizeof(sig));
|
||||
if (len < 0) {
|
||||
log_err("getxattr failed: %s\n", file);
|
||||
@ -829,6 +825,18 @@ static int verify_evm(const char *file)
|
||||
return -1;
|
||||
}
|
||||
|
||||
sig_hash_algo = imaevm_hash_algo_from_sig(sig + 1);
|
||||
if (sig_hash_algo < 0) {
|
||||
log_err("unknown hash algo: %s\n", file);
|
||||
return -1;
|
||||
}
|
||||
imaevm_params.hash_algo = imaevm_hash_algo_by_id(sig_hash_algo);
|
||||
|
||||
mdlen = calc_evm_hash(file, hash);
|
||||
if (mdlen <= 1)
|
||||
return mdlen;
|
||||
assert(mdlen <= sizeof(hash));
|
||||
|
||||
return verify_hash(file, hash, mdlen, sig + 1, len - 1);
|
||||
}
|
||||
|
||||
|
@ -223,5 +223,7 @@ int sign_hash(const char *algo, const unsigned char *hash, int size, const char
|
||||
int verify_hash(const char *file, const unsigned char *hash, int size, unsigned char *sig, int siglen);
|
||||
int ima_verify_signature(const char *file, unsigned char *sig, int siglen, unsigned char *digest, int digestlen);
|
||||
void init_public_keys(const char *keyfiles);
|
||||
int imaevm_hash_algo_from_sig(unsigned char *sig);
|
||||
const char *imaevm_hash_algo_by_id(int algo);
|
||||
|
||||
#endif
|
||||
|
@ -105,7 +105,7 @@ void imaevm_hexdump(const void *ptr, int len)
|
||||
imaevm_do_hexdump(stdout, ptr, len, true);
|
||||
}
|
||||
|
||||
static const char *get_hash_algo_by_id(int algo)
|
||||
const char *imaevm_hash_algo_by_id(int algo)
|
||||
{
|
||||
if (algo < PKEY_HASH__LAST)
|
||||
return pkey_hash_algo[algo];
|
||||
@ -113,7 +113,7 @@ static const char *get_hash_algo_by_id(int algo)
|
||||
return hash_algo_name[algo];
|
||||
|
||||
log_err("digest %d not found\n", algo);
|
||||
return "unknown";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Output all remaining openssl error messages. */
|
||||
@ -575,7 +575,7 @@ int imaevm_get_hash_algo(const char *algo)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int get_hash_algo_from_sig(unsigned char *sig)
|
||||
int imaevm_hash_algo_from_sig(unsigned char *sig)
|
||||
{
|
||||
uint8_t hashalgo;
|
||||
|
||||
@ -632,13 +632,13 @@ int ima_verify_signature(const char *file, unsigned char *sig, int siglen,
|
||||
return -1;
|
||||
}
|
||||
|
||||
sig_hash_algo = get_hash_algo_from_sig(sig + 1);
|
||||
sig_hash_algo = imaevm_hash_algo_from_sig(sig + 1);
|
||||
if (sig_hash_algo < 0) {
|
||||
log_err("Invalid signature\n");
|
||||
return -1;
|
||||
}
|
||||
/* Use hash algorithm as retrieved from signature */
|
||||
imaevm_params.hash_algo = get_hash_algo_by_id(sig_hash_algo);
|
||||
imaevm_params.hash_algo = imaevm_hash_algo_by_id(sig_hash_algo);
|
||||
|
||||
/*
|
||||
* Validate the signature based on the digest included in the
|
||||
|
Loading…
x
Reference in New Issue
Block a user