hc
2023-11-22 f743a7adbd6e230d66a6206fa115b59fec2d88eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * 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;
   spinlock_t q_lock;
   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 {
   struct crypto_ahash *child;
   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;
   struct ahash_request areq;
};
 
struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name,
                   u32 type, u32 mask);
struct crypto_ahash *mcryptd_ahash_child(struct mcryptd_ahash *tfm);
struct ahash_request *mcryptd_ahash_desc(struct ahash_request *req);
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