diff options
| author | Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | 2012-06-18 07:07:03 -0400 |
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2012-06-27 02:42:01 -0400 |
| commit | 30a04008827b58c4aafbd1d6a27d6b6ed239e993 (patch) | |
| tree | 7c1cb4ead62efb278c0d0154f5fcc08c8ace90bb | |
| parent | ffaf9156320a077ebf9c5b9a5cf987689dc1a6b3 (diff) | |
crypto: twofish-avx - change to use shared ablk_* functions
Remove duplicate ablk_* functions and make use of ablk_helper module instead.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
| -rw-r--r-- | arch/x86/crypto/twofish_avx_glue.c | 116 | ||||
| -rw-r--r-- | crypto/Kconfig | 1 |
2 files changed, 7 insertions, 110 deletions
diff --git a/arch/x86/crypto/twofish_avx_glue.c b/arch/x86/crypto/twofish_avx_glue.c index 599f19e4bef6..cabe058eba14 100644 --- a/arch/x86/crypto/twofish_avx_glue.c +++ b/arch/x86/crypto/twofish_avx_glue.c | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #include <asm/i387.h> | 39 | #include <asm/i387.h> |
| 40 | #include <asm/xcr.h> | 40 | #include <asm/xcr.h> |
| 41 | #include <asm/xsave.h> | 41 | #include <asm/xsave.h> |
| 42 | #include <asm/crypto/ablk_helper.h> | ||
| 42 | #include <crypto/scatterwalk.h> | 43 | #include <crypto/scatterwalk.h> |
| 43 | #include <linux/workqueue.h> | 44 | #include <linux/workqueue.h> |
| 44 | #include <linux/spinlock.h> | 45 | #include <linux/spinlock.h> |
| @@ -95,11 +96,6 @@ static inline void twofish_dec_blk_xway(struct twofish_ctx *ctx, u8 *dst, | |||
| 95 | } | 96 | } |
| 96 | 97 | ||
| 97 | 98 | ||
| 98 | |||
| 99 | struct async_twofish_ctx { | ||
| 100 | struct cryptd_ablkcipher *cryptd_tfm; | ||
| 101 | }; | ||
| 102 | |||
| 103 | static inline bool twofish_fpu_begin(bool fpu_enabled, unsigned int nbytes) | 99 | static inline bool twofish_fpu_begin(bool fpu_enabled, unsigned int nbytes) |
| 104 | { | 100 | { |
| 105 | if (fpu_enabled) | 101 | if (fpu_enabled) |
| @@ -730,106 +726,6 @@ static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | |||
| 730 | return ret; | 726 | return ret; |
| 731 | } | 727 | } |
| 732 | 728 | ||
| 733 | static int ablk_set_key(struct crypto_ablkcipher *tfm, const u8 *key, | ||
| 734 | unsigned int key_len) | ||
| 735 | { | ||
| 736 | struct async_twofish_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
| 737 | struct crypto_ablkcipher *child = &ctx->cryptd_tfm->base; | ||
| 738 | int err; | ||
| 739 | |||
| 740 | crypto_ablkcipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
| 741 | crypto_ablkcipher_set_flags(child, crypto_ablkcipher_get_flags(tfm) | ||
| 742 | & CRYPTO_TFM_REQ_MASK); | ||
| 743 | err = crypto_ablkcipher_setkey(child, key, key_len); | ||
| 744 | crypto_ablkcipher_set_flags(tfm, crypto_ablkcipher_get_flags(child) | ||
| 745 | & CRYPTO_TFM_RES_MASK); | ||
| 746 | return err; | ||
| 747 | } | ||
| 748 | |||
| 749 | static int __ablk_encrypt(struct ablkcipher_request *req) | ||
| 750 | { | ||
| 751 | struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); | ||
| 752 | struct async_twofish_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
| 753 | struct blkcipher_desc desc; | ||
| 754 | |||
| 755 | desc.tfm = cryptd_ablkcipher_child(ctx->cryptd_tfm); | ||
| 756 | desc.info = req->info; | ||
| 757 | desc.flags = 0; | ||
| 758 | |||
| 759 | return crypto_blkcipher_crt(desc.tfm)->encrypt( | ||
| 760 | &desc, req->dst, req->src, req->nbytes); | ||
| 761 | } | ||
| 762 | |||
| 763 | static int ablk_encrypt(struct ablkcipher_request *req) | ||
| 764 | { | ||
| 765 | struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); | ||
| 766 | struct async_twofish_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
| 767 | |||
| 768 | if (!irq_fpu_usable()) { | ||
| 769 | struct ablkcipher_request *cryptd_req = | ||
| 770 | ablkcipher_request_ctx(req); | ||
| 771 | |||
| 772 | memcpy(cryptd_req, req, sizeof(*req)); | ||
| 773 | ablkcipher_request_set_tfm(cryptd_req, &ctx->cryptd_tfm->base); | ||
| 774 | |||
| 775 | return crypto_ablkcipher_encrypt(cryptd_req); | ||
| 776 | } else { | ||
| 777 | return __ablk_encrypt(req); | ||
| 778 | } | ||
| 779 | } | ||
| 780 | |||
| 781 | static int ablk_decrypt(struct ablkcipher_request *req) | ||
| 782 | { | ||
| 783 | struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); | ||
| 784 | struct async_twofish_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
| 785 | |||
| 786 | if (!irq_fpu_usable()) { | ||
| 787 | struct ablkcipher_request *cryptd_req = | ||
| 788 | ablkcipher_request_ctx(req); | ||
| 789 | |||
| 790 | memcpy(cryptd_req, req, sizeof(*req)); | ||
| 791 | ablkcipher_request_set_tfm(cryptd_req, &ctx->cryptd_tfm->base); | ||
| 792 | |||
| 793 | return crypto_ablkcipher_decrypt(cryptd_req); | ||
| 794 | } else { | ||
| 795 | struct blkcipher_desc desc; | ||
| 796 | |||
| 797 | desc.tfm = cryptd_ablkcipher_child(ctx->cryptd_tfm); | ||
| 798 | desc.info = req->info; | ||
| 799 | desc.flags = 0; | ||
| 800 | |||
| 801 | return crypto_blkcipher_crt(desc.tfm)->decrypt( | ||
| 802 | &desc, req->dst, req->src, req->nbytes); | ||
| 803 | } | ||
| 804 | } | ||
| 805 | |||
| 806 | static void ablk_exit(struct crypto_tfm *tfm) | ||
| 807 | { | ||
| 808 | struct async_twofish_ctx *ctx = crypto_tfm_ctx(tfm); | ||
| 809 | |||
| 810 | cryptd_free_ablkcipher(ctx->cryptd_tfm); | ||
| 811 | } | ||
| 812 | |||
| 813 | static int ablk_init(struct crypto_tfm *tfm) | ||
| 814 | { | ||
| 815 | struct async_twofish_ctx *ctx = crypto_tfm_ctx(tfm); | ||
| 816 | struct cryptd_ablkcipher *cryptd_tfm; | ||
| 817 | char drv_name[CRYPTO_MAX_ALG_NAME]; | ||
| 818 | |||
| 819 | snprintf(drv_name, sizeof(drv_name), "__driver-%s", | ||
| 820 | crypto_tfm_alg_driver_name(tfm)); | ||
| 821 | |||
| 822 | cryptd_tfm = cryptd_alloc_ablkcipher(drv_name, 0, 0); | ||
| 823 | if (IS_ERR(cryptd_tfm)) | ||
| 824 | return PTR_ERR(cryptd_tfm); | ||
| 825 | |||
| 826 | ctx->cryptd_tfm = cryptd_tfm; | ||
| 827 | tfm->crt_ablkcipher.reqsize = sizeof(struct ablkcipher_request) + | ||
| 828 | crypto_ablkcipher_reqsize(&cryptd_tfm->base); | ||
| 829 | |||
| 830 | return 0; | ||
| 831 | } | ||
| 832 | |||
| 833 | static struct crypto_alg twofish_algs[10] = { { | 729 | static struct crypto_alg twofish_algs[10] = { { |
| 834 | .cra_name = "__ecb-twofish-avx", | 730 | .cra_name = "__ecb-twofish-avx", |
| 835 | .cra_driver_name = "__driver-ecb-twofish-avx", | 731 | .cra_driver_name = "__driver-ecb-twofish-avx", |
| @@ -942,7 +838,7 @@ static struct crypto_alg twofish_algs[10] = { { | |||
| 942 | .cra_priority = 400, | 838 | .cra_priority = 400, |
| 943 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, | 839 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, |
| 944 | .cra_blocksize = TF_BLOCK_SIZE, | 840 | .cra_blocksize = TF_BLOCK_SIZE, |
| 945 | .cra_ctxsize = sizeof(struct async_twofish_ctx), | 841 | .cra_ctxsize = sizeof(struct async_helper_ctx), |
| 946 | .cra_alignmask = 0, | 842 | .cra_alignmask = 0, |
| 947 | .cra_type = &crypto_ablkcipher_type, | 843 | .cra_type = &crypto_ablkcipher_type, |
| 948 | .cra_module = THIS_MODULE, | 844 | .cra_module = THIS_MODULE, |
| @@ -964,7 +860,7 @@ static struct crypto_alg twofish_algs[10] = { { | |||
| 964 | .cra_priority = 400, | 860 | .cra_priority = 400, |
| 965 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, | 861 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, |
| 966 | .cra_blocksize = TF_BLOCK_SIZE, | 862 | .cra_blocksize = TF_BLOCK_SIZE, |
| 967 | .cra_ctxsize = sizeof(struct async_twofish_ctx), | 863 | .cra_ctxsize = sizeof(struct async_helper_ctx), |
| 968 | .cra_alignmask = 0, | 864 | .cra_alignmask = 0, |
| 969 | .cra_type = &crypto_ablkcipher_type, | 865 | .cra_type = &crypto_ablkcipher_type, |
| 970 | .cra_module = THIS_MODULE, | 866 | .cra_module = THIS_MODULE, |
| @@ -987,7 +883,7 @@ static struct crypto_alg twofish_algs[10] = { { | |||
| 987 | .cra_priority = 400, | 883 | .cra_priority = 400, |
| 988 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, | 884 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, |
| 989 | .cra_blocksize = 1, | 885 | .cra_blocksize = 1, |
| 990 | .cra_ctxsize = sizeof(struct async_twofish_ctx), | 886 | .cra_ctxsize = sizeof(struct async_helper_ctx), |
| 991 | .cra_alignmask = 0, | 887 | .cra_alignmask = 0, |
| 992 | .cra_type = &crypto_ablkcipher_type, | 888 | .cra_type = &crypto_ablkcipher_type, |
| 993 | .cra_module = THIS_MODULE, | 889 | .cra_module = THIS_MODULE, |
| @@ -1011,7 +907,7 @@ static struct crypto_alg twofish_algs[10] = { { | |||
| 1011 | .cra_priority = 400, | 907 | .cra_priority = 400, |
| 1012 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, | 908 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, |
| 1013 | .cra_blocksize = TF_BLOCK_SIZE, | 909 | .cra_blocksize = TF_BLOCK_SIZE, |
| 1014 | .cra_ctxsize = sizeof(struct async_twofish_ctx), | 910 | .cra_ctxsize = sizeof(struct async_helper_ctx), |
| 1015 | .cra_alignmask = 0, | 911 | .cra_alignmask = 0, |
| 1016 | .cra_type = &crypto_ablkcipher_type, | 912 | .cra_type = &crypto_ablkcipher_type, |
| 1017 | .cra_module = THIS_MODULE, | 913 | .cra_module = THIS_MODULE, |
| @@ -1036,7 +932,7 @@ static struct crypto_alg twofish_algs[10] = { { | |||
| 1036 | .cra_priority = 400, | 932 | .cra_priority = 400, |
| 1037 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, | 933 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, |
| 1038 | .cra_blocksize = TF_BLOCK_SIZE, | 934 | .cra_blocksize = TF_BLOCK_SIZE, |
| 1039 | .cra_ctxsize = sizeof(struct async_twofish_ctx), | 935 | .cra_ctxsize = sizeof(struct async_helper_ctx), |
| 1040 | .cra_alignmask = 0, | 936 | .cra_alignmask = 0, |
| 1041 | .cra_type = &crypto_ablkcipher_type, | 937 | .cra_type = &crypto_ablkcipher_type, |
| 1042 | .cra_module = THIS_MODULE, | 938 | .cra_module = THIS_MODULE, |
diff --git a/crypto/Kconfig b/crypto/Kconfig index 8e9145c07d87..24b929e30bf3 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
| @@ -946,6 +946,7 @@ config CRYPTO_TWOFISH_AVX_X86_64 | |||
| 946 | depends on X86 && 64BIT | 946 | depends on X86 && 64BIT |
| 947 | select CRYPTO_ALGAPI | 947 | select CRYPTO_ALGAPI |
| 948 | select CRYPTO_CRYPTD | 948 | select CRYPTO_CRYPTD |
| 949 | select CRYPTO_ABLK_HELPER_X86 | ||
| 949 | select CRYPTO_TWOFISH_COMMON | 950 | select CRYPTO_TWOFISH_COMMON |
| 950 | select CRYPTO_TWOFISH_X86_64 | 951 | select CRYPTO_TWOFISH_X86_64 |
| 951 | select CRYPTO_TWOFISH_X86_64_3WAY | 952 | select CRYPTO_TWOFISH_X86_64_3WAY |
