2 * AEAD: Authenticated Encryption with Associated Data
4 * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au>
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)
13 #ifndef _CRYPTO_INTERNAL_AEAD_H
14 #define _CRYPTO_INTERNAL_AEAD_H
16 #include <crypto/aead.h>
17 #include <crypto/algapi.h>
18 #include <linux/stddef.h>
19 #include <linux/types.h>
23 struct aead_instance
{
26 char head
[offsetof(struct aead_alg
, base
)];
27 struct crypto_instance base
;
33 struct crypto_aead_spawn
{
34 struct crypto_spawn base
;
37 extern const struct crypto_type crypto_aead_type
;
38 extern const struct crypto_type crypto_nivaead_type
;
40 static inline void *crypto_aead_ctx(struct crypto_aead
*tfm
)
42 return crypto_tfm_ctx(&tfm
->base
);
45 static inline struct crypto_instance
*crypto_aead_alg_instance(
46 struct crypto_aead
*aead
)
48 return crypto_tfm_alg_instance(&aead
->base
);
51 static inline struct crypto_instance
*aead_crypto_instance(
52 struct aead_instance
*inst
)
54 return container_of(&inst
->alg
.base
, struct crypto_instance
, alg
);
57 static inline struct aead_instance
*aead_instance(struct crypto_instance
*inst
)
59 return container_of(&inst
->alg
, struct aead_instance
, alg
.base
);
62 static inline struct aead_instance
*aead_alg_instance(struct crypto_aead
*aead
)
64 return aead_instance(crypto_aead_alg_instance(aead
));
67 static inline void *aead_instance_ctx(struct aead_instance
*inst
)
69 return crypto_instance_ctx(aead_crypto_instance(inst
));
72 static inline void *aead_request_ctx(struct aead_request
*req
)
77 static inline void aead_request_complete(struct aead_request
*req
, int err
)
79 req
->base
.complete(&req
->base
, err
);
82 static inline u32
aead_request_flags(struct aead_request
*req
)
84 return req
->base
.flags
;
87 static inline void crypto_set_aead_spawn(
88 struct crypto_aead_spawn
*spawn
, struct crypto_instance
*inst
)
90 crypto_set_spawn(&spawn
->base
, inst
);
93 struct crypto_alg
*crypto_lookup_aead(const char *name
, u32 type
, u32 mask
);
95 int crypto_grab_aead(struct crypto_aead_spawn
*spawn
, const char *name
,
98 static inline void crypto_drop_aead(struct crypto_aead_spawn
*spawn
)
100 crypto_drop_spawn(&spawn
->base
);
103 static inline struct crypto_alg
*crypto_aead_spawn_alg(
104 struct crypto_aead_spawn
*spawn
)
106 return spawn
->base
.alg
;
109 static inline struct aead_alg
*crypto_spawn_aead_alg(
110 struct crypto_aead_spawn
*spawn
)
112 return container_of(spawn
->base
.alg
, struct aead_alg
, base
);
115 static inline struct crypto_aead
*crypto_spawn_aead(
116 struct crypto_aead_spawn
*spawn
)
118 return crypto_spawn_tfm2(&spawn
->base
);
121 struct aead_instance
*aead_geniv_alloc(struct crypto_template
*tmpl
,
122 struct rtattr
**tb
, u32 type
, u32 mask
);
123 void aead_geniv_free(struct aead_instance
*inst
);
124 int aead_geniv_init(struct crypto_tfm
*tfm
);
125 void aead_geniv_exit(struct crypto_tfm
*tfm
);
127 static inline struct crypto_aead
*aead_geniv_base(struct crypto_aead
*geniv
)
132 static inline void *aead_givcrypt_reqctx(struct aead_givcrypt_request
*req
)
134 return aead_request_ctx(&req
->areq
);
137 static inline void aead_givcrypt_complete(struct aead_givcrypt_request
*req
,
140 aead_request_complete(&req
->areq
, err
);
143 static inline void crypto_aead_set_reqsize(struct crypto_aead
*aead
,
144 unsigned int reqsize
)
146 crypto_aead_crt(aead
)->reqsize
= reqsize
;
149 static inline unsigned int crypto_aead_alg_maxauthsize(struct aead_alg
*alg
)
151 return alg
->base
.cra_aead
.encrypt
? alg
->base
.cra_aead
.maxauthsize
:
155 static inline unsigned int crypto_aead_maxauthsize(struct crypto_aead
*aead
)
157 return crypto_aead_alg_maxauthsize(crypto_aead_alg(aead
));
160 int crypto_register_aead(struct aead_alg
*alg
);
161 void crypto_unregister_aead(struct aead_alg
*alg
);
162 int crypto_register_aeads(struct aead_alg
*algs
, int count
);
163 void crypto_unregister_aeads(struct aead_alg
*algs
, int count
);
164 int aead_register_instance(struct crypto_template
*tmpl
,
165 struct aead_instance
*inst
);
167 #endif /* _CRYPTO_INTERNAL_AEAD_H */