0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/key.h>
0009
0010 #include "fscrypt_private.h"
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 int fscrypt_file_open(struct inode *inode, struct file *filp)
0033 {
0034 int err;
0035 struct dentry *dir;
0036
0037 err = fscrypt_require_key(inode);
0038 if (err)
0039 return err;
0040
0041 dir = dget_parent(file_dentry(filp));
0042 if (IS_ENCRYPTED(d_inode(dir)) &&
0043 !fscrypt_has_permitted_context(d_inode(dir), inode)) {
0044 fscrypt_warn(inode,
0045 "Inconsistent encryption context (parent directory: %lu)",
0046 d_inode(dir)->i_ino);
0047 err = -EPERM;
0048 }
0049 dput(dir);
0050 return err;
0051 }
0052 EXPORT_SYMBOL_GPL(fscrypt_file_open);
0053
0054 int __fscrypt_prepare_link(struct inode *inode, struct inode *dir,
0055 struct dentry *dentry)
0056 {
0057 if (fscrypt_is_nokey_name(dentry))
0058 return -ENOKEY;
0059
0060
0061
0062
0063
0064 if (!fscrypt_has_permitted_context(dir, inode))
0065 return -EXDEV;
0066
0067 return 0;
0068 }
0069 EXPORT_SYMBOL_GPL(__fscrypt_prepare_link);
0070
0071 int __fscrypt_prepare_rename(struct inode *old_dir, struct dentry *old_dentry,
0072 struct inode *new_dir, struct dentry *new_dentry,
0073 unsigned int flags)
0074 {
0075 if (fscrypt_is_nokey_name(old_dentry) ||
0076 fscrypt_is_nokey_name(new_dentry))
0077 return -ENOKEY;
0078
0079
0080
0081
0082
0083 if (old_dir != new_dir) {
0084 if (IS_ENCRYPTED(new_dir) &&
0085 !fscrypt_has_permitted_context(new_dir,
0086 d_inode(old_dentry)))
0087 return -EXDEV;
0088
0089 if ((flags & RENAME_EXCHANGE) &&
0090 IS_ENCRYPTED(old_dir) &&
0091 !fscrypt_has_permitted_context(old_dir,
0092 d_inode(new_dentry)))
0093 return -EXDEV;
0094 }
0095 return 0;
0096 }
0097 EXPORT_SYMBOL_GPL(__fscrypt_prepare_rename);
0098
0099 int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
0100 struct fscrypt_name *fname)
0101 {
0102 int err = fscrypt_setup_filename(dir, &dentry->d_name, 1, fname);
0103
0104 if (err && err != -ENOENT)
0105 return err;
0106
0107 if (fname->is_nokey_name) {
0108 spin_lock(&dentry->d_lock);
0109 dentry->d_flags |= DCACHE_NOKEY_NAME;
0110 spin_unlock(&dentry->d_lock);
0111 }
0112 return err;
0113 }
0114 EXPORT_SYMBOL_GPL(__fscrypt_prepare_lookup);
0115
0116 int __fscrypt_prepare_readdir(struct inode *dir)
0117 {
0118 return fscrypt_get_encryption_info(dir, true);
0119 }
0120 EXPORT_SYMBOL_GPL(__fscrypt_prepare_readdir);
0121
0122 int __fscrypt_prepare_setattr(struct dentry *dentry, struct iattr *attr)
0123 {
0124 if (attr->ia_valid & ATTR_SIZE)
0125 return fscrypt_require_key(d_inode(dentry));
0126 return 0;
0127 }
0128 EXPORT_SYMBOL_GPL(__fscrypt_prepare_setattr);
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 int fscrypt_prepare_setflags(struct inode *inode,
0142 unsigned int oldflags, unsigned int flags)
0143 {
0144 struct fscrypt_info *ci;
0145 struct key *key;
0146 struct fscrypt_master_key *mk;
0147 int err;
0148
0149
0150
0151
0152
0153
0154 if (IS_ENCRYPTED(inode) && (flags & ~oldflags & FS_CASEFOLD_FL)) {
0155 err = fscrypt_require_key(inode);
0156 if (err)
0157 return err;
0158 ci = inode->i_crypt_info;
0159 if (ci->ci_policy.version != FSCRYPT_POLICY_V2)
0160 return -EINVAL;
0161 key = ci->ci_master_key;
0162 mk = key->payload.data[0];
0163 down_read(&key->sem);
0164 if (is_master_key_secret_present(&mk->mk_secret))
0165 err = fscrypt_derive_dirhash_key(ci, mk);
0166 else
0167 err = -ENOKEY;
0168 up_read(&key->sem);
0169 return err;
0170 }
0171 return 0;
0172 }
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197 int fscrypt_prepare_symlink(struct inode *dir, const char *target,
0198 unsigned int len, unsigned int max_len,
0199 struct fscrypt_str *disk_link)
0200 {
0201 const union fscrypt_policy *policy;
0202
0203
0204
0205
0206
0207
0208 policy = fscrypt_policy_to_inherit(dir);
0209 if (policy == NULL) {
0210
0211 disk_link->name = (unsigned char *)target;
0212 disk_link->len = len + 1;
0213 if (disk_link->len > max_len)
0214 return -ENAMETOOLONG;
0215 return 0;
0216 }
0217 if (IS_ERR(policy))
0218 return PTR_ERR(policy);
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231 if (!__fscrypt_fname_encrypted_size(policy, len,
0232 max_len - sizeof(struct fscrypt_symlink_data),
0233 &disk_link->len))
0234 return -ENAMETOOLONG;
0235 disk_link->len += sizeof(struct fscrypt_symlink_data);
0236
0237 disk_link->name = NULL;
0238 return 0;
0239 }
0240 EXPORT_SYMBOL_GPL(fscrypt_prepare_symlink);
0241
0242 int __fscrypt_encrypt_symlink(struct inode *inode, const char *target,
0243 unsigned int len, struct fscrypt_str *disk_link)
0244 {
0245 int err;
0246 struct qstr iname = QSTR_INIT(target, len);
0247 struct fscrypt_symlink_data *sd;
0248 unsigned int ciphertext_len;
0249
0250
0251
0252
0253
0254
0255 if (WARN_ON_ONCE(!fscrypt_has_encryption_key(inode)))
0256 return -ENOKEY;
0257
0258 if (disk_link->name) {
0259
0260 sd = (struct fscrypt_symlink_data *)disk_link->name;
0261 } else {
0262 sd = kmalloc(disk_link->len, GFP_NOFS);
0263 if (!sd)
0264 return -ENOMEM;
0265 }
0266 ciphertext_len = disk_link->len - sizeof(*sd);
0267 sd->len = cpu_to_le16(ciphertext_len);
0268
0269 err = fscrypt_fname_encrypt(inode, &iname, sd->encrypted_path,
0270 ciphertext_len);
0271 if (err)
0272 goto err_free_sd;
0273
0274
0275
0276
0277
0278
0279 sd->encrypted_path[ciphertext_len] = '\0';
0280
0281
0282 err = -ENOMEM;
0283 inode->i_link = kmemdup(target, len + 1, GFP_NOFS);
0284 if (!inode->i_link)
0285 goto err_free_sd;
0286
0287 if (!disk_link->name)
0288 disk_link->name = (unsigned char *)sd;
0289 return 0;
0290
0291 err_free_sd:
0292 if (!disk_link->name)
0293 kfree(sd);
0294 return err;
0295 }
0296 EXPORT_SYMBOL_GPL(__fscrypt_encrypt_symlink);
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312 const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
0313 unsigned int max_size,
0314 struct delayed_call *done)
0315 {
0316 const struct fscrypt_symlink_data *sd;
0317 struct fscrypt_str cstr, pstr;
0318 bool has_key;
0319 int err;
0320
0321
0322 if (WARN_ON(!IS_ENCRYPTED(inode)))
0323 return ERR_PTR(-EINVAL);
0324
0325
0326 pstr.name = READ_ONCE(inode->i_link);
0327 if (pstr.name)
0328 return pstr.name;
0329
0330
0331
0332
0333
0334 err = fscrypt_get_encryption_info(inode, false);
0335 if (err)
0336 return ERR_PTR(err);
0337 has_key = fscrypt_has_encryption_key(inode);
0338
0339
0340
0341
0342
0343
0344 if (max_size < sizeof(*sd))
0345 return ERR_PTR(-EUCLEAN);
0346 sd = caddr;
0347 cstr.name = (unsigned char *)sd->encrypted_path;
0348 cstr.len = le16_to_cpu(sd->len);
0349
0350 if (cstr.len == 0)
0351 return ERR_PTR(-EUCLEAN);
0352
0353 if (cstr.len + sizeof(*sd) - 1 > max_size)
0354 return ERR_PTR(-EUCLEAN);
0355
0356 err = fscrypt_fname_alloc_buffer(cstr.len, &pstr);
0357 if (err)
0358 return ERR_PTR(err);
0359
0360 err = fscrypt_fname_disk_to_usr(inode, 0, 0, &cstr, &pstr);
0361 if (err)
0362 goto err_kfree;
0363
0364 err = -EUCLEAN;
0365 if (pstr.name[0] == '\0')
0366 goto err_kfree;
0367
0368 pstr.name[pstr.len] = '\0';
0369
0370
0371
0372
0373
0374
0375
0376 if (!has_key ||
0377 cmpxchg_release(&inode->i_link, NULL, pstr.name) != NULL)
0378 set_delayed_call(done, kfree_link, pstr.name);
0379
0380 return pstr.name;
0381
0382 err_kfree:
0383 kfree(pstr.name);
0384 return ERR_PTR(err);
0385 }
0386 EXPORT_SYMBOL_GPL(fscrypt_get_symlink);
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408 int fscrypt_symlink_getattr(const struct path *path, struct kstat *stat)
0409 {
0410 struct dentry *dentry = path->dentry;
0411 struct inode *inode = d_inode(dentry);
0412 const char *link;
0413 DEFINE_DELAYED_CALL(done);
0414
0415
0416
0417
0418
0419
0420 link = READ_ONCE(inode->i_link);
0421 if (!link) {
0422 link = inode->i_op->get_link(dentry, inode, &done);
0423 if (IS_ERR(link))
0424 return PTR_ERR(link);
0425 }
0426 stat->size = strlen(link);
0427 do_delayed_call(&done);
0428 return 0;
0429 }
0430 EXPORT_SYMBOL_GPL(fscrypt_symlink_getattr);