d0c190b4d02fb439b1884c3130459af9047ad0ab
[linux-2.6.git] / include / crypto / algapi.h
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 rtattr;
19 struct seq_file;
20
21 struct crypto_type {
22         unsigned int (*ctxsize)(struct crypto_alg *alg, u32 type, u32 mask);
23         int (*init)(struct crypto_tfm *tfm, u32 type, u32 mask);
24         void (*exit)(struct crypto_tfm *tfm);
25         void (*show)(struct seq_file *m, struct crypto_alg *alg);
26 };
27
28 struct crypto_instance {
29         struct crypto_alg alg;
30
31         struct crypto_template *tmpl;
32         struct hlist_node list;
33
34         void *__ctx[] CRYPTO_MINALIGN_ATTR;
35 };
36
37 struct crypto_template {
38         struct list_head list;
39         struct hlist_head instances;
40         struct module *module;
41
42         struct crypto_instance *(*alloc)(struct rtattr **tb);
43         void (*free)(struct crypto_instance *inst);
44
45         char name[CRYPTO_MAX_ALG_NAME];
46 };
47
48 struct crypto_spawn {
49         struct list_head list;
50         struct crypto_alg *alg;
51         struct crypto_instance *inst;
52 };
53
54 struct scatter_walk {
55         struct scatterlist *sg;
56         unsigned int offset;
57 };
58
59 struct blkcipher_walk {
60         union {
61                 struct {
62                         struct page *page;
63                         unsigned long offset;
64                 } phys;
65
66                 struct {
67                         u8 *page;
68                         u8 *addr;
69                 } virt;
70         } src, dst;
71
72         struct scatter_walk in;
73         unsigned int nbytes;
74
75         struct scatter_walk out;
76         unsigned int total;
77
78         void *page;
79         u8 *buffer;
80         u8 *iv;
81
82         int flags;
83 };
84
85 extern const struct crypto_type crypto_blkcipher_type;
86 extern const struct crypto_type crypto_hash_type;
87
88 void crypto_mod_put(struct crypto_alg *alg);
89
90 int crypto_register_template(struct crypto_template *tmpl);
91 void crypto_unregister_template(struct crypto_template *tmpl);
92 struct crypto_template *crypto_lookup_template(const char *name);
93
94 int crypto_init_spawn(struct crypto_spawn *spawn, struct crypto_alg *alg,
95                       struct crypto_instance *inst);
96 void crypto_drop_spawn(struct crypto_spawn *spawn);
97 struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type,
98                                     u32 mask);
99
100 struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb);
101 int crypto_check_attr_type(struct rtattr **tb, u32 type);
102 struct crypto_alg *crypto_get_attr_alg(struct rtattr **tb, u32 type, u32 mask);
103 struct crypto_instance *crypto_alloc_instance(const char *name,
104                                               struct crypto_alg *alg);
105
106 int blkcipher_walk_done(struct blkcipher_desc *desc,
107                         struct blkcipher_walk *walk, int err);
108 int blkcipher_walk_virt(struct blkcipher_desc *desc,
109                         struct blkcipher_walk *walk);
110 int blkcipher_walk_phys(struct blkcipher_desc *desc,
111                         struct blkcipher_walk *walk);
112
113 static inline void *crypto_tfm_ctx_aligned(struct crypto_tfm *tfm)
114 {
115         unsigned long addr = (unsigned long)crypto_tfm_ctx(tfm);
116         unsigned long align = crypto_tfm_alg_alignmask(tfm);
117
118         if (align <= crypto_tfm_ctx_alignment())
119                 align = 1;
120         return (void *)ALIGN(addr, align);
121 }
122
123 static inline void *crypto_instance_ctx(struct crypto_instance *inst)
124 {
125         return inst->__ctx;
126 }
127
128 static inline void *crypto_blkcipher_ctx(struct crypto_blkcipher *tfm)
129 {
130         return crypto_tfm_ctx(&tfm->base);
131 }
132
133 static inline void *crypto_blkcipher_ctx_aligned(struct crypto_blkcipher *tfm)
134 {
135         return crypto_tfm_ctx_aligned(&tfm->base);
136 }
137
138 static inline struct crypto_cipher *crypto_spawn_cipher(
139         struct crypto_spawn *spawn)
140 {
141         u32 type = CRYPTO_ALG_TYPE_CIPHER;
142         u32 mask = CRYPTO_ALG_TYPE_MASK;
143
144         return __crypto_cipher_cast(crypto_spawn_tfm(spawn, type, mask));
145 }
146
147 static inline struct cipher_alg *crypto_cipher_alg(struct crypto_cipher *tfm)
148 {
149         return &crypto_cipher_tfm(tfm)->__crt_alg->cra_cipher;
150 }
151
152 static inline struct crypto_hash *crypto_spawn_hash(struct crypto_spawn *spawn)
153 {
154         u32 type = CRYPTO_ALG_TYPE_HASH;
155         u32 mask = CRYPTO_ALG_TYPE_HASH_MASK;
156
157         return __crypto_hash_cast(crypto_spawn_tfm(spawn, type, mask));
158 }
159
160 static inline void *crypto_hash_ctx_aligned(struct crypto_hash *tfm)
161 {
162         return crypto_tfm_ctx_aligned(&tfm->base);
163 }
164
165 static inline void blkcipher_walk_init(struct blkcipher_walk *walk,
166                                        struct scatterlist *dst,
167                                        struct scatterlist *src,
168                                        unsigned int nbytes)
169 {
170         walk->in.sg = src;
171         walk->out.sg = dst;
172         walk->total = nbytes;
173 }
174
175 #endif  /* _CRYPTO_ALGAPI_H */
176