Re: [Qemu-devel] [PATCH v2 for-2.10 14/18] crypto: hash: add afalg-backend hash support

2017-04-21 Thread Longpeng (Mike)


On 2017/4/21 21:01, Gonglei (Arei) wrote:

> There are same problems with the previous patch.
> 


Ok, I'll fix them in v3, thanks.

> 
> 
> Regards,
> -Gonglei
> 
> 
>> -Original Message-
>> From: longpeng
>> Sent: Monday, April 17, 2017 9:33 AM
>> To: berra...@redhat.com
>> Cc: Gonglei (Arei); Huangweidong (C); arm...@redhat.com;
>> ebl...@redhat.com; m...@redhat.com; qemu-devel@nongnu.org; longpeng
>> Subject: [PATCH v2 for-2.10 14/18] crypto: hash: add afalg-backend hash
>> support
>>
>> Adds afalg-backend hash support: introduces some private APIs
>> firstly, and then intergrates them into qcrypto_hash_afalg_driver.
>>
>> Signed-off-by: Longpeng(Mike) 
>> ---
>>  crypto/Makefile.objs |   1 +
>>  crypto/afalgpriv.h   |   1 +
>>  crypto/hash-afalg.c  | 151
>> +++
>>  crypto/hash.c|  11 
>>  crypto/hashpriv.h|   4 ++
>>  5 files changed, 168 insertions(+)
>>  create mode 100644 crypto/hash-afalg.c
>>
>> diff --git a/crypto/Makefile.objs b/crypto/Makefile.objs
>> index d2e8fa8..2b99e08 100644
>> --- a/crypto/Makefile.objs
>> +++ b/crypto/Makefile.objs
>> @@ -12,6 +12,7 @@ crypto-obj-y += desrfb.o
>>  crypto-obj-y += cipher.o
>>  crypto-obj-$(CONFIG_AF_ALG) += afalg.o
>>  crypto-obj-$(CONFIG_AF_ALG) += cipher-afalg.o
>> +crypto-obj-$(CONFIG_AF_ALG) += hash-afalg.o
>>  crypto-obj-y += tlscreds.o
>>  crypto-obj-y += tlscredsanon.o
>>  crypto-obj-y += tlscredsx509.o
>> diff --git a/crypto/afalgpriv.h b/crypto/afalgpriv.h
>> index 7db0597..71ec267 100644
>> --- a/crypto/afalgpriv.h
>> +++ b/crypto/afalgpriv.h
>> @@ -24,6 +24,7 @@
>>  #endif
>>
>>  #define AFALG_TYPE_CIPHER "skcipher"
>> +#define AFALG_TYPE_HASH "hash"
>>
>>  #define ALG_OPTYPE_LEN 4
>>  #define ALG_MSGIV_LEN(len) (sizeof(struct af_alg_iv) + (len))
>> diff --git a/crypto/hash-afalg.c b/crypto/hash-afalg.c
>> new file mode 100644
>> index 000..1d0e052
>> --- /dev/null
>> +++ b/crypto/hash-afalg.c
>> @@ -0,0 +1,151 @@
>> +/*
>> + * QEMU Crypto af_alg-backend hash support
>> + *
>> + * Copyright (c) 2017 HUAWEI TECHNOLOGIES CO., LTD.
>> + *
>> + * Authors:
>> + *Longpeng(Mike) 
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2 or
>> + * (at your option) any later version.  See the COPYING file in the
>> + * top-level directory.
>> + */
>> +#include "qemu/osdep.h"
>> +#include "qemu/iov.h"
>> +#include "qemu/sockets.h"
>> +#include "qemu-common.h"
>> +#include "qapi/error.h"
>> +#include "crypto/hash.h"
>> +#include "hashpriv.h"
>> +
>> +static char *
>> +qcrypto_afalg_hash_format_name(QCryptoHashAlgorithm alg,
>> +   Error **errp)
>> +{
>> +char *name;
>> +const char *alg_name = NULL;
>> +int ret;
>> +
>> +switch (alg) {
>> +case QCRYPTO_HASH_ALG_MD5:
>> +alg_name = "md5";
>> +break;
>> +case QCRYPTO_HASH_ALG_SHA1:
>> +alg_name = "sha1";
>> +break;
>> +case QCRYPTO_HASH_ALG_SHA224:
>> +alg_name = "sha224";
>> +break;
>> +case QCRYPTO_HASH_ALG_SHA256:
>> +alg_name = "sha256";
>> +break;
>> +case QCRYPTO_HASH_ALG_SHA384:
>> +alg_name = "sha384";
>> +break;
>> +case QCRYPTO_HASH_ALG_SHA512:
>> +alg_name = "sha512";
>> +break;
>> +case QCRYPTO_HASH_ALG_RIPEMD160:
>> +alg_name = "rmd160";
>> +break;
>> +
>> +default:
>> +error_setg(errp, "Unsupported hash algorithm %d", alg);
>> +return NULL;
>> +}
>> +
>> +name = (char *)g_new0(int8_t, SALG_NAME_LEN_MAX);
>> +ret = snprintf(name, SALG_NAME_LEN_MAX, "%s", alg_name);
>> +if (ret < 0 || ret >= SALG_NAME_LEN_MAX) {
>> +error_setg(errp, "Build hash name(name='%s') failed",
>> +   alg_name);
>> +g_free(name);
>> +return NULL;
>> +}
>> +
>> +return name;
>> +}
>> +
>> +static QCryptoAFAlg *
>> +qcrypto_afalg_hash_ctx_new(QCryptoHashAlgorithm alg, Error **errp)
>> +{
>> +QCryptoAFAlg *afalg;
>> +char *name;
>> +
>> +name = qcrypto_afalg_hash_format_name(alg, errp);
>> +if (!name) {
>> +return NULL;
>> +}
>> +
>> +afalg = qcrypto_afalg_comm_alloc(AFALG_TYPE_HASH, name, errp);
>> +if (!afalg) {
>> +goto error;
>> +}
>> +
>> +/* prepare msg header */
>> +afalg->msg = g_new0(struct msghdr, 1);
>> +
>> +cleanup:
>> +g_free(name);
>> +return afalg;
>> +
>> +error:
>> +qcrypto_afalg_comm_free(afalg);
>> +goto cleanup;
>> +}
>> +
>> +static int
>> +qcrypto_afalg_hash_bytesv(QCryptoHashAlgorithm alg,
>> +  const struct iovec *iov,
>> +  size_t niov, uint8_t **result,
>> +  size_t *resultlen,
>> +  Error **errp)
>> +{
>> +QCryptoAFAlg *afalg;
>> +struct iovec outv;
>> +int ret = 0;
>> +const int except_len = qcrypto_hash_digest_len(alg);
>> +
>> +if (*resultlen ==

Re: [Qemu-devel] [PATCH v2 for-2.10 14/18] crypto: hash: add afalg-backend hash support

2017-04-21 Thread Gonglei (Arei)
There are same problems with the previous patch.



Regards,
-Gonglei


> -Original Message-
> From: longpeng
> Sent: Monday, April 17, 2017 9:33 AM
> To: berra...@redhat.com
> Cc: Gonglei (Arei); Huangweidong (C); arm...@redhat.com;
> ebl...@redhat.com; m...@redhat.com; qemu-devel@nongnu.org; longpeng
> Subject: [PATCH v2 for-2.10 14/18] crypto: hash: add afalg-backend hash
> support
> 
> Adds afalg-backend hash support: introduces some private APIs
> firstly, and then intergrates them into qcrypto_hash_afalg_driver.
> 
> Signed-off-by: Longpeng(Mike) 
> ---
>  crypto/Makefile.objs |   1 +
>  crypto/afalgpriv.h   |   1 +
>  crypto/hash-afalg.c  | 151
> +++
>  crypto/hash.c|  11 
>  crypto/hashpriv.h|   4 ++
>  5 files changed, 168 insertions(+)
>  create mode 100644 crypto/hash-afalg.c
> 
> diff --git a/crypto/Makefile.objs b/crypto/Makefile.objs
> index d2e8fa8..2b99e08 100644
> --- a/crypto/Makefile.objs
> +++ b/crypto/Makefile.objs
> @@ -12,6 +12,7 @@ crypto-obj-y += desrfb.o
>  crypto-obj-y += cipher.o
>  crypto-obj-$(CONFIG_AF_ALG) += afalg.o
>  crypto-obj-$(CONFIG_AF_ALG) += cipher-afalg.o
> +crypto-obj-$(CONFIG_AF_ALG) += hash-afalg.o
>  crypto-obj-y += tlscreds.o
>  crypto-obj-y += tlscredsanon.o
>  crypto-obj-y += tlscredsx509.o
> diff --git a/crypto/afalgpriv.h b/crypto/afalgpriv.h
> index 7db0597..71ec267 100644
> --- a/crypto/afalgpriv.h
> +++ b/crypto/afalgpriv.h
> @@ -24,6 +24,7 @@
>  #endif
> 
>  #define AFALG_TYPE_CIPHER "skcipher"
> +#define AFALG_TYPE_HASH "hash"
> 
>  #define ALG_OPTYPE_LEN 4
>  #define ALG_MSGIV_LEN(len) (sizeof(struct af_alg_iv) + (len))
> diff --git a/crypto/hash-afalg.c b/crypto/hash-afalg.c
> new file mode 100644
> index 000..1d0e052
> --- /dev/null
> +++ b/crypto/hash-afalg.c
> @@ -0,0 +1,151 @@
> +/*
> + * QEMU Crypto af_alg-backend hash support
> + *
> + * Copyright (c) 2017 HUAWEI TECHNOLOGIES CO., LTD.
> + *
> + * Authors:
> + *Longpeng(Mike) 
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or
> + * (at your option) any later version.  See the COPYING file in the
> + * top-level directory.
> + */
> +#include "qemu/osdep.h"
> +#include "qemu/iov.h"
> +#include "qemu/sockets.h"
> +#include "qemu-common.h"
> +#include "qapi/error.h"
> +#include "crypto/hash.h"
> +#include "hashpriv.h"
> +
> +static char *
> +qcrypto_afalg_hash_format_name(QCryptoHashAlgorithm alg,
> +   Error **errp)
> +{
> +char *name;
> +const char *alg_name = NULL;
> +int ret;
> +
> +switch (alg) {
> +case QCRYPTO_HASH_ALG_MD5:
> +alg_name = "md5";
> +break;
> +case QCRYPTO_HASH_ALG_SHA1:
> +alg_name = "sha1";
> +break;
> +case QCRYPTO_HASH_ALG_SHA224:
> +alg_name = "sha224";
> +break;
> +case QCRYPTO_HASH_ALG_SHA256:
> +alg_name = "sha256";
> +break;
> +case QCRYPTO_HASH_ALG_SHA384:
> +alg_name = "sha384";
> +break;
> +case QCRYPTO_HASH_ALG_SHA512:
> +alg_name = "sha512";
> +break;
> +case QCRYPTO_HASH_ALG_RIPEMD160:
> +alg_name = "rmd160";
> +break;
> +
> +default:
> +error_setg(errp, "Unsupported hash algorithm %d", alg);
> +return NULL;
> +}
> +
> +name = (char *)g_new0(int8_t, SALG_NAME_LEN_MAX);
> +ret = snprintf(name, SALG_NAME_LEN_MAX, "%s", alg_name);
> +if (ret < 0 || ret >= SALG_NAME_LEN_MAX) {
> +error_setg(errp, "Build hash name(name='%s') failed",
> +   alg_name);
> +g_free(name);
> +return NULL;
> +}
> +
> +return name;
> +}
> +
> +static QCryptoAFAlg *
> +qcrypto_afalg_hash_ctx_new(QCryptoHashAlgorithm alg, Error **errp)
> +{
> +QCryptoAFAlg *afalg;
> +char *name;
> +
> +name = qcrypto_afalg_hash_format_name(alg, errp);
> +if (!name) {
> +return NULL;
> +}
> +
> +afalg = qcrypto_afalg_comm_alloc(AFALG_TYPE_HASH, name, errp);
> +if (!afalg) {
> +goto error;
> +}
> +
> +/* prepare msg header */
> +afalg->msg = g_new0(struct msghdr, 1);
> +
> +cleanup:
> +g_free(name);
> +return afalg;
> +
> +error:
> +qcrypto_afalg_comm_free(afalg);
> +goto cleanup;
> +}
> +
> +static int
> +qcrypto_afalg_hash_bytesv(QCryptoHashAlgorithm alg,
> +  const struct iovec *iov,
> +  size_t niov, uint8_t **result,
> +  size_t *resultlen,
> +  Error **errp)
> +{
> +QCryptoAFAlg *afalg;
> +struct iovec outv;
> +int ret = 0;
> +const int except_len = qcrypto_hash_digest_len(alg);
> +
> +if (*resultlen == 0) {
> +*resultlen = except_len;
> +*result = g_new0(uint8_t, *resultlen);
> +} else if (*resultlen != except_len) {
> +error_setg(errp,
> +   "Result buffer size %zu is not match hash %d",
> +