Simplify zero-length buffers to always be NULL

Since it is implementation-dependent whether
malloc(0) returns NULL or a pointer, explicitly
represent zero-length buffers as NULL in the
buffer-copy struct, so as to have a uniform
behaviour.

Signed-off-by: David Horstmann <david.horstmann@arm.com>
diff --git a/library/psa_crypto.c b/library/psa_crypto.c
index fc5e241..7b4fc6c 100644
--- a/library/psa_crypto.c
+++ b/library/psa_crypto.c
@@ -8473,6 +8473,16 @@
      * on any pointers safely. */
     memset(buffers, 0, sizeof(*buffers));
 
+    /* Since calloc() may return NULL if we try to allocate zero-length
+     * buffers anyway, deal with this corner case explicitly to ensure
+     * predictable behaviour. Represent zero-length buffers as NULL. */
+    if (input_len == 0) {
+        input = NULL;
+    }
+    if (output_len == 0) {
+        output = NULL;
+    }
+
     if (output != NULL) {
         buffers->output = mbedtls_calloc(output_len, 1);
         if (buffers->output == NULL) {
diff --git a/tests/suites/test_suite_psa_crypto.function b/tests/suites/test_suite_psa_crypto.function
index 073bb6b..8057763 100644
--- a/tests/suites/test_suite_psa_crypto.function
+++ b/tests/suites/test_suite_psa_crypto.function
@@ -10430,8 +10430,16 @@
                                                  &buffer_copies);
     TEST_EQUAL(ret, PSA_SUCCESS);
 
-    TEST_MEMORY_COMPARE(input_buffer, input_len, buffer_copies.input, buffer_copies.input_len);
-    TEST_EQUAL(output_len, buffer_copies.output_len);
+    if (input_zero_length) {
+        TEST_ASSERT(buffer_copies.input == NULL);
+    } else {
+        TEST_MEMORY_COMPARE(input_buffer, input_len, buffer_copies.input, buffer_copies.input_len);
+    }
+    if (output_zero_length) {
+        TEST_ASSERT(buffer_copies.output == NULL);
+    } else {
+        TEST_EQUAL(output_len, buffer_copies.output_len);
+    }
 
 exit:
     mbedtls_free(buffer_copies.input);