mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
8405ec8e3c
In case a health test error occurs during runtime, the power-up health
tests are rerun to verify that the noise source is still good and
that the reported health test error was an outlier. For performing this
power-up health test, the already existing entropy collector instance
is used instead of allocating a new one. This change has the following
implications:
* The noise that is collected as part of the newly run health tests is
inserted into the entropy collector and thus stirs the existing
data present in there further. Thus, the entropy collected during
the health test is not wasted. This is also allowed by SP800-90B.
* The power-on health test is not affected by the state of the entropy
collector, because it resets the APT / RCT state. The remainder of
the state is unrelated to the health test as it is only applied to
newly obtained time stamps.
This change also fixes a bug report about an allocation while in an
atomic lock (the lock is taken in jent_kcapi_random, jent_read_entropy
is called and this can call jent_entropy_init).
Fixes: 04597c8dd6
("jitter - add RCT/APT support for different OSRs")
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Stephan Mueller <smueller@chronox.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
32 lines
1.3 KiB
C
32 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
extern void *jent_kvzalloc(unsigned int len);
|
|
extern void jent_kvzfree(void *ptr, unsigned int len);
|
|
extern void *jent_zalloc(unsigned int len);
|
|
extern void jent_zfree(void *ptr);
|
|
extern void jent_get_nstime(__u64 *out);
|
|
extern int jent_hash_time(void *hash_state, __u64 time, u8 *addtl,
|
|
unsigned int addtl_len, __u64 hash_loop_cnt,
|
|
unsigned int stuck);
|
|
int jent_read_random_block(void *hash_state, char *dst, unsigned int dst_len);
|
|
|
|
struct rand_data;
|
|
extern int jent_entropy_init(unsigned int osr, unsigned int flags,
|
|
void *hash_state, struct rand_data *p_ec);
|
|
extern int jent_read_entropy(struct rand_data *ec, unsigned char *data,
|
|
unsigned int len);
|
|
|
|
extern struct rand_data *jent_entropy_collector_alloc(unsigned int osr,
|
|
unsigned int flags,
|
|
void *hash_state);
|
|
extern void jent_entropy_collector_free(struct rand_data *entropy_collector);
|
|
|
|
#ifdef CONFIG_CRYPTO_JITTERENTROPY_TESTINTERFACE
|
|
int jent_raw_hires_entropy_store(__u32 value);
|
|
void jent_testing_init(void);
|
|
void jent_testing_exit(void);
|
|
#else /* CONFIG_CRYPTO_JITTERENTROPY_TESTINTERFACE */
|
|
static inline int jent_raw_hires_entropy_store(__u32 value) { return 0; }
|
|
static inline void jent_testing_init(void) { }
|
|
static inline void jent_testing_exit(void) { }
|
|
#endif /* CONFIG_CRYPTO_JITTERENTROPY_TESTINTERFACE */
|