linux-stable/crypto
Jason A. Donenfeld 81895a65ec treewide: use prandom_u32_max() when possible, part 1
Rather than incurring a division or requesting too many random bytes for
the given range, use the prandom_u32_max() function, which only takes
the minimum required bytes from the RNG and avoids divisions. This was
done mechanically with this coccinelle script:

@basic@
expression E;
type T;
identifier get_random_u32 =~ "get_random_int|prandom_u32|get_random_u32";
typedef u64;
@@
(
- ((T)get_random_u32() % (E))
+ prandom_u32_max(E)
|
- ((T)get_random_u32() & ((E) - 1))
+ prandom_u32_max(E * XXX_MAKE_SURE_E_IS_POW2)
|
- ((u64)(E) * get_random_u32() >> 32)
+ prandom_u32_max(E)
|
- ((T)get_random_u32() & ~PAGE_MASK)
+ prandom_u32_max(PAGE_SIZE)
)

@multi_line@
identifier get_random_u32 =~ "get_random_int|prandom_u32|get_random_u32";
identifier RAND;
expression E;
@@

-       RAND = get_random_u32();
        ... when != RAND
-       RAND %= (E);
+       RAND = prandom_u32_max(E);

// Find a potential literal
@literal_mask@
expression LITERAL;
type T;
identifier get_random_u32 =~ "get_random_int|prandom_u32|get_random_u32";
position p;
@@

        ((T)get_random_u32()@p & (LITERAL))

// Add one to the literal.
@script:python add_one@
literal << literal_mask.LITERAL;
RESULT;
@@

value = None
if literal.startswith('0x'):
        value = int(literal, 16)
elif literal[0] in '123456789':
        value = int(literal, 10)
if value is None:
        print("I don't know how to handle %s" % (literal))
        cocci.include_match(False)
elif value == 2**32 - 1 or value == 2**31 - 1 or value == 2**24 - 1 or value == 2**16 - 1 or value == 2**8 - 1:
        print("Skipping 0x%x for cleanup elsewhere" % (value))
        cocci.include_match(False)
elif value & (value + 1) != 0:
        print("Skipping 0x%x because it's not a power of two minus one" % (value))
        cocci.include_match(False)
elif literal.startswith('0x'):
        coccinelle.RESULT = cocci.make_expr("0x%x" % (value + 1))
else:
        coccinelle.RESULT = cocci.make_expr("%d" % (value + 1))

// Replace the literal mask with the calculated result.
@plus_one@
expression literal_mask.LITERAL;
position literal_mask.p;
expression add_one.RESULT;
identifier FUNC;
@@

-       (FUNC()@p & (LITERAL))
+       prandom_u32_max(RESULT)

@collapse_ret@
type T;
identifier VAR;
expression E;
@@

 {
-       T VAR;
-       VAR = (E);
-       return VAR;
+       return E;
 }

@drop_var@
type T;
identifier VAR;
@@

 {
-       T VAR;
        ... when != VAR
 }

Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Yury Norov <yury.norov@gmail.com>
Reviewed-by: KP Singh <kpsingh@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz> # for ext4 and sbitmap
Reviewed-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com> # for drbd
Acked-by: Jakub Kicinski <kuba@kernel.org>
Acked-by: Heiko Carstens <hca@linux.ibm.com> # for s390
Acked-by: Ulf Hansson <ulf.hansson@linaro.org> # for mmc
Acked-by: Darrick J. Wong <djwong@kernel.org> # for xfs
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2022-10-11 17:42:55 -06:00
..
asymmetric_keys KEYS: asymmetric: enforce SM2 signature use pkey algo 2022-08-03 23:56:20 +03:00
async_tx crypto: add __init/__exit annotations to init/exit funcs 2022-09-24 16:14:43 +08:00
842.c
acompress.c
adiantum.c
aead.c
aegis128-core.c
aegis128-neon-inner.c
aegis128-neon.c
aegis.h
aes_generic.c
aes_ti.c
af_alg.c af_alg_make_sg(): switch to advancing variant of iov_iter_get_pages() 2022-08-08 22:37:23 -04:00
ahash.c
akcipher.c crypto: akcipher - default implementation for setting a private key 2022-09-09 16:18:33 +08:00
algapi.c crypto: lib - move __crypto_xor into utils 2022-08-19 18:39:34 +08:00
algboss.c
algif_aead.c
algif_hash.c af_alg_make_sg(): switch to advancing variant of iov_iter_get_pages() 2022-08-08 22:37:23 -04:00
algif_rng.c
algif_skcipher.c
ansi_cprng.c
anubis.c
api.c crypto: core - move from strlcpy with unused retval to strscpy 2022-08-26 18:50:38 +08:00
arc4.c
aria_generic.c crypto: aria - prepare generic module for optimized implementations 2022-09-24 16:14:44 +08:00
authenc.c crypto: authenc - Fix sleep in atomic context in decrypt_tail 2022-01-31 11:21:44 +11:00
authencesn.c
blake2b_generic.c
blowfish_common.c
blowfish_generic.c
camellia_generic.c
cast5_generic.c
cast6_generic.c
cast_common.c
cbc.c
ccm.c
cfb.c crypto: cleanup comments 2022-03-03 10:49:20 +12:00
chacha20poly1305.c
chacha_generic.c
cipher.c
cmac.c
compress.c
crc32_generic.c
crc32c_generic.c
crc64_rocksoft_generic.c crypto: add rocksoft 64b crc guard tag framework 2022-03-07 12:48:35 -07:00
crct10dif_common.c
crct10dif_generic.c
cryptd.c crypto: cryptd - Protect per-CPU resource by disabling BH. 2022-05-13 17:24:48 +08:00
crypto_engine.c crypto: engine - Add parameter description in crypto_transfer_request() kernel-doc comment 2022-04-08 16:13:30 +08:00
crypto_null.c
crypto_user_base.c
crypto_user_stat.c
ctr.c
cts.c
curve25519-generic.c crypto: add __init/__exit annotations to init/exit funcs 2022-09-24 16:14:43 +08:00
deflate.c
des_generic.c
dh_helper.c crypto: dh - split out deserialization code from crypto_dh_decode() 2022-03-03 10:47:50 +12:00
dh.c crypto: add __init/__exit annotations to init/exit funcs 2022-09-24 16:14:43 +08:00
drbg.c crypto: drbg - remove unnecessary (void*) conversions 2022-08-19 18:39:36 +08:00
ecb.c
ecc_curve_defs.h
ecc.c
ecdh_helper.c
ecdh.c crypto: add __init/__exit annotations to init/exit funcs 2022-09-24 16:14:43 +08:00
ecdsa.c crypto: add __init/__exit annotations to init/exit funcs 2022-09-24 16:14:43 +08:00
ecdsasignature.asn1
echainiv.c
ecrdsa_defs.h
ecrdsa_params.asn1
ecrdsa_pub_key.asn1
ecrdsa.c crypto: ecrdsa - Fix incorrect use of vli_cmp 2022-04-29 13:44:58 +08:00
essiv.c crypto: core - move from strlcpy with unused retval to strscpy 2022-08-26 18:50:38 +08:00
fcrypt.c
fips.c crypto: fips - make proc files report fips module name and version 2022-07-15 16:43:22 +08:00
gcm.c
geniv.c
gf128mul.c
ghash-generic.c
hash_info.c
hctr2.c crypto: hctr2 - Add HCTR2 support 2022-06-10 16:40:17 +08:00
hmac.c crypto: hmac - disallow keys < 112 bits in FIPS mode 2022-02-11 20:22:01 +11:00
internal.h
jitterentropy-kcapi.c
jitterentropy.c
jitterentropy.h
Kconfig - Yu Zhao's Multi-Gen LRU patches are here. They've been under test in 2022-10-10 17:53:04 -07:00
kdf_sp800108.c
keywrap.c
khazad.c
kpp.c crypto: add crypto_has_kpp() 2022-08-02 17:14:47 -06:00
lrw.c crypto: lrw - Add dependency on ecb 2022-02-18 16:21:08 +11:00
lz4.c
lz4hc.c
lzo-rle.c
lzo.c
Makefile crypto: aria - prepare generic module for optimized implementations 2022-09-24 16:14:44 +08:00
md4.c
md5.c
michael_mic.c
nhpoly1305.c
ofb.c
pcbc.c
pcrypt.c
poly1305_generic.c
polyval-generic.c crypto: x86/polyval - Add PCLMULQDQ accelerated implementation of POLYVAL 2022-06-10 16:40:17 +08:00
proc.c
ripemd.h
rmd160.c
rng.c
rsa_helper.c
rsa-pkcs1pad.c crypto: rsa-pkcs1pad - use clearer variable names 2022-01-31 11:21:44 +11:00
rsa.c crypto: add __init/__exit annotations to init/exit funcs 2022-09-24 16:14:43 +08:00
rsaprivkey.asn1
rsapubkey.asn1
scatterwalk.c
scompress.c
seed.c
seqiv.c
serpent_generic.c
sha1_generic.c
sha3_generic.c
sha256_generic.c
sha512_generic.c
shash.c crypto: add crypto_has_shash() 2022-08-02 17:14:47 -06:00
simd.c
skcipher.c
sm2.c crypto: add __init/__exit annotations to init/exit funcs 2022-09-24 16:14:43 +08:00
sm2signature.asn1
sm3_generic.c crypto: sm3 - make dependent on sm3 library 2022-01-28 16:51:11 +11:00
sm3.c crypto: sm3,sm4 - move into crypto directory 2022-04-08 16:11:48 +08:00
sm4_generic.c
sm4.c crypto: sm4 - export sm4 constant arrays 2022-04-08 16:12:46 +08:00
streebog_generic.c
tcrypt.c crypto: tcrypt - add async speed test for aria cipher 2022-09-24 16:14:44 +08:00
tcrypt.h
tea.c
testmgr.c treewide: use prandom_u32_max() when possible, part 1 2022-10-11 17:42:55 -06:00
testmgr.h crypto: testmgr - some more fixes to RSA test vectors 2022-07-22 16:22:04 +08:00
twofish_common.c crypto: twofish - Fix comment typo 2022-07-22 16:22:04 +08:00
twofish_generic.c
vmac.c
wp512.c
xcbc.c
xctr.c crypto: xctr - Add XCTR support 2022-06-10 16:40:16 +08:00
xor.c
xts.c crypto: xts - Add softdep on ecb 2022-02-18 16:21:08 +11:00
xxhash_generic.c
zstd.c