2014-07-31 17:29:51 +00:00
|
|
|
/*
|
|
|
|
* Software async multibuffer crypto daemon headers
|
|
|
|
*
|
|
|
|
* Author:
|
|
|
|
* Tim Chen <tim.c.chen@linux.intel.com>
|
|
|
|
*
|
|
|
|
* Copyright (c) 2014, Intel Corporation.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _CRYPTO_MCRYPT_H
|
|
|
|
#define _CRYPTO_MCRYPT_H
|
|
|
|
|
|
|
|
#include <linux/crypto.h>
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <crypto/hash.h>
|
|
|
|
|
|
|
|
struct mcryptd_ahash {
|
|
|
|
struct crypto_ahash base;
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline struct mcryptd_ahash *__mcryptd_ahash_cast(
|
|
|
|
struct crypto_ahash *tfm)
|
|
|
|
{
|
|
|
|
return (struct mcryptd_ahash *)tfm;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct mcryptd_cpu_queue {
|
|
|
|
struct crypto_queue queue;
|
|
|
|
struct work_struct work;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mcryptd_queue {
|
|
|
|
struct mcryptd_cpu_queue __percpu *cpu_queue;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mcryptd_instance_ctx {
|
|
|
|
struct crypto_spawn spawn;
|
|
|
|
struct mcryptd_queue *queue;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mcryptd_hash_ctx {
|
2016-06-22 01:21:46 +00:00
|
|
|
struct crypto_ahash *child;
|
2014-07-31 17:29:51 +00:00
|
|
|
struct mcryptd_alg_state *alg_state;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mcryptd_tag {
|
|
|
|
/* seq number of request */
|
|
|
|
unsigned seq_num;
|
|
|
|
/* arrival time of request */
|
|
|
|
unsigned long arrival;
|
|
|
|
unsigned long expire;
|
|
|
|
int cpu;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mcryptd_hash_request_ctx {
|
|
|
|
struct list_head waiter;
|
|
|
|
crypto_completion_t complete;
|
|
|
|
struct mcryptd_tag tag;
|
|
|
|
struct crypto_hash_walk walk;
|
|
|
|
u8 *out;
|
|
|
|
int flag;
|
2016-06-22 01:21:46 +00:00
|
|
|
struct ahash_request areq;
|
2014-07-31 17:29:51 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name,
|
|
|
|
u32 type, u32 mask);
|
2016-06-22 01:21:46 +00:00
|
|
|
struct crypto_ahash *mcryptd_ahash_child(struct mcryptd_ahash *tfm);
|
|
|
|
struct ahash_request *mcryptd_ahash_desc(struct ahash_request *req);
|
2014-07-31 17:29:51 +00:00
|
|
|
void mcryptd_free_ahash(struct mcryptd_ahash *tfm);
|
|
|
|
void mcryptd_flusher(struct work_struct *work);
|
|
|
|
|
|
|
|
enum mcryptd_req_type {
|
|
|
|
MCRYPTD_NONE,
|
|
|
|
MCRYPTD_UPDATE,
|
|
|
|
MCRYPTD_FINUP,
|
|
|
|
MCRYPTD_DIGEST,
|
|
|
|
MCRYPTD_FINAL
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mcryptd_alg_cstate {
|
|
|
|
unsigned long next_flush;
|
|
|
|
unsigned next_seq_num;
|
|
|
|
bool flusher_engaged;
|
|
|
|
struct delayed_work flush;
|
|
|
|
int cpu;
|
|
|
|
struct mcryptd_alg_state *alg_state;
|
|
|
|
void *mgr;
|
|
|
|
spinlock_t work_lock;
|
|
|
|
struct list_head work_list;
|
|
|
|
struct list_head flush_list;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mcryptd_alg_state {
|
|
|
|
struct mcryptd_alg_cstate __percpu *alg_cstate;
|
|
|
|
unsigned long (*flusher)(struct mcryptd_alg_cstate *cstate);
|
|
|
|
};
|
|
|
|
|
|
|
|
/* return delay in jiffies from current time */
|
|
|
|
static inline unsigned long get_delay(unsigned long t)
|
|
|
|
{
|
|
|
|
long delay;
|
|
|
|
|
|
|
|
delay = (long) t - (long) jiffies;
|
|
|
|
if (delay <= 0)
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return (unsigned long) delay;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay);
|
|
|
|
|
|
|
|
#endif
|