Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9196dc11 authored by Mark A. Allyn's avatar Mark A. Allyn Committed by Greg Kroah-Hartman
Browse files

staging: sep: reworked crypto layer



This gets the SEP crypto layer up and running with things like dmcrypt.
It's a fairly big set of changes because it has to rework the whole context
handling system.

[This is picked out of the differences between the upstream driver and
 the staging driver. I'm resolving the differences as a series of updates -AC]

Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ab8ef351
Loading
Loading
Loading
Loading
+1672 −1386

File changed.

Preview size limit exceeded, changes collapsed.

+44 −33
Original line number Diff line number Diff line
@@ -117,7 +117,7 @@

#define SEP_TRANSACTION_WAIT_TIME 5

#define SEP_QUEUE_LENGTH	10
#define SEP_QUEUE_LENGTH	2
/* Macros */
#ifndef __LITTLE_ENDIAN
#define CHG_ENDIAN(val) \
@@ -270,9 +270,26 @@ struct sep_hash_private_context {
	u8 internal_context[sizeof(struct sep_hash_internal_context)];
};

union key_t {
	struct sep_des_key des;
	u32 aes[SEP_AES_MAX_KEY_SIZE_WORDS];
};

/* Context structures for crypto API */
struct sep_block_ctx {
	struct sep_device *sep;
/**
 * Structure for this current task context
 * This same structure is used for both hash
 * and crypt in order to reduce duplicate code
 * for stuff that is done for both hash operations
 * and crypto operations. We cannot trust that the
 * system context is not pulled out from under
 * us during operation to operation, so all
 * critical stuff such as data pointers must
 * be in in a context that is exclusive for this
 * particular task at hand.
 */
struct this_task_ctx {
	struct sep_device *sep_used;
	u32 done;
	unsigned char iv[100];
	enum des_enc_mode des_encmode;
@@ -284,36 +301,7 @@ struct sep_block_ctx {
	size_t data_length;
	size_t ivlen;
	struct ablkcipher_walk walk;
	struct sep_des_private_context des_private_ctx;
	struct sep_aes_private_context aes_private_ctx;
	};

struct sep_hash_ctx {
	u32 done;
	unsigned char *buf;
	size_t buflen;
	unsigned char *dgst;
	int digest_size_words;
	int digest_size_bytes;
	int block_size_words;
	int block_size_bytes;
	struct scatterlist *sg;
	enum hash_op_mode hash_opmode;
	struct sep_hash_private_context hash_private_ctx;
	};

struct sep_system_ctx {
	struct sep_device *sep_used;
	union key_t {
		struct sep_des_key des;
		u32 aes[SEP_AES_MAX_KEY_SIZE_WORDS];
	} key;
	int i_own_sep; /* Do I have custody of the sep? */
	size_t keylen;
	enum des_numkey des_nbr_keys;
	enum aes_keysize aes_key_size;
	u32 key_sent; /* Indicate if key is sent to sep */
	u32 last_block; /* Indicate that this is the final block */
	struct sep_call_status call_status;
	struct build_dcb_struct_kernel dcb_input_data;
	struct sep_dma_context *dma_ctx;
@@ -331,11 +319,34 @@ struct sep_system_ctx {
	struct ahash_request *current_hash_req;
	struct ablkcipher_request *current_cypher_req;
	enum type_of_request current_request;
	int digest_size_words;
	int digest_size_bytes;
	int block_size_words;
	int block_size_bytes;
	enum hash_op_mode hash_opmode;
	enum hash_stage current_hash_stage;
	int done_with_transaction;
	/**
	 * Not that this is a pointer. The are_we_done_yet variable is
	 * allocated by the task function. This way, even if the kernel
	 * crypto infrastructure has grabbed the task structure out from
	 * under us, the task function can still see this variable.
	 */
	int *are_we_done_yet;
	unsigned long end_time;
	};

struct sep_system_ctx {
	union key_t key;
	size_t keylen;
	int key_sent;
	enum des_numkey des_nbr_keys;
	enum aes_keysize aes_key_size;
	unsigned long end_time;
	struct sep_des_private_context des_private_ctx;
	struct sep_aes_private_context aes_private_ctx;
	struct sep_hash_private_context hash_private_ctx;
	};

/* work queue structures */
struct sep_work_struct {
	struct work_struct work;
+1 −2
Original line number Diff line number Diff line
@@ -93,8 +93,7 @@ struct sep_device {
	enum hash_stage	current_hash_stage;
	struct ahash_request	*current_hash_req;
	struct ablkcipher_request *current_cypher_req;
	struct sep_system_ctx *sctx;
	spinlock_t		busy_lock;
	struct this_task_ctx *ta_ctx;
	struct workqueue_struct	*workqueue;
};