Blame view

include/crypto/hash.h 8.82 KB
18e33e6d5   Herbert Xu   crypto: hash - Mo...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*
   * Hash: Hash algorithms under the crypto API
   * 
   * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License as published by the Free
   * Software Foundation; either version 2 of the License, or (at your option) 
   * any later version.
   *
   */
  
  #ifndef _CRYPTO_HASH_H
  #define _CRYPTO_HASH_H
  
  #include <linux/crypto.h>
88056ec34   Herbert Xu   crypto: ahash - C...
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  struct crypto_ahash;
  
  struct hash_alg_common {
  	unsigned int digestsize;
  	unsigned int statesize;
  
  	struct crypto_alg base;
  };
  
  struct ahash_request {
  	struct crypto_async_request base;
  
  	unsigned int nbytes;
  	struct scatterlist *src;
  	u8 *result;
66f6ce5e5   Herbert Xu   crypto: ahash - A...
32
33
  	/* This field may only be used by the ahash API code. */
  	void *priv;
88056ec34   Herbert Xu   crypto: ahash - C...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  	void *__ctx[] CRYPTO_MINALIGN_ATTR;
  };
  
  struct ahash_alg {
  	int (*init)(struct ahash_request *req);
  	int (*update)(struct ahash_request *req);
  	int (*final)(struct ahash_request *req);
  	int (*finup)(struct ahash_request *req);
  	int (*digest)(struct ahash_request *req);
  	int (*export)(struct ahash_request *req, void *out);
  	int (*import)(struct ahash_request *req, const void *in);
  	int (*setkey)(struct crypto_ahash *tfm, const u8 *key,
  		      unsigned int keylen);
  
  	struct hash_alg_common halg;
  };
7b5a080b3   Herbert Xu   crypto: hash - Ad...
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  struct shash_desc {
  	struct crypto_shash *tfm;
  	u32 flags;
  
  	void *__ctx[] CRYPTO_MINALIGN_ATTR;
  };
  
  struct shash_alg {
  	int (*init)(struct shash_desc *desc);
  	int (*update)(struct shash_desc *desc, const u8 *data,
  		      unsigned int len);
  	int (*final)(struct shash_desc *desc, u8 *out);
  	int (*finup)(struct shash_desc *desc, const u8 *data,
  		     unsigned int len, u8 *out);
  	int (*digest)(struct shash_desc *desc, const u8 *data,
  		      unsigned int len, u8 *out);
99d27e1c5   Herbert Xu   crypto: shash - E...
66
67
  	int (*export)(struct shash_desc *desc, void *out);
  	int (*import)(struct shash_desc *desc, const void *in);
7b5a080b3   Herbert Xu   crypto: hash - Ad...
68
69
70
71
  	int (*setkey)(struct crypto_shash *tfm, const u8 *key,
  		      unsigned int keylen);
  
  	unsigned int descsize;
88056ec34   Herbert Xu   crypto: ahash - C...
72
73
  
  	/* These fields must match hash_alg_common. */
fa6496647   Herbert Xu   crypto: shash - F...
74
75
  	unsigned int digestsize
  		__attribute__ ((aligned(__alignof__(struct hash_alg_common))));
99d27e1c5   Herbert Xu   crypto: shash - E...
76
  	unsigned int statesize;
7b5a080b3   Herbert Xu   crypto: hash - Ad...
77
78
79
  
  	struct crypto_alg base;
  };
18e33e6d5   Herbert Xu   crypto: hash - Mo...
80
  struct crypto_ahash {
88056ec34   Herbert Xu   crypto: ahash - C...
81
82
83
84
85
86
87
88
89
  	int (*init)(struct ahash_request *req);
  	int (*update)(struct ahash_request *req);
  	int (*final)(struct ahash_request *req);
  	int (*finup)(struct ahash_request *req);
  	int (*digest)(struct ahash_request *req);
  	int (*export)(struct ahash_request *req, void *out);
  	int (*import)(struct ahash_request *req, const void *in);
  	int (*setkey)(struct crypto_ahash *tfm, const u8 *key,
  		      unsigned int keylen);
88056ec34   Herbert Xu   crypto: ahash - C...
90
  	unsigned int reqsize;
18e33e6d5   Herbert Xu   crypto: hash - Mo...
91
92
  	struct crypto_tfm base;
  };
7b5a080b3   Herbert Xu   crypto: hash - Ad...
93
  struct crypto_shash {
113adefc7   Herbert Xu   crypto: shash - M...
94
  	unsigned int descsize;
7b5a080b3   Herbert Xu   crypto: hash - Ad...
95
96
  	struct crypto_tfm base;
  };
18e33e6d5   Herbert Xu   crypto: hash - Mo...
97
98
  static inline struct crypto_ahash *__crypto_ahash_cast(struct crypto_tfm *tfm)
  {
88056ec34   Herbert Xu   crypto: ahash - C...
99
  	return container_of(tfm, struct crypto_ahash, base);
18e33e6d5   Herbert Xu   crypto: hash - Mo...
100
  }
88056ec34   Herbert Xu   crypto: ahash - C...
101
102
  struct crypto_ahash *crypto_alloc_ahash(const char *alg_name, u32 type,
  					u32 mask);
18e33e6d5   Herbert Xu   crypto: hash - Mo...
103
104
105
106
107
108
109
110
  
  static inline struct crypto_tfm *crypto_ahash_tfm(struct crypto_ahash *tfm)
  {
  	return &tfm->base;
  }
  
  static inline void crypto_free_ahash(struct crypto_ahash *tfm)
  {
88056ec34   Herbert Xu   crypto: ahash - C...
111
  	crypto_destroy_tfm(tfm, crypto_ahash_tfm(tfm));
18e33e6d5   Herbert Xu   crypto: hash - Mo...
112
113
114
115
116
117
118
  }
  
  static inline unsigned int crypto_ahash_alignmask(
  	struct crypto_ahash *tfm)
  {
  	return crypto_tfm_alg_alignmask(crypto_ahash_tfm(tfm));
  }
88056ec34   Herbert Xu   crypto: ahash - C...
119
120
121
122
123
124
125
126
  static inline struct hash_alg_common *__crypto_hash_alg_common(
  	struct crypto_alg *alg)
  {
  	return container_of(alg, struct hash_alg_common, base);
  }
  
  static inline struct hash_alg_common *crypto_hash_alg_common(
  	struct crypto_ahash *tfm)
18e33e6d5   Herbert Xu   crypto: hash - Mo...
127
  {
88056ec34   Herbert Xu   crypto: ahash - C...
128
  	return __crypto_hash_alg_common(crypto_ahash_tfm(tfm)->__crt_alg);
18e33e6d5   Herbert Xu   crypto: hash - Mo...
129
130
131
132
  }
  
  static inline unsigned int crypto_ahash_digestsize(struct crypto_ahash *tfm)
  {
500b3e3c3   Herbert Xu   crypto: ahash - R...
133
  	return crypto_hash_alg_common(tfm)->digestsize;
88056ec34   Herbert Xu   crypto: ahash - C...
134
135
136
137
138
  }
  
  static inline unsigned int crypto_ahash_statesize(struct crypto_ahash *tfm)
  {
  	return crypto_hash_alg_common(tfm)->statesize;
18e33e6d5   Herbert Xu   crypto: hash - Mo...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  }
  
  static inline u32 crypto_ahash_get_flags(struct crypto_ahash *tfm)
  {
  	return crypto_tfm_get_flags(crypto_ahash_tfm(tfm));
  }
  
  static inline void crypto_ahash_set_flags(struct crypto_ahash *tfm, u32 flags)
  {
  	crypto_tfm_set_flags(crypto_ahash_tfm(tfm), flags);
  }
  
  static inline void crypto_ahash_clear_flags(struct crypto_ahash *tfm, u32 flags)
  {
  	crypto_tfm_clear_flags(crypto_ahash_tfm(tfm), flags);
  }
  
  static inline struct crypto_ahash *crypto_ahash_reqtfm(
  	struct ahash_request *req)
  {
  	return __crypto_ahash_cast(req->base.tfm);
  }
  
  static inline unsigned int crypto_ahash_reqsize(struct crypto_ahash *tfm)
  {
88056ec34   Herbert Xu   crypto: ahash - C...
164
  	return tfm->reqsize;
18e33e6d5   Herbert Xu   crypto: hash - Mo...
165
  }
dec8b7860   Herbert Xu   crypto: hash - Ad...
166
167
168
169
  static inline void *ahash_request_ctx(struct ahash_request *req)
  {
  	return req->__ctx;
  }
66f6ce5e5   Herbert Xu   crypto: ahash - A...
170
171
172
173
174
  int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
  			unsigned int keylen);
  int crypto_ahash_finup(struct ahash_request *req);
  int crypto_ahash_final(struct ahash_request *req);
  int crypto_ahash_digest(struct ahash_request *req);
18e33e6d5   Herbert Xu   crypto: hash - Mo...
175

88056ec34   Herbert Xu   crypto: ahash - C...
176
  static inline int crypto_ahash_export(struct ahash_request *req, void *out)
dec8b7860   Herbert Xu   crypto: hash - Ad...
177
  {
88056ec34   Herbert Xu   crypto: ahash - C...
178
  	return crypto_ahash_reqtfm(req)->export(req, out);
dec8b7860   Herbert Xu   crypto: hash - Ad...
179
  }
88056ec34   Herbert Xu   crypto: ahash - C...
180
181
182
183
  static inline int crypto_ahash_import(struct ahash_request *req, const void *in)
  {
  	return crypto_ahash_reqtfm(req)->import(req, in);
  }
dec8b7860   Herbert Xu   crypto: hash - Ad...
184

318e53139   Herbert Xu   crypto: hash - Ad...
185
186
  static inline int crypto_ahash_init(struct ahash_request *req)
  {
88056ec34   Herbert Xu   crypto: ahash - C...
187
  	return crypto_ahash_reqtfm(req)->init(req);
318e53139   Herbert Xu   crypto: hash - Ad...
188
189
190
191
  }
  
  static inline int crypto_ahash_update(struct ahash_request *req)
  {
88056ec34   Herbert Xu   crypto: ahash - C...
192
  	return crypto_ahash_reqtfm(req)->update(req);
318e53139   Herbert Xu   crypto: hash - Ad...
193
  }
18e33e6d5   Herbert Xu   crypto: hash - Mo...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  static inline void ahash_request_set_tfm(struct ahash_request *req,
  					 struct crypto_ahash *tfm)
  {
  	req->base.tfm = crypto_ahash_tfm(tfm);
  }
  
  static inline struct ahash_request *ahash_request_alloc(
  	struct crypto_ahash *tfm, gfp_t gfp)
  {
  	struct ahash_request *req;
  
  	req = kmalloc(sizeof(struct ahash_request) +
  		      crypto_ahash_reqsize(tfm), gfp);
  
  	if (likely(req))
  		ahash_request_set_tfm(req, tfm);
  
  	return req;
  }
  
  static inline void ahash_request_free(struct ahash_request *req)
  {
aef73cfcb   Herbert Xu   crypto: async - U...
216
  	kzfree(req);
18e33e6d5   Herbert Xu   crypto: hash - Mo...
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
  }
  
  static inline struct ahash_request *ahash_request_cast(
  	struct crypto_async_request *req)
  {
  	return container_of(req, struct ahash_request, base);
  }
  
  static inline void ahash_request_set_callback(struct ahash_request *req,
  					      u32 flags,
  					      crypto_completion_t complete,
  					      void *data)
  {
  	req->base.complete = complete;
  	req->base.data = data;
  	req->base.flags = flags;
  }
  
  static inline void ahash_request_set_crypt(struct ahash_request *req,
  					   struct scatterlist *src, u8 *result,
  					   unsigned int nbytes)
  {
  	req->src = src;
  	req->nbytes = nbytes;
  	req->result = result;
  }
7b5a080b3   Herbert Xu   crypto: hash - Ad...
243
244
245
246
247
248
249
250
251
252
  struct crypto_shash *crypto_alloc_shash(const char *alg_name, u32 type,
  					u32 mask);
  
  static inline struct crypto_tfm *crypto_shash_tfm(struct crypto_shash *tfm)
  {
  	return &tfm->base;
  }
  
  static inline void crypto_free_shash(struct crypto_shash *tfm)
  {
412e87ae5   Herbert Xu   crypto: shash - F...
253
  	crypto_destroy_tfm(tfm, crypto_shash_tfm(tfm));
7b5a080b3   Herbert Xu   crypto: hash - Ad...
254
255
256
257
258
259
260
  }
  
  static inline unsigned int crypto_shash_alignmask(
  	struct crypto_shash *tfm)
  {
  	return crypto_tfm_alg_alignmask(crypto_shash_tfm(tfm));
  }
974959863   Herbert Xu   crypto: shash - A...
261
262
263
264
  static inline unsigned int crypto_shash_blocksize(struct crypto_shash *tfm)
  {
  	return crypto_tfm_alg_blocksize(crypto_shash_tfm(tfm));
  }
7b5a080b3   Herbert Xu   crypto: hash - Ad...
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  static inline struct shash_alg *__crypto_shash_alg(struct crypto_alg *alg)
  {
  	return container_of(alg, struct shash_alg, base);
  }
  
  static inline struct shash_alg *crypto_shash_alg(struct crypto_shash *tfm)
  {
  	return __crypto_shash_alg(crypto_shash_tfm(tfm)->__crt_alg);
  }
  
  static inline unsigned int crypto_shash_digestsize(struct crypto_shash *tfm)
  {
  	return crypto_shash_alg(tfm)->digestsize;
  }
99d27e1c5   Herbert Xu   crypto: shash - E...
279
280
281
282
  static inline unsigned int crypto_shash_statesize(struct crypto_shash *tfm)
  {
  	return crypto_shash_alg(tfm)->statesize;
  }
7b5a080b3   Herbert Xu   crypto: hash - Ad...
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
  static inline u32 crypto_shash_get_flags(struct crypto_shash *tfm)
  {
  	return crypto_tfm_get_flags(crypto_shash_tfm(tfm));
  }
  
  static inline void crypto_shash_set_flags(struct crypto_shash *tfm, u32 flags)
  {
  	crypto_tfm_set_flags(crypto_shash_tfm(tfm), flags);
  }
  
  static inline void crypto_shash_clear_flags(struct crypto_shash *tfm, u32 flags)
  {
  	crypto_tfm_clear_flags(crypto_shash_tfm(tfm), flags);
  }
  
  static inline unsigned int crypto_shash_descsize(struct crypto_shash *tfm)
  {
113adefc7   Herbert Xu   crypto: shash - M...
300
  	return tfm->descsize;
7b5a080b3   Herbert Xu   crypto: hash - Ad...
301
302
303
304
305
306
307
308
309
310
311
  }
  
  static inline void *shash_desc_ctx(struct shash_desc *desc)
  {
  	return desc->__ctx;
  }
  
  int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key,
  			unsigned int keylen);
  int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
  			unsigned int len, u8 *out);
99d27e1c5   Herbert Xu   crypto: shash - E...
312
  static inline int crypto_shash_export(struct shash_desc *desc, void *out)
dec8b7860   Herbert Xu   crypto: hash - Ad...
313
  {
99d27e1c5   Herbert Xu   crypto: shash - E...
314
  	return crypto_shash_alg(desc->tfm)->export(desc, out);
dec8b7860   Herbert Xu   crypto: hash - Ad...
315
  }
99d27e1c5   Herbert Xu   crypto: shash - E...
316
317
318
319
  static inline int crypto_shash_import(struct shash_desc *desc, const void *in)
  {
  	return crypto_shash_alg(desc->tfm)->import(desc, in);
  }
dec8b7860   Herbert Xu   crypto: hash - Ad...
320

7b5a080b3   Herbert Xu   crypto: hash - Ad...
321
322
323
324
325
326
327
328
329
330
  static inline int crypto_shash_init(struct shash_desc *desc)
  {
  	return crypto_shash_alg(desc->tfm)->init(desc);
  }
  
  int crypto_shash_update(struct shash_desc *desc, const u8 *data,
  			unsigned int len);
  int crypto_shash_final(struct shash_desc *desc, u8 *out);
  int crypto_shash_finup(struct shash_desc *desc, const u8 *data,
  		       unsigned int len, u8 *out);
18e33e6d5   Herbert Xu   crypto: hash - Mo...
331
  #endif	/* _CRYPTO_HASH_H */