fuzz_privkey.c 2.3 KB

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