Coverage Report

Created: 2026-10-28 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/mbedtls/programs/fuzz/fuzz_pubkey.c
Line
Count
Source
1
#include <stdint.h>
2
#include <stdlib.h>
3
#include "mbedtls/pk.h"
4
#include "common.h"
5
6
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
7
3.29k
{
8
3.29k
#ifdef MBEDTLS_PK_PARSE_C
9
3.29k
    int ret;
10
3.29k
    mbedtls_pk_context pk;
11
12
3.29k
    mbedtls_pk_init(&pk);
13
#if defined(MBEDTLS_USE_PSA_CRYPTO)
14
    psa_status_t status = psa_crypto_init();
15
2
    if (status != PSA_SUCCESS) {
16
2
        goto exit;
17
2
    }
18
0
#endif /* MBEDTLS_USE_PSA_CRYPTO */
19
0
    ret = mbedtls_pk_parse_public_key(&pk, Data, Size);
20
3.29k
    if (ret == 0) {
21
828
#if defined(MBEDTLS_RSA_C)
22
828
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_RSA) {
23
272
            mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
24
272
            mbedtls_rsa_context *rsa;
25
26
272
            mbedtls_mpi_init(&N); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q);
27
272
            mbedtls_mpi_init(&D); mbedtls_mpi_init(&E); mbedtls_mpi_init(&DP);
28
272
            mbedtls_mpi_init(&DQ); mbedtls_mpi_init(&QP);
29
30
272
            rsa = mbedtls_pk_rsa(pk);
31
272
            if (mbedtls_rsa_export(rsa, &N, NULL, NULL, NULL, &E) != 0) {
32
0
                abort();
33
0
            }
34
272
            if (mbedtls_rsa_export(rsa, &N, &P, &Q, &D, &E) != MBEDTLS_ERR_RSA_BAD_INPUT_DATA) {
35
0
                abort();
36
0
            }
37
272
            if (mbedtls_rsa_export_crt(rsa, &DP, &DQ, &QP) != MBEDTLS_ERR_RSA_BAD_INPUT_DATA) {
38
0
                abort();
39
0
            }
40
41
272
            mbedtls_mpi_free(&N); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q);
42
272
            mbedtls_mpi_free(&D); mbedtls_mpi_free(&E); mbedtls_mpi_free(&DP);
43
272
            mbedtls_mpi_free(&DQ); mbedtls_mpi_free(&QP);
44
45
272
        } else
46
556
#endif
47
556
#if defined(MBEDTLS_ECP_C)
48
556
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY ||
49
556
            mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY_DH) {
50
556
            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec(pk);
51
556
            mbedtls_ecp_group_id grp_id = mbedtls_ecp_keypair_get_group_id(ecp);
52
556
            const mbedtls_ecp_curve_info *curve_info =
53
556
                mbedtls_ecp_curve_info_from_grp_id(grp_id);
54
55
            /* If the curve is not supported, the key should not have been
56
             * accepted. */
57
556
            if (curve_info == NULL) {
58
0
                abort();
59
0
            }
60
61
            /* It's a public key, so the private value should not have
62
             * been changed from its initialization to 0. */
63
556
            mbedtls_mpi d;
64
556
            mbedtls_mpi_init(&d);
65
556
            if (mbedtls_ecp_export(ecp, NULL, &d, NULL) != 0) {
66
0
                abort();
67
0
            }
68
556
            if (mbedtls_mpi_cmp_int(&d, 0) != 0) {
69
0
                abort();
70
0
            }
71
556
            mbedtls_mpi_free(&d);
72
556
        } else
73
0
#endif
74
0
        {
75
            /* The key is valid but is not of a supported type.
76
             * This should not happen. */
77
0
            abort();
78
0
        }
79
828
    }
80
#if defined(MBEDTLS_USE_PSA_CRYPTO)
81
2
exit:
82
2
    mbedtls_psa_crypto_free();
83
2
#endif /* MBEDTLS_USE_PSA_CRYPTO */
84
3.29k
    mbedtls_pk_free(&pk);
85
#else
86
    (void) Data;
87
    (void) Size;
88
#endif //MBEDTLS_PK_PARSE_C
89
90
3.29k
    return 0;
91
0
}
LLVMFuzzerTestOneInput
Line
Count
Source
7
3.29k
{
8
3.29k
#ifdef MBEDTLS_PK_PARSE_C
9
3.29k
    int ret;
10
3.29k
    mbedtls_pk_context pk;
11
12
3.29k
    mbedtls_pk_init(&pk);
13
#if defined(MBEDTLS_USE_PSA_CRYPTO)
14
    psa_status_t status = psa_crypto_init();
15
    if (status != PSA_SUCCESS) {
16
        goto exit;
17
    }
18
#endif /* MBEDTLS_USE_PSA_CRYPTO */
19
3.29k
    ret = mbedtls_pk_parse_public_key(&pk, Data, Size);
20
3.29k
    if (ret == 0) {
21
828
#if defined(MBEDTLS_RSA_C)
22
828
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_RSA) {
23
272
            mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
24
272
            mbedtls_rsa_context *rsa;
25
26
272
            mbedtls_mpi_init(&N); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q);
27
272
            mbedtls_mpi_init(&D); mbedtls_mpi_init(&E); mbedtls_mpi_init(&DP);
28
272
            mbedtls_mpi_init(&DQ); mbedtls_mpi_init(&QP);
29
30
272
            rsa = mbedtls_pk_rsa(pk);
31
272
            if (mbedtls_rsa_export(rsa, &N, NULL, NULL, NULL, &E) != 0) {
32
0
                abort();
33
0
            }
34
272
            if (mbedtls_rsa_export(rsa, &N, &P, &Q, &D, &E) != MBEDTLS_ERR_RSA_BAD_INPUT_DATA) {
35
0
                abort();
36
0
            }
37
272
            if (mbedtls_rsa_export_crt(rsa, &DP, &DQ, &QP) != MBEDTLS_ERR_RSA_BAD_INPUT_DATA) {
38
0
                abort();
39
0
            }
40
41
272
            mbedtls_mpi_free(&N); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q);
42
272
            mbedtls_mpi_free(&D); mbedtls_mpi_free(&E); mbedtls_mpi_free(&DP);
43
272
            mbedtls_mpi_free(&DQ); mbedtls_mpi_free(&QP);
44
45
272
        } else
46
556
#endif
47
556
#if defined(MBEDTLS_ECP_C)
48
556
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY ||
49
556
            mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY_DH) {
50
556
            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec(pk);
51
556
            mbedtls_ecp_group_id grp_id = mbedtls_ecp_keypair_get_group_id(ecp);
52
556
            const mbedtls_ecp_curve_info *curve_info =
53
556
                mbedtls_ecp_curve_info_from_grp_id(grp_id);
54
55
            /* If the curve is not supported, the key should not have been
56
             * accepted. */
57
556
            if (curve_info == NULL) {
58
0
                abort();
59
0
            }
60
61
            /* It's a public key, so the private value should not have
62
             * been changed from its initialization to 0. */
63
556
            mbedtls_mpi d;
64
556
            mbedtls_mpi_init(&d);
65
556
            if (mbedtls_ecp_export(ecp, NULL, &d, NULL) != 0) {
66
0
                abort();
67
0
            }
68
556
            if (mbedtls_mpi_cmp_int(&d, 0) != 0) {
69
0
                abort();
70
0
            }
71
556
            mbedtls_mpi_free(&d);
72
556
        } else
73
0
#endif
74
0
        {
75
            /* The key is valid but is not of a supported type.
76
             * This should not happen. */
77
0
            abort();
78
0
        }
79
828
    }
80
#if defined(MBEDTLS_USE_PSA_CRYPTO)
81
exit:
82
    mbedtls_psa_crypto_free();
83
#endif /* MBEDTLS_USE_PSA_CRYPTO */
84
3.29k
    mbedtls_pk_free(&pk);
85
#else
86
    (void) Data;
87
    (void) Size;
88
#endif //MBEDTLS_PK_PARSE_C
89
90
3.29k
    return 0;
91
3.29k
}
LLVMFuzzerTestOneInput
Line
Count
Source
7
2
{
8
2
#ifdef MBEDTLS_PK_PARSE_C
9
2
    int ret;
10
2
    mbedtls_pk_context pk;
11
12
2
    mbedtls_pk_init(&pk);
13
2
#if defined(MBEDTLS_USE_PSA_CRYPTO)
14
2
    psa_status_t status = psa_crypto_init();
15
2
    if (status != PSA_SUCCESS) {
16
2
        goto exit;
17
2
    }
18
0
#endif /* MBEDTLS_USE_PSA_CRYPTO */
19
0
    ret = mbedtls_pk_parse_public_key(&pk, Data, Size);
20
0
    if (ret == 0) {
21
0
#if defined(MBEDTLS_RSA_C)
22
0
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_RSA) {
23
0
            mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
24
0
            mbedtls_rsa_context *rsa;
25
26
0
            mbedtls_mpi_init(&N); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q);
27
0
            mbedtls_mpi_init(&D); mbedtls_mpi_init(&E); mbedtls_mpi_init(&DP);
28
0
            mbedtls_mpi_init(&DQ); mbedtls_mpi_init(&QP);
29
30
0
            rsa = mbedtls_pk_rsa(pk);
31
0
            if (mbedtls_rsa_export(rsa, &N, NULL, NULL, NULL, &E) != 0) {
32
0
                abort();
33
0
            }
34
0
            if (mbedtls_rsa_export(rsa, &N, &P, &Q, &D, &E) != MBEDTLS_ERR_RSA_BAD_INPUT_DATA) {
35
0
                abort();
36
0
            }
37
0
            if (mbedtls_rsa_export_crt(rsa, &DP, &DQ, &QP) != MBEDTLS_ERR_RSA_BAD_INPUT_DATA) {
38
0
                abort();
39
0
            }
40
41
0
            mbedtls_mpi_free(&N); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q);
42
0
            mbedtls_mpi_free(&D); mbedtls_mpi_free(&E); mbedtls_mpi_free(&DP);
43
0
            mbedtls_mpi_free(&DQ); mbedtls_mpi_free(&QP);
44
45
0
        } else
46
0
#endif
47
0
#if defined(MBEDTLS_ECP_C)
48
0
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY ||
49
0
            mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY_DH) {
50
0
            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec(pk);
51
0
            mbedtls_ecp_group_id grp_id = mbedtls_ecp_keypair_get_group_id(ecp);
52
0
            const mbedtls_ecp_curve_info *curve_info =
53
0
                mbedtls_ecp_curve_info_from_grp_id(grp_id);
54
55
            /* If the curve is not supported, the key should not have been
56
             * accepted. */
57
0
            if (curve_info == NULL) {
58
0
                abort();
59
0
            }
60
61
            /* It's a public key, so the private value should not have
62
             * been changed from its initialization to 0. */
63
0
            mbedtls_mpi d;
64
0
            mbedtls_mpi_init(&d);
65
0
            if (mbedtls_ecp_export(ecp, NULL, &d, NULL) != 0) {
66
0
                abort();
67
0
            }
68
0
            if (mbedtls_mpi_cmp_int(&d, 0) != 0) {
69
0
                abort();
70
0
            }
71
0
            mbedtls_mpi_free(&d);
72
0
        } else
73
0
#endif
74
0
        {
75
            /* The key is valid but is not of a supported type.
76
             * This should not happen. */
77
0
            abort();
78
0
        }
79
0
    }
80
0
#if defined(MBEDTLS_USE_PSA_CRYPTO)
81
2
exit:
82
2
    mbedtls_psa_crypto_free();
83
2
#endif /* MBEDTLS_USE_PSA_CRYPTO */
84
2
    mbedtls_pk_free(&pk);
85
#else
86
    (void) Data;
87
    (void) Size;
88
#endif //MBEDTLS_PK_PARSE_C
89
90
2
    return 0;
91
0
}