diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-12-03 20:46:48 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2008-01-10 16:16:46 -0500 |
commit | b9c55aa475599183d0eab6833ea23e70c52dd24b (patch) | |
tree | 74e011e9b95291f230d6e7200730e3bc3b9d7153 /crypto/api.c | |
parent | 806d183aa6cc565d0f6bd2fb7fc6bfb175cc4813 (diff) |
[CRYPTO] skcipher: Create default givcipher instances
This patch makes crypto_alloc_ablkcipher/crypto_grab_skcipher always
return algorithms that are capable of generating their own IVs through
givencrypt and givdecrypt. Each algorithm may specify its default IV
generator through the geniv field.
For algorithms that do not set the geniv field, the blkcipher layer will
pick a default. Currently it's chainiv for synchronous algorithms and
eseqiv for asynchronous algorithms. Note that if these wrappers do not
work on an algorithm then that algorithm must specify its own geniv or
it can't be used at all.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/api.c')
-rw-r--r-- | crypto/api.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/crypto/api.c b/crypto/api.c index 1f5c72477356..a2496d1bc6d4 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
@@ -137,7 +137,7 @@ static struct crypto_alg *crypto_larval_alloc(const char *name, u32 type, | |||
137 | return alg; | 137 | return alg; |
138 | } | 138 | } |
139 | 139 | ||
140 | static void crypto_larval_kill(struct crypto_alg *alg) | 140 | void crypto_larval_kill(struct crypto_alg *alg) |
141 | { | 141 | { |
142 | struct crypto_larval *larval = (void *)alg; | 142 | struct crypto_larval *larval = (void *)alg; |
143 | 143 | ||
@@ -147,6 +147,7 @@ static void crypto_larval_kill(struct crypto_alg *alg) | |||
147 | complete_all(&larval->completion); | 147 | complete_all(&larval->completion); |
148 | crypto_alg_put(alg); | 148 | crypto_alg_put(alg); |
149 | } | 149 | } |
150 | EXPORT_SYMBOL_GPL(crypto_larval_kill); | ||
150 | 151 | ||
151 | static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg) | 152 | static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg) |
152 | { | 153 | { |
@@ -176,11 +177,9 @@ static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, | |||
176 | return alg; | 177 | return alg; |
177 | } | 178 | } |
178 | 179 | ||
179 | struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) | 180 | struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask) |
180 | { | 181 | { |
181 | struct crypto_alg *alg; | 182 | struct crypto_alg *alg; |
182 | struct crypto_alg *larval; | ||
183 | int ok; | ||
184 | 183 | ||
185 | if (!name) | 184 | if (!name) |
186 | return ERR_PTR(-ENOENT); | 185 | return ERR_PTR(-ENOENT); |
@@ -193,7 +192,17 @@ struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) | |||
193 | if (alg) | 192 | if (alg) |
194 | return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg; | 193 | return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg; |
195 | 194 | ||
196 | larval = crypto_larval_alloc(name, type, mask); | 195 | return crypto_larval_alloc(name, type, mask); |
196 | } | ||
197 | EXPORT_SYMBOL_GPL(crypto_larval_lookup); | ||
198 | |||
199 | struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) | ||
200 | { | ||
201 | struct crypto_alg *alg; | ||
202 | struct crypto_alg *larval; | ||
203 | int ok; | ||
204 | |||
205 | larval = crypto_larval_lookup(name, type, mask); | ||
197 | if (IS_ERR(larval) || !crypto_is_larval(larval)) | 206 | if (IS_ERR(larval) || !crypto_is_larval(larval)) |
198 | return larval; | 207 | return larval; |
199 | 208 | ||