0270b9f5a4
We had a message in the data file, and were computing its hash in the test function. It is more efficient (and simpler when it comes to dependencies) to directly have the message hash in the data file. It was probably this way because some test vectors provide the message for the sake of all-in-one implementation that hash-and-sign at once. But our API gets a hash as the input and signs it. In unit tests, this should be reflected in the signature of the test function, which should take a hash as input. The changes to the .data file were done using the following python script: import hashlib suite = 'pkcs1_v21' functions = { 'pkcs1_rsassa_pss_sign': (6, 8), 'pkcs1_rsassa_pss_verify': (4, 6), 'pkcs1_rsassa_pss_verify_ext': (4, 8), } def hash_ctx(s): if s == 'MBEDTLS_MD_MD5': return hashlib.md5() if s == 'MBEDTLS_MD_SHA1': return hashlib.sha1() if s == 'MBEDTLS_MD_SHA224': return hashlib.sha224() if s == 'MBEDTLS_MD_SHA256': return hashlib.sha256() if s == 'MBEDTLS_MD_SHA384': return hashlib.sha384() if s == 'MBEDTLS_MD_SHA512': return hashlib.sha512() def fix(l): parts = l.rstrip().split(":") fun = parts[0] if fun not in functions: return l (digest_idx, msg_idx) = functions[fun] alg_str = parts[digest_idx] if alg_str == "MBEDTLS_MD_NONE": return l h = hash_ctx(alg_str) msg_str = parts[msg_idx] msg_hex = msg_str[1:-1] msg = bytes.fromhex(msg_hex) h.update(msg) msg_hash = h.hexdigest() msg_hash_str = '"' + msg_hash + '"' parts[msg_idx] = msg_hash_str return ":".join(parts) + '\n' filename = 'tests/suites/test_suite_' + suite + '.data' with open(filename) as f: lines = f.readlines() lines = [fix(l) for l in lines] with open(filename, 'w') as f: f.writelines(lines) Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
249 lines
9.5 KiB
Text
249 lines
9.5 KiB
Text
/* BEGIN_HEADER */
|
|
#include "mbedtls/rsa.h"
|
|
#include "mbedtls/md.h"
|
|
/* END_HEADER */
|
|
|
|
/* BEGIN_DEPENDENCIES
|
|
* depends_on:MBEDTLS_PKCS1_V21:MBEDTLS_RSA_C:MBEDTLS_SHA1_C
|
|
* END_DEPENDENCIES
|
|
*/
|
|
|
|
/* BEGIN_CASE */
|
|
void pkcs1_rsaes_oaep_encrypt( int mod, data_t * input_N, data_t * input_E,
|
|
int hash, data_t * message_str, data_t * rnd_buf,
|
|
data_t * result_str, int result )
|
|
{
|
|
unsigned char output[256];
|
|
mbedtls_rsa_context ctx;
|
|
mbedtls_test_rnd_buf_info info;
|
|
mbedtls_mpi N, E;
|
|
|
|
info.fallback_f_rng = mbedtls_test_rnd_std_rand;
|
|
info.fallback_p_rng = NULL;
|
|
info.buf = rnd_buf->x;
|
|
info.length = rnd_buf->len;
|
|
|
|
mbedtls_mpi_init( &N ); mbedtls_mpi_init( &E );
|
|
mbedtls_rsa_init( &ctx );
|
|
TEST_ASSERT( mbedtls_rsa_set_padding( &ctx,
|
|
MBEDTLS_RSA_PKCS_V21, hash ) == 0 );
|
|
memset( output, 0x00, sizeof( output ) );
|
|
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &N, input_N->x, input_N->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &E, input_E->x, input_E->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, NULL, NULL, NULL, &E ) == 0 );
|
|
TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
|
|
TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
|
|
|
|
if( message_str->len == 0 )
|
|
message_str->x = NULL;
|
|
TEST_ASSERT( mbedtls_rsa_pkcs1_encrypt( &ctx,
|
|
&mbedtls_test_rnd_buffer_rand,
|
|
&info, message_str->len,
|
|
message_str->x,
|
|
output ) == result );
|
|
if( result == 0 )
|
|
{
|
|
ASSERT_COMPARE( output, ctx.len, result_str->x, result_str->len );
|
|
}
|
|
|
|
exit:
|
|
mbedtls_mpi_free( &N ); mbedtls_mpi_free( &E );
|
|
mbedtls_rsa_free( &ctx );
|
|
}
|
|
/* END_CASE */
|
|
|
|
/* BEGIN_CASE */
|
|
void pkcs1_rsaes_oaep_decrypt( int mod, data_t * input_P, data_t * input_Q,
|
|
data_t * input_N, data_t * input_E, int hash,
|
|
data_t * result_str, char * seed, data_t * message_str,
|
|
int result )
|
|
{
|
|
unsigned char output[64];
|
|
mbedtls_rsa_context ctx;
|
|
size_t output_len;
|
|
mbedtls_test_rnd_pseudo_info rnd_info;
|
|
mbedtls_mpi N, P, Q, E;
|
|
((void) seed);
|
|
|
|
mbedtls_mpi_init( &N ); mbedtls_mpi_init( &P );
|
|
mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &E );
|
|
|
|
mbedtls_rsa_init( &ctx );
|
|
TEST_ASSERT( mbedtls_rsa_set_padding( &ctx,
|
|
MBEDTLS_RSA_PKCS_V21, hash ) == 0 );
|
|
|
|
memset( output, 0x00, sizeof( output ) );
|
|
memset( &rnd_info, 0, sizeof( mbedtls_test_rnd_pseudo_info ) );
|
|
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &P, input_P->x, input_P->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &Q, input_Q->x, input_Q->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &N, input_N->x, input_N->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &E, input_E->x, input_E->len ) == 0 );
|
|
|
|
TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, &P, &Q, NULL, &E ) == 0 );
|
|
TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
|
|
TEST_ASSERT( mbedtls_rsa_complete( &ctx ) == 0 );
|
|
TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
|
|
|
|
if( result_str->len == 0 )
|
|
{
|
|
TEST_ASSERT( mbedtls_rsa_pkcs1_decrypt( &ctx,
|
|
&mbedtls_test_rnd_pseudo_rand,
|
|
&rnd_info,
|
|
&output_len, message_str->x,
|
|
NULL, 0 ) == result );
|
|
}
|
|
else
|
|
{
|
|
TEST_ASSERT( mbedtls_rsa_pkcs1_decrypt( &ctx,
|
|
&mbedtls_test_rnd_pseudo_rand,
|
|
&rnd_info,
|
|
&output_len, message_str->x,
|
|
output,
|
|
sizeof( output ) ) == result );
|
|
if( result == 0 )
|
|
{
|
|
ASSERT_COMPARE( output, output_len, result_str->x, result_str->len );
|
|
}
|
|
}
|
|
|
|
exit:
|
|
mbedtls_mpi_free( &N ); mbedtls_mpi_free( &P );
|
|
mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &E );
|
|
mbedtls_rsa_free( &ctx );
|
|
}
|
|
/* END_CASE */
|
|
|
|
/* BEGIN_CASE */
|
|
void pkcs1_rsassa_pss_sign( int mod, data_t * input_P, data_t * input_Q,
|
|
data_t * input_N, data_t * input_E, int digest,
|
|
int hash, data_t * hash_digest, data_t * rnd_buf,
|
|
data_t * result_str, int fixed_salt_length,
|
|
int result )
|
|
{
|
|
unsigned char output[512];
|
|
mbedtls_rsa_context ctx;
|
|
mbedtls_test_rnd_buf_info info;
|
|
mbedtls_mpi N, P, Q, E;
|
|
|
|
info.fallback_f_rng = mbedtls_test_rnd_std_rand;
|
|
info.fallback_p_rng = NULL;
|
|
info.buf = rnd_buf->x;
|
|
info.length = rnd_buf->len;
|
|
|
|
mbedtls_mpi_init( &N ); mbedtls_mpi_init( &P );
|
|
mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &E );
|
|
mbedtls_rsa_init( &ctx );
|
|
TEST_ASSERT( mbedtls_rsa_set_padding( &ctx,
|
|
MBEDTLS_RSA_PKCS_V21, hash ) == 0 );
|
|
|
|
memset( output, 0x00, sizeof( output ) );
|
|
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &P, input_P->x, input_P->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &Q, input_Q->x, input_Q->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &N, input_N->x, input_N->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &E, input_E->x, input_E->len ) == 0 );
|
|
|
|
TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, &P, &Q, NULL, &E ) == 0 );
|
|
TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
|
|
TEST_ASSERT( mbedtls_rsa_complete( &ctx ) == 0 );
|
|
TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
|
|
|
|
if (fixed_salt_length == MBEDTLS_RSA_SALT_LEN_ANY)
|
|
{
|
|
TEST_ASSERT( mbedtls_rsa_pkcs1_sign(
|
|
&ctx, &mbedtls_test_rnd_buffer_rand, &info,
|
|
digest, hash_digest->len, hash_digest->x, output ) == result );
|
|
if( result == 0 )
|
|
{
|
|
ASSERT_COMPARE( output, ctx.len, result_str->x, result_str->len );
|
|
}
|
|
|
|
info.buf = rnd_buf->x;
|
|
info.length = rnd_buf->len;
|
|
}
|
|
|
|
TEST_ASSERT( mbedtls_rsa_rsassa_pss_sign_ext(
|
|
&ctx, &mbedtls_test_rnd_buffer_rand, &info,
|
|
digest, hash_digest->len, hash_digest->x,
|
|
fixed_salt_length, output ) == result );
|
|
if( result == 0 )
|
|
{
|
|
ASSERT_COMPARE( output, ctx.len, result_str->x, result_str->len );
|
|
}
|
|
|
|
exit:
|
|
mbedtls_mpi_free( &N ); mbedtls_mpi_free( &P );
|
|
mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &E );
|
|
mbedtls_rsa_free( &ctx );
|
|
}
|
|
/* END_CASE */
|
|
|
|
/* BEGIN_CASE */
|
|
void pkcs1_rsassa_pss_verify( int mod, data_t * input_N, data_t * input_E,
|
|
int digest, int hash, data_t * hash_digest,
|
|
char * salt, data_t * result_str, int result )
|
|
{
|
|
mbedtls_rsa_context ctx;
|
|
mbedtls_mpi N, E;
|
|
((void) salt);
|
|
|
|
mbedtls_mpi_init( &N ); mbedtls_mpi_init( &E );
|
|
mbedtls_rsa_init( &ctx );
|
|
TEST_ASSERT( mbedtls_rsa_set_padding( &ctx,
|
|
MBEDTLS_RSA_PKCS_V21, hash ) == 0 );
|
|
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &N, input_N->x, input_N->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &E, input_E->x, input_E->len ) == 0 );
|
|
|
|
TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, NULL, NULL, NULL, &E ) == 0 );
|
|
TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
|
|
TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
|
|
|
|
|
|
TEST_ASSERT( mbedtls_rsa_pkcs1_verify( &ctx, digest, hash_digest->len, hash_digest->x, result_str->x ) == result );
|
|
|
|
exit:
|
|
mbedtls_mpi_free( &N ); mbedtls_mpi_free( &E );
|
|
mbedtls_rsa_free( &ctx );
|
|
}
|
|
/* END_CASE */
|
|
|
|
/* BEGIN_CASE */
|
|
void pkcs1_rsassa_pss_verify_ext( int mod, data_t * input_N, data_t * input_E,
|
|
int msg_digest_id, int ctx_hash,
|
|
int mgf_hash, int salt_len,
|
|
data_t * hash_digest,
|
|
data_t * result_str, int result_simple,
|
|
int result_full )
|
|
{
|
|
mbedtls_rsa_context ctx;
|
|
mbedtls_mpi N, E;
|
|
|
|
mbedtls_mpi_init( &N ); mbedtls_mpi_init( &E );
|
|
mbedtls_rsa_init( &ctx );
|
|
TEST_ASSERT( mbedtls_rsa_set_padding( &ctx,
|
|
MBEDTLS_RSA_PKCS_V21, ctx_hash ) == 0 );
|
|
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &N, input_N->x, input_N->len ) == 0 );
|
|
TEST_ASSERT( mbedtls_mpi_read_binary( &E, input_E->x, input_E->len ) == 0 );
|
|
|
|
TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, NULL, NULL, NULL, &E ) == 0 );
|
|
TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
|
|
TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
|
|
|
|
|
|
TEST_ASSERT( mbedtls_rsa_pkcs1_verify( &ctx, msg_digest_id,
|
|
hash_digest->len, hash_digest->x,
|
|
result_str->x ) == result_simple );
|
|
|
|
TEST_ASSERT( mbedtls_rsa_rsassa_pss_verify_ext( &ctx, msg_digest_id, hash_digest->len,
|
|
hash_digest->x, mgf_hash, salt_len,
|
|
result_str->x ) == result_full );
|
|
|
|
exit:
|
|
mbedtls_mpi_free( &N ); mbedtls_mpi_free( &E );
|
|
mbedtls_rsa_free( &ctx );
|
|
}
|
|
/* END_CASE */
|