diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-07-07 03:17:12 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2009-07-08 06:57:10 -0400 |
commit | 2e4fddd8e420e8f531a34e7a97f9cdb851a6ad13 (patch) | |
tree | 8f708150f9dca8286a0b6f1d347bda657a3c57a9 | |
parent | 70ec7bb91ad0d6cce84c8e17f8cbb608dda7b18c (diff) |
crypto: shash - Add shash_instance
This patch adds shash_instance and the associated alloc/free
functions. This is meant to be an instance that with a shash
algorithm under it. Note that the instance itself doesn't have
to be shash.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | crypto/shash.c | 7 | ||||
-rw-r--r-- | include/crypto/internal/hash.h | 26 |
2 files changed, 33 insertions, 0 deletions
diff --git a/crypto/shash.c b/crypto/shash.c index 2ccc8b0076ce..8f9d8831e293 100644 --- a/crypto/shash.c +++ b/crypto/shash.c | |||
@@ -502,5 +502,12 @@ int crypto_unregister_shash(struct shash_alg *alg) | |||
502 | } | 502 | } |
503 | EXPORT_SYMBOL_GPL(crypto_unregister_shash); | 503 | EXPORT_SYMBOL_GPL(crypto_unregister_shash); |
504 | 504 | ||
505 | void shash_free_instance(struct crypto_instance *inst) | ||
506 | { | ||
507 | crypto_drop_spawn(crypto_instance_ctx(inst)); | ||
508 | kfree(shash_instance(inst)); | ||
509 | } | ||
510 | EXPORT_SYMBOL_GPL(shash_free_instance); | ||
511 | |||
505 | MODULE_LICENSE("GPL"); | 512 | MODULE_LICENSE("GPL"); |
506 | MODULE_DESCRIPTION("Synchronous cryptographic hash type"); | 513 | MODULE_DESCRIPTION("Synchronous cryptographic hash type"); |
diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h index 82b70564bcab..44d3bcdce6e2 100644 --- a/include/crypto/internal/hash.h +++ b/include/crypto/internal/hash.h | |||
@@ -34,6 +34,10 @@ struct crypto_hash_walk { | |||
34 | unsigned int flags; | 34 | unsigned int flags; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | struct shash_instance { | ||
38 | struct shash_alg alg; | ||
39 | }; | ||
40 | |||
37 | extern const struct crypto_type crypto_ahash_type; | 41 | extern const struct crypto_type crypto_ahash_type; |
38 | 42 | ||
39 | int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err); | 43 | int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err); |
@@ -46,6 +50,8 @@ int crypto_hash_walk_first_compat(struct hash_desc *hdesc, | |||
46 | int crypto_register_shash(struct shash_alg *alg); | 50 | int crypto_register_shash(struct shash_alg *alg); |
47 | int crypto_unregister_shash(struct shash_alg *alg); | 51 | int crypto_unregister_shash(struct shash_alg *alg); |
48 | 52 | ||
53 | void shash_free_instance(struct crypto_instance *inst); | ||
54 | |||
49 | static inline void *crypto_ahash_ctx(struct crypto_ahash *tfm) | 55 | static inline void *crypto_ahash_ctx(struct crypto_ahash *tfm) |
50 | { | 56 | { |
51 | return crypto_tfm_ctx(&tfm->base); | 57 | return crypto_tfm_ctx(&tfm->base); |
@@ -80,5 +86,25 @@ static inline void *crypto_shash_ctx(struct crypto_shash *tfm) | |||
80 | return crypto_tfm_ctx(&tfm->base); | 86 | return crypto_tfm_ctx(&tfm->base); |
81 | } | 87 | } |
82 | 88 | ||
89 | static inline struct crypto_instance *shash_crypto_instance( | ||
90 | struct shash_instance *inst) | ||
91 | { | ||
92 | return container_of(&inst->alg.base, struct crypto_instance, alg); | ||
93 | } | ||
94 | |||
95 | static inline struct shash_instance *shash_instance( | ||
96 | struct crypto_instance *inst) | ||
97 | { | ||
98 | return container_of(__crypto_shash_alg(&inst->alg), | ||
99 | struct shash_instance, alg); | ||
100 | } | ||
101 | |||
102 | static inline struct shash_instance *shash_alloc_instance( | ||
103 | const char *name, struct crypto_alg *alg) | ||
104 | { | ||
105 | return crypto_alloc_instance2(name, alg, | ||
106 | sizeof(struct shash_alg) - sizeof(*alg)); | ||
107 | } | ||
108 | |||
83 | #endif /* _CRYPTO_INTERNAL_HASH_H */ | 109 | #endif /* _CRYPTO_INTERNAL_HASH_H */ |
84 | 110 | ||