fuzz_pubkey.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #define MBEDTLS_ALLOW_PRIVATE_ACCESS
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include "mbedtls/pk.h"
  5. int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
  6. #ifdef MBEDTLS_PK_PARSE_C
  7. int ret;
  8. mbedtls_pk_context pk;
  9. mbedtls_pk_init( &pk );
  10. ret = mbedtls_pk_parse_public_key( &pk, Data, Size );
  11. if (ret == 0) {
  12. #if defined(MBEDTLS_RSA_C)
  13. if( mbedtls_pk_get_type( &pk ) == MBEDTLS_PK_RSA )
  14. {
  15. mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
  16. mbedtls_rsa_context *rsa;
  17. mbedtls_mpi_init( &N ); mbedtls_mpi_init( &P ); mbedtls_mpi_init( &Q );
  18. mbedtls_mpi_init( &D ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &DP );
  19. mbedtls_mpi_init( &DQ ); mbedtls_mpi_init( &QP );
  20. rsa = mbedtls_pk_rsa( pk );
  21. if ( mbedtls_rsa_export( rsa, &N, NULL, NULL, NULL, &E ) != 0 ) {
  22. abort();
  23. }
  24. if ( mbedtls_rsa_export( rsa, &N, &P, &Q, &D, &E ) != MBEDTLS_ERR_RSA_BAD_INPUT_DATA ) {
  25. abort();
  26. }
  27. if ( mbedtls_rsa_export_crt( rsa, &DP, &DQ, &QP ) != MBEDTLS_ERR_RSA_BAD_INPUT_DATA ) {
  28. abort();
  29. }
  30. mbedtls_mpi_free( &N ); mbedtls_mpi_free( &P ); mbedtls_mpi_free( &Q );
  31. mbedtls_mpi_free( &D ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &DP );
  32. mbedtls_mpi_free( &DQ ); mbedtls_mpi_free( &QP );
  33. }
  34. else
  35. #endif
  36. #if defined(MBEDTLS_ECP_C)
  37. if( mbedtls_pk_get_type( &pk ) == MBEDTLS_PK_ECKEY ||
  38. mbedtls_pk_get_type( &pk ) == MBEDTLS_PK_ECKEY_DH )
  39. {
  40. mbedtls_ecp_keypair *ecp = mbedtls_pk_ec( pk );
  41. mbedtls_ecp_group_id grp_id = ecp->grp.id;
  42. const mbedtls_ecp_curve_info *curve_info =
  43. mbedtls_ecp_curve_info_from_grp_id( grp_id );
  44. /* If the curve is not supported, the key should not have been
  45. * accepted. */
  46. if( curve_info == NULL )
  47. abort( );
  48. /* It's a public key, so the private value should not have
  49. * been changed from its initialization to 0. */
  50. if( mbedtls_mpi_cmp_int( &ecp->d, 0 ) != 0 )
  51. abort( );
  52. }
  53. else
  54. #endif
  55. {
  56. /* The key is valid but is not of a supported type.
  57. * This should not happen. */
  58. abort( );
  59. }
  60. }
  61. mbedtls_pk_free( &pk );
  62. #else
  63. (void) Data;
  64. (void) Size;
  65. #endif //MBEDTLS_PK_PARSE_C
  66. return 0;
  67. }