Commit 58bf9910 authored by Pavitrakumar M's avatar Pavitrakumar M Committed by Herbert Xu
Browse files

crypto: spacc - Fix counter width checks



This patch fixes counter width checks according to the version extension3
register. The counter widths can be 8, 16, 32 and 64 bits as per the
extension3 register.

Signed-off-by: default avatarBhoomika K <bhoomikak@vayavyalabs.com>
Signed-off-by: default avatarPavitrakumar M <pavitrakumarm@vayavyalabs.com>
Acked-by: default avatarRuud Derwig <Ruud.Derwig@synopsys.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 694a6f59
Loading
Loading
Loading
Loading
+19 −16
Original line number Diff line number Diff line
@@ -408,40 +408,42 @@ static int spacc_cipher_process(struct skcipher_request *req, int enc_dec)
		for (i = 0; i < 16; i++)
			ivc1[i] = req->iv[i];

		/* 32-bit counter width */
		if (readl(device_h->regmap + SPACC_REG_VERSION_EXT_3) & (0x2)) {
		/* 64-bit counter width */
		if (readl(device_h->regmap + SPACC_REG_VERSION_EXT_3) & (0x3)) {

			for (i = 12; i < 16; i++) {
				num_iv <<= 8;
				num_iv |= ivc1[i];
			for (i = 8; i < 16; i++) {
				num_iv64 <<= 8;
				num_iv64 |= ivc1[i];
			}

			diff = SPACC_CTR_IV_MAX32 - num_iv;
			diff64 = SPACC_CTR_IV_MAX64 - num_iv64;

			if (len > diff) {
			if (len > diff64) {
				name = salg->calg->cra_name;
				ret = spacc_skcipher_fallback(name,
							      req, enc_dec);
				return ret;
			}
		/* 32-bit counter width */
		} else if (readl(device_h->regmap + SPACC_REG_VERSION_EXT_3)
			  & (0x3)) { /* 64-bit counter width */
			& (0x2)) {

			for (i = 8; i < 16; i++) {
				num_iv64 <<= 8;
				num_iv64 |= ivc1[i];
			for (i = 12; i < 16; i++) {
				num_iv <<= 8;
				num_iv |= ivc1[i];
			}

			diff64 = SPACC_CTR_IV_MAX64 - num_iv64;
			diff = SPACC_CTR_IV_MAX32 - num_iv;

			if (len > diff64) {
			if (len > diff) {
				name = salg->calg->cra_name;
				ret = spacc_skcipher_fallback(name,
							      req, enc_dec);
				return ret;
			}
		/* 16-bit counter width */
		} else if (readl(device_h->regmap + SPACC_REG_VERSION_EXT_3)
			   & (0x1)) { /* 16-bit counter width */
			   & (0x1)) {

			for (i = 14; i < 16; i++) {
				num_iv <<= 8;
@@ -456,8 +458,9 @@ static int spacc_cipher_process(struct skcipher_request *req, int enc_dec)
							      req, enc_dec);
				return ret;
			}
		} else if (readl(device_h->regmap + SPACC_REG_VERSION_EXT_3)
			   & (0x0)) { /* 8-bit counter width */
		/* 8-bit counter width */
		} else if ((readl(device_h->regmap + SPACC_REG_VERSION_EXT_3)
			    & 0x7) == 0) {

			for (i = 15; i < 16; i++) {
				num_iv <<= 8;