Message ID | 20240807195122.2827364-9-alejandro.zeise@seagate.com |
---|---|
State | New |
Headers | show |
Series | hw/misc/aspeed_hace: Fix SG Accumulative Hash Calculations | expand |
On Wed, Aug 07, 2024 at 07:51:15PM +0000, Alejandro Zeise wrote: > Added an accumulative hashing test. Checks for functionality of > the new hash create, update, finalize and free functions. > > Signed-off-by: Alejandro Zeise <alejandro.zeise@seagate.com> > --- > tests/unit/test-crypto-hash.c | 48 +++++++++++++++++++++++++++++++++++ > 1 file changed, 48 insertions(+) > > diff --git a/tests/unit/test-crypto-hash.c b/tests/unit/test-crypto-hash.c > index 1f4abb822b..2bf9bcb6a0 100644 > --- a/tests/unit/test-crypto-hash.c > +++ b/tests/unit/test-crypto-hash.c > @@ -1,6 +1,7 @@ > /* > * QEMU Crypto hash algorithms > * > + * Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates > * Copyright (c) 2015 Red Hat, Inc. > * > * This library is free software; you can redistribute it and/or > @@ -241,6 +242,52 @@ static void test_hash_base64(void) > } > } > > +static void test_hash_accumulate(void) > +{ > + QCryptoHash *hash; Move this inside the for() and use 'g_autoptr(QCryptoHash) hash = NULL' > + size_t i; > + > + for (i = 0; i < G_N_ELEMENTS(expected_outputs) ; i++) { > + struct iovec iov[3] = { Don't need to declare it '[3]' just '[]' as, then.... > + { .iov_base = (char *)INPUT_TEXT1, .iov_len = strlen(INPUT_TEXT1) }, > + { .iov_base = (char *)INPUT_TEXT2, .iov_len = strlen(INPUT_TEXT2) }, > + { .iov_base = (char *)INPUT_TEXT3, .iov_len = strlen(INPUT_TEXT3) }, > + }; > + uint8_t *result = NULL; g_autofree uint8_t *result = NULL; > + size_t resultlen = 0; > + int ret; > + size_t j; > + > + if (!qcrypto_hash_supports(i)) { > + continue; > + } > + > + hash = qcrypto_hash_new(i, &error_fatal); > + g_assert(hash != NULL); > + > + /* Add each iovec to the hash context separately */ > + for (j = 0; j < 3; j++) { ...instead of 'j < 3' use 'j < G_N_ELEMENTS(iov)' > + ret = qcrypto_hash_updatev(hash, > + &iov[j], 1, > + &error_fatal); > + > + g_assert(ret == 0); > + } > + > + ret = qcrypto_hash_finalize_bytes(hash, &result, &resultlen, > + &error_fatal); > + > + g_assert(ret == 0); > + g_assert(resultlen == expected_lens[i]); > + for (j = 0; j < resultlen; j++) { > + g_assert(expected_outputs[i][j * 2] == hex[(result[j] >> 4) & 0xf]); > + g_assert(expected_outputs[i][j * 2 + 1] == hex[result[j] & 0xf]); > + } > + g_free(result); > + qcrypto_hash_free(hash); Drop these two frees. > + } > +} > + > int main(int argc, char **argv) > { > int ret = qcrypto_init(&error_fatal); > @@ -252,5 +299,6 @@ int main(int argc, char **argv) > g_test_add_func("/crypto/hash/prealloc", test_hash_prealloc); > g_test_add_func("/crypto/hash/digest", test_hash_digest); > g_test_add_func("/crypto/hash/base64", test_hash_base64); > + g_test_add_func("/crypto/hash/accumulate", test_hash_accumulate); > return g_test_run(); > } > -- > 2.34.1 > With regards, Daniel
diff --git a/tests/unit/test-crypto-hash.c b/tests/unit/test-crypto-hash.c index 1f4abb822b..2bf9bcb6a0 100644 --- a/tests/unit/test-crypto-hash.c +++ b/tests/unit/test-crypto-hash.c @@ -1,6 +1,7 @@ /* * QEMU Crypto hash algorithms * + * Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates * Copyright (c) 2015 Red Hat, Inc. * * This library is free software; you can redistribute it and/or @@ -241,6 +242,52 @@ static void test_hash_base64(void) } } +static void test_hash_accumulate(void) +{ + QCryptoHash *hash; + size_t i; + + for (i = 0; i < G_N_ELEMENTS(expected_outputs) ; i++) { + struct iovec iov[3] = { + { .iov_base = (char *)INPUT_TEXT1, .iov_len = strlen(INPUT_TEXT1) }, + { .iov_base = (char *)INPUT_TEXT2, .iov_len = strlen(INPUT_TEXT2) }, + { .iov_base = (char *)INPUT_TEXT3, .iov_len = strlen(INPUT_TEXT3) }, + }; + uint8_t *result = NULL; + size_t resultlen = 0; + int ret; + size_t j; + + if (!qcrypto_hash_supports(i)) { + continue; + } + + hash = qcrypto_hash_new(i, &error_fatal); + g_assert(hash != NULL); + + /* Add each iovec to the hash context separately */ + for (j = 0; j < 3; j++) { + ret = qcrypto_hash_updatev(hash, + &iov[j], 1, + &error_fatal); + + g_assert(ret == 0); + } + + ret = qcrypto_hash_finalize_bytes(hash, &result, &resultlen, + &error_fatal); + + g_assert(ret == 0); + g_assert(resultlen == expected_lens[i]); + for (j = 0; j < resultlen; j++) { + g_assert(expected_outputs[i][j * 2] == hex[(result[j] >> 4) & 0xf]); + g_assert(expected_outputs[i][j * 2 + 1] == hex[result[j] & 0xf]); + } + g_free(result); + qcrypto_hash_free(hash); + } +} + int main(int argc, char **argv) { int ret = qcrypto_init(&error_fatal); @@ -252,5 +299,6 @@ int main(int argc, char **argv) g_test_add_func("/crypto/hash/prealloc", test_hash_prealloc); g_test_add_func("/crypto/hash/digest", test_hash_digest); g_test_add_func("/crypto/hash/base64", test_hash_base64); + g_test_add_func("/crypto/hash/accumulate", test_hash_accumulate); return g_test_run(); }
Added an accumulative hashing test. Checks for functionality of the new hash create, update, finalize and free functions. Signed-off-by: Alejandro Zeise <alejandro.zeise@seagate.com> --- tests/unit/test-crypto-hash.c | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)