diff options
-rw-r--r-- | crypto/api.c | 14 | ||||
-rw-r--r-- | include/linux/crypto.h | 90 |
2 files changed, 98 insertions, 6 deletions
diff --git a/crypto/api.c b/crypto/api.c index edaa843d8e83..2e84d4b54790 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
@@ -482,3 +482,17 @@ int crypto_alg_available(const char *name, u32 flags) | |||
482 | EXPORT_SYMBOL_GPL(crypto_alloc_tfm); | 482 | EXPORT_SYMBOL_GPL(crypto_alloc_tfm); |
483 | EXPORT_SYMBOL_GPL(crypto_free_tfm); | 483 | EXPORT_SYMBOL_GPL(crypto_free_tfm); |
484 | EXPORT_SYMBOL_GPL(crypto_alg_available); | 484 | EXPORT_SYMBOL_GPL(crypto_alg_available); |
485 | |||
486 | int crypto_has_alg(const char *name, u32 type, u32 mask) | ||
487 | { | ||
488 | int ret = 0; | ||
489 | struct crypto_alg *alg = crypto_alg_mod_lookup(name, type, mask); | ||
490 | |||
491 | if (!IS_ERR(alg)) { | ||
492 | crypto_mod_put(alg); | ||
493 | ret = 1; | ||
494 | } | ||
495 | |||
496 | return ret; | ||
497 | } | ||
498 | EXPORT_SYMBOL_GPL(crypto_has_alg); | ||
diff --git a/include/linux/crypto.h b/include/linux/crypto.h index 929fb9ad1314..cf91c4c0638b 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h | |||
@@ -236,11 +236,17 @@ int crypto_unregister_alg(struct crypto_alg *alg); | |||
236 | */ | 236 | */ |
237 | #ifdef CONFIG_CRYPTO | 237 | #ifdef CONFIG_CRYPTO |
238 | int crypto_alg_available(const char *name, u32 flags); | 238 | int crypto_alg_available(const char *name, u32 flags); |
239 | int crypto_has_alg(const char *name, u32 type, u32 mask); | ||
239 | #else | 240 | #else |
240 | static inline int crypto_alg_available(const char *name, u32 flags) | 241 | static inline int crypto_alg_available(const char *name, u32 flags) |
241 | { | 242 | { |
242 | return 0; | 243 | return 0; |
243 | } | 244 | } |
245 | |||
246 | static inline int crypto_has_alg(const char *name, u32 type, u32 mask) | ||
247 | { | ||
248 | return 0; | ||
249 | } | ||
244 | #endif | 250 | #endif |
245 | 251 | ||
246 | /* | 252 | /* |
@@ -329,6 +335,7 @@ struct crypto_tfm { | |||
329 | }; | 335 | }; |
330 | 336 | ||
331 | #define crypto_cipher crypto_tfm | 337 | #define crypto_cipher crypto_tfm |
338 | #define crypto_comp crypto_tfm | ||
332 | 339 | ||
333 | struct crypto_blkcipher { | 340 | struct crypto_blkcipher { |
334 | struct crypto_tfm base; | 341 | struct crypto_tfm base; |
@@ -485,6 +492,15 @@ static inline void crypto_free_blkcipher(struct crypto_blkcipher *tfm) | |||
485 | crypto_free_tfm(crypto_blkcipher_tfm(tfm)); | 492 | crypto_free_tfm(crypto_blkcipher_tfm(tfm)); |
486 | } | 493 | } |
487 | 494 | ||
495 | static inline int crypto_has_blkcipher(const char *alg_name, u32 type, u32 mask) | ||
496 | { | ||
497 | type &= ~CRYPTO_ALG_TYPE_MASK; | ||
498 | type |= CRYPTO_ALG_TYPE_BLKCIPHER; | ||
499 | mask |= CRYPTO_ALG_TYPE_MASK; | ||
500 | |||
501 | return crypto_has_alg(alg_name, type, mask); | ||
502 | } | ||
503 | |||
488 | static inline const char *crypto_blkcipher_name(struct crypto_blkcipher *tfm) | 504 | static inline const char *crypto_blkcipher_name(struct crypto_blkcipher *tfm) |
489 | { | 505 | { |
490 | return crypto_tfm_alg_name(crypto_blkcipher_tfm(tfm)); | 506 | return crypto_tfm_alg_name(crypto_blkcipher_tfm(tfm)); |
@@ -620,6 +636,15 @@ static inline void crypto_free_cipher(struct crypto_cipher *tfm) | |||
620 | crypto_free_tfm(crypto_cipher_tfm(tfm)); | 636 | crypto_free_tfm(crypto_cipher_tfm(tfm)); |
621 | } | 637 | } |
622 | 638 | ||
639 | static inline int crypto_has_cipher(const char *alg_name, u32 type, u32 mask) | ||
640 | { | ||
641 | type &= ~CRYPTO_ALG_TYPE_MASK; | ||
642 | type |= CRYPTO_ALG_TYPE_CIPHER; | ||
643 | mask |= CRYPTO_ALG_TYPE_MASK; | ||
644 | |||
645 | return crypto_has_alg(alg_name, type, mask); | ||
646 | } | ||
647 | |||
623 | static inline struct cipher_tfm *crypto_cipher_crt(struct crypto_cipher *tfm) | 648 | static inline struct cipher_tfm *crypto_cipher_crt(struct crypto_cipher *tfm) |
624 | { | 649 | { |
625 | return &crypto_cipher_tfm(tfm)->crt_cipher; | 650 | return &crypto_cipher_tfm(tfm)->crt_cipher; |
@@ -718,6 +743,15 @@ static inline void crypto_free_hash(struct crypto_hash *tfm) | |||
718 | crypto_free_tfm(crypto_hash_tfm(tfm)); | 743 | crypto_free_tfm(crypto_hash_tfm(tfm)); |
719 | } | 744 | } |
720 | 745 | ||
746 | static inline int crypto_has_hash(const char *alg_name, u32 type, u32 mask) | ||
747 | { | ||
748 | type &= ~CRYPTO_ALG_TYPE_MASK; | ||
749 | type |= CRYPTO_ALG_TYPE_HASH; | ||
750 | mask |= CRYPTO_ALG_TYPE_HASH_MASK; | ||
751 | |||
752 | return crypto_has_alg(alg_name, type, mask); | ||
753 | } | ||
754 | |||
721 | static inline struct hash_tfm *crypto_hash_crt(struct crypto_hash *tfm) | 755 | static inline struct hash_tfm *crypto_hash_crt(struct crypto_hash *tfm) |
722 | { | 756 | { |
723 | return &crypto_hash_tfm(tfm)->crt_hash; | 757 | return &crypto_hash_tfm(tfm)->crt_hash; |
@@ -853,20 +887,64 @@ static inline void crypto_cipher_get_iv(struct crypto_tfm *tfm, | |||
853 | memcpy(dst, tfm->crt_cipher.cit_iv, len); | 887 | memcpy(dst, tfm->crt_cipher.cit_iv, len); |
854 | } | 888 | } |
855 | 889 | ||
856 | static inline int crypto_comp_compress(struct crypto_tfm *tfm, | 890 | static inline struct crypto_comp *__crypto_comp_cast(struct crypto_tfm *tfm) |
891 | { | ||
892 | return (struct crypto_comp *)tfm; | ||
893 | } | ||
894 | |||
895 | static inline struct crypto_comp *crypto_comp_cast(struct crypto_tfm *tfm) | ||
896 | { | ||
897 | BUG_ON((crypto_tfm_alg_type(tfm) ^ CRYPTO_ALG_TYPE_COMPRESS) & | ||
898 | CRYPTO_ALG_TYPE_MASK); | ||
899 | return __crypto_comp_cast(tfm); | ||
900 | } | ||
901 | |||
902 | static inline struct crypto_comp *crypto_alloc_comp(const char *alg_name, | ||
903 | u32 type, u32 mask) | ||
904 | { | ||
905 | type &= ~CRYPTO_ALG_TYPE_MASK; | ||
906 | type |= CRYPTO_ALG_TYPE_COMPRESS; | ||
907 | mask |= CRYPTO_ALG_TYPE_MASK; | ||
908 | |||
909 | return __crypto_comp_cast(crypto_alloc_base(alg_name, type, mask)); | ||
910 | } | ||
911 | |||
912 | static inline struct crypto_tfm *crypto_comp_tfm(struct crypto_comp *tfm) | ||
913 | { | ||
914 | return tfm; | ||
915 | } | ||
916 | |||
917 | static inline void crypto_free_comp(struct crypto_comp *tfm) | ||
918 | { | ||
919 | crypto_free_tfm(crypto_comp_tfm(tfm)); | ||
920 | } | ||
921 | |||
922 | static inline int crypto_has_comp(const char *alg_name, u32 type, u32 mask) | ||
923 | { | ||
924 | type &= ~CRYPTO_ALG_TYPE_MASK; | ||
925 | type |= CRYPTO_ALG_TYPE_COMPRESS; | ||
926 | mask |= CRYPTO_ALG_TYPE_MASK; | ||
927 | |||
928 | return crypto_has_alg(alg_name, type, mask); | ||
929 | } | ||
930 | |||
931 | static inline struct compress_tfm *crypto_comp_crt(struct crypto_comp *tfm) | ||
932 | { | ||
933 | return &crypto_comp_tfm(tfm)->crt_compress; | ||
934 | } | ||
935 | |||
936 | static inline int crypto_comp_compress(struct crypto_comp *tfm, | ||
857 | const u8 *src, unsigned int slen, | 937 | const u8 *src, unsigned int slen, |
858 | u8 *dst, unsigned int *dlen) | 938 | u8 *dst, unsigned int *dlen) |
859 | { | 939 | { |
860 | BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS); | 940 | return crypto_comp_crt(tfm)->cot_compress(tfm, src, slen, dst, dlen); |
861 | return tfm->crt_compress.cot_compress(tfm, src, slen, dst, dlen); | ||
862 | } | 941 | } |
863 | 942 | ||
864 | static inline int crypto_comp_decompress(struct crypto_tfm *tfm, | 943 | static inline int crypto_comp_decompress(struct crypto_comp *tfm, |
865 | const u8 *src, unsigned int slen, | 944 | const u8 *src, unsigned int slen, |
866 | u8 *dst, unsigned int *dlen) | 945 | u8 *dst, unsigned int *dlen) |
867 | { | 946 | { |
868 | BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS); | 947 | return crypto_comp_crt(tfm)->cot_decompress(tfm, src, slen, dst, dlen); |
869 | return tfm->crt_compress.cot_decompress(tfm, src, slen, dst, dlen); | ||
870 | } | 948 | } |
871 | 949 | ||
872 | #endif /* _LINUX_CRYPTO_H */ | 950 | #endif /* _LINUX_CRYPTO_H */ |