]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
crypto: caam - check assoclen
authorIuliana Prodan <iuliana.prodan@nxp.com>
Wed, 31 Jul 2019 13:08:07 +0000 (16:08 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 9 Aug 2019 05:11:47 +0000 (15:11 +1000)
Check assoclen to solve the extra tests that expect -EINVAL to be
returned when the associated data size is not valid.

Validated assoclen for RFC4106 and RFC4543 which expects an assoclen
of 16 or 20.
Based on seqiv, IPsec ESP and RFC4543/RFC4106 the assoclen is sizeof IP
Header (spi, seq_no, extended seq_no) and IV len. This can be 16 or 20
bytes.

Signed-off-by: Iuliana Prodan <iuliana.prodan@nxp.com>
Reviewed-by: Horia Geanta <horia.geanta@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/caamalg.c
drivers/crypto/caam/caamalg_qi.c
drivers/crypto/caam/caamalg_qi2.c

index 591906988a229aede21524deeb8dd43562e85872..f832491a6bd99bc8fef90b01bb7ced4e8207d998 100644 (file)
@@ -1598,10 +1598,7 @@ static int chachapoly_decrypt(struct aead_request *req)
 
 static int ipsec_gcm_encrypt(struct aead_request *req)
 {
-       if (req->assoclen < 8)
-               return -EINVAL;
-
-       return gcm_encrypt(req);
+       return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_encrypt(req);
 }
 
 static int aead_encrypt(struct aead_request *req)
@@ -1675,10 +1672,7 @@ static int gcm_decrypt(struct aead_request *req)
 
 static int ipsec_gcm_decrypt(struct aead_request *req)
 {
-       if (req->assoclen < 8)
-               return -EINVAL;
-
-       return gcm_decrypt(req);
+       return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_decrypt(req);
 }
 
 static int aead_decrypt(struct aead_request *req)
index 6c69f54d1f79f56925f77b969c134e17966d3fc2..215802017d5385925576477f224f9736b692b715 100644 (file)
@@ -1237,18 +1237,14 @@ static int aead_decrypt(struct aead_request *req)
 
 static int ipsec_gcm_encrypt(struct aead_request *req)
 {
-       if (req->assoclen < 8)
-               return -EINVAL;
-
-       return aead_crypt(req, true);
+       return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_crypt(req,
+                                          true);
 }
 
 static int ipsec_gcm_decrypt(struct aead_request *req)
 {
-       if (req->assoclen < 8)
-               return -EINVAL;
-
-       return aead_crypt(req, false);
+       return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_crypt(req,
+                                          false);
 }
 
 static void skcipher_done(struct caam_drv_req *drv_req, u32 status)
index 141d6231e4b9aed21f847bbf3058bf9fb9ae8af7..7350142050cc7b7a1c73b47d4fae4cc020ba9584 100644 (file)
@@ -1407,18 +1407,12 @@ static int aead_decrypt(struct aead_request *req)
 
 static int ipsec_gcm_encrypt(struct aead_request *req)
 {
-       if (req->assoclen < 8)
-               return -EINVAL;
-
-       return aead_encrypt(req);
+       return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_encrypt(req);
 }
 
 static int ipsec_gcm_decrypt(struct aead_request *req)
 {
-       if (req->assoclen < 8)
-               return -EINVAL;
-
-       return aead_decrypt(req);
+       return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_decrypt(req);
 }
 
 static void skcipher_encrypt_done(void *cbk_ctx, u32 status)