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 */