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.
This commit is contained in:
Gilles Peskine 2018-08-22 18:43:09 +02:00
parent 17351eb7f2
commit 49cd329908
2 changed files with 203 additions and 0 deletions

View file

@ -181,3 +181,125 @@ asymmetric_encryption_algorithm:PSA_ALG_RSA_OAEP( PSA_ALG_SHA_256 ):ALG_IS_RSA_O
Key derivation: HKDF using SHA-256 Key derivation: HKDF using SHA-256
key_derivation_algorithm:PSA_ALG_HKDF( PSA_ALG_SHA_256 ):ALG_IS_HKDF 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

View file

@ -32,6 +32,18 @@
#define ALG_IS_RSA_OAEP ( 1u << 14 ) #define ALG_IS_RSA_OAEP ( 1u << 14 )
#define ALG_IS_HKDF ( 1u << 15 ) #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 ) \ #define TEST_CLASSIFICATION_MACRO( flag, alg, flags ) \
TEST_ASSERT( PSA_##flag( alg ) == !! ( ( flags ) & flag ) ) TEST_ASSERT( PSA_##flag( alg ) == !! ( ( flags ) & flag ) )
@ -58,6 +70,30 @@ void algorithm_classification( psa_algorithm_t alg, unsigned flags )
exit: ; 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 */ /* END_HEADER */
/* BEGIN_DEPENDENCIES /* BEGIN_DEPENDENCIES
@ -248,3 +284,48 @@ void key_derivation_algorithm( int alg_arg, int classification_flags )
} }
/* END_CASE */ /* 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 */