Lines Matching +full:cts +full:- +full:override

1 // SPDX-License-Identifier: GPL-2.0
19 .friendly_name = "AES-256-XTS",
26 .friendly_name = "AES-256-CTS-CBC",
27 .cipher_str = "cts(cbc(aes))",
32 .friendly_name = "AES-128-CBC-ESSIV",
39 .friendly_name = "AES-128-CTS-CBC",
40 .cipher_str = "cts(cbc(aes))",
61 if (S_ISREG(inode->i_mode)) in select_encryption_mode()
64 if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) in select_encryption_mode()
68 inode->i_ino, (inode->i_mode & S_IFMT)); in select_encryption_mode()
69 return ERR_PTR(-EINVAL); in select_encryption_mode()
80 tfm = crypto_alloc_skcipher(mode->cipher_str, 0, 0); in fscrypt_allocate_skcipher()
82 if (PTR_ERR(tfm) == -ENOENT) { in fscrypt_allocate_skcipher()
85 mode->friendly_name, mode->cipher_str); in fscrypt_allocate_skcipher()
86 return ERR_PTR(-ENOPKG); in fscrypt_allocate_skcipher()
89 mode->cipher_str, PTR_ERR(tfm)); in fscrypt_allocate_skcipher()
92 if (!xchg(&mode->logged_impl_name, 1)) { in fscrypt_allocate_skcipher()
96 * performance problems by logging the ->cra_driver_name the in fscrypt_allocate_skcipher()
100 mode->friendly_name, crypto_skcipher_driver_name(tfm)); in fscrypt_allocate_skcipher()
102 if (WARN_ON(crypto_skcipher_ivsize(tfm) != mode->ivsize)) { in fscrypt_allocate_skcipher()
103 err = -EINVAL; in fscrypt_allocate_skcipher()
107 err = crypto_skcipher_setkey(tfm, raw_key, mode->keysize); in fscrypt_allocate_skcipher()
119 * Prepare the crypto transform object or blk-crypto key in @prep_key, given the
121 * (fs-layer or blk-crypto) will be used.
131 tfm = fscrypt_allocate_skcipher(ci->ci_mode, raw_key, ci->ci_inode); in fscrypt_prepare_key()
136 * I.e., here we publish ->tfm with a RELEASE barrier so that in fscrypt_prepare_key()
138 * possible for per-mode keys, not for per-file keys. in fscrypt_prepare_key()
140 smp_store_release(&prep_key->tfm, tfm); in fscrypt_prepare_key()
144 /* Destroy a crypto transform object and/or blk-crypto key. */
147 crypto_free_skcipher(prep_key->tfm); in fscrypt_destroy_prepared_key()
151 /* Given a per-file encryption key, set up the file's crypto transform object */
154 ci->ci_owns_key = true; in fscrypt_set_per_file_enc_key()
155 return fscrypt_prepare_key(&ci->ci_enc_key, raw_key, ci); in fscrypt_set_per_file_enc_key()
163 const struct inode *inode = ci->ci_inode; in setup_per_mode_enc_key()
164 const struct super_block *sb = inode->i_sb; in setup_per_mode_enc_key()
165 struct fscrypt_mode *mode = ci->ci_mode; in setup_per_mode_enc_key()
166 const u8 mode_num = mode - fscrypt_modes; in setup_per_mode_enc_key()
169 u8 hkdf_info[sizeof(mode_num) + sizeof(sb->s_uuid)]; in setup_per_mode_enc_key()
174 return -EINVAL; in setup_per_mode_enc_key()
178 ci->ci_enc_key = *prep_key; in setup_per_mode_enc_key()
188 BUILD_BUG_ON(sizeof(sb->s_uuid) != 16); in setup_per_mode_enc_key()
192 memcpy(&hkdf_info[hkdf_infolen], &sb->s_uuid, in setup_per_mode_enc_key()
193 sizeof(sb->s_uuid)); in setup_per_mode_enc_key()
194 hkdf_infolen += sizeof(sb->s_uuid); in setup_per_mode_enc_key()
196 err = fscrypt_hkdf_expand(&mk->mk_secret.hkdf, in setup_per_mode_enc_key()
198 mode_key, mode->keysize); in setup_per_mode_enc_key()
202 memzero_explicit(mode_key, mode->keysize); in setup_per_mode_enc_key()
206 ci->ci_enc_key = *prep_key; in setup_per_mode_enc_key()
215 * application-specific information string.
218 * as a pair of 64-bit words. Therefore, on big endian CPUs we have to do an
227 err = fscrypt_hkdf_expand(&mk->mk_secret.hkdf, context, info, infolen, in fscrypt_derive_siphash_key()
233 BUILD_BUG_ON(ARRAY_SIZE(key->key) != 2); in fscrypt_derive_siphash_key()
234 le64_to_cpus(&key->key[0]); in fscrypt_derive_siphash_key()
235 le64_to_cpus(&key->key[1]); in fscrypt_derive_siphash_key()
245 ci->ci_nonce, FSCRYPT_FILE_NONCE_SIZE, in fscrypt_derive_dirhash_key()
246 &ci->ci_dirhash_key); in fscrypt_derive_dirhash_key()
249 ci->ci_dirhash_key_initialized = true; in fscrypt_derive_dirhash_key()
256 WARN_ON(ci->ci_inode->i_ino == 0); in fscrypt_hash_inode_number()
257 WARN_ON(!mk->mk_ino_hash_key_initialized); in fscrypt_hash_inode_number()
259 ci->ci_hashed_ino = (u32)siphash_1u64(ci->ci_inode->i_ino, in fscrypt_hash_inode_number()
260 &mk->mk_ino_hash_key); in fscrypt_hash_inode_number()
268 err = setup_per_mode_enc_key(ci, mk, mk->mk_iv_ino_lblk_32_keys, in fscrypt_setup_iv_ino_lblk_32_key()
274 if (!smp_load_acquire(&mk->mk_ino_hash_key_initialized)) { in fscrypt_setup_iv_ino_lblk_32_key()
278 if (mk->mk_ino_hash_key_initialized) in fscrypt_setup_iv_ino_lblk_32_key()
283 NULL, 0, &mk->mk_ino_hash_key); in fscrypt_setup_iv_ino_lblk_32_key()
287 smp_store_release(&mk->mk_ino_hash_key_initialized, true); in fscrypt_setup_iv_ino_lblk_32_key()
298 if (ci->ci_inode->i_ino) in fscrypt_setup_iv_ino_lblk_32_key()
309 if (ci->ci_policy.v2.flags & FSCRYPT_POLICY_FLAG_DIRECT_KEY) { in fscrypt_setup_v2_file_key()
311 * DIRECT_KEY: instead of deriving per-file encryption keys, the in fscrypt_setup_v2_file_key()
312 * per-file nonce will be included in all the IVs. But unlike in fscrypt_setup_v2_file_key()
314 * with the master key directly but rather derive a per-mode in fscrypt_setup_v2_file_key()
318 err = setup_per_mode_enc_key(ci, mk, mk->mk_direct_keys, in fscrypt_setup_v2_file_key()
320 } else if (ci->ci_policy.v2.flags & in fscrypt_setup_v2_file_key()
328 err = setup_per_mode_enc_key(ci, mk, mk->mk_iv_ino_lblk_64_keys, in fscrypt_setup_v2_file_key()
331 } else if (ci->ci_policy.v2.flags & in fscrypt_setup_v2_file_key()
337 err = fscrypt_hkdf_expand(&mk->mk_secret.hkdf, in fscrypt_setup_v2_file_key()
339 ci->ci_nonce, FSCRYPT_FILE_NONCE_SIZE, in fscrypt_setup_v2_file_key()
340 derived_key, ci->ci_mode->keysize); in fscrypt_setup_v2_file_key()
345 memzero_explicit(derived_key, ci->ci_mode->keysize); in fscrypt_setup_v2_file_key()
363 * If the master key is found in the filesystem-level keyring, then the
365 * read-locked. This is needed to ensure that only one task links the
366 * fscrypt_info into ->mk_decrypted_inodes (as multiple tasks may race to create
383 switch (ci->ci_policy.version) { in setup_file_encryption_key()
387 ci->ci_policy.v1.master_key_descriptor, in setup_file_encryption_key()
393 ci->ci_policy.v2.master_key_identifier, in setup_file_encryption_key()
398 return -EINVAL; in setup_file_encryption_key()
401 key = fscrypt_find_master_key(ci->ci_inode->i_sb, &mk_spec); in setup_file_encryption_key()
403 if (key != ERR_PTR(-ENOKEY) || in setup_file_encryption_key()
404 ci->ci_policy.version != FSCRYPT_POLICY_V1) in setup_file_encryption_key()
410 * to before the search of ->s_master_keys, since users in setup_file_encryption_key()
411 * shouldn't be able to override filesystem-level keys. in setup_file_encryption_key()
416 mk = key->payload.data[0]; in setup_file_encryption_key()
417 down_read(&key->sem); in setup_file_encryption_key()
420 if (!is_master_key_secret_present(&mk->mk_secret)) { in setup_file_encryption_key()
421 err = -ENOKEY; in setup_file_encryption_key()
431 if (mk->mk_secret.size < ci->ci_mode->keysize) { in setup_file_encryption_key()
436 mk->mk_secret.size, ci->ci_mode->keysize); in setup_file_encryption_key()
437 err = -ENOKEY; in setup_file_encryption_key()
441 switch (ci->ci_policy.version) { in setup_file_encryption_key()
443 err = fscrypt_setup_v1_file_key(ci, mk->mk_secret.raw); in setup_file_encryption_key()
450 err = -EINVAL; in setup_file_encryption_key()
460 up_read(&key->sem); in setup_file_encryption_key()
472 if (ci->ci_direct_key) in put_crypt_info()
473 fscrypt_put_direct_key(ci->ci_direct_key); in put_crypt_info()
474 else if (ci->ci_owns_key) in put_crypt_info()
475 fscrypt_destroy_prepared_key(&ci->ci_enc_key); in put_crypt_info()
477 key = ci->ci_master_key; in put_crypt_info()
479 struct fscrypt_master_key *mk = key->payload.data[0]; in put_crypt_info()
487 * gets removed from ->s_master_keys. in put_crypt_info()
489 spin_lock(&mk->mk_decrypted_inodes_lock); in put_crypt_info()
490 list_del(&ci->ci_master_key_link); in put_crypt_info()
491 spin_unlock(&mk->mk_decrypted_inodes_lock); in put_crypt_info()
492 if (refcount_dec_and_test(&mk->mk_refcount)) in put_crypt_info()
511 res = fscrypt_initialize(inode->i_sb->s_cop->flags); in fscrypt_setup_encryption_info()
517 return -ENOMEM; in fscrypt_setup_encryption_info()
519 crypt_info->ci_inode = inode; in fscrypt_setup_encryption_info()
520 crypt_info->ci_policy = *policy; in fscrypt_setup_encryption_info()
521 memcpy(crypt_info->ci_nonce, nonce, FSCRYPT_FILE_NONCE_SIZE); in fscrypt_setup_encryption_info()
523 mode = select_encryption_mode(&crypt_info->ci_policy, inode); in fscrypt_setup_encryption_info()
528 WARN_ON(mode->ivsize > FSCRYPT_MAX_IV_SIZE); in fscrypt_setup_encryption_info()
529 crypt_info->ci_mode = mode; in fscrypt_setup_encryption_info()
537 * For existing inodes, multiple tasks may race to set ->i_crypt_info. in fscrypt_setup_encryption_info()
539 * fscrypt_get_info(). I.e., here we publish ->i_crypt_info with a in fscrypt_setup_encryption_info()
542 if (cmpxchg_release(&inode->i_crypt_info, NULL, crypt_info) == NULL) { in fscrypt_setup_encryption_info()
544 * We won the race and set ->i_crypt_info to our crypt_info. in fscrypt_setup_encryption_info()
549 master_key->payload.data[0]; in fscrypt_setup_encryption_info()
551 refcount_inc(&mk->mk_refcount); in fscrypt_setup_encryption_info()
552 crypt_info->ci_master_key = key_get(master_key); in fscrypt_setup_encryption_info()
553 spin_lock(&mk->mk_decrypted_inodes_lock); in fscrypt_setup_encryption_info()
554 list_add(&crypt_info->ci_master_key_link, in fscrypt_setup_encryption_info()
555 &mk->mk_decrypted_inodes); in fscrypt_setup_encryption_info()
556 spin_unlock(&mk->mk_decrypted_inodes_lock); in fscrypt_setup_encryption_info()
563 up_read(&master_key->sem); in fscrypt_setup_encryption_info()
571 * fscrypt_get_encryption_info() - set up an inode's encryption key
579 * Set up ->i_crypt_info, if it hasn't already been done.
581 * Note: unless ->i_crypt_info is already set, this isn't %GFP_NOFS-safe. So
584 * Return: 0 if ->i_crypt_info was set or was already set, *or* if the
586 * distinguish these cases.) Also can return another -errno code.
597 res = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx)); in fscrypt_get_encryption_info()
599 if (res == -ERANGE && allow_unsupported) in fscrypt_get_encryption_info()
617 return -EINVAL; in fscrypt_get_encryption_info()
623 S_ISDIR(inode->i_mode)); in fscrypt_get_encryption_info()
625 if (res == -ENOPKG && allow_unsupported) /* Algorithm unavailable? */ in fscrypt_get_encryption_info()
627 if (res == -ENOKEY) in fscrypt_get_encryption_info()
633 * fscrypt_prepare_new_inode() - prepare to create a new inode in a directory
634 * @dir: a possibly-encrypted directory
635 * @inode: the new inode. ->i_mode must be set already.
636 * ->i_ino doesn't need to be set yet.
639 * If the directory is encrypted, set up its ->i_crypt_info in preparation for
641 * encrypted, set up its ->i_crypt_info and set *encrypt_ret=true.
643 * This isn't %GFP_NOFS-safe, and therefore it should be called before starting
644 * any filesystem transaction to create the inode. For this reason, ->i_ino
650 * Return: 0 on success, -ENOKEY if the encryption key is missing, or another
651 * -errno code
665 if (WARN_ON_ONCE(inode->i_mode == 0)) in fscrypt_prepare_new_inode()
666 return -EINVAL; in fscrypt_prepare_new_inode()
672 if (!S_ISREG(inode->i_mode) && in fscrypt_prepare_new_inode()
673 !S_ISDIR(inode->i_mode) && in fscrypt_prepare_new_inode()
674 !S_ISLNK(inode->i_mode)) in fscrypt_prepare_new_inode()
682 S_ISDIR(inode->i_mode)); in fscrypt_prepare_new_inode()
687 * fscrypt_put_encryption_info() - free most of an inode's fscrypt data
695 put_crypt_info(inode->i_crypt_info); in fscrypt_put_encryption_info()
696 inode->i_crypt_info = NULL; in fscrypt_put_encryption_info()
701 * fscrypt_free_inode() - free an inode's fscrypt data requiring RCU delay
709 if (IS_ENCRYPTED(inode) && S_ISLNK(inode->i_mode)) { in fscrypt_free_inode()
710 kfree(inode->i_link); in fscrypt_free_inode()
711 inode->i_link = NULL; in fscrypt_free_inode()
717 * fscrypt_drop_inode() - check whether the inode's master key has been removed
720 * Filesystems supporting fscrypt must call this from their ->drop_inode()
734 * was provided via the legacy mechanism of the process-subscribed in fscrypt_drop_inode()
737 if (!ci || !ci->ci_master_key) in fscrypt_drop_inode()
739 mk = ci->ci_master_key->payload.data[0]; in fscrypt_drop_inode()
742 * With proper, non-racy use of FS_IOC_REMOVE_ENCRYPTION_KEY, all inodes in fscrypt_drop_inode()
747 if (inode->i_state & I_DIRTY_ALL) in fscrypt_drop_inode()
758 return !is_master_key_secret_present(&mk->mk_secret); in fscrypt_drop_inode()