test: optimizing test_suite_pkwrite code

Signed-off-by: valerio <valerio.setti@nordicsemi.no>
diff --git a/tests/suites/test_suite_pkwrite.function b/tests/suites/test_suite_pkwrite.function
index c148c8a..4820fbd 100644
--- a/tests/suites/test_suite_pkwrite.function
+++ b/tests/suites/test_suite_pkwrite.function
@@ -28,6 +28,43 @@
     }
 }
 
+static int pk_write_any_key(mbedtls_pk_context *pk, unsigned char **p,
+                            size_t *buf_len, int is_public_key, int is_der)
+{
+    int ret = 0;
+
+    if (is_der) {
+        if (is_public_key) {
+            ret = mbedtls_pk_write_pubkey_der(pk, *p, *buf_len);
+        } else {
+            ret = mbedtls_pk_write_key_der(pk, *p, *buf_len);
+        }
+        if (ret <= 0) {
+            return ret;
+        }
+
+        *p = *p + *buf_len - ret;
+        *buf_len = ret;
+    } else {
+#if defined(MBEDTLS_PEM_WRITE_C)
+        if (is_public_key) {
+            ret = mbedtls_pk_write_pubkey_pem(pk, *p, *buf_len);
+        } else {
+            ret = mbedtls_pk_write_key_pem(pk, *p, *buf_len);
+        }
+        if (ret != 0) {
+            return ret;
+        }
+
+        *buf_len = strlen((char *) *p) + 1; /* +1 takes the string terminator into account */
+#else
+        return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
+#endif
+    }
+
+    return 0;
+}
+
 static void pk_write_check_common(char *key_file, int is_public_key, int is_der)
 {
     mbedtls_pk_context key;
@@ -35,7 +72,11 @@
     unsigned char *check_buf = NULL;
     unsigned char *start_buf;
     size_t buf_len, check_buf_len;
-    int ret;
+#if defined(MBEDTLS_USE_PSA_CRYPTO)
+    mbedtls_svc_key_id_t opaque_id = MBEDTLS_SVC_KEY_ID_INIT;
+#endif /* MBEDTLS_USE_PSA_CRYPTO */
+
+    USE_PSA_INIT();
 
     mbedtls_pk_init(&key);
     USE_PSA_INIT();
@@ -62,42 +103,39 @@
 
     if (is_public_key) {
         TEST_EQUAL(mbedtls_pk_parse_public_keyfile(&key, key_file), 0);
-        if (is_der) {
-            ret = mbedtls_pk_write_pubkey_der(&key, buf, check_buf_len);
-        } else {
-#if defined(MBEDTLS_PEM_WRITE_C)
-            ret = mbedtls_pk_write_pubkey_pem(&key, buf, check_buf_len);
-#else
-            ret = MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
-#endif
-        }
     } else {
         TEST_EQUAL(mbedtls_pk_parse_keyfile(&key, key_file, NULL,
                                             mbedtls_test_rnd_std_rand, NULL), 0);
-        if (is_der) {
-            ret = mbedtls_pk_write_key_der(&key, buf, check_buf_len);
-        } else {
-#if defined(MBEDTLS_PEM_WRITE_C)
-            ret = mbedtls_pk_write_key_pem(&key, buf, check_buf_len);
-#else
-            ret = MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
-#endif
-        }
     }
 
-    if (is_der) {
-        TEST_LE_U(1, ret);
-        buf_len = ret;
-        start_buf = buf + check_buf_len - buf_len;
-    } else {
-        TEST_EQUAL(ret, 0);
-        buf_len = strlen((char *) buf) + 1; /* +1 takes the string terminator into account */
-        start_buf = buf;
-    }
+    start_buf = buf;
+    buf_len = check_buf_len;
+    TEST_EQUAL(pk_write_any_key(&key, &start_buf, &buf_len, is_public_key,
+                                is_der), 0);
 
     ASSERT_COMPARE(start_buf, buf_len, check_buf, check_buf_len);
 
+#if defined(MBEDTLS_USE_PSA_CRYPTO)
+    /* Verify that pk_write works also for opaque private keys */
+    if (!is_public_key) {
+        memset(buf, 0, check_buf_len);
+        TEST_EQUAL(mbedtls_pk_wrap_as_opaque(&key, &opaque_id,
+                                             PSA_ALG_NONE,
+                                             PSA_KEY_USAGE_EXPORT,
+                                             PSA_ALG_NONE), 0);
+        start_buf = buf;
+        buf_len = check_buf_len;
+        TEST_EQUAL(pk_write_any_key(&key, &start_buf, &buf_len, is_public_key,
+                                    is_der), 0);
+
+        ASSERT_COMPARE(start_buf, buf_len, check_buf, check_buf_len);
+    }
+#endif /* MBEDTLS_USE_PSA_CRYPTO */
+
 exit:
+#if defined(MBEDTLS_USE_PSA_CRYPTO)
+    psa_destroy_key(opaque_id);
+#endif /* MBEDTLS_USE_PSA_CRYPTO */
     mbedtls_free(buf);
     mbedtls_free(check_buf);
     mbedtls_pk_free(&key);