Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ff9036a authored by Eric Biggers's avatar Eric Biggers Committed by Herbert Xu
Browse files

crypto: arm64/aes - fix handling sub-block CTS-CBC inputs



In the new arm64 CTS-CBC implementation, return an error code rather
than crashing on inputs shorter than AES_BLOCK_SIZE bytes.  Also set
cra_blocksize to AES_BLOCK_SIZE (like is done in the cts template) to
indicate the minimum input size.

Fixes: dd597fb3 ("crypto: arm64/aes-blk - add support for CTS-CBC mode")
Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Reviewed-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 52813ab2
Loading
Loading
Loading
Loading
+9 −4
Original line number Original line Diff line number Diff line
@@ -243,8 +243,11 @@ static int cts_cbc_encrypt(struct skcipher_request *req)


	skcipher_request_set_tfm(&rctx->subreq, tfm);
	skcipher_request_set_tfm(&rctx->subreq, tfm);


	if (req->cryptlen == AES_BLOCK_SIZE)
	if (req->cryptlen <= AES_BLOCK_SIZE) {
		if (req->cryptlen < AES_BLOCK_SIZE)
			return -EINVAL;
		cbc_blocks = 1;
		cbc_blocks = 1;
	}


	if (cbc_blocks > 0) {
	if (cbc_blocks > 0) {
		unsigned int blocks;
		unsigned int blocks;
@@ -305,8 +308,11 @@ static int cts_cbc_decrypt(struct skcipher_request *req)


	skcipher_request_set_tfm(&rctx->subreq, tfm);
	skcipher_request_set_tfm(&rctx->subreq, tfm);


	if (req->cryptlen == AES_BLOCK_SIZE)
	if (req->cryptlen <= AES_BLOCK_SIZE) {
		if (req->cryptlen < AES_BLOCK_SIZE)
			return -EINVAL;
		cbc_blocks = 1;
		cbc_blocks = 1;
	}


	if (cbc_blocks > 0) {
	if (cbc_blocks > 0) {
		unsigned int blocks;
		unsigned int blocks;
@@ -486,14 +492,13 @@ static struct skcipher_alg aes_algs[] = { {
		.cra_driver_name	= "__cts-cbc-aes-" MODE,
		.cra_driver_name	= "__cts-cbc-aes-" MODE,
		.cra_priority		= PRIO,
		.cra_priority		= PRIO,
		.cra_flags		= CRYPTO_ALG_INTERNAL,
		.cra_flags		= CRYPTO_ALG_INTERNAL,
		.cra_blocksize		= 1,
		.cra_blocksize		= AES_BLOCK_SIZE,
		.cra_ctxsize		= sizeof(struct crypto_aes_ctx),
		.cra_ctxsize		= sizeof(struct crypto_aes_ctx),
		.cra_module		= THIS_MODULE,
		.cra_module		= THIS_MODULE,
	},
	},
	.min_keysize	= AES_MIN_KEY_SIZE,
	.min_keysize	= AES_MIN_KEY_SIZE,
	.max_keysize	= AES_MAX_KEY_SIZE,
	.max_keysize	= AES_MAX_KEY_SIZE,
	.ivsize		= AES_BLOCK_SIZE,
	.ivsize		= AES_BLOCK_SIZE,
	.chunksize	= AES_BLOCK_SIZE,
	.walksize	= 2 * AES_BLOCK_SIZE,
	.walksize	= 2 * AES_BLOCK_SIZE,
	.setkey		= skcipher_aes_setkey,
	.setkey		= skcipher_aes_setkey,
	.encrypt	= cts_cbc_encrypt,
	.encrypt	= cts_cbc_encrypt,