|
@@ -195,9 +195,7 @@ static int ima_eventdigest_init_common(u8 *digest, u32 digestsize, u8 hash_algo,
|
|
|
/*
|
|
|
* This function writes the digest of an event (with size limit).
|
|
|
*/
|
|
|
-int ima_eventdigest_init(struct integrity_iint_cache *iint, struct file *file,
|
|
|
- const unsigned char *filename,
|
|
|
- struct evm_ima_xattr_data *xattr_value, int xattr_len,
|
|
|
+int ima_eventdigest_init(struct ima_event_data *event_data,
|
|
|
struct ima_field_data *field_data)
|
|
|
{
|
|
|
struct {
|
|
@@ -211,25 +209,25 @@ int ima_eventdigest_init(struct integrity_iint_cache *iint, struct file *file,
|
|
|
|
|
|
memset(&hash, 0, sizeof(hash));
|
|
|
|
|
|
- if (!iint) /* recording a violation. */
|
|
|
+ if (!event_data->iint) /* recording a violation. */
|
|
|
goto out;
|
|
|
|
|
|
- if (ima_template_hash_algo_allowed(iint->ima_hash->algo)) {
|
|
|
- cur_digest = iint->ima_hash->digest;
|
|
|
- cur_digestsize = iint->ima_hash->length;
|
|
|
+ if (ima_template_hash_algo_allowed(event_data->iint->ima_hash->algo)) {
|
|
|
+ cur_digest = event_data->iint->ima_hash->digest;
|
|
|
+ cur_digestsize = event_data->iint->ima_hash->length;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (!file) /* missing info to re-calculate the digest */
|
|
|
+ if (!event_data->file) /* missing info to re-calculate the digest */
|
|
|
return -EINVAL;
|
|
|
|
|
|
- inode = file_inode(file);
|
|
|
+ inode = file_inode(event_data->file);
|
|
|
hash.hdr.algo = ima_template_hash_algo_allowed(ima_hash_algo) ?
|
|
|
ima_hash_algo : HASH_ALGO_SHA1;
|
|
|
- result = ima_calc_file_hash(file, &hash.hdr);
|
|
|
+ result = ima_calc_file_hash(event_data->file, &hash.hdr);
|
|
|
if (result) {
|
|
|
integrity_audit_msg(AUDIT_INTEGRITY_DATA, inode,
|
|
|
- filename, "collect_data",
|
|
|
+ event_data->filename, "collect_data",
|
|
|
"failed", result, 0);
|
|
|
return result;
|
|
|
}
|
|
@@ -243,48 +241,44 @@ out:
|
|
|
/*
|
|
|
* This function writes the digest of an event (without size limit).
|
|
|
*/
|
|
|
-int ima_eventdigest_ng_init(struct integrity_iint_cache *iint,
|
|
|
- struct file *file, const unsigned char *filename,
|
|
|
- struct evm_ima_xattr_data *xattr_value,
|
|
|
- int xattr_len, struct ima_field_data *field_data)
|
|
|
+int ima_eventdigest_ng_init(struct ima_event_data *event_data,
|
|
|
+ struct ima_field_data *field_data)
|
|
|
{
|
|
|
u8 *cur_digest = NULL, hash_algo = HASH_ALGO_SHA1;
|
|
|
u32 cur_digestsize = 0;
|
|
|
|
|
|
/* If iint is NULL, we are recording a violation. */
|
|
|
- if (!iint)
|
|
|
+ if (!event_data->iint)
|
|
|
goto out;
|
|
|
|
|
|
- cur_digest = iint->ima_hash->digest;
|
|
|
- cur_digestsize = iint->ima_hash->length;
|
|
|
+ cur_digest = event_data->iint->ima_hash->digest;
|
|
|
+ cur_digestsize = event_data->iint->ima_hash->length;
|
|
|
|
|
|
- hash_algo = iint->ima_hash->algo;
|
|
|
+ hash_algo = event_data->iint->ima_hash->algo;
|
|
|
out:
|
|
|
return ima_eventdigest_init_common(cur_digest, cur_digestsize,
|
|
|
hash_algo, field_data);
|
|
|
}
|
|
|
|
|
|
-static int ima_eventname_init_common(struct integrity_iint_cache *iint,
|
|
|
- struct file *file,
|
|
|
- const unsigned char *filename,
|
|
|
+static int ima_eventname_init_common(struct ima_event_data *event_data,
|
|
|
struct ima_field_data *field_data,
|
|
|
bool size_limit)
|
|
|
{
|
|
|
const char *cur_filename = NULL;
|
|
|
u32 cur_filename_len = 0;
|
|
|
|
|
|
- BUG_ON(filename == NULL && file == NULL);
|
|
|
+ BUG_ON(event_data->filename == NULL && event_data->file == NULL);
|
|
|
|
|
|
- if (filename) {
|
|
|
- cur_filename = filename;
|
|
|
- cur_filename_len = strlen(filename);
|
|
|
+ if (event_data->filename) {
|
|
|
+ cur_filename = event_data->filename;
|
|
|
+ cur_filename_len = strlen(event_data->filename);
|
|
|
|
|
|
if (!size_limit || cur_filename_len <= IMA_EVENT_NAME_LEN_MAX)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (file) {
|
|
|
- cur_filename = file->f_path.dentry->d_name.name;
|
|
|
+ if (event_data->file) {
|
|
|
+ cur_filename = event_data->file->f_path.dentry->d_name.name;
|
|
|
cur_filename_len = strlen(cur_filename);
|
|
|
} else
|
|
|
/*
|
|
@@ -300,36 +294,30 @@ out:
|
|
|
/*
|
|
|
* This function writes the name of an event (with size limit).
|
|
|
*/
|
|
|
-int ima_eventname_init(struct integrity_iint_cache *iint, struct file *file,
|
|
|
- const unsigned char *filename,
|
|
|
- struct evm_ima_xattr_data *xattr_value, int xattr_len,
|
|
|
+int ima_eventname_init(struct ima_event_data *event_data,
|
|
|
struct ima_field_data *field_data)
|
|
|
{
|
|
|
- return ima_eventname_init_common(iint, file, filename,
|
|
|
- field_data, true);
|
|
|
+ return ima_eventname_init_common(event_data, field_data, true);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* This function writes the name of an event (without size limit).
|
|
|
*/
|
|
|
-int ima_eventname_ng_init(struct integrity_iint_cache *iint, struct file *file,
|
|
|
- const unsigned char *filename,
|
|
|
- struct evm_ima_xattr_data *xattr_value, int xattr_len,
|
|
|
+int ima_eventname_ng_init(struct ima_event_data *event_data,
|
|
|
struct ima_field_data *field_data)
|
|
|
{
|
|
|
- return ima_eventname_init_common(iint, file, filename,
|
|
|
- field_data, false);
|
|
|
+ return ima_eventname_init_common(event_data, field_data, false);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* ima_eventsig_init - include the file signature as part of the template data
|
|
|
*/
|
|
|
-int ima_eventsig_init(struct integrity_iint_cache *iint, struct file *file,
|
|
|
- const unsigned char *filename,
|
|
|
- struct evm_ima_xattr_data *xattr_value, int xattr_len,
|
|
|
+int ima_eventsig_init(struct ima_event_data *event_data,
|
|
|
struct ima_field_data *field_data)
|
|
|
{
|
|
|
enum data_formats fmt = DATA_FMT_HEX;
|
|
|
+ struct evm_ima_xattr_data *xattr_value = event_data->xattr_value;
|
|
|
+ int xattr_len = event_data->xattr_len;
|
|
|
int rc = 0;
|
|
|
|
|
|
if ((!xattr_value) || (xattr_value->type != EVM_IMA_XATTR_DIGSIG))
|