Blame view

include/linux/crypto.h 32.3 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  /*
   * Scatterlist Cryptographic API.
   *
   * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
   * Copyright (c) 2002 David S. Miller (davem@redhat.com)
5cb1454b8   Herbert Xu   [CRYPTO] Allow mu...
6
   * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
   *
   * Portions derived from Cryptoapi, by Alexander Kjeldaas <astor@fast.no>
18735dd8d   John Anthony Kazos Jr   crypto: convert c...
9
   * and Nettle, by Niels Möller.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
14
15
16
17
18
   * 
   * 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 _LINUX_CRYPTO_H
  #define _LINUX_CRYPTO_H
60063497a   Arun Sharma   atomic: use <linu...
19
  #include <linux/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  #include <linux/list.h>
799111020   Herbert Xu   [CRYPTO] api: Fix...
22
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  #include <linux/string.h>
799111020   Herbert Xu   [CRYPTO] api: Fix...
24
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
  
  /*
   * Algorithm masks and types.
   */
2825982d9   Herbert Xu   [CRYPTO] api: Add...
29
  #define CRYPTO_ALG_TYPE_MASK		0x0000000f
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  #define CRYPTO_ALG_TYPE_CIPHER		0x00000001
004a403c2   Loc Ho   [CRYPTO] hash: Ad...
31
32
  #define CRYPTO_ALG_TYPE_COMPRESS	0x00000002
  #define CRYPTO_ALG_TYPE_AEAD		0x00000003
055bcee31   Herbert Xu   [CRYPTO] digest: ...
33
  #define CRYPTO_ALG_TYPE_BLKCIPHER	0x00000004
332f8840f   Herbert Xu   [CRYPTO] ablkciph...
34
  #define CRYPTO_ALG_TYPE_ABLKCIPHER	0x00000005
61da88e2b   Herbert Xu   [CRYPTO] skcipher...
35
  #define CRYPTO_ALG_TYPE_GIVCIPHER	0x00000006
004a403c2   Loc Ho   [CRYPTO] hash: Ad...
36
  #define CRYPTO_ALG_TYPE_DIGEST		0x00000008
5f7082ed4   Herbert Xu   crypto: hash - Ex...
37
38
  #define CRYPTO_ALG_TYPE_HASH		0x00000008
  #define CRYPTO_ALG_TYPE_SHASH		0x00000009
004a403c2   Loc Ho   [CRYPTO] hash: Ad...
39
  #define CRYPTO_ALG_TYPE_AHASH		0x0000000a
17f0f4a47   Neil Horman   crypto: rng - RNG...
40
  #define CRYPTO_ALG_TYPE_RNG		0x0000000c
a1d2f0954   Geert Uytterhoeven   crypto: compress ...
41
  #define CRYPTO_ALG_TYPE_PCOMPRESS	0x0000000f
055bcee31   Herbert Xu   [CRYPTO] digest: ...
42
43
  
  #define CRYPTO_ALG_TYPE_HASH_MASK	0x0000000e
004a403c2   Loc Ho   [CRYPTO] hash: Ad...
44
  #define CRYPTO_ALG_TYPE_AHASH_MASK	0x0000000c
332f8840f   Herbert Xu   [CRYPTO] ablkciph...
45
  #define CRYPTO_ALG_TYPE_BLKCIPHER_MASK	0x0000000c
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46

2825982d9   Herbert Xu   [CRYPTO] api: Add...
47
  #define CRYPTO_ALG_LARVAL		0x00000010
6bfd48096   Herbert Xu   [CRYPTO] api: Add...
48
49
  #define CRYPTO_ALG_DEAD			0x00000020
  #define CRYPTO_ALG_DYING		0x00000040
f3f632d61   Herbert Xu   [CRYPTO] api: Add...
50
  #define CRYPTO_ALG_ASYNC		0x00000080
2825982d9   Herbert Xu   [CRYPTO] api: Add...
51

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  /*
6010439f4   Herbert Xu   [CRYPTO] padlock:...
53
54
55
56
57
58
   * Set this bit if and only if the algorithm requires another algorithm of
   * the same type to handle corner cases.
   */
  #define CRYPTO_ALG_NEED_FALLBACK	0x00000100
  
  /*
ecfc43292   Herbert Xu   [CRYPTO] skcipher...
59
60
61
62
63
64
   * This bit is set for symmetric key ciphers that have already been wrapped
   * with a generic IV generator to prevent them from being wrapped again.
   */
  #define CRYPTO_ALG_GENIV		0x00000200
  
  /*
73d3864a4   Herbert Xu   crypto: api - Use...
65
66
67
68
69
70
71
72
   * Set if the algorithm has passed automated run-time testing.  Note that
   * if there is no run-time testing for a given algorithm it is considered
   * to have passed.
   */
  
  #define CRYPTO_ALG_TESTED		0x00000400
  
  /*
64a947b13   Steffen Klassert   crypto: Add a fla...
73
74
75
76
77
   * Set if the algorithm is an instance that is build from templates.
   */
  #define CRYPTO_ALG_INSTANCE		0x00000800
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
   * Transform masks and values (for crt_flags).
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
  #define CRYPTO_TFM_REQ_MASK		0x000fff00
  #define CRYPTO_TFM_RES_MASK		0xfff00000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
  #define CRYPTO_TFM_REQ_WEAK_KEY		0x00000100
64baf3cfe   Herbert Xu   [CRYPTO]: Added C...
83
  #define CRYPTO_TFM_REQ_MAY_SLEEP	0x00000200
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
84
  #define CRYPTO_TFM_REQ_MAY_BACKLOG	0x00000400
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
87
88
89
90
91
92
93
  #define CRYPTO_TFM_RES_WEAK_KEY		0x00100000
  #define CRYPTO_TFM_RES_BAD_KEY_LEN   	0x00200000
  #define CRYPTO_TFM_RES_BAD_KEY_SCHED 	0x00400000
  #define CRYPTO_TFM_RES_BAD_BLOCK_LEN 	0x00800000
  #define CRYPTO_TFM_RES_BAD_FLAGS 	0x01000000
  
  /*
   * Miscellaneous stuff.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
  #define CRYPTO_MAX_ALG_NAME		64
799111020   Herbert Xu   [CRYPTO] api: Fix...
95
96
97
98
99
100
101
102
  /*
   * The macro CRYPTO_MINALIGN_ATTR (along with the void * type in the actual
   * declaration) is used to ensure that the crypto_tfm context structure is
   * aligned correctly for the given architecture so that there are no alignment
   * faults for C data types.  In particular, this is required on platforms such
   * as arm where pointers are 32-bit aligned but there are data types such as
   * u64 which require 64-bit alignment.
   */
799111020   Herbert Xu   [CRYPTO] api: Fix...
103
  #define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN
799111020   Herbert Xu   [CRYPTO] api: Fix...
104

799111020   Herbert Xu   [CRYPTO] api: Fix...
105
  #define CRYPTO_MINALIGN_ATTR __attribute__ ((__aligned__(CRYPTO_MINALIGN)))
799111020   Herbert Xu   [CRYPTO] api: Fix...
106

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
  struct scatterlist;
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
108
109
  struct crypto_ablkcipher;
  struct crypto_async_request;
1ae978208   Herbert Xu   [CRYPTO] api: Add...
110
  struct crypto_aead;
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
111
  struct crypto_blkcipher;
055bcee31   Herbert Xu   [CRYPTO] digest: ...
112
  struct crypto_hash;
17f0f4a47   Neil Horman   crypto: rng - RNG...
113
  struct crypto_rng;
40725181b   Herbert Xu   [CRYPTO] Add supp...
114
  struct crypto_tfm;
e853c3cfa   Herbert Xu   [CRYPTO] api: Add...
115
  struct crypto_type;
743edf572   Herbert Xu   [CRYPTO] aead: Ad...
116
  struct aead_givcrypt_request;
61da88e2b   Herbert Xu   [CRYPTO] skcipher...
117
  struct skcipher_givcrypt_request;
40725181b   Herbert Xu   [CRYPTO] Add supp...
118

32e3983fe   Herbert Xu   [CRYPTO] api: Add...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
  typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err);
  
  struct crypto_async_request {
  	struct list_head list;
  	crypto_completion_t complete;
  	void *data;
  	struct crypto_tfm *tfm;
  
  	u32 flags;
  };
  
  struct ablkcipher_request {
  	struct crypto_async_request base;
  
  	unsigned int nbytes;
  
  	void *info;
  
  	struct scatterlist *src;
  	struct scatterlist *dst;
  
  	void *__ctx[] CRYPTO_MINALIGN_ATTR;
  };
1ae978208   Herbert Xu   [CRYPTO] api: Add...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  /**
   *	struct aead_request - AEAD request
   *	@base: Common attributes for async crypto requests
   *	@assoclen: Length in bytes of associated data for authentication
   *	@cryptlen: Length of data to be encrypted or decrypted
   *	@iv: Initialisation vector
   *	@assoc: Associated data
   *	@src: Source data
   *	@dst: Destination data
   *	@__ctx: Start of private context data
   */
  struct aead_request {
  	struct crypto_async_request base;
  
  	unsigned int assoclen;
  	unsigned int cryptlen;
  
  	u8 *iv;
  
  	struct scatterlist *assoc;
  	struct scatterlist *src;
  	struct scatterlist *dst;
  
  	void *__ctx[] CRYPTO_MINALIGN_ATTR;
  };
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
167
168
169
170
171
  struct blkcipher_desc {
  	struct crypto_blkcipher *tfm;
  	void *info;
  	u32 flags;
  };
40725181b   Herbert Xu   [CRYPTO] Add supp...
172
173
  struct cipher_desc {
  	struct crypto_tfm *tfm;
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
174
  	void (*crfn)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
40725181b   Herbert Xu   [CRYPTO] Add supp...
175
176
177
178
  	unsigned int (*prfn)(const struct cipher_desc *desc, u8 *dst,
  			     const u8 *src, unsigned int nbytes);
  	void *info;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179

055bcee31   Herbert Xu   [CRYPTO] digest: ...
180
181
182
183
  struct hash_desc {
  	struct crypto_hash *tfm;
  	u32 flags;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
185
186
187
  /*
   * Algorithms: modular crypto algorithm implementations, managed
   * via crypto_register_alg() and crypto_unregister_alg().
   */
b5b7f0886   Herbert Xu   [CRYPTO] api: Add...
188
189
190
191
192
  struct ablkcipher_alg {
  	int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key,
  	              unsigned int keylen);
  	int (*encrypt)(struct ablkcipher_request *req);
  	int (*decrypt)(struct ablkcipher_request *req);
61da88e2b   Herbert Xu   [CRYPTO] skcipher...
193
194
  	int (*givencrypt)(struct skcipher_givcrypt_request *req);
  	int (*givdecrypt)(struct skcipher_givcrypt_request *req);
b5b7f0886   Herbert Xu   [CRYPTO] api: Add...
195

23508e11a   Herbert Xu   [CRYPTO] skcipher...
196
  	const char *geniv;
b5b7f0886   Herbert Xu   [CRYPTO] api: Add...
197
198
199
200
  	unsigned int min_keysize;
  	unsigned int max_keysize;
  	unsigned int ivsize;
  };
1ae978208   Herbert Xu   [CRYPTO] api: Add...
201
202
203
  struct aead_alg {
  	int (*setkey)(struct crypto_aead *tfm, const u8 *key,
  	              unsigned int keylen);
7ba683a6d   Herbert Xu   [CRYPTO] aead: Ma...
204
  	int (*setauthsize)(struct crypto_aead *tfm, unsigned int authsize);
1ae978208   Herbert Xu   [CRYPTO] api: Add...
205
206
  	int (*encrypt)(struct aead_request *req);
  	int (*decrypt)(struct aead_request *req);
743edf572   Herbert Xu   [CRYPTO] aead: Ad...
207
208
  	int (*givencrypt)(struct aead_givcrypt_request *req);
  	int (*givdecrypt)(struct aead_givcrypt_request *req);
1ae978208   Herbert Xu   [CRYPTO] api: Add...
209

5b6d2d7fd   Herbert Xu   [CRYPTO] aead: Ad...
210
  	const char *geniv;
1ae978208   Herbert Xu   [CRYPTO] api: Add...
211
  	unsigned int ivsize;
7ba683a6d   Herbert Xu   [CRYPTO] aead: Ma...
212
  	unsigned int maxauthsize;
1ae978208   Herbert Xu   [CRYPTO] api: Add...
213
  };
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
214
215
216
217
218
219
220
221
222
  struct blkcipher_alg {
  	int (*setkey)(struct crypto_tfm *tfm, const u8 *key,
  	              unsigned int keylen);
  	int (*encrypt)(struct blkcipher_desc *desc,
  		       struct scatterlist *dst, struct scatterlist *src,
  		       unsigned int nbytes);
  	int (*decrypt)(struct blkcipher_desc *desc,
  		       struct scatterlist *dst, struct scatterlist *src,
  		       unsigned int nbytes);
23508e11a   Herbert Xu   [CRYPTO] skcipher...
223
  	const char *geniv;
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
224
225
226
227
  	unsigned int min_keysize;
  	unsigned int max_keysize;
  	unsigned int ivsize;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
229
230
  struct cipher_alg {
  	unsigned int cia_min_keysize;
  	unsigned int cia_max_keysize;
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
231
  	int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key,
560c06ae1   Herbert Xu   [CRYPTO] api: Get...
232
  	                  unsigned int keylen);
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
233
234
  	void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
  	void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
  struct compress_alg {
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
237
238
239
240
  	int (*coa_compress)(struct crypto_tfm *tfm, const u8 *src,
  			    unsigned int slen, u8 *dst, unsigned int *dlen);
  	int (*coa_decompress)(struct crypto_tfm *tfm, const u8 *src,
  			      unsigned int slen, u8 *dst, unsigned int *dlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241
  };
17f0f4a47   Neil Horman   crypto: rng - RNG...
242
243
244
245
246
247
248
  struct rng_alg {
  	int (*rng_make_random)(struct crypto_rng *tfm, u8 *rdata,
  			       unsigned int dlen);
  	int (*rng_reset)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
  
  	unsigned int seedsize;
  };
b5b7f0886   Herbert Xu   [CRYPTO] api: Add...
249
  #define cra_ablkcipher	cra_u.ablkcipher
1ae978208   Herbert Xu   [CRYPTO] api: Add...
250
  #define cra_aead	cra_u.aead
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
251
  #define cra_blkcipher	cra_u.blkcipher
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
252
  #define cra_cipher	cra_u.cipher
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
  #define cra_compress	cra_u.compress
17f0f4a47   Neil Horman   crypto: rng - RNG...
254
  #define cra_rng		cra_u.rng
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
257
  
  struct crypto_alg {
  	struct list_head cra_list;
6bfd48096   Herbert Xu   [CRYPTO] api: Add...
258
  	struct list_head cra_users;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
260
261
  	u32 cra_flags;
  	unsigned int cra_blocksize;
  	unsigned int cra_ctxsize;
954773779   Herbert Xu   [CRYPTO] Add alig...
262
  	unsigned int cra_alignmask;
5cb1454b8   Herbert Xu   [CRYPTO] Allow mu...
263
264
  
  	int cra_priority;
6521f3027   Herbert Xu   [CRYPTO] api: Add...
265
  	atomic_t cra_refcnt;
5cb1454b8   Herbert Xu   [CRYPTO] Allow mu...
266

d913ea0d6   Herbert Xu   [CRYPTO] api: Rem...
267
268
  	char cra_name[CRYPTO_MAX_ALG_NAME];
  	char cra_driver_name[CRYPTO_MAX_ALG_NAME];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269

e853c3cfa   Herbert Xu   [CRYPTO] api: Add...
270
  	const struct crypto_type *cra_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
  	union {
b5b7f0886   Herbert Xu   [CRYPTO] api: Add...
272
  		struct ablkcipher_alg ablkcipher;
1ae978208   Herbert Xu   [CRYPTO] api: Add...
273
  		struct aead_alg aead;
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
274
  		struct blkcipher_alg blkcipher;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
  		struct cipher_alg cipher;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
  		struct compress_alg compress;
17f0f4a47   Neil Horman   crypto: rng - RNG...
277
  		struct rng_alg rng;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
  	} cra_u;
c7fc05992   Herbert Xu   [CRYPTO] api: Add...
279
280
281
  
  	int (*cra_init)(struct crypto_tfm *tfm);
  	void (*cra_exit)(struct crypto_tfm *tfm);
6521f3027   Herbert Xu   [CRYPTO] api: Add...
282
  	void (*cra_destroy)(struct crypto_alg *alg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
285
286
287
288
289
290
291
292
293
294
295
  	
  	struct module *cra_module;
  };
  
  /*
   * Algorithm registration interface.
   */
  int crypto_register_alg(struct crypto_alg *alg);
  int crypto_unregister_alg(struct crypto_alg *alg);
  
  /*
   * Algorithm query interface.
   */
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
296
  int crypto_has_alg(const char *name, u32 type, u32 mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
298
299
  
  /*
   * Transforms: user-instantiated objects which encapsulate algorithms
6d7d684d6   Herbert Xu   [CRYPTO] api: Add...
300
301
   * and core processing logic.  Managed via crypto_alloc_*() and
   * crypto_free_*(), as well as the various helpers below.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303

32e3983fe   Herbert Xu   [CRYPTO] api: Add...
304
305
306
307
308
  struct ablkcipher_tfm {
  	int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key,
  	              unsigned int keylen);
  	int (*encrypt)(struct ablkcipher_request *req);
  	int (*decrypt)(struct ablkcipher_request *req);
61da88e2b   Herbert Xu   [CRYPTO] skcipher...
309
310
  	int (*givencrypt)(struct skcipher_givcrypt_request *req);
  	int (*givdecrypt)(struct skcipher_givcrypt_request *req);
ecfc43292   Herbert Xu   [CRYPTO] skcipher...
311
  	struct crypto_ablkcipher *base;
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
312
313
314
  	unsigned int ivsize;
  	unsigned int reqsize;
  };
1ae978208   Herbert Xu   [CRYPTO] api: Add...
315
316
317
318
319
  struct aead_tfm {
  	int (*setkey)(struct crypto_aead *tfm, const u8 *key,
  	              unsigned int keylen);
  	int (*encrypt)(struct aead_request *req);
  	int (*decrypt)(struct aead_request *req);
743edf572   Herbert Xu   [CRYPTO] aead: Ad...
320
321
  	int (*givencrypt)(struct aead_givcrypt_request *req);
  	int (*givdecrypt)(struct aead_givcrypt_request *req);
5b6d2d7fd   Herbert Xu   [CRYPTO] aead: Ad...
322
323
  
  	struct crypto_aead *base;
1ae978208   Herbert Xu   [CRYPTO] api: Add...
324
325
326
327
  	unsigned int ivsize;
  	unsigned int authsize;
  	unsigned int reqsize;
  };
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
328
329
330
331
332
333
334
335
336
  struct blkcipher_tfm {
  	void *iv;
  	int (*setkey)(struct crypto_tfm *tfm, const u8 *key,
  		      unsigned int keylen);
  	int (*encrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,
  		       struct scatterlist *src, unsigned int nbytes);
  	int (*decrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,
  		       struct scatterlist *src, unsigned int nbytes);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
  struct cipher_tfm {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
339
  	int (*cit_setkey)(struct crypto_tfm *tfm,
  	                  const u8 *key, unsigned int keylen);
f28776a36   Herbert Xu   [CRYPTO] cipher: ...
340
341
  	void (*cit_encrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
  	void (*cit_decrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
342
  };
055bcee31   Herbert Xu   [CRYPTO] digest: ...
343
344
345
346
347
348
349
350
351
  struct hash_tfm {
  	int (*init)(struct hash_desc *desc);
  	int (*update)(struct hash_desc *desc,
  		      struct scatterlist *sg, unsigned int nsg);
  	int (*final)(struct hash_desc *desc, u8 *out);
  	int (*digest)(struct hash_desc *desc, struct scatterlist *sg,
  		      unsigned int nsg, u8 *out);
  	int (*setkey)(struct crypto_hash *tfm, const u8 *key,
  		      unsigned int keylen);
055bcee31   Herbert Xu   [CRYPTO] digest: ...
352
  	unsigned int digestsize;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
354
355
356
357
358
359
360
361
362
  };
  
  struct compress_tfm {
  	int (*cot_compress)(struct crypto_tfm *tfm,
  	                    const u8 *src, unsigned int slen,
  	                    u8 *dst, unsigned int *dlen);
  	int (*cot_decompress)(struct crypto_tfm *tfm,
  	                      const u8 *src, unsigned int slen,
  	                      u8 *dst, unsigned int *dlen);
  };
17f0f4a47   Neil Horman   crypto: rng - RNG...
363
364
365
366
367
  struct rng_tfm {
  	int (*rng_gen_random)(struct crypto_rng *tfm, u8 *rdata,
  			      unsigned int dlen);
  	int (*rng_reset)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
  };
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
368
  #define crt_ablkcipher	crt_u.ablkcipher
1ae978208   Herbert Xu   [CRYPTO] api: Add...
369
  #define crt_aead	crt_u.aead
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
370
  #define crt_blkcipher	crt_u.blkcipher
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371
  #define crt_cipher	crt_u.cipher
055bcee31   Herbert Xu   [CRYPTO] digest: ...
372
  #define crt_hash	crt_u.hash
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
  #define crt_compress	crt_u.compress
17f0f4a47   Neil Horman   crypto: rng - RNG...
374
  #define crt_rng		crt_u.rng
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
375
376
377
378
379
380
  
  struct crypto_tfm {
  
  	u32 crt_flags;
  	
  	union {
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
381
  		struct ablkcipher_tfm ablkcipher;
1ae978208   Herbert Xu   [CRYPTO] api: Add...
382
  		struct aead_tfm aead;
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
383
  		struct blkcipher_tfm blkcipher;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
  		struct cipher_tfm cipher;
055bcee31   Herbert Xu   [CRYPTO] digest: ...
385
  		struct hash_tfm hash;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
  		struct compress_tfm compress;
17f0f4a47   Neil Horman   crypto: rng - RNG...
387
  		struct rng_tfm rng;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388
  	} crt_u;
4a7794860   Herbert Xu   crypto: api - Mov...
389
390
  
  	void (*exit)(struct crypto_tfm *tfm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
392
  	
  	struct crypto_alg *__crt_alg;
f10b7897e   Herbert Xu   [CRYPTO] api: Ali...
393

799111020   Herbert Xu   [CRYPTO] api: Fix...
394
  	void *__crt_ctx[] CRYPTO_MINALIGN_ATTR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
395
  };
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
396
397
398
  struct crypto_ablkcipher {
  	struct crypto_tfm base;
  };
1ae978208   Herbert Xu   [CRYPTO] api: Add...
399
400
401
  struct crypto_aead {
  	struct crypto_tfm base;
  };
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
402
403
404
  struct crypto_blkcipher {
  	struct crypto_tfm base;
  };
78a1fe4f2   Herbert Xu   [CRYPTO] api: Use...
405
406
407
408
409
410
411
  struct crypto_cipher {
  	struct crypto_tfm base;
  };
  
  struct crypto_comp {
  	struct crypto_tfm base;
  };
055bcee31   Herbert Xu   [CRYPTO] digest: ...
412
413
414
  struct crypto_hash {
  	struct crypto_tfm base;
  };
17f0f4a47   Neil Horman   crypto: rng - RNG...
415
416
417
  struct crypto_rng {
  	struct crypto_tfm base;
  };
2b8c19dbd   Herbert Xu   [CRYPTO] api: Add...
418
419
420
  enum {
  	CRYPTOA_UNSPEC,
  	CRYPTOA_ALG,
ebc610e5b   Herbert Xu   [CRYPTO] template...
421
  	CRYPTOA_TYPE,
39e1ee011   Herbert Xu   [CRYPTO] api: Add...
422
  	CRYPTOA_U32,
ebc610e5b   Herbert Xu   [CRYPTO] template...
423
  	__CRYPTOA_MAX,
2b8c19dbd   Herbert Xu   [CRYPTO] api: Add...
424
  };
ebc610e5b   Herbert Xu   [CRYPTO] template...
425
  #define CRYPTOA_MAX (__CRYPTOA_MAX - 1)
39e1ee011   Herbert Xu   [CRYPTO] api: Add...
426
427
  /* Maximum number of (rtattr) parameters for each template. */
  #define CRYPTO_MAX_ATTRS 32
2b8c19dbd   Herbert Xu   [CRYPTO] api: Add...
428
429
430
  struct crypto_attr_alg {
  	char name[CRYPTO_MAX_ALG_NAME];
  };
ebc610e5b   Herbert Xu   [CRYPTO] template...
431
432
433
434
  struct crypto_attr_type {
  	u32 type;
  	u32 mask;
  };
39e1ee011   Herbert Xu   [CRYPTO] api: Add...
435
436
437
  struct crypto_attr_u32 {
  	u32 num;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
439
440
441
  /* 
   * Transform user interface.
   */
   
6d7d684d6   Herbert Xu   [CRYPTO] api: Add...
442
  struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask);
7b2cd92ad   Herbert Xu   crypto: api - Fix...
443
444
445
446
447
448
  void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm);
  
  static inline void crypto_free_tfm(struct crypto_tfm *tfm)
  {
  	return crypto_destroy_tfm(tfm, tfm);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449

da7f033dd   Herbert Xu   crypto: cryptomgr...
450
  int alg_test(const char *driver, const char *alg, u32 type, u32 mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
451
452
453
454
455
456
457
  /*
   * Transform helpers which query the underlying algorithm.
   */
  static inline const char *crypto_tfm_alg_name(struct crypto_tfm *tfm)
  {
  	return tfm->__crt_alg->cra_name;
  }
b14cdd670   Michal Ludvig   [CRYPTO] api: Add...
458
459
460
461
462
463
464
465
466
  static inline const char *crypto_tfm_alg_driver_name(struct crypto_tfm *tfm)
  {
  	return tfm->__crt_alg->cra_driver_name;
  }
  
  static inline int crypto_tfm_alg_priority(struct crypto_tfm *tfm)
  {
  	return tfm->__crt_alg->cra_priority;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
467
468
469
470
  static inline u32 crypto_tfm_alg_type(struct crypto_tfm *tfm)
  {
  	return tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
471
472
473
474
  static inline unsigned int crypto_tfm_alg_blocksize(struct crypto_tfm *tfm)
  {
  	return tfm->__crt_alg->cra_blocksize;
  }
fbdae9f3e   Herbert Xu   [CRYPTO] Ensure c...
475
476
477
478
  static inline unsigned int crypto_tfm_alg_alignmask(struct crypto_tfm *tfm)
  {
  	return tfm->__crt_alg->cra_alignmask;
  }
f28776a36   Herbert Xu   [CRYPTO] cipher: ...
479
480
481
482
483
484
485
486
487
488
489
490
491
492
  static inline u32 crypto_tfm_get_flags(struct crypto_tfm *tfm)
  {
  	return tfm->crt_flags;
  }
  
  static inline void crypto_tfm_set_flags(struct crypto_tfm *tfm, u32 flags)
  {
  	tfm->crt_flags |= flags;
  }
  
  static inline void crypto_tfm_clear_flags(struct crypto_tfm *tfm, u32 flags)
  {
  	tfm->crt_flags &= ~flags;
  }
40725181b   Herbert Xu   [CRYPTO] Add supp...
493
494
  static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm)
  {
f10b7897e   Herbert Xu   [CRYPTO] api: Ali...
495
496
497
498
499
500
501
  	return tfm->__crt_ctx;
  }
  
  static inline unsigned int crypto_tfm_ctx_alignment(void)
  {
  	struct crypto_tfm *tfm;
  	return __alignof__(tfm->__crt_ctx);
40725181b   Herbert Xu   [CRYPTO] Add supp...
502
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
505
  /*
   * API wrappers.
   */
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
506
507
508
509
510
  static inline struct crypto_ablkcipher *__crypto_ablkcipher_cast(
  	struct crypto_tfm *tfm)
  {
  	return (struct crypto_ablkcipher *)tfm;
  }
378f4f51f   Herbert Xu   [CRYPTO] skcipher...
511
  static inline u32 crypto_skcipher_type(u32 type)
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
512
  {
ecfc43292   Herbert Xu   [CRYPTO] skcipher...
513
  	type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV);
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
514
  	type |= CRYPTO_ALG_TYPE_BLKCIPHER;
378f4f51f   Herbert Xu   [CRYPTO] skcipher...
515
516
517
518
519
  	return type;
  }
  
  static inline u32 crypto_skcipher_mask(u32 mask)
  {
ecfc43292   Herbert Xu   [CRYPTO] skcipher...
520
  	mask &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV);
332f8840f   Herbert Xu   [CRYPTO] ablkciph...
521
  	mask |= CRYPTO_ALG_TYPE_BLKCIPHER_MASK;
378f4f51f   Herbert Xu   [CRYPTO] skcipher...
522
523
  	return mask;
  }
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
524

b9c55aa47   Herbert Xu   [CRYPTO] skcipher...
525
526
  struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name,
  						  u32 type, u32 mask);
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
  
  static inline struct crypto_tfm *crypto_ablkcipher_tfm(
  	struct crypto_ablkcipher *tfm)
  {
  	return &tfm->base;
  }
  
  static inline void crypto_free_ablkcipher(struct crypto_ablkcipher *tfm)
  {
  	crypto_free_tfm(crypto_ablkcipher_tfm(tfm));
  }
  
  static inline int crypto_has_ablkcipher(const char *alg_name, u32 type,
  					u32 mask)
  {
378f4f51f   Herbert Xu   [CRYPTO] skcipher...
542
543
  	return crypto_has_alg(alg_name, crypto_skcipher_type(type),
  			      crypto_skcipher_mask(mask));
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
  }
  
  static inline struct ablkcipher_tfm *crypto_ablkcipher_crt(
  	struct crypto_ablkcipher *tfm)
  {
  	return &crypto_ablkcipher_tfm(tfm)->crt_ablkcipher;
  }
  
  static inline unsigned int crypto_ablkcipher_ivsize(
  	struct crypto_ablkcipher *tfm)
  {
  	return crypto_ablkcipher_crt(tfm)->ivsize;
  }
  
  static inline unsigned int crypto_ablkcipher_blocksize(
  	struct crypto_ablkcipher *tfm)
  {
  	return crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(tfm));
  }
  
  static inline unsigned int crypto_ablkcipher_alignmask(
  	struct crypto_ablkcipher *tfm)
  {
  	return crypto_tfm_alg_alignmask(crypto_ablkcipher_tfm(tfm));
  }
  
  static inline u32 crypto_ablkcipher_get_flags(struct crypto_ablkcipher *tfm)
  {
  	return crypto_tfm_get_flags(crypto_ablkcipher_tfm(tfm));
  }
  
  static inline void crypto_ablkcipher_set_flags(struct crypto_ablkcipher *tfm,
  					       u32 flags)
  {
  	crypto_tfm_set_flags(crypto_ablkcipher_tfm(tfm), flags);
  }
  
  static inline void crypto_ablkcipher_clear_flags(struct crypto_ablkcipher *tfm,
  						 u32 flags)
  {
  	crypto_tfm_clear_flags(crypto_ablkcipher_tfm(tfm), flags);
  }
  
  static inline int crypto_ablkcipher_setkey(struct crypto_ablkcipher *tfm,
  					   const u8 *key, unsigned int keylen)
  {
ecfc43292   Herbert Xu   [CRYPTO] skcipher...
590
591
592
  	struct ablkcipher_tfm *crt = crypto_ablkcipher_crt(tfm);
  
  	return crt->setkey(crt->base, key, keylen);
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
  }
  
  static inline struct crypto_ablkcipher *crypto_ablkcipher_reqtfm(
  	struct ablkcipher_request *req)
  {
  	return __crypto_ablkcipher_cast(req->base.tfm);
  }
  
  static inline int crypto_ablkcipher_encrypt(struct ablkcipher_request *req)
  {
  	struct ablkcipher_tfm *crt =
  		crypto_ablkcipher_crt(crypto_ablkcipher_reqtfm(req));
  	return crt->encrypt(req);
  }
  
  static inline int crypto_ablkcipher_decrypt(struct ablkcipher_request *req)
  {
  	struct ablkcipher_tfm *crt =
  		crypto_ablkcipher_crt(crypto_ablkcipher_reqtfm(req));
  	return crt->decrypt(req);
  }
b16c3a2e2   Herbert Xu   [CRYPTO] api: Fix...
614
615
  static inline unsigned int crypto_ablkcipher_reqsize(
  	struct crypto_ablkcipher *tfm)
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
616
617
618
  {
  	return crypto_ablkcipher_crt(tfm)->reqsize;
  }
e196d6259   Herbert Xu   [CRYPTO] api: Add...
619
620
621
  static inline void ablkcipher_request_set_tfm(
  	struct ablkcipher_request *req, struct crypto_ablkcipher *tfm)
  {
ecfc43292   Herbert Xu   [CRYPTO] skcipher...
622
  	req->base.tfm = crypto_ablkcipher_tfm(crypto_ablkcipher_crt(tfm)->base);
e196d6259   Herbert Xu   [CRYPTO] api: Add...
623
  }
b5b7f0886   Herbert Xu   [CRYPTO] api: Add...
624
625
626
627
628
  static inline struct ablkcipher_request *ablkcipher_request_cast(
  	struct crypto_async_request *req)
  {
  	return container_of(req, struct ablkcipher_request, base);
  }
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
629
630
631
632
633
634
635
636
637
  static inline struct ablkcipher_request *ablkcipher_request_alloc(
  	struct crypto_ablkcipher *tfm, gfp_t gfp)
  {
  	struct ablkcipher_request *req;
  
  	req = kmalloc(sizeof(struct ablkcipher_request) +
  		      crypto_ablkcipher_reqsize(tfm), gfp);
  
  	if (likely(req))
e196d6259   Herbert Xu   [CRYPTO] api: Add...
638
  		ablkcipher_request_set_tfm(req, tfm);
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
639
640
641
642
643
644
  
  	return req;
  }
  
  static inline void ablkcipher_request_free(struct ablkcipher_request *req)
  {
aef73cfcb   Herbert Xu   crypto: async - U...
645
  	kzfree(req);
32e3983fe   Herbert Xu   [CRYPTO] api: Add...
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
  }
  
  static inline void ablkcipher_request_set_callback(
  	struct ablkcipher_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 ablkcipher_request_set_crypt(
  	struct ablkcipher_request *req,
  	struct scatterlist *src, struct scatterlist *dst,
  	unsigned int nbytes, void *iv)
  {
  	req->src = src;
  	req->dst = dst;
  	req->nbytes = nbytes;
  	req->info = iv;
  }
1ae978208   Herbert Xu   [CRYPTO] api: Add...
667
668
669
670
  static inline struct crypto_aead *__crypto_aead_cast(struct crypto_tfm *tfm)
  {
  	return (struct crypto_aead *)tfm;
  }
d29ce988a   Herbert Xu   [CRYPTO] aead: Cr...
671
  struct crypto_aead *crypto_alloc_aead(const char *alg_name, u32 type, u32 mask);
1ae978208   Herbert Xu   [CRYPTO] api: Add...
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
  
  static inline struct crypto_tfm *crypto_aead_tfm(struct crypto_aead *tfm)
  {
  	return &tfm->base;
  }
  
  static inline void crypto_free_aead(struct crypto_aead *tfm)
  {
  	crypto_free_tfm(crypto_aead_tfm(tfm));
  }
  
  static inline struct aead_tfm *crypto_aead_crt(struct crypto_aead *tfm)
  {
  	return &crypto_aead_tfm(tfm)->crt_aead;
  }
  
  static inline unsigned int crypto_aead_ivsize(struct crypto_aead *tfm)
  {
  	return crypto_aead_crt(tfm)->ivsize;
  }
  
  static inline unsigned int crypto_aead_authsize(struct crypto_aead *tfm)
  {
  	return crypto_aead_crt(tfm)->authsize;
  }
  
  static inline unsigned int crypto_aead_blocksize(struct crypto_aead *tfm)
  {
  	return crypto_tfm_alg_blocksize(crypto_aead_tfm(tfm));
  }
  
  static inline unsigned int crypto_aead_alignmask(struct crypto_aead *tfm)
  {
  	return crypto_tfm_alg_alignmask(crypto_aead_tfm(tfm));
  }
  
  static inline u32 crypto_aead_get_flags(struct crypto_aead *tfm)
  {
  	return crypto_tfm_get_flags(crypto_aead_tfm(tfm));
  }
  
  static inline void crypto_aead_set_flags(struct crypto_aead *tfm, u32 flags)
  {
  	crypto_tfm_set_flags(crypto_aead_tfm(tfm), flags);
  }
  
  static inline void crypto_aead_clear_flags(struct crypto_aead *tfm, u32 flags)
  {
  	crypto_tfm_clear_flags(crypto_aead_tfm(tfm), flags);
  }
  
  static inline int crypto_aead_setkey(struct crypto_aead *tfm, const u8 *key,
  				     unsigned int keylen)
  {
5b6d2d7fd   Herbert Xu   [CRYPTO] aead: Ad...
726
727
728
  	struct aead_tfm *crt = crypto_aead_crt(tfm);
  
  	return crt->setkey(crt->base, key, keylen);
1ae978208   Herbert Xu   [CRYPTO] api: Add...
729
  }
7ba683a6d   Herbert Xu   [CRYPTO] aead: Ma...
730
  int crypto_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize);
1ae978208   Herbert Xu   [CRYPTO] api: Add...
731
732
733
734
735
736
737
738
739
740
741
742
743
744
  static inline struct crypto_aead *crypto_aead_reqtfm(struct aead_request *req)
  {
  	return __crypto_aead_cast(req->base.tfm);
  }
  
  static inline int crypto_aead_encrypt(struct aead_request *req)
  {
  	return crypto_aead_crt(crypto_aead_reqtfm(req))->encrypt(req);
  }
  
  static inline int crypto_aead_decrypt(struct aead_request *req)
  {
  	return crypto_aead_crt(crypto_aead_reqtfm(req))->decrypt(req);
  }
b16c3a2e2   Herbert Xu   [CRYPTO] api: Fix...
745
  static inline unsigned int crypto_aead_reqsize(struct crypto_aead *tfm)
1ae978208   Herbert Xu   [CRYPTO] api: Add...
746
747
748
749
750
751
752
  {
  	return crypto_aead_crt(tfm)->reqsize;
  }
  
  static inline void aead_request_set_tfm(struct aead_request *req,
  					struct crypto_aead *tfm)
  {
5b6d2d7fd   Herbert Xu   [CRYPTO] aead: Ad...
753
  	req->base.tfm = crypto_aead_tfm(crypto_aead_crt(tfm)->base);
1ae978208   Herbert Xu   [CRYPTO] api: Add...
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
  }
  
  static inline struct aead_request *aead_request_alloc(struct crypto_aead *tfm,
  						      gfp_t gfp)
  {
  	struct aead_request *req;
  
  	req = kmalloc(sizeof(*req) + crypto_aead_reqsize(tfm), gfp);
  
  	if (likely(req))
  		aead_request_set_tfm(req, tfm);
  
  	return req;
  }
  
  static inline void aead_request_free(struct aead_request *req)
  {
aef73cfcb   Herbert Xu   crypto: async - U...
771
  	kzfree(req);
1ae978208   Herbert Xu   [CRYPTO] api: Add...
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
  }
  
  static inline void aead_request_set_callback(struct aead_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 aead_request_set_crypt(struct aead_request *req,
  					  struct scatterlist *src,
  					  struct scatterlist *dst,
  					  unsigned int cryptlen, u8 *iv)
  {
  	req->src = src;
  	req->dst = dst;
  	req->cryptlen = cryptlen;
  	req->iv = iv;
  }
  
  static inline void aead_request_set_assoc(struct aead_request *req,
  					  struct scatterlist *assoc,
  					  unsigned int assoclen)
  {
  	req->assoc = assoc;
  	req->assoclen = assoclen;
  }
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
  static inline struct crypto_blkcipher *__crypto_blkcipher_cast(
  	struct crypto_tfm *tfm)
  {
  	return (struct crypto_blkcipher *)tfm;
  }
  
  static inline struct crypto_blkcipher *crypto_blkcipher_cast(
  	struct crypto_tfm *tfm)
  {
  	BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_BLKCIPHER);
  	return __crypto_blkcipher_cast(tfm);
  }
  
  static inline struct crypto_blkcipher *crypto_alloc_blkcipher(
  	const char *alg_name, u32 type, u32 mask)
  {
332f8840f   Herbert Xu   [CRYPTO] ablkciph...
818
  	type &= ~CRYPTO_ALG_TYPE_MASK;
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
819
  	type |= CRYPTO_ALG_TYPE_BLKCIPHER;
332f8840f   Herbert Xu   [CRYPTO] ablkciph...
820
  	mask |= CRYPTO_ALG_TYPE_MASK;
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
821
822
823
824
825
826
827
828
829
830
831
832
833
834
  
  	return __crypto_blkcipher_cast(crypto_alloc_base(alg_name, type, mask));
  }
  
  static inline struct crypto_tfm *crypto_blkcipher_tfm(
  	struct crypto_blkcipher *tfm)
  {
  	return &tfm->base;
  }
  
  static inline void crypto_free_blkcipher(struct crypto_blkcipher *tfm)
  {
  	crypto_free_tfm(crypto_blkcipher_tfm(tfm));
  }
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
835
836
  static inline int crypto_has_blkcipher(const char *alg_name, u32 type, u32 mask)
  {
332f8840f   Herbert Xu   [CRYPTO] ablkciph...
837
  	type &= ~CRYPTO_ALG_TYPE_MASK;
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
838
  	type |= CRYPTO_ALG_TYPE_BLKCIPHER;
332f8840f   Herbert Xu   [CRYPTO] ablkciph...
839
  	mask |= CRYPTO_ALG_TYPE_MASK;
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
840
841
842
  
  	return crypto_has_alg(alg_name, type, mask);
  }
5cde0af2a   Herbert Xu   [CRYPTO] cipher: ...
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
  static inline const char *crypto_blkcipher_name(struct crypto_blkcipher *tfm)
  {
  	return crypto_tfm_alg_name(crypto_blkcipher_tfm(tfm));
  }
  
  static inline struct blkcipher_tfm *crypto_blkcipher_crt(
  	struct crypto_blkcipher *tfm)
  {
  	return &crypto_blkcipher_tfm(tfm)->crt_blkcipher;
  }
  
  static inline struct blkcipher_alg *crypto_blkcipher_alg(
  	struct crypto_blkcipher *tfm)
  {
  	return &crypto_blkcipher_tfm(tfm)->__crt_alg->cra_blkcipher;
  }
  
  static inline unsigned int crypto_blkcipher_ivsize(struct crypto_blkcipher *tfm)
  {
  	return crypto_blkcipher_alg(tfm)->ivsize;
  }
  
  static inline unsigned int crypto_blkcipher_blocksize(
  	struct crypto_blkcipher *tfm)
  {
  	return crypto_tfm_alg_blocksize(crypto_blkcipher_tfm(tfm));
  }
  
  static inline unsigned int crypto_blkcipher_alignmask(
  	struct crypto_blkcipher *tfm)
  {
  	return crypto_tfm_alg_alignmask(crypto_blkcipher_tfm(tfm));
  }
  
  static inline u32 crypto_blkcipher_get_flags(struct crypto_blkcipher *tfm)
  {
  	return crypto_tfm_get_flags(crypto_blkcipher_tfm(tfm));
  }
  
  static inline void crypto_blkcipher_set_flags(struct crypto_blkcipher *tfm,
  					      u32 flags)
  {
  	crypto_tfm_set_flags(crypto_blkcipher_tfm(tfm), flags);
  }
  
  static inline void crypto_blkcipher_clear_flags(struct crypto_blkcipher *tfm,
  						u32 flags)
  {
  	crypto_tfm_clear_flags(crypto_blkcipher_tfm(tfm), flags);
  }
  
  static inline int crypto_blkcipher_setkey(struct crypto_blkcipher *tfm,
  					  const u8 *key, unsigned int keylen)
  {
  	return crypto_blkcipher_crt(tfm)->setkey(crypto_blkcipher_tfm(tfm),
  						 key, keylen);
  }
  
  static inline int crypto_blkcipher_encrypt(struct blkcipher_desc *desc,
  					   struct scatterlist *dst,
  					   struct scatterlist *src,
  					   unsigned int nbytes)
  {
  	desc->info = crypto_blkcipher_crt(desc->tfm)->iv;
  	return crypto_blkcipher_crt(desc->tfm)->encrypt(desc, dst, src, nbytes);
  }
  
  static inline int crypto_blkcipher_encrypt_iv(struct blkcipher_desc *desc,
  					      struct scatterlist *dst,
  					      struct scatterlist *src,
  					      unsigned int nbytes)
  {
  	return crypto_blkcipher_crt(desc->tfm)->encrypt(desc, dst, src, nbytes);
  }
  
  static inline int crypto_blkcipher_decrypt(struct blkcipher_desc *desc,
  					   struct scatterlist *dst,
  					   struct scatterlist *src,
  					   unsigned int nbytes)
  {
  	desc->info = crypto_blkcipher_crt(desc->tfm)->iv;
  	return crypto_blkcipher_crt(desc->tfm)->decrypt(desc, dst, src, nbytes);
  }
  
  static inline int crypto_blkcipher_decrypt_iv(struct blkcipher_desc *desc,
  					      struct scatterlist *dst,
  					      struct scatterlist *src,
  					      unsigned int nbytes)
  {
  	return crypto_blkcipher_crt(desc->tfm)->decrypt(desc, dst, src, nbytes);
  }
  
  static inline void crypto_blkcipher_set_iv(struct crypto_blkcipher *tfm,
  					   const u8 *src, unsigned int len)
  {
  	memcpy(crypto_blkcipher_crt(tfm)->iv, src, len);
  }
  
  static inline void crypto_blkcipher_get_iv(struct crypto_blkcipher *tfm,
  					   u8 *dst, unsigned int len)
  {
  	memcpy(dst, crypto_blkcipher_crt(tfm)->iv, len);
  }
f28776a36   Herbert Xu   [CRYPTO] cipher: ...
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
  static inline struct crypto_cipher *__crypto_cipher_cast(struct crypto_tfm *tfm)
  {
  	return (struct crypto_cipher *)tfm;
  }
  
  static inline struct crypto_cipher *crypto_cipher_cast(struct crypto_tfm *tfm)
  {
  	BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
  	return __crypto_cipher_cast(tfm);
  }
  
  static inline struct crypto_cipher *crypto_alloc_cipher(const char *alg_name,
  							u32 type, u32 mask)
  {
  	type &= ~CRYPTO_ALG_TYPE_MASK;
  	type |= CRYPTO_ALG_TYPE_CIPHER;
  	mask |= CRYPTO_ALG_TYPE_MASK;
  
  	return __crypto_cipher_cast(crypto_alloc_base(alg_name, type, mask));
  }
  
  static inline struct crypto_tfm *crypto_cipher_tfm(struct crypto_cipher *tfm)
  {
78a1fe4f2   Herbert Xu   [CRYPTO] api: Use...
969
  	return &tfm->base;
f28776a36   Herbert Xu   [CRYPTO] cipher: ...
970
971
972
973
974
975
  }
  
  static inline void crypto_free_cipher(struct crypto_cipher *tfm)
  {
  	crypto_free_tfm(crypto_cipher_tfm(tfm));
  }
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
976
977
978
979
980
981
982
983
  static inline int crypto_has_cipher(const char *alg_name, u32 type, u32 mask)
  {
  	type &= ~CRYPTO_ALG_TYPE_MASK;
  	type |= CRYPTO_ALG_TYPE_CIPHER;
  	mask |= CRYPTO_ALG_TYPE_MASK;
  
  	return crypto_has_alg(alg_name, type, mask);
  }
f28776a36   Herbert Xu   [CRYPTO] cipher: ...
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
  static inline struct cipher_tfm *crypto_cipher_crt(struct crypto_cipher *tfm)
  {
  	return &crypto_cipher_tfm(tfm)->crt_cipher;
  }
  
  static inline unsigned int crypto_cipher_blocksize(struct crypto_cipher *tfm)
  {
  	return crypto_tfm_alg_blocksize(crypto_cipher_tfm(tfm));
  }
  
  static inline unsigned int crypto_cipher_alignmask(struct crypto_cipher *tfm)
  {
  	return crypto_tfm_alg_alignmask(crypto_cipher_tfm(tfm));
  }
  
  static inline u32 crypto_cipher_get_flags(struct crypto_cipher *tfm)
  {
  	return crypto_tfm_get_flags(crypto_cipher_tfm(tfm));
  }
  
  static inline void crypto_cipher_set_flags(struct crypto_cipher *tfm,
  					   u32 flags)
  {
  	crypto_tfm_set_flags(crypto_cipher_tfm(tfm), flags);
  }
  
  static inline void crypto_cipher_clear_flags(struct crypto_cipher *tfm,
  					     u32 flags)
  {
  	crypto_tfm_clear_flags(crypto_cipher_tfm(tfm), flags);
  }
7226bc877   Herbert Xu   [CRYPTO] api: Mar...
1015
1016
1017
1018
1019
1020
  static inline int crypto_cipher_setkey(struct crypto_cipher *tfm,
                                         const u8 *key, unsigned int keylen)
  {
  	return crypto_cipher_crt(tfm)->cit_setkey(crypto_cipher_tfm(tfm),
  						  key, keylen);
  }
f28776a36   Herbert Xu   [CRYPTO] cipher: ...
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
  static inline void crypto_cipher_encrypt_one(struct crypto_cipher *tfm,
  					     u8 *dst, const u8 *src)
  {
  	crypto_cipher_crt(tfm)->cit_encrypt_one(crypto_cipher_tfm(tfm),
  						dst, src);
  }
  
  static inline void crypto_cipher_decrypt_one(struct crypto_cipher *tfm,
  					     u8 *dst, const u8 *src)
  {
  	crypto_cipher_crt(tfm)->cit_decrypt_one(crypto_cipher_tfm(tfm),
  						dst, src);
  }
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1034
  static inline struct crypto_hash *__crypto_hash_cast(struct crypto_tfm *tfm)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1035
  {
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1036
  	return (struct crypto_hash *)tfm;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1037
  }
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1038
  static inline struct crypto_hash *crypto_hash_cast(struct crypto_tfm *tfm)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1039
  {
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1040
1041
1042
  	BUG_ON((crypto_tfm_alg_type(tfm) ^ CRYPTO_ALG_TYPE_HASH) &
  	       CRYPTO_ALG_TYPE_HASH_MASK);
  	return __crypto_hash_cast(tfm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1043
  }
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1044
1045
  static inline struct crypto_hash *crypto_alloc_hash(const char *alg_name,
  						    u32 type, u32 mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1046
  {
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1047
  	type &= ~CRYPTO_ALG_TYPE_MASK;
551a09a7a   Herbert Xu   [CRYPTO] api: San...
1048
  	mask &= ~CRYPTO_ALG_TYPE_MASK;
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1049
1050
1051
1052
  	type |= CRYPTO_ALG_TYPE_HASH;
  	mask |= CRYPTO_ALG_TYPE_HASH_MASK;
  
  	return __crypto_hash_cast(crypto_alloc_base(alg_name, type, mask));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1053
  }
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1054
  static inline struct crypto_tfm *crypto_hash_tfm(struct crypto_hash *tfm)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1055
  {
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1056
1057
1058
1059
1060
1061
1062
  	return &tfm->base;
  }
  
  static inline void crypto_free_hash(struct crypto_hash *tfm)
  {
  	crypto_free_tfm(crypto_hash_tfm(tfm));
  }
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
1063
1064
1065
  static inline int crypto_has_hash(const char *alg_name, u32 type, u32 mask)
  {
  	type &= ~CRYPTO_ALG_TYPE_MASK;
551a09a7a   Herbert Xu   [CRYPTO] api: San...
1066
  	mask &= ~CRYPTO_ALG_TYPE_MASK;
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
1067
1068
1069
1070
1071
  	type |= CRYPTO_ALG_TYPE_HASH;
  	mask |= CRYPTO_ALG_TYPE_HASH_MASK;
  
  	return crypto_has_alg(alg_name, type, mask);
  }
055bcee31   Herbert Xu   [CRYPTO] digest: ...
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
  static inline struct hash_tfm *crypto_hash_crt(struct crypto_hash *tfm)
  {
  	return &crypto_hash_tfm(tfm)->crt_hash;
  }
  
  static inline unsigned int crypto_hash_blocksize(struct crypto_hash *tfm)
  {
  	return crypto_tfm_alg_blocksize(crypto_hash_tfm(tfm));
  }
  
  static inline unsigned int crypto_hash_alignmask(struct crypto_hash *tfm)
  {
  	return crypto_tfm_alg_alignmask(crypto_hash_tfm(tfm));
  }
  
  static inline unsigned int crypto_hash_digestsize(struct crypto_hash *tfm)
  {
  	return crypto_hash_crt(tfm)->digestsize;
  }
  
  static inline u32 crypto_hash_get_flags(struct crypto_hash *tfm)
  {
  	return crypto_tfm_get_flags(crypto_hash_tfm(tfm));
  }
  
  static inline void crypto_hash_set_flags(struct crypto_hash *tfm, u32 flags)
  {
  	crypto_tfm_set_flags(crypto_hash_tfm(tfm), flags);
  }
  
  static inline void crypto_hash_clear_flags(struct crypto_hash *tfm, u32 flags)
  {
  	crypto_tfm_clear_flags(crypto_hash_tfm(tfm), flags);
  }
  
  static inline int crypto_hash_init(struct hash_desc *desc)
  {
  	return crypto_hash_crt(desc->tfm)->init(desc);
  }
  
  static inline int crypto_hash_update(struct hash_desc *desc,
  				     struct scatterlist *sg,
  				     unsigned int nbytes)
  {
  	return crypto_hash_crt(desc->tfm)->update(desc, sg, nbytes);
  }
  
  static inline int crypto_hash_final(struct hash_desc *desc, u8 *out)
  {
  	return crypto_hash_crt(desc->tfm)->final(desc, out);
  }
  
  static inline int crypto_hash_digest(struct hash_desc *desc,
  				     struct scatterlist *sg,
  				     unsigned int nbytes, u8 *out)
  {
  	return crypto_hash_crt(desc->tfm)->digest(desc, sg, nbytes, out);
  }
  
  static inline int crypto_hash_setkey(struct crypto_hash *hash,
  				     const u8 *key, unsigned int keylen)
  {
  	return crypto_hash_crt(hash)->setkey(hash, key, keylen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1135
  }
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
  static inline struct crypto_comp *__crypto_comp_cast(struct crypto_tfm *tfm)
  {
  	return (struct crypto_comp *)tfm;
  }
  
  static inline struct crypto_comp *crypto_comp_cast(struct crypto_tfm *tfm)
  {
  	BUG_ON((crypto_tfm_alg_type(tfm) ^ CRYPTO_ALG_TYPE_COMPRESS) &
  	       CRYPTO_ALG_TYPE_MASK);
  	return __crypto_comp_cast(tfm);
  }
  
  static inline struct crypto_comp *crypto_alloc_comp(const char *alg_name,
  						    u32 type, u32 mask)
  {
  	type &= ~CRYPTO_ALG_TYPE_MASK;
  	type |= CRYPTO_ALG_TYPE_COMPRESS;
  	mask |= CRYPTO_ALG_TYPE_MASK;
  
  	return __crypto_comp_cast(crypto_alloc_base(alg_name, type, mask));
  }
  
  static inline struct crypto_tfm *crypto_comp_tfm(struct crypto_comp *tfm)
  {
78a1fe4f2   Herbert Xu   [CRYPTO] api: Use...
1160
  	return &tfm->base;
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
  }
  
  static inline void crypto_free_comp(struct crypto_comp *tfm)
  {
  	crypto_free_tfm(crypto_comp_tfm(tfm));
  }
  
  static inline int crypto_has_comp(const char *alg_name, u32 type, u32 mask)
  {
  	type &= ~CRYPTO_ALG_TYPE_MASK;
  	type |= CRYPTO_ALG_TYPE_COMPRESS;
  	mask |= CRYPTO_ALG_TYPE_MASK;
  
  	return crypto_has_alg(alg_name, type, mask);
  }
e4d5b79c6   Herbert Xu   [CRYPTO] users: U...
1176
1177
1178
1179
  static inline const char *crypto_comp_name(struct crypto_comp *tfm)
  {
  	return crypto_tfm_alg_name(crypto_comp_tfm(tfm));
  }
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
1180
1181
1182
1183
1184
1185
  static inline struct compress_tfm *crypto_comp_crt(struct crypto_comp *tfm)
  {
  	return &crypto_comp_tfm(tfm)->crt_compress;
  }
  
  static inline int crypto_comp_compress(struct crypto_comp *tfm,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1186
1187
1188
                                         const u8 *src, unsigned int slen,
                                         u8 *dst, unsigned int *dlen)
  {
78a1fe4f2   Herbert Xu   [CRYPTO] api: Use...
1189
1190
  	return crypto_comp_crt(tfm)->cot_compress(crypto_comp_tfm(tfm),
  						  src, slen, dst, dlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1191
  }
fce32d70b   Herbert Xu   [CRYPTO] api: Add...
1192
  static inline int crypto_comp_decompress(struct crypto_comp *tfm,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1193
1194
1195
                                           const u8 *src, unsigned int slen,
                                           u8 *dst, unsigned int *dlen)
  {
78a1fe4f2   Herbert Xu   [CRYPTO] api: Use...
1196
1197
  	return crypto_comp_crt(tfm)->cot_decompress(crypto_comp_tfm(tfm),
  						    src, slen, dst, dlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1198
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1199
  #endif	/* _LINUX_CRYPTO_H */