Re: [Qemu-devel] [PATCH v2 for-2.10 14/18] crypto: hash: add afalg-backend hash support
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
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", > +