crypto: spacc - Fix counter width checks
authorPavitrakumar M <pavitrakumarm@vayavyalabs.com>
Fri, 16 Aug 2024 12:03:32 +0000 (17:33 +0530)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 24 Aug 2024 13:38:54 +0000 (21:38 +0800)
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: Bhoomika K <bhoomikak@vayavyalabs.com>
Signed-off-by: Pavitrakumar M <pavitrakumarm@vayavyalabs.com>
Acked-by: Ruud Derwig <Ruud.Derwig@synopsys.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/dwc-spacc/spacc_skcipher.c

index 8c698b7..1ef7c66 100644 (file)
@@ -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;