]>
Commit | Line | Data |
---|---|---|
743edf57 HX |
1 | /* |
2 | * AEAD: Authenticated Encryption with Associated Data | |
3 | * | |
4 | * Copyright (c) 2007 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_AEAD_H | |
14 | #define _CRYPTO_AEAD_H | |
15 | ||
16 | #include <linux/crypto.h> | |
17 | #include <linux/kernel.h> | |
3a282bd2 | 18 | #include <linux/slab.h> |
743edf57 HX |
19 | |
20 | /** | |
21 | * struct aead_givcrypt_request - AEAD request with IV generation | |
22 | * @seq: Sequence number for IV generation | |
23 | * @giv: Space for generated IV | |
24 | * @areq: The AEAD request itself | |
25 | */ | |
26 | struct aead_givcrypt_request { | |
27 | u64 seq; | |
28 | u8 *giv; | |
29 | ||
30 | struct aead_request areq; | |
31 | }; | |
32 | ||
33 | static inline struct crypto_aead *aead_givcrypt_reqtfm( | |
34 | struct aead_givcrypt_request *req) | |
35 | { | |
36 | return crypto_aead_reqtfm(&req->areq); | |
37 | } | |
38 | ||
3a282bd2 HX |
39 | static inline int crypto_aead_givencrypt(struct aead_givcrypt_request *req) |
40 | { | |
41 | struct aead_tfm *crt = crypto_aead_crt(aead_givcrypt_reqtfm(req)); | |
42 | return crt->givencrypt(req); | |
43 | }; | |
44 | ||
45 | static inline int crypto_aead_givdecrypt(struct aead_givcrypt_request *req) | |
46 | { | |
47 | struct aead_tfm *crt = crypto_aead_crt(aead_givcrypt_reqtfm(req)); | |
48 | return crt->givdecrypt(req); | |
49 | }; | |
50 | ||
51 | static inline void aead_givcrypt_set_tfm(struct aead_givcrypt_request *req, | |
52 | struct crypto_aead *tfm) | |
53 | { | |
54 | req->areq.base.tfm = crypto_aead_tfm(tfm); | |
55 | } | |
56 | ||
57 | static inline struct aead_givcrypt_request *aead_givcrypt_alloc( | |
58 | struct crypto_aead *tfm, gfp_t gfp) | |
59 | { | |
60 | struct aead_givcrypt_request *req; | |
61 | ||
62 | req = kmalloc(sizeof(struct aead_givcrypt_request) + | |
63 | crypto_aead_reqsize(tfm), gfp); | |
64 | ||
65 | if (likely(req)) | |
66 | aead_givcrypt_set_tfm(req, tfm); | |
67 | ||
68 | return req; | |
69 | } | |
70 | ||
71 | static inline void aead_givcrypt_free(struct aead_givcrypt_request *req) | |
72 | { | |
73 | kfree(req); | |
74 | } | |
75 | ||
76 | static inline void aead_givcrypt_set_callback( | |
77 | struct aead_givcrypt_request *req, u32 flags, | |
78 | crypto_completion_t complete, void *data) | |
79 | { | |
80 | aead_request_set_callback(&req->areq, flags, complete, data); | |
81 | } | |
82 | ||
83 | static inline void aead_givcrypt_set_crypt(struct aead_givcrypt_request *req, | |
84 | struct scatterlist *src, | |
85 | struct scatterlist *dst, | |
86 | unsigned int nbytes, void *iv) | |
87 | { | |
88 | aead_request_set_crypt(&req->areq, src, dst, nbytes, iv); | |
89 | } | |
90 | ||
91 | static inline void aead_givcrypt_set_assoc(struct aead_givcrypt_request *req, | |
92 | struct scatterlist *assoc, | |
93 | unsigned int assoclen) | |
94 | { | |
95 | aead_request_set_assoc(&req->areq, assoc, assoclen); | |
96 | } | |
97 | ||
98 | static inline void aead_givcrypt_set_giv(struct aead_givcrypt_request *req, | |
99 | u8 *giv, u64 seq) | |
100 | { | |
101 | req->giv = giv; | |
102 | req->seq = seq; | |
103 | } | |
104 | ||
743edf57 | 105 | #endif /* _CRYPTO_AEAD_H */ |