4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2019, 2020, Whamcloud.
26 * This file is part of Lustre, http://www.lustre.org/
29 #ifndef _LUSTRE_CRYPTO_H_
30 #define _LUSTRE_CRYPTO_H_
33 int ll_set_encflags(struct inode *inode, void *encctx, __u32 encctxlen,
35 void llcrypt_free_ctx(void *encctx, __u32 size);
36 bool ll_sbi_has_test_dummy_encryption(struct ll_sb_info *sbi);
37 bool ll_sbi_has_encrypt(struct ll_sb_info *sbi);
38 void ll_sbi_set_encrypt(struct ll_sb_info *sbi, bool set);
40 /* Encoding/decoding routines inspired from yEnc principles.
41 * We just take care of a few critical characters:
42 * NULL, LF, CR, /, DEL and =.
43 * If such a char is found, it is replaced with '=' followed by
44 * the char value + 64.
45 * All other chars are left untouched.
46 * Efficiency of this encoding depends on the occurences of the
47 * critical chars, but statistically on binary data it can be much higher
48 * than base64 for instance.
50 static inline int critical_encode(const u8 *src, int len, char *dst)
52 u8 *p = (u8 *)src, *q = dst;
54 while (p - src < len) {
55 /* escape NULL, LF, CR, /, DEL and = */
56 if (unlikely(*p == 0x0 || *p == 0xA || *p == 0xD ||
57 *p == '/' || *p == 0x7F || *p == '=')) {
65 return (char *)q - dst;
68 /* returns the number of chars encoding would produce */
69 static inline int critical_chars(const u8 *src, int len)
74 while (p - src < len) {
75 /* NULL, LF, CR, /, DEL and = cost an additional '=' */
76 if (unlikely(*p == 0x0 || *p == 0xA || *p == 0xD ||
77 *p == '/' || *p == 0x7F || *p == '='))
85 /* decoding routine - returns the number of chars in output */
86 static inline int critical_decode(const u8 *src, int len, char *dst)
88 u8 *p = (u8 *)src, *q = dst;
90 while (p - src < len) {
91 if (unlikely(*p == '=')) {
99 return (char *)q - dst;
102 #ifdef CONFIG_LL_ENCRYPTION
103 #include <libcfs/crypto/llcrypt.h>
104 #else /* !CONFIG_LL_ENCRYPTION */
105 #ifdef HAVE_LUSTRE_CRYPTO
106 #define __FS_HAS_ENCRYPTION 1
107 #include <linux/fscrypt.h>
109 #define llcrypt_operations fscrypt_operations
110 #define llcrypt_symlink_data fscrypt_symlink_data
111 #define llcrypt_dummy_context_enabled(inode) \
112 fscrypt_dummy_context_enabled(inode)
113 #define llcrypt_has_encryption_key(inode) fscrypt_has_encryption_key(inode)
114 #define llcrypt_encrypt_pagecache_blocks(page, len, offs, gfp_flags) \
115 fscrypt_encrypt_pagecache_blocks(page, len, offs, gfp_flags)
116 #define llcrypt_encrypt_block_inplace(inode, page, len, offs, lblk, gfp_flags) \
117 fscrypt_encrypt_block_inplace(inode, page, len, offs, lblk, gfp_flags)
118 #define llcrypt_decrypt_pagecache_blocks(page, len, offs) \
119 fscrypt_decrypt_pagecache_blocks(page, len, offs)
120 #define llcrypt_decrypt_block_inplace(inode, page, len, offs, lblk_num) \
121 fscrypt_decrypt_block_inplace(inode, page, len, offs, lblk_num)
122 #define llcrypt_inherit_context(parent, child, fs_data, preload) \
123 fscrypt_inherit_context(parent, child, fs_data, preload)
124 #define llcrypt_get_encryption_info(inode) fscrypt_get_encryption_info(inode)
125 #define llcrypt_put_encryption_info(inode) fscrypt_put_encryption_info(inode)
126 #define llcrypt_free_inode(inode) fscrypt_free_inode(inode)
127 #define llcrypt_finalize_bounce_page(pagep) fscrypt_finalize_bounce_page(pagep)
128 #define llcrypt_file_open(inode, filp) fscrypt_file_open(inode, filp)
129 #define llcrypt_ioctl_set_policy(filp, arg) fscrypt_ioctl_set_policy(filp, arg)
130 #define llcrypt_ioctl_get_policy_ex(filp, arg) \
131 fscrypt_ioctl_get_policy_ex(filp, arg)
132 #define llcrypt_ioctl_add_key(filp, arg) fscrypt_ioctl_add_key(filp, arg)
133 #define llcrypt_ioctl_remove_key(filp, arg) fscrypt_ioctl_remove_key(filp, arg)
134 #define llcrypt_ioctl_remove_key_all_users(filp, arg) \
135 fscrypt_ioctl_remove_key_all_users(filp, arg)
136 #define llcrypt_ioctl_get_key_status(filp, arg) \
137 fscrypt_ioctl_get_key_status(filp, arg)
138 #define llcrypt_drop_inode(inode) fscrypt_drop_inode(inode)
139 #define llcrypt_prepare_rename(olddir, olddentry, newdir, newdentry, flags) \
140 fscrypt_prepare_rename(olddir, olddentry, newdir, newdentry, flags)
141 #define llcrypt_prepare_link(old_dentry, dir, dentry) \
142 fscrypt_prepare_link(old_dentry, dir, dentry)
143 #define llcrypt_prepare_setattr(dentry, attr) \
144 fscrypt_prepare_setattr(dentry, attr)
145 #define llcrypt_set_ops(sb, cop) fscrypt_set_ops(sb, cop)
146 #define llcrypt_fname_alloc_buffer(inode, max_encrypted_len, crypto_str) \
147 fscrypt_fname_alloc_buffer(inode, max_encrypted_len, crypto_str)
148 #define llcrypt_fname_disk_to_usr(inode, hash, minor_hash, iname, oname) \
149 fscrypt_fname_disk_to_usr(inode, hash, minor_hash, iname, oname)
150 #define llcrypt_fname_free_buffer(crypto_str) \
151 fscrypt_fname_free_buffer(crypto_str)
152 #define llcrypt_setup_filename(dir, iname, lookup, fname) \
153 fscrypt_setup_filename(dir, iname, lookup, fname)
154 #define llcrypt_free_filename(fname) \
155 fscrypt_free_filename(fname)
156 #define llcrypt_prepare_lookup(dir, dentry, fname) \
157 fscrypt_prepare_lookup(dir, dentry, fname)
158 #define llcrypt_encrypt_symlink(inode, target, len, disk_link) \
159 fscrypt_encrypt_symlink(inode, target, len, disk_link)
160 #define llcrypt_prepare_symlink(dir, target, len, max_len, disk_link) \
161 fscrypt_prepare_symlink(dir, target, len, max_len, disk_link)
162 #define llcrypt_get_symlink(inode, caddr, max_size, done) \
163 fscrypt_get_symlink(inode, caddr, max_size, done)
164 #define llcrypt_handle_d_move(dentry) \
165 fscrypt_handle_d_move(dentry)
166 #else /* !HAVE_LUSTRE_CRYPTO */
167 /* Extracts the second-to-last ciphertext block */
168 #define LLCRYPT_FNAME_DIGEST(name, len) \
169 ((name) + round_down((len) - LL_CRYPTO_BLOCK_SIZE - 1, \
170 LL_CRYPTO_BLOCK_SIZE))
171 #define LLCRYPT_FNAME_DIGEST_SIZE LL_CRYPTO_BLOCK_SIZE
172 #include <libcfs/crypto/llcrypt.h>
173 #endif /* HAVE_LUSTRE_CRYPTO */
174 #endif /* !CONFIG_LL_ENCRYPTION */
176 #endif /* _LUSTRE_CRYPTO_H_ */