mirror of
https://git.code.sf.net/p/linux-ima/ima-evm-utils
synced 2025-04-28 06:33:36 +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 hash[MAX_DIGEST_SIZE];
|
||||||
unsigned char sig[MAX_SIGNATURE_SIZE];
|
unsigned char sig[MAX_SIGNATURE_SIZE];
|
||||||
|
int sig_hash_algo;
|
||||||
int mdlen;
|
int mdlen;
|
||||||
int len;
|
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));
|
len = lgetxattr(file, xattr_evm, sig, sizeof(sig));
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
log_err("getxattr failed: %s\n", file);
|
log_err("getxattr failed: %s\n", file);
|
||||||
@ -829,6 +825,18 @@ static int verify_evm(const char *file)
|
|||||||
return -1;
|
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);
|
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 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);
|
int ima_verify_signature(const char *file, unsigned char *sig, int siglen, unsigned char *digest, int digestlen);
|
||||||
void init_public_keys(const char *keyfiles);
|
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
|
#endif
|
||||||
|
@ -105,7 +105,7 @@ void imaevm_hexdump(const void *ptr, int len)
|
|||||||
imaevm_do_hexdump(stdout, ptr, len, true);
|
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)
|
if (algo < PKEY_HASH__LAST)
|
||||||
return pkey_hash_algo[algo];
|
return pkey_hash_algo[algo];
|
||||||
@ -113,7 +113,7 @@ static const char *get_hash_algo_by_id(int algo)
|
|||||||
return hash_algo_name[algo];
|
return hash_algo_name[algo];
|
||||||
|
|
||||||
log_err("digest %d not found\n", algo);
|
log_err("digest %d not found\n", algo);
|
||||||
return "unknown";
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output all remaining openssl error messages. */
|
/* Output all remaining openssl error messages. */
|
||||||
@ -575,7 +575,7 @@ int imaevm_get_hash_algo(const char *algo)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_hash_algo_from_sig(unsigned char *sig)
|
int imaevm_hash_algo_from_sig(unsigned char *sig)
|
||||||
{
|
{
|
||||||
uint8_t hashalgo;
|
uint8_t hashalgo;
|
||||||
|
|
||||||
@ -632,13 +632,13 @@ int ima_verify_signature(const char *file, unsigned char *sig, int siglen,
|
|||||||
return -1;
|
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) {
|
if (sig_hash_algo < 0) {
|
||||||
log_err("Invalid signature\n");
|
log_err("Invalid signature\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* Use hash algorithm as retrieved from signature */
|
/* 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
|
* Validate the signature based on the digest included in the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user