Add test case for mbedtls_ecp_set_zero

Tests function with various ECP point conditions, covering freshly
initialized, zeroed, non-zero, and freed points.

Signed-off-by: Werner Lewis <werner.lewis@arm.com>
diff --git a/tests/suites/test_suite_ecp.function b/tests/suites/test_suite_ecp.function
index 2cabef4..65c7067 100644
--- a/tests/suites/test_suite_ecp.function
+++ b/tests/suites/test_suite_ecp.function
@@ -1020,6 +1020,72 @@
 }
 /* END_CASE */
 
+/* BEGIN_CASE */
+void ecp_set_zero( int id, data_t * P_bin )
+{
+    mbedtls_ecp_group grp;
+    mbedtls_ecp_point pt, zero_pt, nonzero_pt;
+
+    mbedtls_ecp_group_init( &grp );
+    mbedtls_ecp_point_init( &pt );
+    mbedtls_ecp_point_init( &zero_pt );
+    mbedtls_ecp_point_init( &nonzero_pt );
+
+    // Set zero and non-zero points for comparison
+    TEST_EQUAL( mbedtls_ecp_set_zero( &zero_pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_group_load( &grp, id ), 0 );
+    TEST_EQUAL( mbedtls_ecp_point_read_binary( &grp, &nonzero_pt,
+                                               P_bin->x, P_bin->len ), 0 );
+    TEST_EQUAL( mbedtls_ecp_is_zero( &zero_pt ), 1 );
+    TEST_EQUAL( mbedtls_ecp_is_zero( &nonzero_pt ), 0 );
+
+    // Test initialized point
+    TEST_EQUAL( mbedtls_ecp_set_zero( &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_is_zero( &pt ), 1 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &zero_pt, &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &nonzero_pt, &zero_pt ),
+                MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
+
+    // Test zeroed point
+    TEST_EQUAL( mbedtls_ecp_set_zero( &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_is_zero( &pt ), 1 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &zero_pt, &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &nonzero_pt, &pt ),
+                MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
+
+    // Set point to non-zero value
+    TEST_EQUAL( mbedtls_ecp_point_read_binary( &grp, &pt,
+                                               P_bin->x, P_bin->len ), 0 );
+    TEST_EQUAL( mbedtls_ecp_is_zero( &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &zero_pt, &pt ),
+                MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &nonzero_pt, &pt), 0 );
+
+    // Test non-zero point
+    TEST_EQUAL( mbedtls_ecp_set_zero( &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_is_zero( &pt ), 1 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &zero_pt, &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &nonzero_pt, &pt ),
+                MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
+
+    // Test freed non-zero point
+    TEST_EQUAL( mbedtls_ecp_point_read_binary( &grp, &pt,
+                                               P_bin->x, P_bin->len ), 0 );
+    mbedtls_ecp_point_free( &pt );
+    TEST_EQUAL( mbedtls_ecp_set_zero( &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_is_zero( &pt ), 1 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &zero_pt, &pt ), 0 );
+    TEST_EQUAL( mbedtls_ecp_point_cmp( &nonzero_pt, &pt),
+                MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
+
+exit:
+    mbedtls_ecp_group_free( &grp );
+    mbedtls_ecp_point_free( &pt );
+    mbedtls_ecp_point_free( &zero_pt );
+    mbedtls_ecp_point_free( &nonzero_pt );
+}
+/* END_CASE */
+
 /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
 void ecp_selftest(  )
 {