Browse Source
* Support sha384 with glib crypto backend
* Improve error reporting for unsupported cipher modes
* Avoid memory leak when bad cipher mode is given
* Run pbkdf tests on macOS
* Runtime check for pbkdf hash impls with gnutls & gcrypt
* Avoid hangs counter pbkdf iterations on some Linux kernels
by using a throwaway thread for benchmarking performance
* Fix iotests expected output from gnutls errors
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEE2vOm/bJrYpEtDo4/vobrtBUQT98FAmbfAy4ACgkQvobrtBUQ
T99ZLhAAomQ7GeUNYM2/Fh9VptSAy9nddp7WwMd2egTZ+wPMnvalxXiMupf0WNzb
3CJtXojeNCCV8PtBuTmlCmLg+HxFA+zQgkizS9WqUOMies54woGrwQCUIlyez1Au
Y2+9GbRRrkJA860R1aK2EJI5C2ofJf+CJd/nWSxsTzZSPu6Iu3V9ZahSdAq8o96R
AMh//6MOuX5pauyTYLXL3jpxEJEM4YjQ/+AF8D5FYustcN1Icjv2KPL1PArwUOTe
m1NZtcWLxZpmis5vXO8davMbB16bda6YUxuBQ++pFlF3ars7U2JldZ4DIqECAKkI
sxtw6Wq/IjdVwyJLj/+c7CX3/T1p4IuJ8ch6sfVnQz1KUf2NxPtBwSXqQneLUa2G
b46swxL695nCBYkbcfgWYfL5BaU1b0W8Xkk4sRoTNN5tDcYOuE9nMTMu71pHifmz
1itkxvLdLkwH7mxzTAxVV+vdQk3KiXlmt42/hOJMgAC3WRp2JJsEv64Jpq9huooA
a+7fM5c2r3b77q7hjIwp8X6HmNehCt2KQiGvn0DvMmqb22r/RT9VzE89iNhPNSUx
rCj7b2+19Xrfe1wxwl07GJ7yUXX4XIcphH66iO9nu1RQDBATqNSiJ/dHCfP9iiEP
7PHf4krOSzA+wL67FP+u8x0sVhpPmbPRvU8VW4+D+Av91TK5wo0=
=wLAZ
-----END PGP SIGNATURE-----
Merge tag 'crypto-fixes-pull-request' of https://gitlab.com/berrange/qemu into staging
Various crypto fixes
* Support sha384 with glib crypto backend
* Improve error reporting for unsupported cipher modes
* Avoid memory leak when bad cipher mode is given
* Run pbkdf tests on macOS
* Runtime check for pbkdf hash impls with gnutls & gcrypt
* Avoid hangs counter pbkdf iterations on some Linux kernels
by using a throwaway thread for benchmarking performance
* Fix iotests expected output from gnutls errors
# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCAAdFiEE2vOm/bJrYpEtDo4/vobrtBUQT98FAmbfAy4ACgkQvobrtBUQ
# T99ZLhAAomQ7GeUNYM2/Fh9VptSAy9nddp7WwMd2egTZ+wPMnvalxXiMupf0WNzb
# 3CJtXojeNCCV8PtBuTmlCmLg+HxFA+zQgkizS9WqUOMies54woGrwQCUIlyez1Au
# Y2+9GbRRrkJA860R1aK2EJI5C2ofJf+CJd/nWSxsTzZSPu6Iu3V9ZahSdAq8o96R
# AMh//6MOuX5pauyTYLXL3jpxEJEM4YjQ/+AF8D5FYustcN1Icjv2KPL1PArwUOTe
# m1NZtcWLxZpmis5vXO8davMbB16bda6YUxuBQ++pFlF3ars7U2JldZ4DIqECAKkI
# sxtw6Wq/IjdVwyJLj/+c7CX3/T1p4IuJ8ch6sfVnQz1KUf2NxPtBwSXqQneLUa2G
# b46swxL695nCBYkbcfgWYfL5BaU1b0W8Xkk4sRoTNN5tDcYOuE9nMTMu71pHifmz
# 1itkxvLdLkwH7mxzTAxVV+vdQk3KiXlmt42/hOJMgAC3WRp2JJsEv64Jpq9huooA
# a+7fM5c2r3b77q7hjIwp8X6HmNehCt2KQiGvn0DvMmqb22r/RT9VzE89iNhPNSUx
# rCj7b2+19Xrfe1wxwl07GJ7yUXX4XIcphH66iO9nu1RQDBATqNSiJ/dHCfP9iiEP
# 7PHf4krOSzA+wL67FP+u8x0sVhpPmbPRvU8VW4+D+Av91TK5wo0=
# =wLAZ
# -----END PGP SIGNATURE-----
# gpg: Signature made Mon 09 Sep 2024 15:16:14 BST
# gpg: using RSA key DAF3A6FDB26B62912D0E8E3FBE86EBB415104FDF
# gpg: Good signature from "Daniel P. Berrange <dan@berrange.com>" [full]
# gpg: aka "Daniel P. Berrange <berrange@redhat.com>" [full]
# Primary key fingerprint: DAF3 A6FD B26B 6291 2D0E 8E3F BE86 EBB4 1510 4FDF
* tag 'crypto-fixes-pull-request' of https://gitlab.com/berrange/qemu:
crypto: Introduce x509 utils
crypto: Support SHA384 hash when using glib
crypto: Define macros for hash algorithm digest lengths
crypto: use consistent error reporting pattern for unsupported cipher modes
crypto: avoid leak of ctx when bad cipher mode is given
tests/unit: build pbkdf test on macOS
tests/unit: always build the pbkdf crypto unit test
crypto: check gnutls & gcrypt support the requested pbkdf hash
crypto: run qcrypto_pbkdf2_count_iters in a new thread
iotests: fix expected output from gnutls
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
pull/273/head
13 changed files with 200 additions and 37 deletions
@ -0,0 +1,76 @@ |
|||
/*
|
|||
* X.509 certificate related helpers |
|||
* |
|||
* Copyright (c) 2024 Dorjoy Chowdhury <dorjoychy111@gmail.com> |
|||
* |
|||
* 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 "qapi/error.h" |
|||
#include "crypto/x509-utils.h" |
|||
#include <gnutls/gnutls.h> |
|||
#include <gnutls/crypto.h> |
|||
#include <gnutls/x509.h> |
|||
|
|||
static const int qcrypto_to_gnutls_hash_alg_map[QCRYPTO_HASH_ALG__MAX] = { |
|||
[QCRYPTO_HASH_ALG_MD5] = GNUTLS_DIG_MD5, |
|||
[QCRYPTO_HASH_ALG_SHA1] = GNUTLS_DIG_SHA1, |
|||
[QCRYPTO_HASH_ALG_SHA224] = GNUTLS_DIG_SHA224, |
|||
[QCRYPTO_HASH_ALG_SHA256] = GNUTLS_DIG_SHA256, |
|||
[QCRYPTO_HASH_ALG_SHA384] = GNUTLS_DIG_SHA384, |
|||
[QCRYPTO_HASH_ALG_SHA512] = GNUTLS_DIG_SHA512, |
|||
[QCRYPTO_HASH_ALG_RIPEMD160] = GNUTLS_DIG_RMD160, |
|||
}; |
|||
|
|||
int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, size_t size, |
|||
QCryptoHashAlgorithm alg, |
|||
uint8_t *result, |
|||
size_t *resultlen, |
|||
Error **errp) |
|||
{ |
|||
int ret = -1; |
|||
int hlen; |
|||
gnutls_x509_crt_t crt; |
|||
gnutls_datum_t datum = {.data = cert, .size = size}; |
|||
|
|||
if (alg >= G_N_ELEMENTS(qcrypto_to_gnutls_hash_alg_map)) { |
|||
error_setg(errp, "Unknown hash algorithm"); |
|||
return -1; |
|||
} |
|||
|
|||
if (result == NULL) { |
|||
error_setg(errp, "No valid buffer given"); |
|||
return -1; |
|||
} |
|||
|
|||
gnutls_x509_crt_init(&crt); |
|||
|
|||
if (gnutls_x509_crt_import(crt, &datum, GNUTLS_X509_FMT_PEM) != 0) { |
|||
error_setg(errp, "Failed to import certificate"); |
|||
goto cleanup; |
|||
} |
|||
|
|||
hlen = gnutls_hash_get_len(qcrypto_to_gnutls_hash_alg_map[alg]); |
|||
if (*resultlen < hlen) { |
|||
error_setg(errp, |
|||
"Result buffer size %zu is smaller than hash %d", |
|||
*resultlen, hlen); |
|||
goto cleanup; |
|||
} |
|||
|
|||
if (gnutls_x509_crt_get_fingerprint(crt, |
|||
qcrypto_to_gnutls_hash_alg_map[alg], |
|||
result, resultlen) != 0) { |
|||
error_setg(errp, "Failed to get fingerprint from certificate"); |
|||
goto cleanup; |
|||
} |
|||
|
|||
ret = 0; |
|||
|
|||
cleanup: |
|||
gnutls_x509_crt_deinit(crt); |
|||
return ret; |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
/*
|
|||
* X.509 certificate related helpers |
|||
* |
|||
* Copyright (c) 2024 Dorjoy Chowdhury <dorjoychy111@gmail.com> |
|||
* |
|||
* 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. |
|||
*/ |
|||
|
|||
#ifndef QCRYPTO_X509_UTILS_H |
|||
#define QCRYPTO_X509_UTILS_H |
|||
|
|||
#include "crypto/hash.h" |
|||
|
|||
int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, size_t size, |
|||
QCryptoHashAlgorithm hash, |
|||
uint8_t *result, |
|||
size_t *resultlen, |
|||
Error **errp); |
|||
|
|||
#endif |
|||
Loading…
Reference in new issue