fuzz_pubkey.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. {
  7. #ifdef MBEDTLS_PK_PARSE_C
  8. int ret;
  9. mbedtls_pk_context pk;
  10. mbedtls_pk_init(&pk);
  11. ret = mbedtls_pk_parse_public_key(&pk, Data, Size);
  12. if (ret == 0) {
  13. #if defined(MBEDTLS_RSA_C)
  14. if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_RSA) {
  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. } else
  34. #endif
  35. #if defined(MBEDTLS_ECP_C)
  36. if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY ||
  37. mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY_DH) {
  38. mbedtls_ecp_keypair *ecp = mbedtls_pk_ec(pk);
  39. mbedtls_ecp_group_id grp_id = ecp->grp.id;
  40. const mbedtls_ecp_curve_info *curve_info =
  41. mbedtls_ecp_curve_info_from_grp_id(grp_id);
  42. /* If the curve is not supported, the key should not have been
  43. * accepted. */
  44. if (curve_info == NULL) {
  45. abort();
  46. }
  47. /* It's a public key, so the private value should not have
  48. * been changed from its initialization to 0. */
  49. if (mbedtls_mpi_cmp_int(&ecp->d, 0) != 0) {
  50. abort();
  51. }
  52. } else
  53. #endif
  54. {
  55. /* The key is valid but is not of a supported type.
  56. * This should not happen. */
  57. abort();
  58. }
  59. }
  60. mbedtls_pk_free(&pk);
  61. #else
  62. (void) Data;
  63. (void) Size;
  64. #endif //MBEDTLS_PK_PARSE_C
  65. return 0;
  66. }