cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

blk-crypto-internal.h (5837B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright 2019 Google LLC
      4 */
      5
      6#ifndef __LINUX_BLK_CRYPTO_INTERNAL_H
      7#define __LINUX_BLK_CRYPTO_INTERNAL_H
      8
      9#include <linux/bio.h>
     10#include <linux/blk-mq.h>
     11
     12/* Represents a crypto mode supported by blk-crypto  */
     13struct blk_crypto_mode {
     14	const char *name; /* name of this mode, shown in sysfs */
     15	const char *cipher_str; /* crypto API name (for fallback case) */
     16	unsigned int keysize; /* key size in bytes */
     17	unsigned int ivsize; /* iv size in bytes */
     18};
     19
     20extern const struct blk_crypto_mode blk_crypto_modes[];
     21
     22#ifdef CONFIG_BLK_INLINE_ENCRYPTION
     23
     24int blk_crypto_sysfs_register(struct request_queue *q);
     25
     26void blk_crypto_sysfs_unregister(struct request_queue *q);
     27
     28void bio_crypt_dun_increment(u64 dun[BLK_CRYPTO_DUN_ARRAY_SIZE],
     29			     unsigned int inc);
     30
     31bool bio_crypt_rq_ctx_compatible(struct request *rq, struct bio *bio);
     32
     33bool bio_crypt_ctx_mergeable(struct bio_crypt_ctx *bc1, unsigned int bc1_bytes,
     34			     struct bio_crypt_ctx *bc2);
     35
     36static inline bool bio_crypt_ctx_back_mergeable(struct request *req,
     37						struct bio *bio)
     38{
     39	return bio_crypt_ctx_mergeable(req->crypt_ctx, blk_rq_bytes(req),
     40				       bio->bi_crypt_context);
     41}
     42
     43static inline bool bio_crypt_ctx_front_mergeable(struct request *req,
     44						 struct bio *bio)
     45{
     46	return bio_crypt_ctx_mergeable(bio->bi_crypt_context,
     47				       bio->bi_iter.bi_size, req->crypt_ctx);
     48}
     49
     50static inline bool bio_crypt_ctx_merge_rq(struct request *req,
     51					  struct request *next)
     52{
     53	return bio_crypt_ctx_mergeable(req->crypt_ctx, blk_rq_bytes(req),
     54				       next->crypt_ctx);
     55}
     56
     57static inline void blk_crypto_rq_set_defaults(struct request *rq)
     58{
     59	rq->crypt_ctx = NULL;
     60	rq->crypt_keyslot = NULL;
     61}
     62
     63static inline bool blk_crypto_rq_is_encrypted(struct request *rq)
     64{
     65	return rq->crypt_ctx;
     66}
     67
     68#else /* CONFIG_BLK_INLINE_ENCRYPTION */
     69
     70static inline int blk_crypto_sysfs_register(struct request_queue *q)
     71{
     72	return 0;
     73}
     74
     75static inline void blk_crypto_sysfs_unregister(struct request_queue *q) { }
     76
     77static inline bool bio_crypt_rq_ctx_compatible(struct request *rq,
     78					       struct bio *bio)
     79{
     80	return true;
     81}
     82
     83static inline bool bio_crypt_ctx_front_mergeable(struct request *req,
     84						 struct bio *bio)
     85{
     86	return true;
     87}
     88
     89static inline bool bio_crypt_ctx_back_mergeable(struct request *req,
     90						struct bio *bio)
     91{
     92	return true;
     93}
     94
     95static inline bool bio_crypt_ctx_merge_rq(struct request *req,
     96					  struct request *next)
     97{
     98	return true;
     99}
    100
    101static inline void blk_crypto_rq_set_defaults(struct request *rq) { }
    102
    103static inline bool blk_crypto_rq_is_encrypted(struct request *rq)
    104{
    105	return false;
    106}
    107
    108#endif /* CONFIG_BLK_INLINE_ENCRYPTION */
    109
    110void __bio_crypt_advance(struct bio *bio, unsigned int bytes);
    111static inline void bio_crypt_advance(struct bio *bio, unsigned int bytes)
    112{
    113	if (bio_has_crypt_ctx(bio))
    114		__bio_crypt_advance(bio, bytes);
    115}
    116
    117void __bio_crypt_free_ctx(struct bio *bio);
    118static inline void bio_crypt_free_ctx(struct bio *bio)
    119{
    120	if (bio_has_crypt_ctx(bio))
    121		__bio_crypt_free_ctx(bio);
    122}
    123
    124static inline void bio_crypt_do_front_merge(struct request *rq,
    125					    struct bio *bio)
    126{
    127#ifdef CONFIG_BLK_INLINE_ENCRYPTION
    128	if (bio_has_crypt_ctx(bio))
    129		memcpy(rq->crypt_ctx->bc_dun, bio->bi_crypt_context->bc_dun,
    130		       sizeof(rq->crypt_ctx->bc_dun));
    131#endif
    132}
    133
    134bool __blk_crypto_bio_prep(struct bio **bio_ptr);
    135static inline bool blk_crypto_bio_prep(struct bio **bio_ptr)
    136{
    137	if (bio_has_crypt_ctx(*bio_ptr))
    138		return __blk_crypto_bio_prep(bio_ptr);
    139	return true;
    140}
    141
    142blk_status_t __blk_crypto_init_request(struct request *rq);
    143static inline blk_status_t blk_crypto_init_request(struct request *rq)
    144{
    145	if (blk_crypto_rq_is_encrypted(rq))
    146		return __blk_crypto_init_request(rq);
    147	return BLK_STS_OK;
    148}
    149
    150void __blk_crypto_free_request(struct request *rq);
    151static inline void blk_crypto_free_request(struct request *rq)
    152{
    153	if (blk_crypto_rq_is_encrypted(rq))
    154		__blk_crypto_free_request(rq);
    155}
    156
    157int __blk_crypto_rq_bio_prep(struct request *rq, struct bio *bio,
    158			     gfp_t gfp_mask);
    159/**
    160 * blk_crypto_rq_bio_prep - Prepare a request's crypt_ctx when its first bio
    161 *			    is inserted
    162 * @rq: The request to prepare
    163 * @bio: The first bio being inserted into the request
    164 * @gfp_mask: Memory allocation flags
    165 *
    166 * Return: 0 on success, -ENOMEM if out of memory.  -ENOMEM is only possible if
    167 *	   @gfp_mask doesn't include %__GFP_DIRECT_RECLAIM.
    168 */
    169static inline int blk_crypto_rq_bio_prep(struct request *rq, struct bio *bio,
    170					 gfp_t gfp_mask)
    171{
    172	if (bio_has_crypt_ctx(bio))
    173		return __blk_crypto_rq_bio_prep(rq, bio, gfp_mask);
    174	return 0;
    175}
    176
    177/**
    178 * blk_crypto_insert_cloned_request - Prepare a cloned request to be inserted
    179 *				      into a request queue.
    180 * @rq: the request being queued
    181 *
    182 * Return: BLK_STS_OK on success, nonzero on error.
    183 */
    184static inline blk_status_t blk_crypto_insert_cloned_request(struct request *rq)
    185{
    186
    187	if (blk_crypto_rq_is_encrypted(rq))
    188		return blk_crypto_init_request(rq);
    189	return BLK_STS_OK;
    190}
    191
    192#ifdef CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK
    193
    194int blk_crypto_fallback_start_using_mode(enum blk_crypto_mode_num mode_num);
    195
    196bool blk_crypto_fallback_bio_prep(struct bio **bio_ptr);
    197
    198int blk_crypto_fallback_evict_key(const struct blk_crypto_key *key);
    199
    200#else /* CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK */
    201
    202static inline int
    203blk_crypto_fallback_start_using_mode(enum blk_crypto_mode_num mode_num)
    204{
    205	pr_warn_once("crypto API fallback is disabled\n");
    206	return -ENOPKG;
    207}
    208
    209static inline bool blk_crypto_fallback_bio_prep(struct bio **bio_ptr)
    210{
    211	pr_warn_once("crypto API fallback disabled; failing request.\n");
    212	(*bio_ptr)->bi_status = BLK_STS_NOTSUPP;
    213	return false;
    214}
    215
    216static inline int
    217blk_crypto_fallback_evict_key(const struct blk_crypto_key *key)
    218{
    219	return 0;
    220}
    221
    222#endif /* CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK */
    223
    224#endif /* __LINUX_BLK_CRYPTO_INTERNAL_H */