On Fri, 22 Nov 2019 at 10:46, Jason A. Donenfeld <Jason@xxxxxxxxx> wrote: > > 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@xxxxxxxxx> > --- > Changes v2->v3: > - v2 was a dud, with a find and replace operation gone wild. v3 is > what v2 should have been. > Changes v1->v2: > - Discussing with Ard on IRC, we concluded that IS_REACHABLE makes > more sense than IS_ENABLED. > Acked-by: Ard Biesheuvel <ardb@xxxxxxxxxx> with the note that with this arrangement, e.g., the accelerated Curve25519 code will not be exposed via the CRYPTO_KPP interface if the former is builtin while the latter is built as a module. This is somewhat related to how the accelerated library code interacts with builtin generic code, for which I added some Kconfig dependencies, and which we should be able to revisit this once support for static calls has made it into mainline. > arch/arm/crypto/chacha-glue.c | 26 ++++++++++++++++---------- > arch/arm/crypto/curve25519-glue.c | 5 +++-- > arch/arm/crypto/poly1305-glue.c | 9 ++++++--- > arch/arm64/crypto/chacha-neon-glue.c | 5 +++-- > arch/arm64/crypto/poly1305-glue.c | 5 +++-- > arch/mips/crypto/chacha-glue.c | 6 ++++-- > arch/mips/crypto/poly1305-glue.c | 6 ++++-- > arch/x86/crypto/blake2s-glue.c | 6 ++++-- > arch/x86/crypto/chacha_glue.c | 6 ++++-- > arch/x86/crypto/curve25519-x86_64.c | 7 ++++--- > arch/x86/crypto/poly1305_glue.c | 5 +++-- > 11 files changed, 54 insertions(+), 32 deletions(-) > > diff --git a/arch/arm/crypto/chacha-glue.c b/arch/arm/crypto/chacha-glue.c > index 3f0c057aa050..6ebbb2b241d2 100644 > --- a/arch/arm/crypto/chacha-glue.c > +++ b/arch/arm/crypto/chacha-glue.c > @@ -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); > diff --git a/arch/arm/crypto/curve25519-glue.c b/arch/arm/crypto/curve25519-glue.c > index 2e9e12d2f642..f3f42cf3b893 100644 > --- a/arch/arm/crypto/curve25519-glue.c > +++ b/arch/arm/crypto/curve25519-glue.c > @@ -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); > } > > diff --git a/arch/arm/crypto/poly1305-glue.c b/arch/arm/crypto/poly1305-glue.c > index 74a725ac89c9..abe3f2d587dc 100644 > --- a/arch/arm/crypto/poly1305-glue.c > +++ b/arch/arm/crypto/poly1305-glue.c > @@ -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; > diff --git a/arch/arm64/crypto/chacha-neon-glue.c b/arch/arm64/crypto/chacha-neon-glue.c > index b08029d7bde6..c1f9660d104c 100644 > --- a/arch/arm64/crypto/chacha-neon-glue.c > +++ b/arch/arm64/crypto/chacha-neon-glue.c > @@ -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)); > } > > diff --git a/arch/arm64/crypto/poly1305-glue.c b/arch/arm64/crypto/poly1305-glue.c > index dd843d0ee83a..83a2338a8826 100644 > --- a/arch/arm64/crypto/poly1305-glue.c > +++ b/arch/arm64/crypto/poly1305-glue.c > @@ -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); > } > > diff --git a/arch/mips/crypto/chacha-glue.c b/arch/mips/crypto/chacha-glue.c > index 779e399c9bef..d1fd23e6ef84 100644 > --- a/arch/mips/crypto/chacha-glue.c > +++ b/arch/mips/crypto/chacha-glue.c > @@ -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); > diff --git a/arch/mips/crypto/poly1305-glue.c b/arch/mips/crypto/poly1305-glue.c > index b759b6ccc361..b37d29cf5d0a 100644 > --- a/arch/mips/crypto/poly1305-glue.c > +++ b/arch/mips/crypto/poly1305-glue.c > @@ -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); > diff --git a/arch/x86/crypto/blake2s-glue.c b/arch/x86/crypto/blake2s-glue.c > index 4a37ba7cdbe5..1d9ff8a45e1f 100644 > --- a/arch/x86/crypto/blake2s-glue.c > +++ b/arch/x86/crypto/blake2s-glue.c > @@ -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)); > } > > diff --git a/arch/x86/crypto/chacha_glue.c b/arch/x86/crypto/chacha_glue.c > index b391e13a9e41..ce67bc8a9f4e 100644 > --- a/arch/x86/crypto/chacha_glue.c > +++ b/arch/x86/crypto/chacha_glue.c > @@ -299,12 +299,14 @@ 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) > { > - 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); > diff --git a/arch/x86/crypto/curve25519-x86_64.c b/arch/x86/crypto/curve25519-x86_64.c > index a52a3fb15727..eec7d2d24239 100644 > --- a/arch/x86/crypto/curve25519-x86_64.c > +++ b/arch/x86/crypto/curve25519-x86_64.c > @@ -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); > } > > diff --git a/arch/x86/crypto/poly1305_glue.c b/arch/x86/crypto/poly1305_glue.c > index 370cd88068ec..0cc4537e6617 100644 > --- a/arch/x86/crypto/poly1305_glue.c > +++ b/arch/x86/crypto/poly1305_glue.c > @@ -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); > -- > 2.24.0 >