Add PK tests for rsa encrypt/decrypt
diff --git a/tests/suites/test_suite_pk.function b/tests/suites/test_suite_pk.function
index d98d2a7..157860c 100644
--- a/tests/suites/test_suite_pk.function
+++ b/tests/suites/test_suite_pk.function
@@ -145,3 +145,108 @@
     pk_free( &pk );
 }
 /* END_CASE */
+
+/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
+void pk_rsa_encrypt_test_vec( char *message_hex, int mod,
+                            int radix_N, char *input_N,
+                            int radix_E, char *input_E,
+                            char *result_hex, int ret )
+{
+    unsigned char message[1000];
+    unsigned char output[1000];
+    unsigned char result[1000];
+    size_t msg_len, olen, res_len;
+    rnd_pseudo_info rnd_info;
+    rsa_context *rsa;
+    pk_context pk;
+
+    memset( &rnd_info,  0, sizeof( rnd_pseudo_info ) );
+    memset( message,    0, sizeof( message ) );
+    memset( output,     0, sizeof( output ) );
+    memset( result,     0, sizeof( result ) );
+
+    msg_len = unhexify( message, message_hex );
+    res_len = unhexify( result, result_hex );
+
+    pk_init( &pk );
+    TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
+    rsa = pk_rsa( pk );
+
+    rsa->len = mod / 8;
+    TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
+    TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
+
+    TEST_ASSERT( pk_encrypt( &pk, message, msg_len,
+                             output, &olen, sizeof( output ),
+                             rnd_pseudo_rand, &rnd_info ) == ret );
+    TEST_ASSERT( olen == res_len );
+    TEST_ASSERT( memcmp( output, result, olen ) == 0 );
+
+    pk_free( &pk );
+}
+/* END_CASE */
+
+/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
+void pk_rsa_decrypt_test_vec( char *cipher_hex, int mod,
+                            int radix_P, char *input_P,
+                            int radix_Q, char *input_Q,
+                            int radix_N, char *input_N,
+                            int radix_E, char *input_E,
+                            char *clear_hex, int ret )
+{
+    unsigned char clear[1000];
+    unsigned char output[1000];
+    unsigned char cipher[1000];
+    size_t clear_len, olen, cipher_len;
+    rnd_pseudo_info rnd_info;
+    mpi P1, Q1, H, G;
+    rsa_context *rsa;
+    pk_context pk;
+
+    pk_init( &pk );
+    mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
+
+    memset( &rnd_info,  0, sizeof( rnd_pseudo_info ) );
+    memset( clear,      0, sizeof( clear ) );
+    memset( cipher,     0, sizeof( cipher ) );
+
+    clear_len = unhexify( clear, clear_hex );
+    cipher_len = unhexify( cipher, cipher_hex );
+
+    /* init pk-rsa context */
+    TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
+    rsa = pk_rsa( pk );
+
+    /* load public key */
+    rsa->len = mod / 8;
+    TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
+    TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
+
+    /* load private key */
+    TEST_ASSERT( mpi_read_string( &rsa->P, radix_P, input_P ) == 0 );
+    TEST_ASSERT( mpi_read_string( &rsa->Q, radix_Q, input_Q ) == 0 );
+    TEST_ASSERT( mpi_sub_int( &P1, &rsa->P, 1 ) == 0 );
+    TEST_ASSERT( mpi_sub_int( &Q1, &rsa->Q, 1 ) == 0 );
+    TEST_ASSERT( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
+    TEST_ASSERT( mpi_gcd( &G, &rsa->E, &H  ) == 0 );
+    TEST_ASSERT( mpi_inv_mod( &rsa->D , &rsa->E, &H  ) == 0 );
+    TEST_ASSERT( mpi_mod_mpi( &rsa->DP, &rsa->D, &P1 ) == 0 );
+    TEST_ASSERT( mpi_mod_mpi( &rsa->DQ, &rsa->D, &Q1 ) == 0 );
+    TEST_ASSERT( mpi_inv_mod( &rsa->QP, &rsa->Q, &rsa->P ) == 0 );
+
+    /* decryption test */
+    memset( output, 0, sizeof( output ) );
+    olen = 0;
+    TEST_ASSERT( pk_decrypt( &pk, cipher, cipher_len,
+                             output, &olen, sizeof( output ),
+                             rnd_pseudo_rand, &rnd_info ) == ret );
+    if( ret == 0 )
+    {
+        TEST_ASSERT( olen == clear_len );
+        TEST_ASSERT( memcmp( output, clear, olen ) == 0 );
+    }
+
+    mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
+    pk_free( &pk );
+}
+/* END_CASE */