0001
0002
0003
0004
0005
0006
0007
0008 #include "fsverity_private.h"
0009
0010 #include <linux/uaccess.h>
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 int fsverity_ioctl_measure(struct file *filp, void __user *_uarg)
0024 {
0025 const struct inode *inode = file_inode(filp);
0026 struct fsverity_digest __user *uarg = _uarg;
0027 const struct fsverity_info *vi;
0028 const struct fsverity_hash_alg *hash_alg;
0029 struct fsverity_digest arg;
0030
0031 vi = fsverity_get_info(inode);
0032 if (!vi)
0033 return -ENODATA;
0034 hash_alg = vi->tree_params.hash_alg;
0035
0036
0037
0038
0039
0040
0041
0042 if (get_user(arg.digest_size, &uarg->digest_size))
0043 return -EFAULT;
0044 if (arg.digest_size < hash_alg->digest_size)
0045 return -EOVERFLOW;
0046
0047 memset(&arg, 0, sizeof(arg));
0048 arg.digest_algorithm = hash_alg - fsverity_hash_algs;
0049 arg.digest_size = hash_alg->digest_size;
0050
0051 if (copy_to_user(uarg, &arg, sizeof(arg)))
0052 return -EFAULT;
0053
0054 if (copy_to_user(uarg->digest, vi->file_digest, hash_alg->digest_size))
0055 return -EFAULT;
0056
0057 return 0;
0058 }
0059 EXPORT_SYMBOL_GPL(fsverity_ioctl_measure);
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 int fsverity_get_digest(struct inode *inode,
0074 u8 digest[FS_VERITY_MAX_DIGEST_SIZE],
0075 enum hash_algo *alg)
0076 {
0077 const struct fsverity_info *vi;
0078 const struct fsverity_hash_alg *hash_alg;
0079 int i;
0080
0081 vi = fsverity_get_info(inode);
0082 if (!vi)
0083 return -ENODATA;
0084
0085 hash_alg = vi->tree_params.hash_alg;
0086 memset(digest, 0, FS_VERITY_MAX_DIGEST_SIZE);
0087
0088
0089 i = match_string(hash_algo_name, HASH_ALGO__LAST, hash_alg->name);
0090 if (i < 0)
0091 return -EINVAL;
0092 *alg = i;
0093
0094 if (WARN_ON_ONCE(hash_alg->digest_size != hash_digest_size[*alg]))
0095 return -EINVAL;
0096 memcpy(digest, vi->file_digest, hash_alg->digest_size);
0097
0098 pr_debug("file digest %s:%*phN\n", hash_algo_name[*alg],
0099 hash_digest_size[*alg], digest);
0100
0101 return 0;
0102 }