Line data Source code
1 : /*
2 : * Hash: Hash algorithms under the crypto API
3 : *
4 : * Copyright (c) 2008 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 :
13 : #ifndef _CRYPTO_HASH_H
14 : #define _CRYPTO_HASH_H
15 :
16 : #include <linux/crypto.h>
17 :
18 : struct crypto_ahash;
19 :
20 : struct hash_alg_common {
21 : unsigned int digestsize;
22 : unsigned int statesize;
23 :
24 : struct crypto_alg base;
25 : };
26 :
27 : struct ahash_request {
28 : struct crypto_async_request base;
29 :
30 : unsigned int nbytes;
31 : struct scatterlist *src;
32 : u8 *result;
33 :
34 : /* This field may only be used by the ahash API code. */
35 : void *priv;
36 :
37 : void *__ctx[] CRYPTO_MINALIGN_ATTR;
38 : };
39 :
40 : struct ahash_alg {
41 : int (*init)(struct ahash_request *req);
42 : int (*update)(struct ahash_request *req);
43 : int (*final)(struct ahash_request *req);
44 : int (*finup)(struct ahash_request *req);
45 : int (*digest)(struct ahash_request *req);
46 : int (*export)(struct ahash_request *req, void *out);
47 : int (*import)(struct ahash_request *req, const void *in);
48 : int (*setkey)(struct crypto_ahash *tfm, const u8 *key,
49 : unsigned int keylen);
50 :
51 : struct hash_alg_common halg;
52 : };
53 :
54 : struct shash_desc {
55 : struct crypto_shash *tfm;
56 : u32 flags;
57 :
58 : void *__ctx[] CRYPTO_MINALIGN_ATTR;
59 : };
60 :
61 : struct shash_alg {
62 : int (*init)(struct shash_desc *desc);
63 : int (*update)(struct shash_desc *desc, const u8 *data,
64 : unsigned int len);
65 : int (*final)(struct shash_desc *desc, u8 *out);
66 : int (*finup)(struct shash_desc *desc, const u8 *data,
67 : unsigned int len, u8 *out);
68 : int (*digest)(struct shash_desc *desc, const u8 *data,
69 : unsigned int len, u8 *out);
70 : int (*export)(struct shash_desc *desc, void *out);
71 : int (*import)(struct shash_desc *desc, const void *in);
72 : int (*setkey)(struct crypto_shash *tfm, const u8 *key,
73 : unsigned int keylen);
74 :
75 : unsigned int descsize;
76 :
77 : /* These fields must match hash_alg_common. */
78 : unsigned int digestsize
79 : __attribute__ ((aligned(__alignof__(struct hash_alg_common))));
80 : unsigned int statesize;
81 :
82 : struct crypto_alg base;
83 : };
84 :
85 : struct crypto_ahash {
86 : int (*init)(struct ahash_request *req);
87 : int (*update)(struct ahash_request *req);
88 : int (*final)(struct ahash_request *req);
89 : int (*finup)(struct ahash_request *req);
90 : int (*digest)(struct ahash_request *req);
91 : int (*export)(struct ahash_request *req, void *out);
92 : int (*import)(struct ahash_request *req, const void *in);
93 : int (*setkey)(struct crypto_ahash *tfm, const u8 *key,
94 : unsigned int keylen);
95 :
96 : unsigned int reqsize;
97 : struct crypto_tfm base;
98 : };
99 :
100 : struct crypto_shash {
101 : unsigned int descsize;
102 : struct crypto_tfm base;
103 : };
104 :
105 : static inline struct crypto_ahash *__crypto_ahash_cast(struct crypto_tfm *tfm)
106 : {
107 : return container_of(tfm, struct crypto_ahash, base);
108 : }
109 :
110 : struct crypto_ahash *crypto_alloc_ahash(const char *alg_name, u32 type,
111 : u32 mask);
112 :
113 : static inline struct crypto_tfm *crypto_ahash_tfm(struct crypto_ahash *tfm)
114 : {
115 : return &tfm->base;
116 : }
117 :
118 : static inline void crypto_free_ahash(struct crypto_ahash *tfm)
119 : {
120 : crypto_destroy_tfm(tfm, crypto_ahash_tfm(tfm));
121 : }
122 :
123 : static inline unsigned int crypto_ahash_alignmask(
124 : struct crypto_ahash *tfm)
125 : {
126 : return crypto_tfm_alg_alignmask(crypto_ahash_tfm(tfm));
127 : }
128 :
129 : static inline struct hash_alg_common *__crypto_hash_alg_common(
130 : struct crypto_alg *alg)
131 : {
132 : return container_of(alg, struct hash_alg_common, base);
133 : }
134 :
135 : static inline struct hash_alg_common *crypto_hash_alg_common(
136 : struct crypto_ahash *tfm)
137 : {
138 : return __crypto_hash_alg_common(crypto_ahash_tfm(tfm)->__crt_alg);
139 : }
140 :
141 : static inline unsigned int crypto_ahash_digestsize(struct crypto_ahash *tfm)
142 : {
143 : return crypto_hash_alg_common(tfm)->digestsize;
144 : }
145 :
146 : static inline unsigned int crypto_ahash_statesize(struct crypto_ahash *tfm)
147 : {
148 : return crypto_hash_alg_common(tfm)->statesize;
149 : }
150 :
151 : static inline u32 crypto_ahash_get_flags(struct crypto_ahash *tfm)
152 : {
153 : return crypto_tfm_get_flags(crypto_ahash_tfm(tfm));
154 : }
155 :
156 : static inline void crypto_ahash_set_flags(struct crypto_ahash *tfm, u32 flags)
157 : {
158 : crypto_tfm_set_flags(crypto_ahash_tfm(tfm), flags);
159 : }
160 :
161 : static inline void crypto_ahash_clear_flags(struct crypto_ahash *tfm, u32 flags)
162 : {
163 : crypto_tfm_clear_flags(crypto_ahash_tfm(tfm), flags);
164 : }
165 :
166 : static inline struct crypto_ahash *crypto_ahash_reqtfm(
167 : struct ahash_request *req)
168 : {
169 : return __crypto_ahash_cast(req->base.tfm);
170 : }
171 :
172 : static inline unsigned int crypto_ahash_reqsize(struct crypto_ahash *tfm)
173 : {
174 : return tfm->reqsize;
175 : }
176 :
177 : static inline void *ahash_request_ctx(struct ahash_request *req)
178 : {
179 : return req->__ctx;
180 : }
181 :
182 : int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
183 : unsigned int keylen);
184 : int crypto_ahash_finup(struct ahash_request *req);
185 : int crypto_ahash_final(struct ahash_request *req);
186 : int crypto_ahash_digest(struct ahash_request *req);
187 :
188 : static inline int crypto_ahash_export(struct ahash_request *req, void *out)
189 : {
190 : return crypto_ahash_reqtfm(req)->export(req, out);
191 : }
192 :
193 : static inline int crypto_ahash_import(struct ahash_request *req, const void *in)
194 : {
195 : return crypto_ahash_reqtfm(req)->import(req, in);
196 : }
197 :
198 : static inline int crypto_ahash_init(struct ahash_request *req)
199 : {
200 : return crypto_ahash_reqtfm(req)->init(req);
201 : }
202 :
203 : static inline int crypto_ahash_update(struct ahash_request *req)
204 : {
205 : return crypto_ahash_reqtfm(req)->update(req);
206 : }
207 :
208 : static inline void ahash_request_set_tfm(struct ahash_request *req,
209 : struct crypto_ahash *tfm)
210 : {
211 : req->base.tfm = crypto_ahash_tfm(tfm);
212 : }
213 :
214 : static inline struct ahash_request *ahash_request_alloc(
215 : struct crypto_ahash *tfm, gfp_t gfp)
216 : {
217 : struct ahash_request *req;
218 :
219 : req = kmalloc(sizeof(struct ahash_request) +
220 : crypto_ahash_reqsize(tfm), gfp);
221 :
222 : if (likely(req))
223 : ahash_request_set_tfm(req, tfm);
224 :
225 : return req;
226 : }
227 :
228 : static inline void ahash_request_free(struct ahash_request *req)
229 : {
230 : kzfree(req);
231 : }
232 :
233 : static inline struct ahash_request *ahash_request_cast(
234 : struct crypto_async_request *req)
235 : {
236 : return container_of(req, struct ahash_request, base);
237 : }
238 :
239 : static inline void ahash_request_set_callback(struct ahash_request *req,
240 : u32 flags,
241 : crypto_completion_t compl,
242 : void *data)
243 : {
244 : req->base.complete = compl;
245 : req->base.data = data;
246 : req->base.flags = flags;
247 : }
248 :
249 : static inline void ahash_request_set_crypt(struct ahash_request *req,
250 : struct scatterlist *src, u8 *result,
251 : unsigned int nbytes)
252 : {
253 : req->src = src;
254 : req->nbytes = nbytes;
255 : req->result = result;
256 : }
257 :
258 : struct crypto_shash *crypto_alloc_shash(const char *alg_name, u32 type,
259 : u32 mask);
260 :
261 : static inline struct crypto_tfm *crypto_shash_tfm(struct crypto_shash *tfm)
262 : {
263 : return &tfm->base;
264 : }
265 :
266 : static inline void crypto_free_shash(struct crypto_shash *tfm)
267 : {
268 0 : crypto_destroy_tfm(tfm, crypto_shash_tfm(tfm));
269 : }
270 :
271 : static inline unsigned int crypto_shash_alignmask(
272 : struct crypto_shash *tfm)
273 : {
274 : return crypto_tfm_alg_alignmask(crypto_shash_tfm(tfm));
275 : }
276 :
277 : static inline unsigned int crypto_shash_blocksize(struct crypto_shash *tfm)
278 : {
279 : return crypto_tfm_alg_blocksize(crypto_shash_tfm(tfm));
280 : }
281 :
282 : static inline struct shash_alg *__crypto_shash_alg(struct crypto_alg *alg)
283 : {
284 : return container_of(alg, struct shash_alg, base);
285 : }
286 :
287 : static inline struct shash_alg *crypto_shash_alg(struct crypto_shash *tfm)
288 : {
289 : return __crypto_shash_alg(crypto_shash_tfm(tfm)->__crt_alg);
290 : }
291 :
292 : static inline unsigned int crypto_shash_digestsize(struct crypto_shash *tfm)
293 : {
294 : return crypto_shash_alg(tfm)->digestsize;
295 : }
296 :
297 : static inline unsigned int crypto_shash_statesize(struct crypto_shash *tfm)
298 : {
299 : return crypto_shash_alg(tfm)->statesize;
300 : }
301 :
302 : static inline u32 crypto_shash_get_flags(struct crypto_shash *tfm)
303 : {
304 : return crypto_tfm_get_flags(crypto_shash_tfm(tfm));
305 : }
306 :
307 : static inline void crypto_shash_set_flags(struct crypto_shash *tfm, u32 flags)
308 : {
309 : crypto_tfm_set_flags(crypto_shash_tfm(tfm), flags);
310 : }
311 :
312 : static inline void crypto_shash_clear_flags(struct crypto_shash *tfm, u32 flags)
313 : {
314 : crypto_tfm_clear_flags(crypto_shash_tfm(tfm), flags);
315 : }
316 :
317 : static inline unsigned int crypto_shash_descsize(struct crypto_shash *tfm)
318 : {
319 5966186 : return tfm->descsize;
320 : }
321 :
322 : static inline void *shash_desc_ctx(struct shash_desc *desc)
323 : {
324 : return desc->__ctx;
325 : }
326 :
327 : int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key,
328 : unsigned int keylen);
329 : int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
330 : unsigned int len, u8 *out);
331 :
332 : static inline int crypto_shash_export(struct shash_desc *desc, void *out)
333 : {
334 : return crypto_shash_alg(desc->tfm)->export(desc, out);
335 : }
336 :
337 : static inline int crypto_shash_import(struct shash_desc *desc, const void *in)
338 : {
339 : return crypto_shash_alg(desc->tfm)->import(desc, in);
340 : }
341 :
342 : static inline int crypto_shash_init(struct shash_desc *desc)
343 : {
344 : return crypto_shash_alg(desc->tfm)->init(desc);
345 : }
346 :
347 : int crypto_shash_update(struct shash_desc *desc, const u8 *data,
348 : unsigned int len);
349 : int crypto_shash_final(struct shash_desc *desc, u8 *out);
350 : int crypto_shash_finup(struct shash_desc *desc, const u8 *data,
351 : unsigned int len, u8 *out);
352 :
353 : #endif /* _CRYPTO_HASH_H */
|