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