diff options
Diffstat (limited to 'include/crypto/algapi.h')
-rw-r--r-- | include/crypto/algapi.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h new file mode 100644 index 000000000000..5748aecdb414 --- /dev/null +++ b/include/crypto/algapi.h | |||
@@ -0,0 +1,156 @@ | |||
1 | /* | ||
2 | * Cryptographic API for algorithms (i.e., low-level API). | ||
3 | * | ||
4 | * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | #ifndef _CRYPTO_ALGAPI_H | ||
13 | #define _CRYPTO_ALGAPI_H | ||
14 | |||
15 | #include <linux/crypto.h> | ||
16 | |||
17 | struct module; | ||
18 | struct seq_file; | ||
19 | |||
20 | struct crypto_type { | ||
21 | unsigned int (*ctxsize)(struct crypto_alg *alg); | ||
22 | int (*init)(struct crypto_tfm *tfm); | ||
23 | void (*exit)(struct crypto_tfm *tfm); | ||
24 | void (*show)(struct seq_file *m, struct crypto_alg *alg); | ||
25 | }; | ||
26 | |||
27 | struct crypto_instance { | ||
28 | struct crypto_alg alg; | ||
29 | |||
30 | struct crypto_template *tmpl; | ||
31 | struct hlist_node list; | ||
32 | |||
33 | void *__ctx[] CRYPTO_MINALIGN_ATTR; | ||
34 | }; | ||
35 | |||
36 | struct crypto_template { | ||
37 | struct list_head list; | ||
38 | struct hlist_head instances; | ||
39 | struct module *module; | ||
40 | |||
41 | struct crypto_instance *(*alloc)(void *param, unsigned int len); | ||
42 | void (*free)(struct crypto_instance *inst); | ||
43 | |||
44 | char name[CRYPTO_MAX_ALG_NAME]; | ||
45 | }; | ||
46 | |||
47 | struct crypto_spawn { | ||
48 | struct list_head list; | ||
49 | struct crypto_alg *alg; | ||
50 | struct crypto_instance *inst; | ||
51 | }; | ||
52 | |||
53 | struct scatter_walk { | ||
54 | struct scatterlist *sg; | ||
55 | unsigned int offset; | ||
56 | }; | ||
57 | |||
58 | struct blkcipher_walk { | ||
59 | union { | ||
60 | struct { | ||
61 | struct page *page; | ||
62 | unsigned long offset; | ||
63 | } phys; | ||
64 | |||
65 | struct { | ||
66 | u8 *page; | ||
67 | u8 *addr; | ||
68 | } virt; | ||
69 | } src, dst; | ||
70 | |||
71 | struct scatter_walk in; | ||
72 | unsigned int nbytes; | ||
73 | |||
74 | struct scatter_walk out; | ||
75 | unsigned int total; | ||
76 | |||
77 | void *page; | ||
78 | u8 *buffer; | ||
79 | u8 *iv; | ||
80 | |||
81 | int flags; | ||
82 | }; | ||
83 | |||
84 | extern const struct crypto_type crypto_blkcipher_type; | ||
85 | extern const struct crypto_type crypto_hash_type; | ||
86 | |||
87 | void crypto_mod_put(struct crypto_alg *alg); | ||
88 | |||
89 | int crypto_register_template(struct crypto_template *tmpl); | ||
90 | void crypto_unregister_template(struct crypto_template *tmpl); | ||
91 | struct crypto_template *crypto_lookup_template(const char *name); | ||
92 | |||
93 | int crypto_init_spawn(struct crypto_spawn *spawn, struct crypto_alg *alg, | ||
94 | struct crypto_instance *inst); | ||
95 | void crypto_drop_spawn(struct crypto_spawn *spawn); | ||
96 | struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn); | ||
97 | |||
98 | struct crypto_alg *crypto_get_attr_alg(void *param, unsigned int len, | ||
99 | u32 type, u32 mask); | ||
100 | struct crypto_instance *crypto_alloc_instance(const char *name, | ||
101 | struct crypto_alg *alg); | ||
102 | |||
103 | int blkcipher_walk_done(struct blkcipher_desc *desc, | ||
104 | struct blkcipher_walk *walk, int err); | ||
105 | int blkcipher_walk_virt(struct blkcipher_desc *desc, | ||
106 | struct blkcipher_walk *walk); | ||
107 | int blkcipher_walk_phys(struct blkcipher_desc *desc, | ||
108 | struct blkcipher_walk *walk); | ||
109 | |||
110 | static inline void *crypto_tfm_ctx_aligned(struct crypto_tfm *tfm) | ||
111 | { | ||
112 | unsigned long addr = (unsigned long)crypto_tfm_ctx(tfm); | ||
113 | unsigned long align = crypto_tfm_alg_alignmask(tfm); | ||
114 | |||
115 | if (align <= crypto_tfm_ctx_alignment()) | ||
116 | align = 1; | ||
117 | return (void *)ALIGN(addr, align); | ||
118 | } | ||
119 | |||
120 | static inline void *crypto_instance_ctx(struct crypto_instance *inst) | ||
121 | { | ||
122 | return inst->__ctx; | ||
123 | } | ||
124 | |||
125 | static inline void *crypto_blkcipher_ctx(struct crypto_blkcipher *tfm) | ||
126 | { | ||
127 | return crypto_tfm_ctx(&tfm->base); | ||
128 | } | ||
129 | |||
130 | static inline void *crypto_blkcipher_ctx_aligned(struct crypto_blkcipher *tfm) | ||
131 | { | ||
132 | return crypto_tfm_ctx_aligned(&tfm->base); | ||
133 | } | ||
134 | |||
135 | static inline struct cipher_alg *crypto_cipher_alg(struct crypto_cipher *tfm) | ||
136 | { | ||
137 | return &crypto_cipher_tfm(tfm)->__crt_alg->cra_cipher; | ||
138 | } | ||
139 | |||
140 | static inline void *crypto_hash_ctx_aligned(struct crypto_hash *tfm) | ||
141 | { | ||
142 | return crypto_tfm_ctx_aligned(&tfm->base); | ||
143 | } | ||
144 | |||
145 | static inline void blkcipher_walk_init(struct blkcipher_walk *walk, | ||
146 | struct scatterlist *dst, | ||
147 | struct scatterlist *src, | ||
148 | unsigned int nbytes) | ||
149 | { | ||
150 | walk->in.sg = src; | ||
151 | walk->out.sg = dst; | ||
152 | walk->total = nbytes; | ||
153 | } | ||
154 | |||
155 | #endif /* _CRYPTO_ALGAPI_H */ | ||
156 | |||