pkcs11_client tests - hardcoded signature verification

Add review fixes - naming changes, importing a signature instead of
generating it.
diff --git a/include/mbedtls/ecdsa.h b/include/mbedtls/ecdsa.h
index ed88c8a..bff30fc 100644
--- a/include/mbedtls/ecdsa.h
+++ b/include/mbedtls/ecdsa.h
@@ -240,12 +240,13 @@
  *                  of {r,s}
  *
  * \param sig       Signature to be converted
- * \param ssize     Size of the passed buffer
+ * \param ssize     Size of the signature
  * \param byte_len  Length of a single number of the signature
- * \param buf       Buffer pointer
- * \param slen      Size of the written signature
+ * \param buf       Buffer pointer for the converted signature
+ * \param bufsize   Size of the passed buffer
+ * \param buflen    Size of the signature written to the buffer
  *
- * \note            The size of the buffer \c ssize should be at least
+ * \note            The size of the buffer \c bufsize should be at least
  *                  2*byte_len bytes long, otherwise this function will
  *                  return an error.
  *
@@ -255,7 +256,8 @@
  */
 int mbedtls_ecdsa_signature_to_raw( const unsigned char *sig,
                             size_t ssize, uint16_t byte_len,
-                            unsigned char *buf, size_t* slen );
+                            unsigned char *buf, size_t bufsize,
+                            size_t* buflen );
 /**
  * \brief           Convert a signature from numbers to ASN.1
  *
diff --git a/library/ecdsa.c b/library/ecdsa.c
index 645fbb5..0f33b83 100644
--- a/library/ecdsa.c
+++ b/library/ecdsa.c
@@ -289,9 +289,13 @@
 /*
  * Convert a signature to a raw concatenation of {r, s}
  */
+/*int mbedtls_ecdsa_signature_to_raw( const unsigned char *sig,
+                            size_t ssize, uint16_t byte_len,
+                            unsigned char *buf, size_t* slen )*/
 int mbedtls_ecdsa_signature_to_raw( const unsigned char *sig,
                             size_t ssize, uint16_t byte_len,
-                            unsigned char *buf, size_t* slen )
+                            unsigned char *buf, size_t bufsize,
+                            size_t* buflen )
 {
     int ret;
     unsigned char *p = (unsigned char *) sig;
@@ -299,7 +303,7 @@
     size_t len;
     mbedtls_mpi r, s;
 
-    if( 2 * byte_len > ssize )
+    if( 2 * byte_len > bufsize )
     {
         return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
     }
@@ -339,7 +343,7 @@
         ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
         goto cleanup;
     }
-    *slen = 2*byte_len;
+    *buflen = 2*byte_len;
     cleanup:
         mbedtls_mpi_free( &r );
         mbedtls_mpi_free( &s );
diff --git a/library/pkcs11_client.c b/library/pkcs11_client.c
index 70cc0de..1e03ef1 100644
--- a/library/pkcs11_client.c
+++ b/library/pkcs11_client.c
@@ -239,7 +239,7 @@
     mbedtls_pk_pkcs11_context_t *ctx = ctx_arg;
     CK_RV rv;
     CK_MECHANISM mechanism = {0, NULL_PTR, 0};
-    unsigned char *decoded_sig = NULL_PTR;
+    unsigned char *decoded_sig = NULL;
     size_t decoded_sig_len;
 
     /* This function takes size_t arguments but the underlying layer
@@ -286,9 +286,14 @@
     if( mechanism.mechanism == CKM_ECDSA )
     {
         uint16_t byte_len = ( ( ctx->bit_length + 7 ) / 8 );
-        decoded_sig = malloc( 2 * byte_len );
+        decoded_sig = mbedtls_calloc( 1, 2 * byte_len );
+        if( decoded_sig == NULL )
+        {
+            return( MBEDTLS_ERR_PK_ALLOC_FAILED );
+        }
         if( mbedtls_ecdsa_signature_to_raw( sig, sig_len, byte_len,
-                                    decoded_sig, &decoded_sig_len ) != 0 )
+                                    decoded_sig, 2 * byte_len,
+                                    &decoded_sig_len ) != 0 )
         {
             rv = CKR_GENERAL_ERROR;
             goto exit;
@@ -303,7 +308,7 @@
         goto exit;
 
 exit:
-    free(decoded_sig);
+    mbedtls_free(decoded_sig);
     return( pkcs11_err_to_mbedtls_pk_err( rv ) );
 }
 
diff --git a/tests/suites/test_suite_pkcs11_client.data b/tests/suites/test_suite_pkcs11_client.data
index 33a75c3..1793023 100644
--- a/tests/suites/test_suite_pkcs11_client.data
+++ b/tests/suites/test_suite_pkcs11_client.data
@@ -6,10 +6,14 @@
 depends_on:MBEDTLS_PK_C:MBEDTLS_ECDSA_C
 pk_generate_sign:MBEDTLS_PK_ECDSA
 
-PKCS#11 ECDSA generate, sign and verify with Cryptoki
+PKCS#11 ECDSA import, sign and verify with Cryptoki
 depends_on:MBEDTLS_PK_C:MBEDTLS_ECDSA_C
-pk_signX_verifyX:MBEDTLS_PK_ECDSA
+pk_import_sign_verify:"data_files/server3.key"
 
 PKCS#11 ECDSA import, sign with MbedTLS and verify with Cryptoki
 depends_on:MBEDTLS_PK_C:MBEDTLS_ECDSA_C
-pk_import_signI_verifyX:"data_files/server3.key"
+pk_import_verify_signed:"data_files/server3.key"
+
+PKCS#11 ECDSA verify a hardcoded signature with Cryptoki
+depends_on:MBEDTLS_ECP_DP_SECP192R1_ENABLED
+pk_ecdsa_hardcoded_verify:MBEDTLS_PK_ECDSA:MBEDTLS_ECP_DP_SECP192R1:"046FDD3028FA94A863CD4F78DBFF8B3AA561FC6D9CCBBCA88E0AE6FA437F5415F957542D0717FF8B84562DAE99872EF841":"546869732073686F756C64206265207468652068617368206F662061206D6573736167652E00":"30350218185B2A7FB5CD9C9A8488B119B68B47D6EC833509CE9FA1FF021900FB7D259A744A2348BD45D241A39DC915B81CC2084100FA24":0
diff --git a/tests/suites/test_suite_pkcs11_client.function b/tests/suites/test_suite_pkcs11_client.function
index e14996b..1a123bf 100644
--- a/tests/suites/test_suite_pkcs11_client.function
+++ b/tests/suites/test_suite_pkcs11_client.function
@@ -325,9 +325,9 @@
 /* END_CASE */
 
 /* BEGIN_CASE depends_on:MBEDTLS_PK_C:MBEDTLS_SHA256_C */
-void pk_signX_verifyX( int key_type )
+void pk_import_sign_verify( char *file )
 {
-    /* Sign with cryptoki, convert to mbedTLS format and save, 
+   /* Sign with cryptoki, convert to mbedTLS format and save, 
        verify by cryptoki with a conversion to a raw, concatenated
        format by the engine. */
     mbedtls_pk_context pkcs11_ctx;
@@ -336,106 +336,34 @@
     CK_OBJECT_HANDLE hPublicKey = CK_INVALID_HANDLE;
     CK_OBJECT_HANDLE hPrivateKey = CK_INVALID_HANDLE;
     unsigned char hash_value[32] = "Fake hash, it doesn't matter....";
-    unsigned char sig_buffer[RSA_KEY_SIZE_BYTES];
+    unsigned char sig_buffer[4096];
     size_t sig_length = sizeof( sig_buffer );
 
     mbedtls_pk_init( &pkcs11_ctx );
     mbedtls_pk_init( &transparent_ctx );
 
-    /* Initialize cryptoki and generate a key in the token */
+    /* Read a transparent key */
+    TEST_ASSERT( mbedtls_pk_parse_keyfile( &transparent_ctx, file, NULL ) == 0 );
+
+    /* Initialize cryptoki and import the key into the token */
     hSession = pkcs11_init( );
     TEST_ASSERT( hSession != CK_INVALID_HANDLE );
 
-    CK_ASSERT( pkcs11_generate_key( key_type,
-                                    hSession,
-                                    &hPublicKey, &hPrivateKey ) );
+    TEST_ASSERT( mbedtls_pk_import_to_pkcs11( &transparent_ctx,
+                                              MBEDTLS_PK_FLAG_SIGN |
+                                              MBEDTLS_PK_FLAG_VERIFY,
+                                              hSession,
+                                              &hPublicKey,
+                                              &hPrivateKey ) == 0 );
     TEST_ASSERT( hPublicKey != CK_INVALID_HANDLE );
     TEST_ASSERT( hPrivateKey != CK_INVALID_HANDLE );
-
-    /* Prepare the mbed TLS contexts */
-    TEST_ASSERT( mbedtls_pk_setup( &transparent_ctx,
-                                   mbedtls_pk_info_from_type( key_type ) ) == 0 );
     TEST_ASSERT( mbedtls_pk_setup_pkcs11( &pkcs11_ctx,
                                           hSession,
                                           hPublicKey,
                                           hPrivateKey ) == 0 );
 
-    /* Retrieve the public key from the token */
-    switch( key_type )
-    {
-#if defined(MBEDTLS_RSA_C)
-    case MBEDTLS_PK_RSA:
-        {
-            unsigned char n_buffer[RSA_KEY_SIZE_BYTES];
-            unsigned char e_buffer[RSA_KEY_SIZE_BYTES];
-            CK_ATTRIBUTE public_attributes[] = {
-                {CKA_MODULUS, n_buffer, sizeof( n_buffer )},
-                {CKA_PUBLIC_EXPONENT, e_buffer, sizeof( e_buffer )},
-            };
-            CK_ULONG *n_length = &public_attributes[0].ulValueLen;
-            CK_ULONG *e_length = &public_attributes[1].ulValueLen;
-            mbedtls_rsa_context *rsa_ctx = mbedtls_pk_rsa( transparent_ctx );
-
-            CK_ASSERT( C_GetAttributeValue( hSession, hPublicKey,
-                                            public_attributes, ARRAY_LENGTH( public_attributes ) ) );
-            TEST_ASSERT( mbedtls_mpi_read_binary( &rsa_ctx->N,
-                                                  n_buffer, *n_length ) == 0 );
-            TEST_ASSERT( mbedtls_mpi_read_binary( &rsa_ctx->E,
-                                                  e_buffer, *e_length ) == 0 );
-            rsa_ctx->len = mbedtls_mpi_size( &rsa_ctx->N );
-        }
-        break;
-#endif /* MBEDTLS_RSA_C */
-
-#if defined(MBEDTLS_ECDSA_C)
-    case MBEDTLS_PK_ECDSA:
-        {
-            unsigned char ecParams[16];
-            unsigned char ecPoint[128];
-            CK_ATTRIBUTE public_attributes[] = {
-                {CKA_EC_PARAMS, ecParams, sizeof( ecParams )},
-                {CKA_EC_POINT, ecPoint, sizeof( ecPoint )},
-            };
-            mbedtls_ecp_keypair *ecp_ctx = mbedtls_pk_ec( transparent_ctx );
-
-            CK_ASSERT( C_GetAttributeValue( hSession, hPublicKey,
-                                            public_attributes, ARRAY_LENGTH( public_attributes ) ) );
-            // TODO: lift out a function or two from pkparse.c
-            // * pk_get_ecparams followed by pk_use_ecparams for ecParams?
-            // * Some code from pk_group_from_specified to read an octet string for ecPoint?
-            {
-                mbedtls_asn1_buf params_asn1;
-                CK_ULONG ecParams_length = public_attributes[0].ulValueLen;
-                mbedtls_ecp_group_id grp_id;
-                params_asn1.tag = ecParams[0];
-                params_asn1.len = ecParams[1];
-                params_asn1.p = ecParams + 2;
-                TEST_ASSERT( ecParams_length == 2 + params_asn1.len );
-                TEST_ASSERT( mbedtls_oid_get_ec_grp( &params_asn1, &grp_id ) == 0 );
-                TEST_ASSERT( mbedtls_ecp_group_load( &ecp_ctx->grp, grp_id ) == 0 );
-            }
-            {
-                unsigned char *p = ecPoint;
-                size_t len;
-                CK_ULONG ecPoint_length = public_attributes[1].ulValueLen;
-                TEST_ASSERT( mbedtls_asn1_get_tag( &p,
-                                                   ecPoint + ecPoint_length,
-                                                   &len,
-                                                   MBEDTLS_ASN1_OCTET_STRING ) == 0 );
-                TEST_ASSERT( mbedtls_ecp_point_read_binary( &ecp_ctx->grp,
-                                                            &ecp_ctx->Q,
-                                                            p, len ) == 0 );
-            }
-        }
-        break;
-#endif /* MBEDTLS_ECDSA_C */
-
-    default:
-        TEST_ASSERT( !"Unsupported key type in test data" );
-        break;
-    }
-
-    /* Sign with the token and verify in software */
+    /* Sign with the token and verify with cryptoki */
+    TEST_ASSERT( sizeof( sig_buffer ) >= mbedtls_pk_signature_size( &pkcs11_ctx ) );
     TEST_ASSERT( mbedtls_pk_sign( &pkcs11_ctx, MBEDTLS_MD_SHA256,
                                   hash_value, 32,
                                   sig_buffer, &sig_length,
@@ -457,7 +385,7 @@
 /* END_CASE */
 
 /* BEGIN_CASE depends_on:MBEDTLS_PK_C:MBEDTLS_SHA256_C */
-void pk_import_signI_verifyX( char *file )
+void pk_import_verify_signed( char *file )
 {
     /* Sign with mbedTLS, verify by cryptoki with a conversion 
        to a raw, concatenated format by the engine. */
@@ -514,3 +442,65 @@
     mbedtls_pk_free( &transparent_ctx );
 }
 /* END_CASE */
+
+/* BEGIN_CASE depends_on:MBEDTLS_ECDSA_C */
+void pk_ecdsa_hardcoded_verify( int type, int id, char *key_str,
+                     char *hash_str, char * sig_str, int ret )
+{
+    mbedtls_pk_context transparent_ctx;
+    mbedtls_ecp_keypair *eckey;
+    unsigned char hash[100], sig[500], key[500];
+    size_t hash_len, sig_len, key_len;
+
+    mbedtls_pk_context pkcs11_ctx;
+    CK_SESSION_HANDLE hSession = CK_INVALID_HANDLE;
+    CK_OBJECT_HANDLE hPublicKey = CK_INVALID_HANDLE;
+    CK_OBJECT_HANDLE hPrivateKey = CK_INVALID_HANDLE;
+
+    mbedtls_pk_init( &transparent_ctx );
+
+    memset( hash, 0, sizeof( hash ) );  hash_len = unhexify(hash, hash_str);
+    memset( sig, 0, sizeof( sig ) );    sig_len = unhexify(sig, sig_str);
+    memset( key, 0, sizeof( key ) );    key_len = unhexify(key, key_str);
+
+    TEST_ASSERT( mbedtls_pk_setup( &transparent_ctx, mbedtls_pk_info_from_type( type ) ) == 0 );
+
+    TEST_ASSERT( mbedtls_pk_can_do( &transparent_ctx, MBEDTLS_PK_ECDSA ) );
+    eckey = mbedtls_pk_ec( transparent_ctx );
+
+    TEST_ASSERT( mbedtls_ecp_group_load( &eckey->grp, id ) == 0 );
+    TEST_ASSERT( mbedtls_ecp_point_read_binary( &eckey->grp, &eckey->Q,
+                                        key, key_len ) == 0 );
+
+    // PKCS11 part
+    mbedtls_pk_init( &pkcs11_ctx );
+
+    /* Initialize cryptoki and import the key into the token */
+    hSession = pkcs11_init( );
+    TEST_ASSERT( hSession != CK_INVALID_HANDLE );
+    TEST_ASSERT( mbedtls_pk_import_to_pkcs11( &transparent_ctx,
+                                              MBEDTLS_PK_FLAG_SIGN |
+                                              MBEDTLS_PK_FLAG_VERIFY,
+                                              hSession,
+                                              &hPublicKey,
+                                              &hPrivateKey ) == 0 );
+    TEST_ASSERT( hPublicKey != CK_INVALID_HANDLE );
+    TEST_ASSERT( hPrivateKey != CK_INVALID_HANDLE );
+    TEST_ASSERT( mbedtls_pk_setup_pkcs11( &pkcs11_ctx,
+                                          hSession,
+                                          hPublicKey,
+                                          hPrivateKey ) == 0 );
+    TEST_ASSERT( mbedtls_pk_verify( &pkcs11_ctx, MBEDTLS_MD_NONE,
+                            hash, hash_len, sig, sig_len ) == ret );
+
+exit:
+    if( hPublicKey != CK_INVALID_HANDLE )
+        C_DestroyObject( hSession, hPublicKey );
+    if( hPrivateKey != CK_INVALID_HANDLE )
+        C_DestroyObject( hSession, hPrivateKey );
+    C_CloseSession( hSession );
+    C_Finalize( NULL_PTR );
+    mbedtls_pk_free( &pkcs11_ctx );
+    mbedtls_pk_free( &transparent_ctx );
+}
+/* END_CASE */