tests/unit/test-crypto-hash: accumulative hashing
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> [ clg: - Improved test_hash_accumulate() with g_autofree variables ] Signed-off-by: Cédric Le Goater <clg@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
e3c07527f3
commit
d8e99c5cd6
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* QEMU Crypto hash algorithms
|
* QEMU Crypto hash algorithms
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
|
||||||
* Copyright (c) 2015 Red Hat, Inc.
|
* Copyright (c) 2015 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -241,6 +242,50 @@ static void test_hash_base64(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_hash_accumulate(void)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS(expected_outputs) ; i++) {
|
||||||
|
g_autoptr(QCryptoHash) hash = NULL;
|
||||||
|
struct iovec iov[] = {
|
||||||
|
{ .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) },
|
||||||
|
};
|
||||||
|
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 < G_N_ELEMENTS(iov); 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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int ret = qcrypto_init(&error_fatal);
|
int ret = qcrypto_init(&error_fatal);
|
||||||
@ -252,5 +297,6 @@ int main(int argc, char **argv)
|
|||||||
g_test_add_func("/crypto/hash/prealloc", test_hash_prealloc);
|
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/digest", test_hash_digest);
|
||||||
g_test_add_func("/crypto/hash/base64", test_hash_base64);
|
g_test_add_func("/crypto/hash/base64", test_hash_base64);
|
||||||
|
g_test_add_func("/crypto/hash/accumulate", test_hash_accumulate);
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user