-----Original Message-----
From: Stephan Mueller [mailto:smuel...@chronox.de] 
Sent: Wednesday, September 28, 2016 11:46 AM
To: Dey, Megha <megha....@intel.com>
Cc: linux-crypto@vger.kernel.org; tim.c.c...@linux.intel.com
Subject: Re: sha1_mb broken

Am Mittwoch, 28. September 2016, 11:25:47 CEST schrieb Megha Dey:

Hi Megha,

> Hi Stephan,
> 
> There was a bug fix: Commit ID : 0851561d (introduced in 4.6-rc5).

I use the current cryptodev-2.6 tree.
> 
> Assuming that you are using an older kernel than this one, maybe we 
> are issuing the complete with the wrong pointer, so the original 
> issuer of the request never gets the complete back.
> 
> If you are using an older kernel, can you please use the lastest and 
> let me know if you still see this issue?
> 
> Also can you give more info on the test case? Does it issue single 
> request or multiple requests?

It is a single test with the message "8c899bba" where I expect 
"ac6d8c4851beacf61c175aed0699053d8f632df8"

>> For the message 8c899bba, the expected hash is  not 
>> ac6d8c4851beacf61c175aed0699053d8f632df8 but 
2e2816f6241fef89d78dd7afc926adc03ca94ace. I used this hash value in the 
existing tcrypt test and the test passes.

I would like to duplicate the test case you are using so that I can have a 
better look.
Can you provide the complete code for the test case? The code you sent earlier 
are missing some structure definitions. I will try to incorporate this test in 
the tcrypt test suite and try to reproduce this issue.

The code is the following which works with any other hash:

struct kccavs_ahash_def {
        struct crypto_ahash *tfm;
        struct ahash_request *req;
        struct kccavs_tcrypt_res result;
};

/* Callback function */
static void kccavs_ahash_cb(struct crypto_async_request *req, int error) {
        struct kccavs_tcrypt_res *result = req->data;

        if (error == -EINPROGRESS)
                return;
        result->err = error;
        complete(&result->completion);
        dbg("Encryption finished successfully\n"); }

/* Perform hash */
static unsigned int kccavs_ahash_op(struct kccavs_ahash_def *ahash) {
        int rc = 0;

        rc = crypto_ahash_digest(ahash->req);

        switch (rc) {
        case 0:
                break;
        case -EINPROGRESS:
        case -EBUSY:
                rc = 
wait_for_completion_interruptible(&ahash->result.completion);
                if (!rc && !ahash->result.err) {
#ifdef OLDASYNC
                        INIT_COMPLETION(aead->result.completion);
#else
                        reinit_completion(&ahash->result.completion);
#endif
                        break;
                }
        default:
                dbg("ahash cipher operation returned with %d result"
                    " %d\n",rc, ahash->result.err);
                break;
        }
        init_completion(&ahash->result.completion);

        return rc;
}

static int kccavs_test_ahash(size_t nbytes) {
        int ret;
        struct crypto_ahash *tfm;
        struct ahash_request *req = NULL;
        struct kccavs_ahash_def ahash;
        struct kccavs_data *data = &kccavs_test->data;
        struct kccavs_data *key = &kccavs_test->key;
        unsigned char *digest = NULL;
        struct scatterlist sg;

        /*
         * We explicitly do not check the input buffer as we allow
         * an empty string.
         */

        /* allocate synchronous hash */
        tfm = crypto_alloc_ahash(kccavs_test->name, 0, 0);
        if (IS_ERR(tfm)) {
                pr_info("could not allocate digest TFM handle for %s\n", 
kccavs_test-
>name);
                return PTR_ERR(tfm);
        }

        digest = kzalloc(crypto_ahash_digestsize(tfm), GFP_KERNEL);
        if (!digest) {
                ret = -ENOMEM;
                goto out;
        }

        req = ahash_request_alloc(tfm, GFP_KERNEL);
        if (!req) {
                pr_info("could not allocate request queue\n");
                ret = -ENOMEM;
                goto out;
        }
        ahash.tfm = tfm;
        ahash.req = req;

        if (key->len) {
                dbg("set key for HMAC\n");
                ret = crypto_ahash_setkey(tfm, key->data, key->len);
                if (ret < 0)
                        goto out;
        }

        sg_init_one(&sg, data->data, data->len);
        ahash_request_set_crypt(req, &sg, digest, data->len);
        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
                                   kccavs_ahash_cb, &ahash.result);

        ret = kccavs_ahash_op(&ahash);
        if (!ret) {
                data->len = crypto_ahash_digestsize(tfm);
                memcpy(data->data, digest, data->len);
        }

out:
        kzfree(digest);
        if (req)
                ahash_request_free(req);
        crypto_free_ahash(tfm);
        return ret;
}


Ciao
Stephan
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to