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_INTERNAL_AEAD_H 14 #define _CRYPTO_INTERNAL_AEAD_H 15 16 #include <crypto/aead.h> 17 #include <crypto/algapi.h> 18 #include <linux/types.h> 19 20 struct rtattr; 21 22 struct crypto_aead_spawn { 23 struct crypto_spawn base; 24 }; 25 26 extern const struct crypto_type crypto_aead_type; 27 extern const struct crypto_type crypto_nivaead_type; 28 29 static inline struct aead_alg *crypto_aead_alg(struct crypto_aead *tfm) 30 { 31 return &crypto_aead_tfm(tfm)->__crt_alg->cra_aead; 32 } 33 34 static inline void *crypto_aead_ctx(struct crypto_aead *tfm) 35 { 36 return crypto_tfm_ctx(&tfm->base); 37 } 38 39 static inline struct crypto_instance *crypto_aead_alg_instance( 40 struct crypto_aead *aead) 41 { 42 return crypto_tfm_alg_instance(&aead->base); 43 } 44 45 static inline void *aead_request_ctx(struct aead_request *req) 46 { 47 return req->__ctx; 48 } 49 50 static inline void aead_request_complete(struct aead_request *req, int err) 51 { 52 req->base.complete(&req->base, err); 53 } 54 55 static inline u32 aead_request_flags(struct aead_request *req) 56 { 57 return req->base.flags; 58 } 59 60 static inline void crypto_set_aead_spawn( 61 struct crypto_aead_spawn *spawn, struct crypto_instance *inst) 62 { 63 crypto_set_spawn(&spawn->base, inst); 64 } 65 66 struct crypto_alg *crypto_lookup_aead(const char *name, u32 type, u32 mask); 67 68 int crypto_grab_aead(struct crypto_aead_spawn *spawn, const char *name, 69 u32 type, u32 mask); 70 71 static inline void crypto_drop_aead(struct crypto_aead_spawn *spawn) 72 { 73 crypto_drop_spawn(&spawn->base); 74 } 75 76 static inline struct crypto_alg *crypto_aead_spawn_alg( 77 struct crypto_aead_spawn *spawn) 78 { 79 return spawn->base.alg; 80 } 81 82 static inline struct crypto_aead *crypto_spawn_aead( 83 struct crypto_aead_spawn *spawn) 84 { 85 return crypto_spawn_tfm2(&spawn->base); 86 } 87 88 struct crypto_instance *aead_geniv_alloc(struct crypto_template *tmpl, 89 struct rtattr **tb, u32 type, 90 u32 mask); 91 void aead_geniv_free(struct crypto_instance *inst); 92 int aead_geniv_init(struct crypto_tfm *tfm); 93 void aead_geniv_exit(struct crypto_tfm *tfm); 94 95 static inline struct crypto_aead *aead_geniv_base(struct crypto_aead *geniv) 96 { 97 return geniv->child; 98 } 99 100 static inline void *aead_givcrypt_reqctx(struct aead_givcrypt_request *req) 101 { 102 return aead_request_ctx(&req->areq); 103 } 104 105 static inline void aead_givcrypt_complete(struct aead_givcrypt_request *req, 106 int err) 107 { 108 aead_request_complete(&req->areq, err); 109 } 110 111 static inline void crypto_aead_set_reqsize(struct crypto_aead *aead, 112 unsigned int reqsize) 113 { 114 crypto_aead_crt(aead)->reqsize = reqsize; 115 } 116 117 #endif /* _CRYPTO_INTERNAL_AEAD_H */ 118 119