Skip to content

Commit ea53756

Browse files
ndreysherbertx
authored andcommitted
crypto: caam - limit single JD RNG output to maximum of 16 bytes
In order to follow recommendation in SP800-90C (section "9.4 The Oversampling-NRBG Construction") limit the output of "generate" JD submitted to CAAM. See https://lore.kernel.org/linux-crypto/VI1PR0402MB3485EF10976A4A69F90E5B0F98580@VI1PR0402MB3485.eurprd04.prod.outlook.com/ for more details. This change should make CAAM's hwrng driver good enough to have 1024 quality rating. Signed-off-by: Andrey Smirnov <[email protected]> Reviewed-by: Horia Geantă <[email protected]> Cc: Chris Healy <[email protected]> Cc: Lucas Stach <[email protected]> Cc: Horia Geantă <[email protected]> Cc: Herbert Xu <[email protected]> Cc: Iuliana Prodan <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Signed-off-by: Herbert Xu <[email protected]>
1 parent 358ba76 commit ea53756

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

drivers/crypto/caam/caamrng.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@
2222
#include "jr.h"
2323
#include "error.h"
2424

25-
#define CAAM_RNG_MAX_FIFO_STORE_SIZE U16_MAX
26-
27-
#define CAAM_RNG_FIFO_LEN SZ_32K /* Must be a multiple of 2 */
25+
#define CAAM_RNG_MAX_FIFO_STORE_SIZE 16
2826

2927
/*
3028
* Length of used descriptors, see caam_init_desc()
@@ -65,14 +63,15 @@ static void caam_rng_done(struct device *jrdev, u32 *desc, u32 err,
6563
complete(jctx->done);
6664
}
6765

68-
static u32 *caam_init_desc(u32 *desc, dma_addr_t dst_dma, int len)
66+
static u32 *caam_init_desc(u32 *desc, dma_addr_t dst_dma)
6967
{
7068
init_job_desc(desc, 0); /* + 1 cmd_sz */
7169
/* Generate random bytes: + 1 cmd_sz */
7270
append_operation(desc, OP_ALG_ALGSEL_RNG | OP_TYPE_CLASS1_ALG |
7371
OP_ALG_PR_ON);
7472
/* Store bytes: + 1 cmd_sz + caam_ptr_sz */
75-
append_fifo_store(desc, dst_dma, len, FIFOST_TYPE_RNGSTORE);
73+
append_fifo_store(desc, dst_dma,
74+
CAAM_RNG_MAX_FIFO_STORE_SIZE, FIFOST_TYPE_RNGSTORE);
7675

7776
print_hex_dump_debug("rng job desc@: ", DUMP_PREFIX_ADDRESS,
7877
16, 4, desc, desc_bytes(desc), 1);
@@ -92,7 +91,7 @@ static int caam_rng_read_one(struct device *jrdev,
9291
.err = &ret,
9392
};
9493

95-
len = min_t(int, len, CAAM_RNG_MAX_FIFO_STORE_SIZE);
94+
len = CAAM_RNG_MAX_FIFO_STORE_SIZE;
9695

9796
dst_dma = dma_map_single(jrdev, dst, len, DMA_FROM_DEVICE);
9897
if (dma_mapping_error(jrdev, dst_dma)) {
@@ -102,7 +101,7 @@ static int caam_rng_read_one(struct device *jrdev,
102101

103102
init_completion(done);
104103
err = caam_jr_enqueue(jrdev,
105-
caam_init_desc(desc, dst_dma, len),
104+
caam_init_desc(desc, dst_dma),
106105
caam_rng_done, &jctx);
107106
if (err == -EINPROGRESS) {
108107
wait_for_completion(done);
@@ -122,7 +121,7 @@ static void caam_rng_fill_async(struct caam_rng_ctx *ctx)
122121

123122
sg_init_table(sg, ARRAY_SIZE(sg));
124123
nents = kfifo_dma_in_prepare(&ctx->fifo, sg, ARRAY_SIZE(sg),
125-
CAAM_RNG_FIFO_LEN);
124+
CAAM_RNG_MAX_FIFO_STORE_SIZE);
126125
if (!nents)
127126
return;
128127

@@ -156,7 +155,7 @@ static int caam_read(struct hwrng *rng, void *dst, size_t max, bool wait)
156155
}
157156

158157
out = kfifo_out(&ctx->fifo, dst, max);
159-
if (kfifo_len(&ctx->fifo) <= CAAM_RNG_FIFO_LEN / 2)
158+
if (kfifo_is_empty(&ctx->fifo))
160159
schedule_work(&ctx->worker);
161160

162161
return out;
@@ -186,7 +185,8 @@ static int caam_init(struct hwrng *rng)
186185
if (!ctx->desc_async)
187186
return -ENOMEM;
188187

189-
if (kfifo_alloc(&ctx->fifo, CAAM_RNG_FIFO_LEN, GFP_DMA | GFP_KERNEL))
188+
if (kfifo_alloc(&ctx->fifo, CAAM_RNG_MAX_FIFO_STORE_SIZE,
189+
GFP_DMA | GFP_KERNEL))
190190
return -ENOMEM;
191191

192192
INIT_WORK(&ctx->worker, caam_rng_worker);
@@ -246,6 +246,7 @@ int caam_rng_init(struct device *ctrldev)
246246
ctx->rng.cleanup = caam_cleanup;
247247
ctx->rng.read = caam_read;
248248
ctx->rng.priv = (unsigned long)ctx;
249+
ctx->rng.quality = 1024;
249250

250251
dev_info(ctrldev, "registering rng-caam\n");
251252

0 commit comments

Comments
 (0)