test_suite_ecdsa.function 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /* BEGIN_HEADER */
  2. #include "mbedtls/ecdsa.h"
  3. /* END_HEADER */
  4. /* BEGIN_DEPENDENCIES
  5. * depends_on:MBEDTLS_ECDSA_C
  6. * END_DEPENDENCIES
  7. */
  8. /* BEGIN_CASE */
  9. void ecdsa_prim_random( int id )
  10. {
  11. mbedtls_ecp_group grp;
  12. mbedtls_ecp_point Q;
  13. mbedtls_mpi d, r, s;
  14. rnd_pseudo_info rnd_info;
  15. unsigned char buf[66];
  16. mbedtls_ecp_group_init( &grp );
  17. mbedtls_ecp_point_init( &Q );
  18. mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
  19. memset( &rnd_info, 0x00, sizeof( rnd_pseudo_info ) );
  20. memset( buf, 0, sizeof( buf ) );
  21. /* prepare material for signature */
  22. TEST_ASSERT( rnd_pseudo_rand( &rnd_info, buf, sizeof( buf ) ) == 0 );
  23. TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
  24. TEST_ASSERT( mbedtls_ecp_gen_keypair( &grp, &d, &Q, &rnd_pseudo_rand, &rnd_info )
  25. == 0 );
  26. TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, buf, sizeof( buf ),
  27. &rnd_pseudo_rand, &rnd_info ) == 0 );
  28. TEST_ASSERT( mbedtls_ecdsa_verify( &grp, buf, sizeof( buf ), &Q, &r, &s ) == 0 );
  29. exit:
  30. mbedtls_ecp_group_free( &grp );
  31. mbedtls_ecp_point_free( &Q );
  32. mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
  33. }
  34. /* END_CASE */
  35. /* BEGIN_CASE */
  36. void ecdsa_prim_test_vectors( int id, char *d_str, char *xQ_str, char *yQ_str,
  37. char *k_str, char *hash_str, char *r_str,
  38. char *s_str )
  39. {
  40. mbedtls_ecp_group grp;
  41. mbedtls_ecp_point Q;
  42. mbedtls_mpi d, r, s, r_check, s_check;
  43. unsigned char hash[66], rnd_buf[66];
  44. size_t hlen;
  45. rnd_buf_info rnd_info;
  46. mbedtls_ecp_group_init( &grp );
  47. mbedtls_ecp_point_init( &Q );
  48. mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
  49. mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
  50. memset( hash, 0, sizeof( hash ) );
  51. memset( rnd_buf, 0, sizeof( rnd_buf ) );
  52. TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
  53. TEST_ASSERT( mbedtls_ecp_point_read_string( &Q, 16, xQ_str, yQ_str ) == 0 );
  54. TEST_ASSERT( mbedtls_mpi_read_string( &d, 16, d_str ) == 0 );
  55. TEST_ASSERT( mbedtls_mpi_read_string( &r_check, 16, r_str ) == 0 );
  56. TEST_ASSERT( mbedtls_mpi_read_string( &s_check, 16, s_str ) == 0 );
  57. hlen = unhexify(hash, hash_str);
  58. rnd_info.buf = rnd_buf;
  59. rnd_info.length = unhexify( rnd_buf, k_str );
  60. /* Fix rnd_buf by shifting it left if necessary */
  61. if( grp.nbits % 8 != 0 )
  62. {
  63. unsigned char shift = 8 - ( grp.nbits % 8 );
  64. size_t i;
  65. for( i = 0; i < rnd_info.length - 1; i++ )
  66. rnd_buf[i] = rnd_buf[i] << shift | rnd_buf[i+1] >> ( 8 - shift );
  67. rnd_buf[rnd_info.length-1] <<= shift;
  68. }
  69. TEST_ASSERT( mbedtls_ecdsa_sign( &grp, &r, &s, &d, hash, hlen,
  70. rnd_buffer_rand, &rnd_info ) == 0 );
  71. TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
  72. TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
  73. TEST_ASSERT( mbedtls_ecdsa_verify( &grp, hash, hlen, &Q, &r_check, &s_check ) == 0 );
  74. exit:
  75. mbedtls_ecp_group_free( &grp );
  76. mbedtls_ecp_point_free( &Q );
  77. mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
  78. mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
  79. }
  80. /* END_CASE */
  81. /* BEGIN_CASE depends_on:MBEDTLS_ECDSA_DETERMINISTIC */
  82. void ecdsa_det_test_vectors( int id, char *d_str, int md_alg,
  83. char *msg, char *r_str, char *s_str )
  84. {
  85. mbedtls_ecp_group grp;
  86. mbedtls_mpi d, r, s, r_check, s_check;
  87. unsigned char hash[MBEDTLS_MD_MAX_SIZE];
  88. size_t hlen;
  89. const mbedtls_md_info_t *md_info;
  90. mbedtls_ecp_group_init( &grp );
  91. mbedtls_mpi_init( &d ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s );
  92. mbedtls_mpi_init( &r_check ); mbedtls_mpi_init( &s_check );
  93. memset( hash, 0, sizeof( hash ) );
  94. TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
  95. TEST_ASSERT( mbedtls_mpi_read_string( &d, 16, d_str ) == 0 );
  96. TEST_ASSERT( mbedtls_mpi_read_string( &r_check, 16, r_str ) == 0 );
  97. TEST_ASSERT( mbedtls_mpi_read_string( &s_check, 16, s_str ) == 0 );
  98. md_info = mbedtls_md_info_from_type( md_alg );
  99. TEST_ASSERT( md_info != NULL );
  100. hlen = mbedtls_md_get_size( md_info );
  101. mbedtls_md( md_info, (const unsigned char *) msg, strlen( msg ), hash );
  102. TEST_ASSERT( mbedtls_ecdsa_sign_det( &grp, &r, &s, &d, hash, hlen, md_alg ) == 0 );
  103. TEST_ASSERT( mbedtls_mpi_cmp_mpi( &r, &r_check ) == 0 );
  104. TEST_ASSERT( mbedtls_mpi_cmp_mpi( &s, &s_check ) == 0 );
  105. exit:
  106. mbedtls_ecp_group_free( &grp );
  107. mbedtls_mpi_free( &d ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s );
  108. mbedtls_mpi_free( &r_check ); mbedtls_mpi_free( &s_check );
  109. }
  110. /* END_CASE */
  111. /* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
  112. void ecdsa_write_read_random( int id )
  113. {
  114. mbedtls_ecdsa_context ctx;
  115. rnd_pseudo_info rnd_info;
  116. unsigned char hash[32];
  117. unsigned char sig[200];
  118. size_t sig_len, i;
  119. mbedtls_ecdsa_init( &ctx );
  120. memset( &rnd_info, 0x00, sizeof( rnd_pseudo_info ) );
  121. memset( hash, 0, sizeof( hash ) );
  122. memset( sig, 0x2a, sizeof( sig ) );
  123. /* prepare material for signature */
  124. TEST_ASSERT( rnd_pseudo_rand( &rnd_info, hash, sizeof( hash ) ) == 0 );
  125. /* generate signing key */
  126. TEST_ASSERT( mbedtls_ecdsa_genkey( &ctx, id, &rnd_pseudo_rand, &rnd_info ) == 0 );
  127. /* generate and write signature, then read and verify it */
  128. TEST_ASSERT( mbedtls_ecdsa_write_signature( &ctx, MBEDTLS_MD_SHA256,
  129. hash, sizeof( hash ),
  130. sig, &sig_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
  131. TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
  132. sig, sig_len ) == 0 );
  133. /* check we didn't write past the announced length */
  134. for( i = sig_len; i < sizeof( sig ); i++ )
  135. TEST_ASSERT( sig[i] == 0x2a );
  136. /* try verification with invalid length */
  137. TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
  138. sig, sig_len - 1 ) != 0 );
  139. TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
  140. sig, sig_len + 1 ) != 0 );
  141. /* try invalid sequence tag */
  142. sig[0]++;
  143. TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
  144. sig, sig_len ) != 0 );
  145. sig[0]--;
  146. /* try modifying r */
  147. sig[10]++;
  148. TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
  149. sig, sig_len ) != 0 );
  150. sig[10]--;
  151. /* try modifying s */
  152. sig[sig_len - 1]++;
  153. TEST_ASSERT( mbedtls_ecdsa_read_signature( &ctx, hash, sizeof( hash ),
  154. sig, sig_len ) != 0 );
  155. sig[sig_len - 1]--;
  156. exit:
  157. mbedtls_ecdsa_free( &ctx );
  158. }
  159. /* END_CASE */