| .. | .. |
|---|
| 6 | 6 | #ifndef __LINUX_BLK_CRYPTO_H |
|---|
| 7 | 7 | #define __LINUX_BLK_CRYPTO_H |
|---|
| 8 | 8 | |
|---|
| 9 | | -#include <linux/bio.h> |
|---|
| 9 | +#include <linux/types.h> |
|---|
| 10 | + |
|---|
| 11 | +enum blk_crypto_mode_num { |
|---|
| 12 | + BLK_ENCRYPTION_MODE_INVALID, |
|---|
| 13 | + BLK_ENCRYPTION_MODE_AES_256_XTS, |
|---|
| 14 | + BLK_ENCRYPTION_MODE_AES_128_CBC_ESSIV, |
|---|
| 15 | + BLK_ENCRYPTION_MODE_ADIANTUM, |
|---|
| 16 | + BLK_ENCRYPTION_MODE_MAX, |
|---|
| 17 | +}; |
|---|
| 18 | + |
|---|
| 19 | +#define BLK_CRYPTO_MAX_KEY_SIZE 64 |
|---|
| 20 | +#define BLK_CRYPTO_MAX_WRAPPED_KEY_SIZE 128 |
|---|
| 21 | + |
|---|
| 22 | +/** |
|---|
| 23 | + * struct blk_crypto_config - an inline encryption key's crypto configuration |
|---|
| 24 | + * @crypto_mode: encryption algorithm this key is for |
|---|
| 25 | + * @data_unit_size: the data unit size for all encryption/decryptions with this |
|---|
| 26 | + * key. This is the size in bytes of each individual plaintext and |
|---|
| 27 | + * ciphertext. This is always a power of 2. It might be e.g. the |
|---|
| 28 | + * filesystem block size or the disk sector size. |
|---|
| 29 | + * @dun_bytes: the maximum number of bytes of DUN used when using this key |
|---|
| 30 | + * @is_hw_wrapped: @raw points to a wrapped key to be used by an inline |
|---|
| 31 | + * encryption hardware that accepts wrapped keys. |
|---|
| 32 | + */ |
|---|
| 33 | +struct blk_crypto_config { |
|---|
| 34 | + enum blk_crypto_mode_num crypto_mode; |
|---|
| 35 | + unsigned int data_unit_size; |
|---|
| 36 | + unsigned int dun_bytes; |
|---|
| 37 | + bool is_hw_wrapped; |
|---|
| 38 | +}; |
|---|
| 39 | + |
|---|
| 40 | +/** |
|---|
| 41 | + * struct blk_crypto_key - an inline encryption key |
|---|
| 42 | + * @crypto_cfg: the crypto configuration (like crypto_mode, key size) for this |
|---|
| 43 | + * key |
|---|
| 44 | + * @data_unit_size_bits: log2 of data_unit_size |
|---|
| 45 | + * @size: size of this key in bytes (determined by @crypto_cfg.crypto_mode) |
|---|
| 46 | + * @raw: the raw bytes of this key. Only the first @size bytes are used. |
|---|
| 47 | + * |
|---|
| 48 | + * A blk_crypto_key is immutable once created, and many bios can reference it at |
|---|
| 49 | + * the same time. It must not be freed until all bios using it have completed |
|---|
| 50 | + * and it has been evicted from all devices on which it may have been used. |
|---|
| 51 | + */ |
|---|
| 52 | +struct blk_crypto_key { |
|---|
| 53 | + struct blk_crypto_config crypto_cfg; |
|---|
| 54 | + unsigned int data_unit_size_bits; |
|---|
| 55 | + unsigned int size; |
|---|
| 56 | + u8 raw[BLK_CRYPTO_MAX_WRAPPED_KEY_SIZE]; |
|---|
| 57 | +}; |
|---|
| 58 | + |
|---|
| 59 | +#define BLK_CRYPTO_MAX_IV_SIZE 32 |
|---|
| 60 | +#define BLK_CRYPTO_DUN_ARRAY_SIZE (BLK_CRYPTO_MAX_IV_SIZE / sizeof(u64)) |
|---|
| 61 | + |
|---|
| 62 | +/** |
|---|
| 63 | + * struct bio_crypt_ctx - an inline encryption context |
|---|
| 64 | + * @bc_key: the key, algorithm, and data unit size to use |
|---|
| 65 | + * @bc_dun: the data unit number (starting IV) to use |
|---|
| 66 | + * |
|---|
| 67 | + * A bio_crypt_ctx specifies that the contents of the bio will be encrypted (for |
|---|
| 68 | + * write requests) or decrypted (for read requests) inline by the storage device |
|---|
| 69 | + * or controller, or by the crypto API fallback. |
|---|
| 70 | + */ |
|---|
| 71 | +struct bio_crypt_ctx { |
|---|
| 72 | + const struct blk_crypto_key *bc_key; |
|---|
| 73 | + u64 bc_dun[BLK_CRYPTO_DUN_ARRAY_SIZE]; |
|---|
| 74 | +}; |
|---|
| 75 | + |
|---|
| 76 | +#include <linux/blk_types.h> |
|---|
| 77 | +#include <linux/blkdev.h> |
|---|
| 78 | + |
|---|
| 79 | +struct request; |
|---|
| 80 | +struct request_queue; |
|---|
| 10 | 81 | |
|---|
| 11 | 82 | #ifdef CONFIG_BLK_INLINE_ENCRYPTION |
|---|
| 12 | 83 | |
|---|
| 13 | | -int blk_crypto_submit_bio(struct bio **bio_ptr); |
|---|
| 84 | +static inline bool bio_has_crypt_ctx(struct bio *bio) |
|---|
| 85 | +{ |
|---|
| 86 | + return bio->bi_crypt_context; |
|---|
| 87 | +} |
|---|
| 14 | 88 | |
|---|
| 15 | | -bool blk_crypto_endio(struct bio *bio); |
|---|
| 89 | +void bio_crypt_set_ctx(struct bio *bio, const struct blk_crypto_key *key, |
|---|
| 90 | + const u64 dun[BLK_CRYPTO_DUN_ARRAY_SIZE], |
|---|
| 91 | + gfp_t gfp_mask); |
|---|
| 92 | + |
|---|
| 93 | +bool bio_crypt_dun_is_contiguous(const struct bio_crypt_ctx *bc, |
|---|
| 94 | + unsigned int bytes, |
|---|
| 95 | + const u64 next_dun[BLK_CRYPTO_DUN_ARRAY_SIZE]); |
|---|
| 16 | 96 | |
|---|
| 17 | 97 | int blk_crypto_init_key(struct blk_crypto_key *blk_key, |
|---|
| 18 | 98 | const u8 *raw_key, unsigned int raw_key_size, |
|---|
| .. | .. |
|---|
| 21 | 101 | unsigned int dun_bytes, |
|---|
| 22 | 102 | unsigned int data_unit_size); |
|---|
| 23 | 103 | |
|---|
| 24 | | -int blk_crypto_start_using_mode(enum blk_crypto_mode_num crypto_mode, |
|---|
| 25 | | - unsigned int dun_bytes, |
|---|
| 26 | | - unsigned int data_unit_size, |
|---|
| 27 | | - bool is_hw_wrapped_key, |
|---|
| 28 | | - struct request_queue *q); |
|---|
| 104 | +int blk_crypto_start_using_key(const struct blk_crypto_key *key, |
|---|
| 105 | + struct request_queue *q); |
|---|
| 29 | 106 | |
|---|
| 30 | | -int blk_crypto_evict_key(struct request_queue *q, |
|---|
| 31 | | - const struct blk_crypto_key *key); |
|---|
| 107 | +void blk_crypto_evict_key(struct request_queue *q, |
|---|
| 108 | + const struct blk_crypto_key *key); |
|---|
| 109 | + |
|---|
| 110 | +bool blk_crypto_config_supported(struct request_queue *q, |
|---|
| 111 | + const struct blk_crypto_config *cfg); |
|---|
| 32 | 112 | |
|---|
| 33 | 113 | #else /* CONFIG_BLK_INLINE_ENCRYPTION */ |
|---|
| 34 | 114 | |
|---|
| 35 | | -static inline int blk_crypto_submit_bio(struct bio **bio_ptr) |
|---|
| 115 | +static inline bool bio_has_crypt_ctx(struct bio *bio) |
|---|
| 36 | 116 | { |
|---|
| 37 | | - return 0; |
|---|
| 38 | | -} |
|---|
| 39 | | - |
|---|
| 40 | | -static inline bool blk_crypto_endio(struct bio *bio) |
|---|
| 41 | | -{ |
|---|
| 42 | | - return true; |
|---|
| 117 | + return false; |
|---|
| 43 | 118 | } |
|---|
| 44 | 119 | |
|---|
| 45 | 120 | #endif /* CONFIG_BLK_INLINE_ENCRYPTION */ |
|---|
| 46 | 121 | |
|---|
| 47 | | -#ifdef CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK |
|---|
| 122 | +static inline void bio_clone_skip_dm_default_key(struct bio *dst, |
|---|
| 123 | + const struct bio *src); |
|---|
| 48 | 124 | |
|---|
| 49 | | -int blk_crypto_fallback_init(void); |
|---|
| 50 | | - |
|---|
| 51 | | -#else /* CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK */ |
|---|
| 52 | | - |
|---|
| 53 | | -static inline int blk_crypto_fallback_init(void) |
|---|
| 125 | +int __bio_crypt_clone(struct bio *dst, struct bio *src, gfp_t gfp_mask); |
|---|
| 126 | +/** |
|---|
| 127 | + * bio_crypt_clone - clone bio encryption context |
|---|
| 128 | + * @dst: destination bio |
|---|
| 129 | + * @src: source bio |
|---|
| 130 | + * @gfp_mask: memory allocation flags |
|---|
| 131 | + * |
|---|
| 132 | + * If @src has an encryption context, clone it to @dst. |
|---|
| 133 | + * |
|---|
| 134 | + * Return: 0 on success, -ENOMEM if out of memory. -ENOMEM is only possible if |
|---|
| 135 | + * @gfp_mask doesn't include %__GFP_DIRECT_RECLAIM. |
|---|
| 136 | + */ |
|---|
| 137 | +static inline int bio_crypt_clone(struct bio *dst, struct bio *src, |
|---|
| 138 | + gfp_t gfp_mask) |
|---|
| 54 | 139 | { |
|---|
| 140 | + bio_clone_skip_dm_default_key(dst, src); |
|---|
| 141 | + if (bio_has_crypt_ctx(src)) |
|---|
| 142 | + return __bio_crypt_clone(dst, src, gfp_mask); |
|---|
| 55 | 143 | return 0; |
|---|
| 56 | 144 | } |
|---|
| 57 | 145 | |
|---|
| 58 | | -#endif /* CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK */ |
|---|
| 146 | +#if IS_ENABLED(CONFIG_DM_DEFAULT_KEY) |
|---|
| 147 | +static inline void bio_set_skip_dm_default_key(struct bio *bio) |
|---|
| 148 | +{ |
|---|
| 149 | + bio->bi_skip_dm_default_key = true; |
|---|
| 150 | +} |
|---|
| 151 | + |
|---|
| 152 | +static inline bool bio_should_skip_dm_default_key(const struct bio *bio) |
|---|
| 153 | +{ |
|---|
| 154 | + return bio->bi_skip_dm_default_key; |
|---|
| 155 | +} |
|---|
| 156 | + |
|---|
| 157 | +static inline void bio_clone_skip_dm_default_key(struct bio *dst, |
|---|
| 158 | + const struct bio *src) |
|---|
| 159 | +{ |
|---|
| 160 | + dst->bi_skip_dm_default_key = src->bi_skip_dm_default_key; |
|---|
| 161 | +} |
|---|
| 162 | +#else /* CONFIG_DM_DEFAULT_KEY */ |
|---|
| 163 | +static inline void bio_set_skip_dm_default_key(struct bio *bio) |
|---|
| 164 | +{ |
|---|
| 165 | +} |
|---|
| 166 | + |
|---|
| 167 | +static inline bool bio_should_skip_dm_default_key(const struct bio *bio) |
|---|
| 168 | +{ |
|---|
| 169 | + return false; |
|---|
| 170 | +} |
|---|
| 171 | + |
|---|
| 172 | +static inline void bio_clone_skip_dm_default_key(struct bio *dst, |
|---|
| 173 | + const struct bio *src) |
|---|
| 174 | +{ |
|---|
| 175 | +} |
|---|
| 176 | +#endif /* !CONFIG_DM_DEFAULT_KEY */ |
|---|
| 59 | 177 | |
|---|
| 60 | 178 | #endif /* __LINUX_BLK_CRYPTO_H */ |
|---|