OSDN Git Service

Merge tag 'char-misc-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[uclinux-h8/linux.git] / crypto / testmgr.c
index e5d8a0b..8386038 100644 (file)
@@ -1253,6 +1253,50 @@ static int test_aead_vec_cfg(const char *driver, int enc,
                return -EINVAL;
        }
 
+       /* Check that the algorithm didn't overwrite things it shouldn't have */
+       if (req->cryptlen != (enc ? vec->plen : vec->clen) ||
+           req->assoclen != vec->alen ||
+           req->iv != iv ||
+           req->src != tsgls->src.sgl_ptr ||
+           req->dst != tsgls->dst.sgl_ptr ||
+           crypto_aead_reqtfm(req) != tfm ||
+           req->base.complete != crypto_req_done ||
+           req->base.flags != req_flags ||
+           req->base.data != &wait) {
+               pr_err("alg: aead: %s %s corrupted request struct on test vector %u, cfg=\"%s\"\n",
+                      driver, op, vec_num, cfg->name);
+               if (req->cryptlen != (enc ? vec->plen : vec->clen))
+                       pr_err("alg: aead: changed 'req->cryptlen'\n");
+               if (req->assoclen != vec->alen)
+                       pr_err("alg: aead: changed 'req->assoclen'\n");
+               if (req->iv != iv)
+                       pr_err("alg: aead: changed 'req->iv'\n");
+               if (req->src != tsgls->src.sgl_ptr)
+                       pr_err("alg: aead: changed 'req->src'\n");
+               if (req->dst != tsgls->dst.sgl_ptr)
+                       pr_err("alg: aead: changed 'req->dst'\n");
+               if (crypto_aead_reqtfm(req) != tfm)
+                       pr_err("alg: aead: changed 'req->base.tfm'\n");
+               if (req->base.complete != crypto_req_done)
+                       pr_err("alg: aead: changed 'req->base.complete'\n");
+               if (req->base.flags != req_flags)
+                       pr_err("alg: aead: changed 'req->base.flags'\n");
+               if (req->base.data != &wait)
+                       pr_err("alg: aead: changed 'req->base.data'\n");
+               return -EINVAL;
+       }
+       if (is_test_sglist_corrupted(&tsgls->src)) {
+               pr_err("alg: aead: %s %s corrupted src sgl on test vector %u, cfg=\"%s\"\n",
+                      driver, op, vec_num, cfg->name);
+               return -EINVAL;
+       }
+       if (tsgls->dst.sgl_ptr != tsgls->src.sgl &&
+           is_test_sglist_corrupted(&tsgls->dst)) {
+               pr_err("alg: aead: %s %s corrupted dst sgl on test vector %u, cfg=\"%s\"\n",
+                      driver, op, vec_num, cfg->name);
+               return -EINVAL;
+       }
+
        /* Check for the correct output (ciphertext or plaintext) */
        err = verify_correct_output(&tsgls->dst, enc ? vec->ctext : vec->ptext,
                                    enc ? vec->clen : vec->plen,
@@ -1498,7 +1542,9 @@ static int test_skcipher_vec_cfg(const char *driver, int enc,
        if (ivsize) {
                if (WARN_ON(ivsize > MAX_IVLEN))
                        return -EINVAL;
-               if (vec->iv && !(vec->generates_iv && enc))
+               if (vec->generates_iv && !enc)
+                       memcpy(iv, vec->iv_out, ivsize);
+               else if (vec->iv)
                        memcpy(iv, vec->iv, ivsize);
                else
                        memset(iv, 0, ivsize);
@@ -1535,6 +1581,47 @@ static int test_skcipher_vec_cfg(const char *driver, int enc,
                return err;
        }
 
+       /* Check that the algorithm didn't overwrite things it shouldn't have */
+       if (req->cryptlen != vec->len ||
+           req->iv != iv ||
+           req->src != tsgls->src.sgl_ptr ||
+           req->dst != tsgls->dst.sgl_ptr ||
+           crypto_skcipher_reqtfm(req) != tfm ||
+           req->base.complete != crypto_req_done ||
+           req->base.flags != req_flags ||
+           req->base.data != &wait) {
+               pr_err("alg: skcipher: %s %s corrupted request struct on test vector %u, cfg=\"%s\"\n",
+                      driver, op, vec_num, cfg->name);
+               if (req->cryptlen != vec->len)
+                       pr_err("alg: skcipher: changed 'req->cryptlen'\n");
+               if (req->iv != iv)
+                       pr_err("alg: skcipher: changed 'req->iv'\n");
+               if (req->src != tsgls->src.sgl_ptr)
+                       pr_err("alg: skcipher: changed 'req->src'\n");
+               if (req->dst != tsgls->dst.sgl_ptr)
+                       pr_err("alg: skcipher: changed 'req->dst'\n");
+               if (crypto_skcipher_reqtfm(req) != tfm)
+                       pr_err("alg: skcipher: changed 'req->base.tfm'\n");
+               if (req->base.complete != crypto_req_done)
+                       pr_err("alg: skcipher: changed 'req->base.complete'\n");
+               if (req->base.flags != req_flags)
+                       pr_err("alg: skcipher: changed 'req->base.flags'\n");
+               if (req->base.data != &wait)
+                       pr_err("alg: skcipher: changed 'req->base.data'\n");
+               return -EINVAL;
+       }
+       if (is_test_sglist_corrupted(&tsgls->src)) {
+               pr_err("alg: skcipher: %s %s corrupted src sgl on test vector %u, cfg=\"%s\"\n",
+                      driver, op, vec_num, cfg->name);
+               return -EINVAL;
+       }
+       if (tsgls->dst.sgl_ptr != tsgls->src.sgl &&
+           is_test_sglist_corrupted(&tsgls->dst)) {
+               pr_err("alg: skcipher: %s %s corrupted dst sgl on test vector %u, cfg=\"%s\"\n",
+                      driver, op, vec_num, cfg->name);
+               return -EINVAL;
+       }
+
        /* Check for the correct output (ciphertext or plaintext) */
        err = verify_correct_output(&tsgls->dst, enc ? vec->ctext : vec->ptext,
                                    vec->len, 0, true);
@@ -1550,7 +1637,7 @@ static int test_skcipher_vec_cfg(const char *driver, int enc,
        }
 
        /* If applicable, check that the algorithm generated the correct IV */
-       if (vec->generates_iv && enc && memcmp(iv, vec->iv, ivsize) != 0) {
+       if (vec->iv_out && memcmp(iv, vec->iv_out, ivsize) != 0) {
                pr_err("alg: skcipher: %s %s test failed (wrong output IV) on test vector %u, cfg=\"%s\"\n",
                       driver, op, vec_num, cfg->name);
                hexdump(iv, ivsize);