diff options
-rw-r--r-- | drivers/char/random.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c index cd9a6211dcad..73e52b7796f9 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -957,10 +957,23 @@ static ssize_t extract_entropy(struct entropy_store *r, void *buf, | |||
957 | { | 957 | { |
958 | ssize_t ret = 0, i; | 958 | ssize_t ret = 0, i; |
959 | __u8 tmp[EXTRACT_SIZE]; | 959 | __u8 tmp[EXTRACT_SIZE]; |
960 | unsigned long flags; | ||
960 | 961 | ||
961 | /* if last_data isn't primed, we need EXTRACT_SIZE extra bytes */ | 962 | /* if last_data isn't primed, we need EXTRACT_SIZE extra bytes */ |
962 | if (fips_enabled && !r->last_data_init) | 963 | if (fips_enabled) { |
963 | nbytes += EXTRACT_SIZE; | 964 | spin_lock_irqsave(&r->lock, flags); |
965 | if (!r->last_data_init) { | ||
966 | r->last_data_init = true; | ||
967 | spin_unlock_irqrestore(&r->lock, flags); | ||
968 | trace_extract_entropy(r->name, EXTRACT_SIZE, | ||
969 | r->entropy_count, _RET_IP_); | ||
970 | xfer_secondary_pool(r, EXTRACT_SIZE); | ||
971 | extract_buf(r, tmp); | ||
972 | spin_lock_irqsave(&r->lock, flags); | ||
973 | memcpy(r->last_data, tmp, EXTRACT_SIZE); | ||
974 | } | ||
975 | spin_unlock_irqrestore(&r->lock, flags); | ||
976 | } | ||
964 | 977 | ||
965 | trace_extract_entropy(r->name, nbytes, r->entropy_count, _RET_IP_); | 978 | trace_extract_entropy(r->name, nbytes, r->entropy_count, _RET_IP_); |
966 | xfer_secondary_pool(r, nbytes); | 979 | xfer_secondary_pool(r, nbytes); |
@@ -970,19 +983,6 @@ static ssize_t extract_entropy(struct entropy_store *r, void *buf, | |||
970 | extract_buf(r, tmp); | 983 | extract_buf(r, tmp); |
971 | 984 | ||
972 | if (fips_enabled) { | 985 | if (fips_enabled) { |
973 | unsigned long flags; | ||
974 | |||
975 | |||
976 | /* prime last_data value if need be, per fips 140-2 */ | ||
977 | if (!r->last_data_init) { | ||
978 | spin_lock_irqsave(&r->lock, flags); | ||
979 | memcpy(r->last_data, tmp, EXTRACT_SIZE); | ||
980 | r->last_data_init = true; | ||
981 | nbytes -= EXTRACT_SIZE; | ||
982 | spin_unlock_irqrestore(&r->lock, flags); | ||
983 | extract_buf(r, tmp); | ||
984 | } | ||
985 | |||
986 | spin_lock_irqsave(&r->lock, flags); | 986 | spin_lock_irqsave(&r->lock, flags); |
987 | if (!memcmp(tmp, r->last_data, EXTRACT_SIZE)) | 987 | if (!memcmp(tmp, r->last_data, EXTRACT_SIZE)) |
988 | panic("Hardware RNG duplicated output!\n"); | 988 | panic("Hardware RNG duplicated output!\n"); |