@@ -56,7 +56,7 @@ int evm_init_key(void);
int evm_update_evmxattr(struct dentry *dentry,
const char *req_xattr_name,
const char *req_xattr_value,
- size_t req_xattr_value_len);
+ size_t req_xattr_value_len, u64 flags);
int evm_calc_hmac(struct dentry *dentry, const char *req_xattr_name,
const char *req_xattr_value,
size_t req_xattr_value_len, u64 flags, char *digest);
@@ -259,16 +259,18 @@ int evm_calc_hash(struct dentry *dentry, const char *req_xattr_name,
* Expects to be called with i_mutex locked.
*/
int evm_update_evmxattr(struct dentry *dentry, const char *xattr_name,
- const char *xattr_value, size_t xattr_value_len)
+ const char *xattr_value, size_t xattr_value_len,
+ u64 flags)
{
struct inode *inode = d_backing_inode(dentry);
- struct evm_ima_xattr_data xattr_data;
+ struct evm_hmac_ng_data xattr_data;
int rc = 0;
rc = evm_calc_hmac(dentry, xattr_name, xattr_value,
- xattr_value_len, evm_default_flags, xattr_data.digest);
+ xattr_value_len, flags, xattr_data.digest);
if (rc == 0) {
- xattr_data.type = EVM_XATTR_HMAC;
+ xattr_data.hdr.type = EVM_XATTR_HMAC_NG;
+ xattr_data.hdr.flags = cpu_to_be64(flags);
rc = __vfs_setxattr_noperm(dentry, XATTR_NAME_EVM,
&xattr_data,
sizeof(xattr_data), 0);
@@ -188,7 +188,8 @@ static enum integrity_status evm_verify_hmac(struct dentry *dentry,
!IS_IMMUTABLE(d_backing_inode(dentry)))
evm_update_evmxattr(dentry, xattr_name,
xattr_value,
- xattr_value_len);
+ xattr_value_len,
+ evm_default_flags);
}
break;
case EVM_XATTR_HMAC_NG:
@@ -427,7 +428,8 @@ void evm_inode_post_setxattr(struct dentry *dentry, const char *xattr_name,
evm_reset_status(dentry->d_inode);
- evm_update_evmxattr(dentry, xattr_name, xattr_value, xattr_value_len);
+ evm_update_evmxattr(dentry, xattr_name, xattr_value, xattr_value_len,
+ evm_default_flags);
}
/**
@@ -447,7 +449,7 @@ void evm_inode_post_removexattr(struct dentry *dentry, const char *xattr_name)
evm_reset_status(dentry->d_inode);
- evm_update_evmxattr(dentry, xattr_name, NULL, 0);
+ evm_update_evmxattr(dentry, xattr_name, NULL, 0, evm_default_flags);
}
/**
@@ -488,7 +490,7 @@ void evm_inode_post_setattr(struct dentry *dentry, int ia_valid)
return;
if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
- evm_update_evmxattr(dentry, NULL, NULL, 0);
+ evm_update_evmxattr(dentry, NULL, NULL, 0, evm_default_flags);
}
/*
Write out HMACs in the NG format rather than the original format. Signed-off-by: Matthew Garrett <mjg59@google.com> --- security/integrity/evm/evm.h | 2 +- security/integrity/evm/evm_crypto.c | 10 ++++++---- security/integrity/evm/evm_main.c | 10 ++++++---- 3 files changed, 13 insertions(+), 9 deletions(-)