Key type validation tests

For all key types, validate feature test macros (PSA_KEY_TYPE_IS_xxx).

For asymmetric keys (public key or key pair), validate the
corresponding public/pair type.

For ECC keys, validate GET_CURVE.
diff --git a/tests/suites/test_suite_psa_crypto_metadata.data b/tests/suites/test_suite_psa_crypto_metadata.data
index d1a5986..714d094 100644
--- a/tests/suites/test_suite_psa_crypto_metadata.data
+++ b/tests/suites/test_suite_psa_crypto_metadata.data
@@ -181,3 +181,125 @@
 Key derivation: HKDF using SHA-256
 key_derivation_algorithm:PSA_ALG_HKDF( PSA_ALG_SHA_256 ):ALG_IS_HKDF
 
+Key type: raw data
+key_type:PSA_KEY_TYPE_RAW_DATA:KEY_TYPE_IS_UNSTRUCTURED
+
+Key type: HMAC
+key_type:PSA_KEY_TYPE_HMAC:KEY_TYPE_IS_UNSTRUCTURED
+
+Key type: secret for key derivation
+key_type:PSA_KEY_TYPE_DERIVE:KEY_TYPE_IS_UNSTRUCTURED
+
+Key type: AES
+key_type:PSA_KEY_TYPE_AES:KEY_TYPE_IS_UNSTRUCTURED
+
+Key type: DES
+key_type:PSA_KEY_TYPE_DES:KEY_TYPE_IS_UNSTRUCTURED
+
+Key type: Camellia
+key_type:PSA_KEY_TYPE_CAMELLIA:KEY_TYPE_IS_UNSTRUCTURED
+
+Key type: ARC4
+key_type:PSA_KEY_TYPE_ARC4:KEY_TYPE_IS_UNSTRUCTURED
+
+Key type: RSA public key
+key_type:PSA_KEY_TYPE_RSA_PUBLIC_KEY:KEY_TYPE_IS_PUBLIC_KEY | KEY_TYPE_IS_RSA
+
+Key type: RSA key pair
+key_type:PSA_KEY_TYPE_RSA_KEYPAIR:KEY_TYPE_IS_KEYPAIR | KEY_TYPE_IS_RSA
+
+Key type: DSA public key
+key_type:PSA_KEY_TYPE_DSA_PUBLIC_KEY:KEY_TYPE_IS_PUBLIC_KEY | KEY_TYPE_IS_DSA
+
+Key type: DSA key pair
+key_type:PSA_KEY_TYPE_DSA_KEYPAIR:KEY_TYPE_IS_KEYPAIR | KEY_TYPE_IS_DSA
+
+ECC key types: sect163k1
+ecc_key_types:PSA_ECC_CURVE_SECT163K1
+
+ECC key types: sect163r1
+ecc_key_types:PSA_ECC_CURVE_SECT163R1
+
+ECC key types: sect163r2
+ecc_key_types:PSA_ECC_CURVE_SECT163R2
+
+ECC key types: sect193r1
+ecc_key_types:PSA_ECC_CURVE_SECT193R1
+
+ECC key types: sect193r2
+ecc_key_types:PSA_ECC_CURVE_SECT193R2
+
+ECC key types: sect233k1
+ecc_key_types:PSA_ECC_CURVE_SECT233K1
+
+ECC key types: sect233r1
+ecc_key_types:PSA_ECC_CURVE_SECT233R1
+
+ECC key types: sect239k1
+ecc_key_types:PSA_ECC_CURVE_SECT239K1
+
+ECC key types: sect283k1
+ecc_key_types:PSA_ECC_CURVE_SECT283K1
+
+ECC key types: sect283r1
+ecc_key_types:PSA_ECC_CURVE_SECT283R1
+
+ECC key types: sect409k1
+ecc_key_types:PSA_ECC_CURVE_SECT409K1
+
+ECC key types: sect409r1
+ecc_key_types:PSA_ECC_CURVE_SECT409R1
+
+ECC key types: sect571k1
+ecc_key_types:PSA_ECC_CURVE_SECT571K1
+
+ECC key types: sect571r1
+ecc_key_types:PSA_ECC_CURVE_SECT571R1
+
+ECC key types: secp160k1
+ecc_key_types:PSA_ECC_CURVE_SECP160K1
+
+ECC key types: secp160r1
+ecc_key_types:PSA_ECC_CURVE_SECP160R1
+
+ECC key types: secp160r2
+ecc_key_types:PSA_ECC_CURVE_SECP160R2
+
+ECC key types: secp192k1
+ecc_key_types:PSA_ECC_CURVE_SECP192K1
+
+ECC key types: secp192r1
+ecc_key_types:PSA_ECC_CURVE_SECP192R1
+
+ECC key types: secp224k1
+ecc_key_types:PSA_ECC_CURVE_SECP224K1
+
+ECC key types: secp224r1
+ecc_key_types:PSA_ECC_CURVE_SECP224R1
+
+ECC key types: secp256k1
+ecc_key_types:PSA_ECC_CURVE_SECP256K1
+
+ECC key types: secp256r1
+ecc_key_types:PSA_ECC_CURVE_SECP256R1
+
+ECC key types: secp384r1
+ecc_key_types:PSA_ECC_CURVE_SECP384R1
+
+ECC key types: secp521r1
+ecc_key_types:PSA_ECC_CURVE_SECP521R1
+
+ECC key types: Brainpool P256R1
+ecc_key_types:PSA_ECC_CURVE_BRAINPOOL_P256R1
+
+ECC key types: Brainpool P384R1
+ecc_key_types:PSA_ECC_CURVE_BRAINPOOL_P384R1
+
+ECC key types: Brainpool P512R1
+ecc_key_types:PSA_ECC_CURVE_BRAINPOOL_P512R1
+
+ECC key types: Curve25519
+ecc_key_types:PSA_ECC_CURVE_CURVE25519
+
+ECC key types: Curve448
+ecc_key_types:PSA_ECC_CURVE_CURVE448
diff --git a/tests/suites/test_suite_psa_crypto_metadata.function b/tests/suites/test_suite_psa_crypto_metadata.function
index d25aace..0b8fba0 100644
--- a/tests/suites/test_suite_psa_crypto_metadata.function
+++ b/tests/suites/test_suite_psa_crypto_metadata.function
@@ -32,6 +32,18 @@
 #define ALG_IS_RSA_OAEP                 ( 1u << 14 )
 #define ALG_IS_HKDF                     ( 1u << 15 )
 
+/* Flags for key type classification macros. There is a flag for every
+ * key type classification macro PSA_KEY_TYPE_IS_xxx except for some that
+ * are tested as derived from other macros. The name of the flag is
+ * the name of the classification macro without the PSA_ prefix. */
+#define KEY_TYPE_IS_VENDOR_DEFINED      ( 1u << 0 )
+#define KEY_TYPE_IS_UNSTRUCTURED        ( 1u << 1 )
+#define KEY_TYPE_IS_PUBLIC_KEY          ( 1u << 2 )
+#define KEY_TYPE_IS_KEYPAIR             ( 1u << 3 )
+#define KEY_TYPE_IS_RSA                 ( 1u << 4 )
+#define KEY_TYPE_IS_DSA                 ( 1u << 5 )
+#define KEY_TYPE_IS_ECC                 ( 1u << 6 )
+
 #define TEST_CLASSIFICATION_MACRO( flag, alg, flags )            \
     TEST_ASSERT( PSA_##flag( alg ) == !! ( ( flags ) & flag ) )
 
@@ -58,6 +70,30 @@
 exit: ;
 }
 
+void key_type_classification( psa_key_type_t type, unsigned flags )
+{
+    /* Macros tested based on the test case parameter */
+    TEST_CLASSIFICATION_MACRO( KEY_TYPE_IS_VENDOR_DEFINED, type, flags );
+    TEST_CLASSIFICATION_MACRO( KEY_TYPE_IS_UNSTRUCTURED, type, flags );
+    TEST_CLASSIFICATION_MACRO( KEY_TYPE_IS_PUBLIC_KEY, type, flags );
+    TEST_CLASSIFICATION_MACRO( KEY_TYPE_IS_KEYPAIR, type, flags );
+    TEST_CLASSIFICATION_MACRO( KEY_TYPE_IS_RSA, type, flags );
+    TEST_CLASSIFICATION_MACRO( KEY_TYPE_IS_ECC, type, flags );
+
+    /* Macros with derived semantics */
+    TEST_ASSERT( PSA_KEY_TYPE_IS_ASYMMETRIC( type ) ==
+                 ( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ||
+                   PSA_KEY_TYPE_IS_KEYPAIR( type ) ) );
+    TEST_ASSERT( PSA_KEY_TYPE_IS_ECC_KEYPAIR( type ) ==
+                 ( PSA_KEY_TYPE_IS_ECC( type ) &&
+                   PSA_KEY_TYPE_IS_KEYPAIR( type ) ) );
+    TEST_ASSERT( PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY( type ) ==
+                 ( PSA_KEY_TYPE_IS_ECC( type ) &&
+                   PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) ) );
+
+exit: ;
+}
+
 /* END_HEADER */
 
 /* BEGIN_DEPENDENCIES
@@ -248,3 +284,48 @@
 }
 /* END_CASE */
 
+/* BEGIN_CASE */
+void key_type( int type_arg, int classification_flags )
+{
+    psa_key_type_t type = type_arg;
+
+    key_type_classification( type, classification_flags );
+
+    /* For asymmetric types, check the corresponding pair/public type */
+    if( classification_flags & KEY_TYPE_IS_PUBLIC_KEY )
+    {
+        psa_key_type_t pair_type = PSA_KEY_TYPE_KEYPAIR_OF_PUBLIC_KEY( type );
+        TEST_ASSERT( PSA_KEY_TYPE_PUBLIC_KEY_OF_KEYPAIR( pair_type ) == type );
+        key_type_classification( pair_type,
+                                 ( classification_flags
+                                   & ~KEY_TYPE_IS_PUBLIC_KEY )
+                                 | KEY_TYPE_IS_KEYPAIR );
+        TEST_ASSERT( PSA_KEY_TYPE_PUBLIC_KEY_OF_KEYPAIR( type ) == type );
+    }
+    if( classification_flags & KEY_TYPE_IS_KEYPAIR )
+    {
+        psa_key_type_t public_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEYPAIR( type );
+        TEST_ASSERT( PSA_KEY_TYPE_KEYPAIR_OF_PUBLIC_KEY( public_type ) == type );
+        key_type_classification( public_type,
+                                 ( classification_flags
+                                   & ~KEY_TYPE_IS_KEYPAIR )
+                                 | KEY_TYPE_IS_PUBLIC_KEY );
+        TEST_ASSERT( PSA_KEY_TYPE_KEYPAIR_OF_PUBLIC_KEY( type ) == type );
+    }
+}
+/* END_CASE */
+
+/* BEGIN_CASE */
+void ecc_key_types( int curve_arg )
+{
+    psa_ecc_curve_t curve = curve_arg;
+    psa_key_type_t public_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY( curve );
+    psa_key_type_t pair_type = PSA_KEY_TYPE_ECC_KEYPAIR( curve );
+
+    test_key_type( public_type, KEY_TYPE_IS_ECC | KEY_TYPE_IS_PUBLIC_KEY );
+    test_key_type( pair_type, KEY_TYPE_IS_ECC | KEY_TYPE_IS_KEYPAIR );
+
+    TEST_ASSERT( PSA_KEY_TYPE_GET_CURVE( public_type ) == curve );
+    TEST_ASSERT( PSA_KEY_TYPE_GET_CURVE( pair_type ) == curve );
+}
+/* END_CASE */