crypto: arch - conditionalize crypto api in arch glue for lib code
authorJason A. Donenfeld <Jason@zx2c4.com>
Mon, 25 Nov 2019 10:31:12 +0000 (11:31 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 27 Nov 2019 05:08:49 +0000 (13:08 +0800)
For glue code that's used by Zinc, the actual Crypto API functions might
not necessarily exist, and don't need to exist either. Before this
patch, there are valid build configurations that lead to a unbuildable
kernel. This fixes it to conditionalize those symbols on the existence
of the proper config entry.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/arm/crypto/chacha-glue.c
arch/arm/crypto/curve25519-glue.c
arch/arm/crypto/poly1305-glue.c
arch/arm64/crypto/chacha-neon-glue.c
arch/arm64/crypto/poly1305-glue.c
arch/mips/crypto/chacha-glue.c
arch/mips/crypto/poly1305-glue.c
arch/x86/crypto/blake2s-glue.c
arch/x86/crypto/chacha_glue.c
arch/x86/crypto/curve25519-x86_64.c
arch/x86/crypto/poly1305_glue.c

index 3f0c057aa0502065320591972eb8f04ecd456de5..6ebbb2b241d2be3d7478e492811819bdf6395f4a 100644 (file)
@@ -286,11 +286,13 @@ static struct skcipher_alg neon_algs[] = {
 
 static int __init chacha_simd_mod_init(void)
 {
-       int err;
+       int err = 0;
 
-       err = crypto_register_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-       if (err)
-               return err;
+       if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER)) {
+               err = crypto_register_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
+               if (err)
+                       return err;
+       }
 
        if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON)) {
                int i;
@@ -310,18 +312,22 @@ static int __init chacha_simd_mod_init(void)
                        static_branch_enable(&use_neon);
                }
 
-               err = crypto_register_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-               if (err)
-                       crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
+               if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER)) {
+                       err = crypto_register_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
+                       if (err)
+                               crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
+               }
        }
        return err;
 }
 
 static void __exit chacha_simd_mod_fini(void)
 {
-       crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-       if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON))
-               crypto_unregister_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
+       if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER)) {
+               crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
+               if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON))
+                       crypto_unregister_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
+       }
 }
 
 module_init(chacha_simd_mod_init);
index 2e9e12d2f642ac9d0166ecb611da845984463c4d..f3f42cf3b8937e3e28fd01a6e2ab4890335f0dd3 100644 (file)
@@ -108,14 +108,15 @@ static int __init mod_init(void)
 {
        if (elf_hwcap & HWCAP_NEON) {
                static_branch_enable(&have_neon);
-               return crypto_register_kpp(&curve25519_alg);
+               return IS_REACHABLE(CONFIG_CRYPTO_KPP) ?
+                       crypto_register_kpp(&curve25519_alg) : 0;
        }
        return 0;
 }
 
 static void __exit mod_exit(void)
 {
-       if (elf_hwcap & HWCAP_NEON)
+       if (IS_REACHABLE(CONFIG_CRYPTO_KPP) && elf_hwcap & HWCAP_NEON)
                crypto_unregister_kpp(&curve25519_alg);
 }
 
index 74a725ac89c9f1b9b5b4653b8f5bc72d51f0d930..abe3f2d587dcbdcf923cf1688ea62f89a0afad47 100644 (file)
@@ -249,16 +249,19 @@ static int __init arm_poly1305_mod_init(void)
        if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) &&
            (elf_hwcap & HWCAP_NEON))
                static_branch_enable(&have_neon);
-       else
+       else if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
                /* register only the first entry */
                return crypto_register_shash(&arm_poly1305_algs[0]);
 
-       return crypto_register_shashes(arm_poly1305_algs,
-                                      ARRAY_SIZE(arm_poly1305_algs));
+       return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
+               crypto_register_shashes(arm_poly1305_algs,
+                                       ARRAY_SIZE(arm_poly1305_algs)) : 0;
 }
 
 static void __exit arm_poly1305_mod_exit(void)
 {
+       if (!IS_REACHABLE(CONFIG_CRYPTO_HASH))
+               return;
        if (!static_branch_likely(&have_neon)) {
                crypto_unregister_shash(&arm_poly1305_algs[0]);
                return;
index b08029d7bde620a7714d57b0b04ff1d0556bcd14..c1f9660d104cfc57365e42edc23867034b65fcfd 100644 (file)
@@ -211,12 +211,13 @@ static int __init chacha_simd_mod_init(void)
 
        static_branch_enable(&have_neon);
 
-       return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
+       return IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) ?
+               crypto_register_skciphers(algs, ARRAY_SIZE(algs)) : 0;
 }
 
 static void __exit chacha_simd_mod_fini(void)
 {
-       if (cpu_have_named_feature(ASIMD))
+       if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) && cpu_have_named_feature(ASIMD))
                crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
 }
 
index dd843d0ee83ab9086407f06057adca7e3ce9c22b..83a2338a88263d2495ff0273315a170c65f85ad8 100644 (file)
@@ -220,12 +220,13 @@ static int __init neon_poly1305_mod_init(void)
 
        static_branch_enable(&have_neon);
 
-       return crypto_register_shash(&neon_poly1305_alg);
+       return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
+               crypto_register_shash(&neon_poly1305_alg) : 0;
 }
 
 static void __exit neon_poly1305_mod_exit(void)
 {
-       if (cpu_have_named_feature(ASIMD))
+       if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && cpu_have_named_feature(ASIMD))
                crypto_unregister_shash(&neon_poly1305_alg);
 }
 
index 779e399c9befda2c08960c9a422a329bfe4c934f..d1fd23e6ef844d13282af3f5731366642bd4a456 100644 (file)
@@ -128,12 +128,14 @@ static struct skcipher_alg algs[] = {
 
 static int __init chacha_simd_mod_init(void)
 {
-       return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
+       return IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) ?
+               crypto_register_skciphers(algs, ARRAY_SIZE(algs)) : 0;
 }
 
 static void __exit chacha_simd_mod_fini(void)
 {
-       crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
+       if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER))
+               crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
 }
 
 module_init(chacha_simd_mod_init);
index b759b6ccc361c8492f1e5e04b959d59474434a32..b37d29cf5d0a8621fa666c6bfb285524da3c0767 100644 (file)
@@ -187,12 +187,14 @@ static struct shash_alg mips_poly1305_alg = {
 
 static int __init mips_poly1305_mod_init(void)
 {
-       return crypto_register_shash(&mips_poly1305_alg);
+       return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
+               crypto_register_shash(&mips_poly1305_alg) : 0;
 }
 
 static void __exit mips_poly1305_mod_exit(void)
 {
-       crypto_unregister_shash(&mips_poly1305_alg);
+       if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
+               crypto_unregister_shash(&mips_poly1305_alg);
 }
 
 module_init(mips_poly1305_mod_init);
index 4a37ba7cdbe5216cd68e0e346e882092f9b4e7c4..1d9ff8a45e1fdef51186812d090895004ea0a3f9 100644 (file)
@@ -210,12 +210,14 @@ static int __init blake2s_mod_init(void)
                              XFEATURE_MASK_AVX512, NULL))
                static_branch_enable(&blake2s_use_avx512);
 
-       return crypto_register_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
+       return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
+               crypto_register_shashes(blake2s_algs,
+                                       ARRAY_SIZE(blake2s_algs)) : 0;
 }
 
 static void __exit blake2s_mod_exit(void)
 {
-       if (boot_cpu_has(X86_FEATURE_SSSE3))
+       if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && boot_cpu_has(X86_FEATURE_SSSE3))
                crypto_unregister_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
 }
 
index a94e30b6f941349c31b6fcab7e48ee03c404d844..68a74953efaf94e20901dec9990c2aecaf162e53 100644 (file)
@@ -299,12 +299,13 @@ static int __init chacha_simd_mod_init(void)
                    boot_cpu_has(X86_FEATURE_AVX512BW)) /* kmovq */
                        static_branch_enable(&chacha_use_avx512vl);
        }
-       return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
+       return IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) ?
+               crypto_register_skciphers(algs, ARRAY_SIZE(algs)) : 0;
 }
 
 static void __exit chacha_simd_mod_fini(void)
 {
-       if (boot_cpu_has(X86_FEATURE_SSSE3))
+       if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) && boot_cpu_has(X86_FEATURE_SSSE3))
                crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
 }
 
index a52a3fb157279fb00f719a7c8df916f6f3a5e6b2..eec7d2d24239680afde28e079ca8852b7a374d61 100644 (file)
@@ -2457,13 +2457,14 @@ static int __init curve25519_mod_init(void)
                static_branch_enable(&curve25519_use_adx);
        else
                return 0;
-       return crypto_register_kpp(&curve25519_alg);
+       return IS_REACHABLE(CONFIG_CRYPTO_KPP) ?
+               crypto_register_kpp(&curve25519_alg) : 0;
 }
 
 static void __exit curve25519_mod_exit(void)
 {
-       if (boot_cpu_has(X86_FEATURE_BMI2) ||
-           boot_cpu_has(X86_FEATURE_ADX))
+       if (IS_REACHABLE(CONFIG_CRYPTO_KPP) &&
+           (boot_cpu_has(X86_FEATURE_BMI2) || boot_cpu_has(X86_FEATURE_ADX)))
                crypto_unregister_kpp(&curve25519_alg);
 }
 
index 370cd88068ec10d13d65199858f5dc7472400583..0cc4537e6617c35681ae84f4be8be73c5579b76b 100644 (file)
@@ -224,12 +224,13 @@ static int __init poly1305_simd_mod_init(void)
            cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL))
                static_branch_enable(&poly1305_use_avx2);
 
-       return crypto_register_shash(&alg);
+       return IS_REACHABLE(CONFIG_CRYPTO_HASH) ? crypto_register_shash(&alg) : 0;
 }
 
 static void __exit poly1305_simd_mod_exit(void)
 {
-       crypto_unregister_shash(&alg);
+       if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
+               crypto_unregister_shash(&alg);
 }
 
 module_init(poly1305_simd_mod_init);