qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Cédric Le Goater" <clg@redhat.com>
To: qemu-devel@nongnu.org, berrange@redhat.com
Cc: kris.conklin@seagate.com, jonathan.henze@seagate.com,
	evan.burgess@seagate.com, peter.maydell@linaro.org,
	"Alejandro Zeise" <alejandro.zeise@seagate.com>,
	"Cédric Le Goater" <clg@redhat.com>
Subject: [PATCH v5 03/16] crypto/hash-gcrypt: Implement new hash API
Date: Tue,  8 Oct 2024 09:57:10 +0200	[thread overview]
Message-ID: <20241008075724.2772149-4-clg@redhat.com> (raw)
In-Reply-To: <20241008075724.2772149-1-clg@redhat.com>

From: Alejandro Zeise <alejandro.zeise@seagate.com>

Implements the new hashing API in the gcrypt hash driver.
Supports creating/destroying a context, updating the context
with input data and obtaining an output hash.

Signed-off-by: Alejandro Zeise <alejandro.zeise@seagate.com>
[ clg: - Dropped qcrypto_hash_supports() in qcrypto_gcrypt_hash_new()
       - Reworked qcrypto_gcrypt_hash_finalize()
       - Handled gcry_md_open() errors in qcrypto_gcrypt_hash_new()
       - Checkpatch fixes ]
Signed-off-by: Cédric Le Goater <clg@redhat.com>
---
 crypto/hash-gcrypt.c | 79 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/crypto/hash-gcrypt.c b/crypto/hash-gcrypt.c
index 0973cc0d93c1..cb2cb37f25ed 100644
--- a/crypto/hash-gcrypt.c
+++ b/crypto/hash-gcrypt.c
@@ -1,6 +1,7 @@
 /*
  * QEMU Crypto hash algorithms
  *
+ * Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
  * Copyright (c) 2016 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
@@ -110,7 +111,85 @@ qcrypto_gcrypt_hash_bytesv(QCryptoHashAlgo alg,
     return -1;
 }
 
+static
+QCryptoHash *qcrypto_gcrypt_hash_new(QCryptoHashAlgo alg, Error **errp)
+{
+    QCryptoHash *hash;
+    int ret;
+
+    hash = g_new(QCryptoHash, 1);
+    hash->alg = alg;
+    hash->opaque = g_new(gcry_md_hd_t, 1);
+
+    ret = gcry_md_open((gcry_md_hd_t *) hash->opaque,
+                       qcrypto_hash_alg_map[alg], 0);
+    if (ret < 0) {
+        error_setg(errp,
+                   "Unable to initialize hash algorithm: %s",
+                   gcry_strerror(ret));
+        g_free(hash->opaque);
+        g_free(hash);
+        return NULL;
+    }
+    return hash;
+}
+
+static
+void qcrypto_gcrypt_hash_free(QCryptoHash *hash)
+{
+    gcry_md_hd_t *ctx = hash->opaque;
+
+    if (ctx) {
+        gcry_md_close(*ctx);
+        g_free(ctx);
+    }
+
+    g_free(hash);
+}
+
+
+static
+int qcrypto_gcrypt_hash_update(QCryptoHash *hash,
+                               const struct iovec *iov,
+                               size_t niov,
+                               Error **errp)
+{
+    gcry_md_hd_t *ctx = hash->opaque;
+
+    for (int i = 0; i < niov; i++) {
+        gcry_md_write(*ctx, iov[i].iov_base, iov[i].iov_len);
+    }
+
+    return 0;
+}
+
+static
+int qcrypto_gcrypt_hash_finalize(QCryptoHash *hash,
+                                 uint8_t **result,
+                                 size_t *result_len,
+                                 Error **errp)
+{
+    unsigned char *digest;
+    gcry_md_hd_t *ctx = hash->opaque;
+
+    *result_len = gcry_md_get_algo_dlen(qcrypto_hash_alg_map[hash->alg]);
+    if (*result_len == 0) {
+        error_setg(errp, "Unable to get hash length");
+        return -1;
+    }
+
+    *result = g_new(uint8_t, *result_len);
+
+    /* Digest is freed by gcry_md_close(), copy it */
+    digest = gcry_md_read(*ctx, 0);
+    memcpy(*result, digest, *result_len);
+    return 0;
+}
 
 QCryptoHashDriver qcrypto_hash_lib_driver = {
     .hash_bytesv = qcrypto_gcrypt_hash_bytesv,
+    .hash_new      = qcrypto_gcrypt_hash_new,
+    .hash_update   = qcrypto_gcrypt_hash_update,
+    .hash_finalize = qcrypto_gcrypt_hash_finalize,
+    .hash_free     = qcrypto_gcrypt_hash_free,
 };
-- 
2.46.2



  parent reply	other threads:[~2024-10-08  7:58 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-08  7:57 [PATCH v5 00/16] hw/misc/aspeed_hace: Fix SG Accumulative Hash Calculations Cédric Le Goater
2024-10-08  7:57 ` [PATCH v5 01/16] crypto: accumulative hashing API Cédric Le Goater
2024-10-10 10:09   ` Daniel P. Berrangé
2024-10-08  7:57 ` [PATCH v5 02/16] crypto/hash-glib: Implement new hash API Cédric Le Goater
2024-10-10 10:11   ` Daniel P. Berrangé
2024-10-08  7:57 ` Cédric Le Goater [this message]
2024-10-10 10:29   ` [PATCH v5 03/16] crypto/hash-gcrypt: " Daniel P. Berrangé
2024-10-08  7:57 ` [PATCH v5 04/16] crypto/hash-gnutls: " Cédric Le Goater
2024-10-10 10:36   ` Daniel P. Berrangé
2024-10-08  7:57 ` [PATCH v5 05/16] crypto/hash-nettle: " Cédric Le Goater
2024-10-10 10:49   ` Daniel P. Berrangé
2024-10-10 11:43     ` Daniel P. Berrangé
2024-10-10 12:01       ` Cédric Le Goater
2024-10-08  7:57 ` [PATCH v5 06/16] util/iov: Introduce iov_send_recv_with_flags() Cédric Le Goater
2024-10-10 10:51   ` Daniel P. Berrangé
2024-10-08  7:57 ` [PATCH v5 07/16] crypto/hash-afalg: Implement new hash API Cédric Le Goater
2024-10-10 11:16   ` Daniel P. Berrangé
2024-10-08  7:57 ` [PATCH v5 08/16] crypto/hash: Implement and use " Cédric Le Goater
2024-10-10 11:21   ` Daniel P. Berrangé
2024-10-08  7:57 ` [PATCH v5 09/16] tests/unit/test-crypto-hash: accumulative hashing Cédric Le Goater
2024-10-10 11:22   ` Daniel P. Berrangé
2024-10-08  7:57 ` [PATCH v5 10/16] crypto/hash-glib: Remove old hash API functions Cédric Le Goater
2024-10-08  7:57 ` [PATCH v5 11/16] crypto/hash-gcrypt: " Cédric Le Goater
2024-10-08  7:57 ` [PATCH v5 12/16] crypto/hash-gnutls: " Cédric Le Goater
2024-10-08  7:57 ` [PATCH v5 13/16] crypto/hash-nettle: " Cédric Le Goater
2024-10-08  7:57 ` [PATCH v5 14/16] crypto/hash-afalg: " Cédric Le Goater
2024-10-08  7:57 ` [PATCH v5 15/16] crypto/hashpriv: Remove old hash API function Cédric Le Goater
2024-10-08  7:57 ` [PATCH v5 16/16] hw/misc/aspeed_hace: Fix SG Accumulative hashing Cédric Le Goater
2024-10-10 11:25   ` Daniel P. Berrangé
2024-10-08  8:01 ` [PATCH v5 00/16] hw/misc/aspeed_hace: Fix SG Accumulative Hash Calculations Cédric Le Goater
2024-10-10 11:28 ` Daniel P. Berrangé
2024-10-10 11:40   ` Cédric Le Goater

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241008075724.2772149-4-clg@redhat.com \
    --to=clg@redhat.com \
    --cc=alejandro.zeise@seagate.com \
    --cc=berrange@redhat.com \
    --cc=evan.burgess@seagate.com \
    --cc=jonathan.henze@seagate.com \
    --cc=kris.conklin@seagate.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).