mbedtls_base64_decode: test the reported output length
Reinforce the unit test for `mbedtls_base64_decode()` with valid inputs to
systematically call the function with a smaller output buffer and with an
empty output buffer. Assert the reported necessary output length in those
cases.
Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
diff --git a/tests/suites/test_suite_base64.function b/tests/suites/test_suite_base64.function
index e351ad8..1797049 100644
--- a/tests/suites/test_suite_base64.function
+++ b/tests/suites/test_suite_base64.function
@@ -85,20 +85,53 @@
/* BEGIN_CASE */
void mbedtls_base64_decode(char *src_string, char *dst_string, int result)
{
- unsigned char src_str[1000];
- unsigned char dst_str[1000];
+ unsigned char *src = NULL;
+ size_t src_len = strlen(src_string);
+ unsigned char *dst = NULL;
+ size_t correct_dst_len = strlen(dst_string);
+ size_t dst_size = correct_dst_len;
size_t len;
- int res;
- memset(src_str, 0x00, 1000);
- memset(dst_str, 0x00, 1000);
-
- strncpy((char *) src_str, src_string, sizeof(src_str) - 1);
- res = mbedtls_base64_decode(dst_str, sizeof(dst_str), &len, src_str, strlen((char *) src_str));
- TEST_ASSERT(res == result);
- if (result == 0) {
- TEST_ASSERT(strcmp((char *) dst_str, dst_string) == 0);
+ TEST_CALLOC(src, src_len);
+ if (src_len != 0) {
+ memcpy(src, src_string, src_len);
}
+
+ TEST_CALLOC(dst, dst_size);
+
+ size_t expected_dst_len = correct_dst_len;
+
+ /* Test normal operation */
+ TEST_EQUAL(mbedtls_base64_decode(dst, dst_size, &len,
+ src, src_len),
+ result);
+ if (result == 0) {
+ TEST_MEMORY_COMPARE(dst_string, expected_dst_len, dst, len);
+ }
+
+ /* Test an output buffer that's one byte too small */
+ if (result == 0 && dst_size != 0) {
+ mbedtls_free(dst);
+ dst = NULL;
+ dst_size -= 1;
+ TEST_CALLOC(dst, dst_size);
+ TEST_EQUAL(mbedtls_base64_decode(dst, dst_size, &len,
+ src, src_len),
+ MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
+ TEST_EQUAL(correct_dst_len, len);
+ }
+
+ /* Test an empty output buffer */
+ if (result == 0 && dst_size != 0) {
+ TEST_EQUAL(mbedtls_base64_decode(NULL, 0, &len,
+ src, src_len),
+ MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
+ TEST_EQUAL(correct_dst_len, len);
+ }
+
+exit:
+ mbedtls_free(src);
+ mbedtls_free(dst);
}
/* END_CASE */