In some cases you only have the base values for RSA at your disposal and want to use those within mbed TLS. mbed TLS, or specifically the
mbedtls_rsa_context structure, requires more than the base values in order to perform optimized operations for RSA.
Luckily, you are able to extract those other values if you have access to your E, P and Q! In most cases you alread have your N, so you can skip the next section.
For the following example, we assume that you have already correctly initialized the RSA context named ctx and loaded the values for P, Q and E into the
Getting the modulus (N)
Calculating the modulus (N) is done as follows:
MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx.N, &ctx.P, &ctx.Q ) );
Fill the context
In order to fill all the other values within the context you can use the following sequence of function calls. You will have to define and initialize the appropriate variables such as P1.
MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx.P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx.Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx.D , &ctx.E, &H ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) );
And finally, we set the length field in the
ctx.len = mbedtls_mpi_size( &ctx.N );
Check RSA key consistency
If you want to check correctness of all values in your context, use