Skip to content

Commit 6048fdc

Browse files
committed
lib/crypto: blake2s: include as built-in
In preparation for using blake2s in the RNG, we change the way that it is wired-in to the build system. Instead of using ifdefs to select the right symbol, we use weak symbols. And because ARM doesn't need the generic implementation, we make the generic one default only if an arch library doesn't need it already, and then have arch libraries that do need it opt-in. So that the arch libraries can remain tristate rather than bool, we then split the shash part from the glue code. Acked-by: Herbert Xu <[email protected]> Acked-by: Ard Biesheuvel <[email protected]> Acked-by: Greg Kroah-Hartman <[email protected]> Cc: Masahiro Yamada <[email protected]> Cc: [email protected] Cc: [email protected] Signed-off-by: Jason A. Donenfeld <[email protected]>
1 parent 009ba85 commit 6048fdc

File tree

14 files changed

+189
-174
lines changed

14 files changed

+189
-174
lines changed

arch/arm/crypto/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ obj-$(CONFIG_CRYPTO_SHA1_ARM_NEON) += sha1-arm-neon.o
1010
obj-$(CONFIG_CRYPTO_SHA256_ARM) += sha256-arm.o
1111
obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
1212
obj-$(CONFIG_CRYPTO_BLAKE2S_ARM) += blake2s-arm.o
13+
obj-$(if $(CONFIG_CRYPTO_BLAKE2S_ARM),y) += libblake2s-arm.o
1314
obj-$(CONFIG_CRYPTO_BLAKE2B_NEON) += blake2b-neon.o
1415
obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
1516
obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o
@@ -31,7 +32,8 @@ sha256-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha256_neon_glue.o
3132
sha256-arm-y := sha256-core.o sha256_glue.o $(sha256-arm-neon-y)
3233
sha512-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha512-neon-glue.o
3334
sha512-arm-y := sha512-core.o sha512-glue.o $(sha512-arm-neon-y)
34-
blake2s-arm-y := blake2s-core.o blake2s-glue.o
35+
blake2s-arm-y := blake2s-shash.o
36+
libblake2s-arm-y:= blake2s-core.o blake2s-glue.o
3537
blake2b-neon-y := blake2b-neon-core.o blake2b-neon-glue.o
3638
sha1-arm-ce-y := sha1-ce-core.o sha1-ce-glue.o
3739
sha2-arm-ce-y := sha2-ce-core.o sha2-ce-glue.o

arch/arm/crypto/blake2s-core.S

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,16 +167,16 @@
167167
.endm
168168

169169
//
170-
// void blake2s_compress_arch(struct blake2s_state *state,
171-
// const u8 *block, size_t nblocks, u32 inc);
170+
// void blake2s_compress(struct blake2s_state *state,
171+
// const u8 *block, size_t nblocks, u32 inc);
172172
//
173173
// Only the first three fields of struct blake2s_state are used:
174174
// u32 h[8]; (inout)
175175
// u32 t[2]; (inout)
176176
// u32 f[2]; (in)
177177
//
178178
.align 5
179-
ENTRY(blake2s_compress_arch)
179+
ENTRY(blake2s_compress)
180180
push {r0-r2,r4-r11,lr} // keep this an even number
181181

182182
.Lnext_block:
@@ -303,4 +303,4 @@ ENTRY(blake2s_compress_arch)
303303
str r3, [r12], #4
304304
bne 1b
305305
b .Lcopy_block_done
306-
ENDPROC(blake2s_compress_arch)
306+
ENDPROC(blake2s_compress)

arch/arm/crypto/blake2s-glue.c

Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,7 @@
11
// SPDX-License-Identifier: GPL-2.0-or-later
2-
/*
3-
* BLAKE2s digest algorithm, ARM scalar implementation
4-
*
5-
* Copyright 2020 Google LLC
6-
*/
72

83
#include <crypto/internal/blake2s.h>
9-
#include <crypto/internal/hash.h>
10-
114
#include <linux/module.h>
125

136
/* defined in blake2s-core.S */
14-
EXPORT_SYMBOL(blake2s_compress_arch);
15-
16-
static int crypto_blake2s_update_arm(struct shash_desc *desc,
17-
const u8 *in, unsigned int inlen)
18-
{
19-
return crypto_blake2s_update(desc, in, inlen, blake2s_compress_arch);
20-
}
21-
22-
static int crypto_blake2s_final_arm(struct shash_desc *desc, u8 *out)
23-
{
24-
return crypto_blake2s_final(desc, out, blake2s_compress_arch);
25-
}
26-
27-
#define BLAKE2S_ALG(name, driver_name, digest_size) \
28-
{ \
29-
.base.cra_name = name, \
30-
.base.cra_driver_name = driver_name, \
31-
.base.cra_priority = 200, \
32-
.base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
33-
.base.cra_blocksize = BLAKE2S_BLOCK_SIZE, \
34-
.base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx), \
35-
.base.cra_module = THIS_MODULE, \
36-
.digestsize = digest_size, \
37-
.setkey = crypto_blake2s_setkey, \
38-
.init = crypto_blake2s_init, \
39-
.update = crypto_blake2s_update_arm, \
40-
.final = crypto_blake2s_final_arm, \
41-
.descsize = sizeof(struct blake2s_state), \
42-
}
43-
44-
static struct shash_alg blake2s_arm_algs[] = {
45-
BLAKE2S_ALG("blake2s-128", "blake2s-128-arm", BLAKE2S_128_HASH_SIZE),
46-
BLAKE2S_ALG("blake2s-160", "blake2s-160-arm", BLAKE2S_160_HASH_SIZE),
47-
BLAKE2S_ALG("blake2s-224", "blake2s-224-arm", BLAKE2S_224_HASH_SIZE),
48-
BLAKE2S_ALG("blake2s-256", "blake2s-256-arm", BLAKE2S_256_HASH_SIZE),
49-
};
50-
51-
static int __init blake2s_arm_mod_init(void)
52-
{
53-
return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
54-
crypto_register_shashes(blake2s_arm_algs,
55-
ARRAY_SIZE(blake2s_arm_algs)) : 0;
56-
}
57-
58-
static void __exit blake2s_arm_mod_exit(void)
59-
{
60-
if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
61-
crypto_unregister_shashes(blake2s_arm_algs,
62-
ARRAY_SIZE(blake2s_arm_algs));
63-
}
64-
65-
module_init(blake2s_arm_mod_init);
66-
module_exit(blake2s_arm_mod_exit);
67-
68-
MODULE_DESCRIPTION("BLAKE2s digest algorithm, ARM scalar implementation");
69-
MODULE_LICENSE("GPL");
70-
MODULE_AUTHOR("Eric Biggers <[email protected]>");
71-
MODULE_ALIAS_CRYPTO("blake2s-128");
72-
MODULE_ALIAS_CRYPTO("blake2s-128-arm");
73-
MODULE_ALIAS_CRYPTO("blake2s-160");
74-
MODULE_ALIAS_CRYPTO("blake2s-160-arm");
75-
MODULE_ALIAS_CRYPTO("blake2s-224");
76-
MODULE_ALIAS_CRYPTO("blake2s-224-arm");
77-
MODULE_ALIAS_CRYPTO("blake2s-256");
78-
MODULE_ALIAS_CRYPTO("blake2s-256-arm");
7+
EXPORT_SYMBOL(blake2s_compress);

arch/arm/crypto/blake2s-shash.c

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
/*
3+
* BLAKE2s digest algorithm, ARM scalar implementation
4+
*
5+
* Copyright 2020 Google LLC
6+
*/
7+
8+
#include <crypto/internal/blake2s.h>
9+
#include <crypto/internal/hash.h>
10+
11+
#include <linux/module.h>
12+
13+
static int crypto_blake2s_update_arm(struct shash_desc *desc,
14+
const u8 *in, unsigned int inlen)
15+
{
16+
return crypto_blake2s_update(desc, in, inlen, blake2s_compress);
17+
}
18+
19+
static int crypto_blake2s_final_arm(struct shash_desc *desc, u8 *out)
20+
{
21+
return crypto_blake2s_final(desc, out, blake2s_compress);
22+
}
23+
24+
#define BLAKE2S_ALG(name, driver_name, digest_size) \
25+
{ \
26+
.base.cra_name = name, \
27+
.base.cra_driver_name = driver_name, \
28+
.base.cra_priority = 200, \
29+
.base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
30+
.base.cra_blocksize = BLAKE2S_BLOCK_SIZE, \
31+
.base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx), \
32+
.base.cra_module = THIS_MODULE, \
33+
.digestsize = digest_size, \
34+
.setkey = crypto_blake2s_setkey, \
35+
.init = crypto_blake2s_init, \
36+
.update = crypto_blake2s_update_arm, \
37+
.final = crypto_blake2s_final_arm, \
38+
.descsize = sizeof(struct blake2s_state), \
39+
}
40+
41+
static struct shash_alg blake2s_arm_algs[] = {
42+
BLAKE2S_ALG("blake2s-128", "blake2s-128-arm", BLAKE2S_128_HASH_SIZE),
43+
BLAKE2S_ALG("blake2s-160", "blake2s-160-arm", BLAKE2S_160_HASH_SIZE),
44+
BLAKE2S_ALG("blake2s-224", "blake2s-224-arm", BLAKE2S_224_HASH_SIZE),
45+
BLAKE2S_ALG("blake2s-256", "blake2s-256-arm", BLAKE2S_256_HASH_SIZE),
46+
};
47+
48+
static int __init blake2s_arm_mod_init(void)
49+
{
50+
return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
51+
crypto_register_shashes(blake2s_arm_algs,
52+
ARRAY_SIZE(blake2s_arm_algs)) : 0;
53+
}
54+
55+
static void __exit blake2s_arm_mod_exit(void)
56+
{
57+
if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
58+
crypto_unregister_shashes(blake2s_arm_algs,
59+
ARRAY_SIZE(blake2s_arm_algs));
60+
}
61+
62+
module_init(blake2s_arm_mod_init);
63+
module_exit(blake2s_arm_mod_exit);
64+
65+
MODULE_DESCRIPTION("BLAKE2s digest algorithm, ARM scalar implementation");
66+
MODULE_LICENSE("GPL");
67+
MODULE_AUTHOR("Eric Biggers <[email protected]>");
68+
MODULE_ALIAS_CRYPTO("blake2s-128");
69+
MODULE_ALIAS_CRYPTO("blake2s-128-arm");
70+
MODULE_ALIAS_CRYPTO("blake2s-160");
71+
MODULE_ALIAS_CRYPTO("blake2s-160-arm");
72+
MODULE_ALIAS_CRYPTO("blake2s-224");
73+
MODULE_ALIAS_CRYPTO("blake2s-224-arm");
74+
MODULE_ALIAS_CRYPTO("blake2s-256");
75+
MODULE_ALIAS_CRYPTO("blake2s-256-arm");

arch/x86/crypto/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ obj-$(CONFIG_CRYPTO_SHA512_SSSE3) += sha512-ssse3.o
6262
sha512-ssse3-y := sha512-ssse3-asm.o sha512-avx-asm.o sha512-avx2-asm.o sha512_ssse3_glue.o
6363

6464
obj-$(CONFIG_CRYPTO_BLAKE2S_X86) += blake2s-x86_64.o
65-
blake2s-x86_64-y := blake2s-core.o blake2s-glue.o
65+
blake2s-x86_64-y := blake2s-shash.o
66+
obj-$(if $(CONFIG_CRYPTO_BLAKE2S_X86),y) += libblake2s-x86_64.o
67+
libblake2s-x86_64-y := blake2s-core.o blake2s-glue.o
6668

6769
obj-$(CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL) += ghash-clmulni-intel.o
6870
ghash-clmulni-intel-y := ghash-clmulni-intel_asm.o ghash-clmulni-intel_glue.o

arch/x86/crypto/blake2s-glue.c

Lines changed: 6 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
#include <crypto/internal/blake2s.h>
77
#include <crypto/internal/simd.h>
8-
#include <crypto/internal/hash.h>
98

109
#include <linux/types.h>
1110
#include <linux/jump_label.h>
@@ -28,9 +27,8 @@ asmlinkage void blake2s_compress_avx512(struct blake2s_state *state,
2827
static __ro_after_init DEFINE_STATIC_KEY_FALSE(blake2s_use_ssse3);
2928
static __ro_after_init DEFINE_STATIC_KEY_FALSE(blake2s_use_avx512);
3029

31-
void blake2s_compress_arch(struct blake2s_state *state,
32-
const u8 *block, size_t nblocks,
33-
const u32 inc)
30+
void blake2s_compress(struct blake2s_state *state, const u8 *block,
31+
size_t nblocks, const u32 inc)
3432
{
3533
/* SIMD disables preemption, so relax after processing each page. */
3634
BUILD_BUG_ON(SZ_4K / BLAKE2S_BLOCK_SIZE < 8);
@@ -56,49 +54,12 @@ void blake2s_compress_arch(struct blake2s_state *state,
5654
block += blocks * BLAKE2S_BLOCK_SIZE;
5755
} while (nblocks);
5856
}
59-
EXPORT_SYMBOL(blake2s_compress_arch);
60-
61-
static int crypto_blake2s_update_x86(struct shash_desc *desc,
62-
const u8 *in, unsigned int inlen)
63-
{
64-
return crypto_blake2s_update(desc, in, inlen, blake2s_compress_arch);
65-
}
66-
67-
static int crypto_blake2s_final_x86(struct shash_desc *desc, u8 *out)
68-
{
69-
return crypto_blake2s_final(desc, out, blake2s_compress_arch);
70-
}
71-
72-
#define BLAKE2S_ALG(name, driver_name, digest_size) \
73-
{ \
74-
.base.cra_name = name, \
75-
.base.cra_driver_name = driver_name, \
76-
.base.cra_priority = 200, \
77-
.base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
78-
.base.cra_blocksize = BLAKE2S_BLOCK_SIZE, \
79-
.base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx), \
80-
.base.cra_module = THIS_MODULE, \
81-
.digestsize = digest_size, \
82-
.setkey = crypto_blake2s_setkey, \
83-
.init = crypto_blake2s_init, \
84-
.update = crypto_blake2s_update_x86, \
85-
.final = crypto_blake2s_final_x86, \
86-
.descsize = sizeof(struct blake2s_state), \
87-
}
88-
89-
static struct shash_alg blake2s_algs[] = {
90-
BLAKE2S_ALG("blake2s-128", "blake2s-128-x86", BLAKE2S_128_HASH_SIZE),
91-
BLAKE2S_ALG("blake2s-160", "blake2s-160-x86", BLAKE2S_160_HASH_SIZE),
92-
BLAKE2S_ALG("blake2s-224", "blake2s-224-x86", BLAKE2S_224_HASH_SIZE),
93-
BLAKE2S_ALG("blake2s-256", "blake2s-256-x86", BLAKE2S_256_HASH_SIZE),
94-
};
57+
EXPORT_SYMBOL(blake2s_compress);
9558

9659
static int __init blake2s_mod_init(void)
9760
{
98-
if (!boot_cpu_has(X86_FEATURE_SSSE3))
99-
return 0;
100-
101-
static_branch_enable(&blake2s_use_ssse3);
61+
if (boot_cpu_has(X86_FEATURE_SSSE3))
62+
static_branch_enable(&blake2s_use_ssse3);
10263

10364
if (IS_ENABLED(CONFIG_AS_AVX512) &&
10465
boot_cpu_has(X86_FEATURE_AVX) &&
@@ -109,26 +70,9 @@ static int __init blake2s_mod_init(void)
10970
XFEATURE_MASK_AVX512, NULL))
11071
static_branch_enable(&blake2s_use_avx512);
11172

112-
return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
113-
crypto_register_shashes(blake2s_algs,
114-
ARRAY_SIZE(blake2s_algs)) : 0;
115-
}
116-
117-
static void __exit blake2s_mod_exit(void)
118-
{
119-
if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && boot_cpu_has(X86_FEATURE_SSSE3))
120-
crypto_unregister_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
73+
return 0;
12174
}
12275

12376
module_init(blake2s_mod_init);
124-
module_exit(blake2s_mod_exit);
12577

126-
MODULE_ALIAS_CRYPTO("blake2s-128");
127-
MODULE_ALIAS_CRYPTO("blake2s-128-x86");
128-
MODULE_ALIAS_CRYPTO("blake2s-160");
129-
MODULE_ALIAS_CRYPTO("blake2s-160-x86");
130-
MODULE_ALIAS_CRYPTO("blake2s-224");
131-
MODULE_ALIAS_CRYPTO("blake2s-224-x86");
132-
MODULE_ALIAS_CRYPTO("blake2s-256");
133-
MODULE_ALIAS_CRYPTO("blake2s-256-x86");
13478
MODULE_LICENSE("GPL v2");

arch/x86/crypto/blake2s-shash.c

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// SPDX-License-Identifier: GPL-2.0 OR MIT
2+
/*
3+
* Copyright (C) 2015-2019 Jason A. Donenfeld <[email protected]>. All Rights Reserved.
4+
*/
5+
6+
#include <crypto/internal/blake2s.h>
7+
#include <crypto/internal/simd.h>
8+
#include <crypto/internal/hash.h>
9+
10+
#include <linux/types.h>
11+
#include <linux/kernel.h>
12+
#include <linux/module.h>
13+
#include <linux/sizes.h>
14+
15+
#include <asm/cpufeature.h>
16+
#include <asm/processor.h>
17+
18+
static int crypto_blake2s_update_x86(struct shash_desc *desc,
19+
const u8 *in, unsigned int inlen)
20+
{
21+
return crypto_blake2s_update(desc, in, inlen, blake2s_compress);
22+
}
23+
24+
static int crypto_blake2s_final_x86(struct shash_desc *desc, u8 *out)
25+
{
26+
return crypto_blake2s_final(desc, out, blake2s_compress);
27+
}
28+
29+
#define BLAKE2S_ALG(name, driver_name, digest_size) \
30+
{ \
31+
.base.cra_name = name, \
32+
.base.cra_driver_name = driver_name, \
33+
.base.cra_priority = 200, \
34+
.base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
35+
.base.cra_blocksize = BLAKE2S_BLOCK_SIZE, \
36+
.base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx), \
37+
.base.cra_module = THIS_MODULE, \
38+
.digestsize = digest_size, \
39+
.setkey = crypto_blake2s_setkey, \
40+
.init = crypto_blake2s_init, \
41+
.update = crypto_blake2s_update_x86, \
42+
.final = crypto_blake2s_final_x86, \
43+
.descsize = sizeof(struct blake2s_state), \
44+
}
45+
46+
static struct shash_alg blake2s_algs[] = {
47+
BLAKE2S_ALG("blake2s-128", "blake2s-128-x86", BLAKE2S_128_HASH_SIZE),
48+
BLAKE2S_ALG("blake2s-160", "blake2s-160-x86", BLAKE2S_160_HASH_SIZE),
49+
BLAKE2S_ALG("blake2s-224", "blake2s-224-x86", BLAKE2S_224_HASH_SIZE),
50+
BLAKE2S_ALG("blake2s-256", "blake2s-256-x86", BLAKE2S_256_HASH_SIZE),
51+
};
52+
53+
static int __init blake2s_mod_init(void)
54+
{
55+
if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && boot_cpu_has(X86_FEATURE_SSSE3))
56+
return crypto_register_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
57+
return 0;
58+
}
59+
60+
static void __exit blake2s_mod_exit(void)
61+
{
62+
if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && boot_cpu_has(X86_FEATURE_SSSE3))
63+
crypto_unregister_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
64+
}
65+
66+
module_init(blake2s_mod_init);
67+
module_exit(blake2s_mod_exit);
68+
69+
MODULE_ALIAS_CRYPTO("blake2s-128");
70+
MODULE_ALIAS_CRYPTO("blake2s-128-x86");
71+
MODULE_ALIAS_CRYPTO("blake2s-160");
72+
MODULE_ALIAS_CRYPTO("blake2s-160-x86");
73+
MODULE_ALIAS_CRYPTO("blake2s-224");
74+
MODULE_ALIAS_CRYPTO("blake2s-224-x86");
75+
MODULE_ALIAS_CRYPTO("blake2s-256");
76+
MODULE_ALIAS_CRYPTO("blake2s-256-x86");
77+
MODULE_LICENSE("GPL v2");

0 commit comments

Comments
 (0)