Coverage Report

Created: 2025-11-16 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/mbedtls/programs/fuzz/fuzz_privkey.c
Line
Count
Source
1
#include <stdint.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#include "mbedtls/pk.h"
5
#include "mbedtls/entropy.h"
6
#include "mbedtls/ctr_drbg.h"
7
#include "common.h"
8
9
//4 Kb should be enough for every bug ;-)
10
3.61k
#define MAX_LEN 0x1000
11
12
#if defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_CTR_DRBG_C) && defined(MBEDTLS_ENTROPY_C)
13
const char *pers = "fuzz_privkey";
14
#endif // MBEDTLS_PK_PARSE_C && MBEDTLS_CTR_DRBG_C && MBEDTLS_ENTROPY_C
15
16
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
17
3.60k
{
18
3.60k
#if defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_CTR_DRBG_C) && defined(MBEDTLS_ENTROPY_C)
19
3.60k
    int ret;
20
3.60k
    mbedtls_pk_context pk;
21
3.60k
    mbedtls_ctr_drbg_context ctr_drbg;
22
3.60k
    mbedtls_entropy_context entropy;
23
24
3.60k
    if (Size > MAX_LEN) {
25
        //only work on small inputs
26
9
        Size = MAX_LEN;
27
9
    }
28
29
3.60k
    mbedtls_ctr_drbg_init(&ctr_drbg);
30
3.60k
    mbedtls_entropy_init(&entropy);
31
3.60k
    mbedtls_pk_init(&pk);
32
33
#if defined(MBEDTLS_USE_PSA_CRYPTO)
34
    psa_status_t status = psa_crypto_init();
35
27
    if (status != PSA_SUCCESS) {
36
27
        goto exit;
37
27
    }
38
0
#endif /* MBEDTLS_USE_PSA_CRYPTO */
39
40
3.57k
    if (mbedtls_ctr_drbg_seed(&ctr_drbg, dummy_entropy, &entropy,
41
3.57k
                              (const unsigned char *) pers, strlen(pers)) != 0) {
42
0
        goto exit;
43
0
    }
44
45
3.57k
    ret = mbedtls_pk_parse_key(&pk, Data, Size, NULL, 0,
46
3.57k
                               dummy_random, &ctr_drbg);
47
3.57k
    if (ret == 0) {
48
1.25k
#if defined(MBEDTLS_RSA_C)
49
1.25k
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_RSA) {
50
46
            mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
51
46
            mbedtls_rsa_context *rsa;
52
53
46
            mbedtls_mpi_init(&N); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q);
54
46
            mbedtls_mpi_init(&D); mbedtls_mpi_init(&E); mbedtls_mpi_init(&DP);
55
46
            mbedtls_mpi_init(&DQ); mbedtls_mpi_init(&QP);
56
57
46
            rsa = mbedtls_pk_rsa(pk);
58
46
            if (mbedtls_rsa_export(rsa, &N, &P, &Q, &D, &E) != 0) {
59
0
                abort();
60
0
            }
61
46
            if (mbedtls_rsa_export_crt(rsa, &DP, &DQ, &QP) != 0) {
62
0
                abort();
63
0
            }
64
65
46
            mbedtls_mpi_free(&N); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q);
66
46
            mbedtls_mpi_free(&D); mbedtls_mpi_free(&E); mbedtls_mpi_free(&DP);
67
46
            mbedtls_mpi_free(&DQ); mbedtls_mpi_free(&QP);
68
46
        } else
69
1.21k
#endif
70
1.21k
#if defined(MBEDTLS_ECP_C)
71
1.21k
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY ||
72
1.21k
            mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY_DH) {
73
1.21k
            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec(pk);
74
1.21k
            mbedtls_ecp_group_id grp_id = mbedtls_ecp_keypair_get_group_id(ecp);
75
1.21k
            const mbedtls_ecp_curve_info *curve_info =
76
1.21k
                mbedtls_ecp_curve_info_from_grp_id(grp_id);
77
78
            /* If the curve is not supported, the key should not have been
79
             * accepted. */
80
1.21k
            if (curve_info == NULL) {
81
0
                abort();
82
0
            }
83
1.21k
        } else
84
0
#endif
85
0
        {
86
            /* The key is valid but is not of a supported type.
87
             * This should not happen. */
88
0
            abort();
89
0
        }
90
1.25k
    }
91
3.60k
exit:
92
3.60k
    mbedtls_entropy_free(&entropy);
93
3.60k
    mbedtls_ctr_drbg_free(&ctr_drbg);
94
3.60k
    mbedtls_pk_free(&pk);
95
#if defined(MBEDTLS_USE_PSA_CRYPTO)
96
    mbedtls_psa_crypto_free();
97
#endif /* MBEDTLS_USE_PSA_CRYPTO */
98
#else
99
    (void) Data;
100
    (void) Size;
101
#endif // MBEDTLS_PK_PARSE_C && MBEDTLS_CTR_DRBG_C && MBEDTLS_ENTROPY_C
102
103
3.60k
    return 0;
104
3.57k
}
LLVMFuzzerTestOneInput
Line
Count
Source
17
3.57k
{
18
3.57k
#if defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_CTR_DRBG_C) && defined(MBEDTLS_ENTROPY_C)
19
3.57k
    int ret;
20
3.57k
    mbedtls_pk_context pk;
21
3.57k
    mbedtls_ctr_drbg_context ctr_drbg;
22
3.57k
    mbedtls_entropy_context entropy;
23
24
3.57k
    if (Size > MAX_LEN) {
25
        //only work on small inputs
26
5
        Size = MAX_LEN;
27
5
    }
28
29
3.57k
    mbedtls_ctr_drbg_init(&ctr_drbg);
30
3.57k
    mbedtls_entropy_init(&entropy);
31
3.57k
    mbedtls_pk_init(&pk);
32
33
#if defined(MBEDTLS_USE_PSA_CRYPTO)
34
    psa_status_t status = psa_crypto_init();
35
    if (status != PSA_SUCCESS) {
36
        goto exit;
37
    }
38
#endif /* MBEDTLS_USE_PSA_CRYPTO */
39
40
3.57k
    if (mbedtls_ctr_drbg_seed(&ctr_drbg, dummy_entropy, &entropy,
41
3.57k
                              (const unsigned char *) pers, strlen(pers)) != 0) {
42
0
        goto exit;
43
0
    }
44
45
3.57k
    ret = mbedtls_pk_parse_key(&pk, Data, Size, NULL, 0,
46
3.57k
                               dummy_random, &ctr_drbg);
47
3.57k
    if (ret == 0) {
48
1.25k
#if defined(MBEDTLS_RSA_C)
49
1.25k
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_RSA) {
50
46
            mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
51
46
            mbedtls_rsa_context *rsa;
52
53
46
            mbedtls_mpi_init(&N); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q);
54
46
            mbedtls_mpi_init(&D); mbedtls_mpi_init(&E); mbedtls_mpi_init(&DP);
55
46
            mbedtls_mpi_init(&DQ); mbedtls_mpi_init(&QP);
56
57
46
            rsa = mbedtls_pk_rsa(pk);
58
46
            if (mbedtls_rsa_export(rsa, &N, &P, &Q, &D, &E) != 0) {
59
0
                abort();
60
0
            }
61
46
            if (mbedtls_rsa_export_crt(rsa, &DP, &DQ, &QP) != 0) {
62
0
                abort();
63
0
            }
64
65
46
            mbedtls_mpi_free(&N); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q);
66
46
            mbedtls_mpi_free(&D); mbedtls_mpi_free(&E); mbedtls_mpi_free(&DP);
67
46
            mbedtls_mpi_free(&DQ); mbedtls_mpi_free(&QP);
68
46
        } else
69
1.21k
#endif
70
1.21k
#if defined(MBEDTLS_ECP_C)
71
1.21k
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY ||
72
1.21k
            mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY_DH) {
73
1.21k
            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec(pk);
74
1.21k
            mbedtls_ecp_group_id grp_id = mbedtls_ecp_keypair_get_group_id(ecp);
75
1.21k
            const mbedtls_ecp_curve_info *curve_info =
76
1.21k
                mbedtls_ecp_curve_info_from_grp_id(grp_id);
77
78
            /* If the curve is not supported, the key should not have been
79
             * accepted. */
80
1.21k
            if (curve_info == NULL) {
81
0
                abort();
82
0
            }
83
1.21k
        } else
84
0
#endif
85
0
        {
86
            /* The key is valid but is not of a supported type.
87
             * This should not happen. */
88
0
            abort();
89
0
        }
90
1.25k
    }
91
3.57k
exit:
92
3.57k
    mbedtls_entropy_free(&entropy);
93
3.57k
    mbedtls_ctr_drbg_free(&ctr_drbg);
94
3.57k
    mbedtls_pk_free(&pk);
95
#if defined(MBEDTLS_USE_PSA_CRYPTO)
96
    mbedtls_psa_crypto_free();
97
#endif /* MBEDTLS_USE_PSA_CRYPTO */
98
#else
99
    (void) Data;
100
    (void) Size;
101
#endif // MBEDTLS_PK_PARSE_C && MBEDTLS_CTR_DRBG_C && MBEDTLS_ENTROPY_C
102
103
3.57k
    return 0;
104
3.57k
}
LLVMFuzzerTestOneInput
Line
Count
Source
17
27
{
18
27
#if defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_CTR_DRBG_C) && defined(MBEDTLS_ENTROPY_C)
19
27
    int ret;
20
27
    mbedtls_pk_context pk;
21
27
    mbedtls_ctr_drbg_context ctr_drbg;
22
27
    mbedtls_entropy_context entropy;
23
24
27
    if (Size > MAX_LEN) {
25
        //only work on small inputs
26
4
        Size = MAX_LEN;
27
4
    }
28
29
27
    mbedtls_ctr_drbg_init(&ctr_drbg);
30
27
    mbedtls_entropy_init(&entropy);
31
27
    mbedtls_pk_init(&pk);
32
33
27
#if defined(MBEDTLS_USE_PSA_CRYPTO)
34
27
    psa_status_t status = psa_crypto_init();
35
27
    if (status != PSA_SUCCESS) {
36
27
        goto exit;
37
27
    }
38
0
#endif /* MBEDTLS_USE_PSA_CRYPTO */
39
40
0
    if (mbedtls_ctr_drbg_seed(&ctr_drbg, dummy_entropy, &entropy,
41
0
                              (const unsigned char *) pers, strlen(pers)) != 0) {
42
0
        goto exit;
43
0
    }
44
45
0
    ret = mbedtls_pk_parse_key(&pk, Data, Size, NULL, 0,
46
0
                               dummy_random, &ctr_drbg);
47
0
    if (ret == 0) {
48
0
#if defined(MBEDTLS_RSA_C)
49
0
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_RSA) {
50
0
            mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
51
0
            mbedtls_rsa_context *rsa;
52
53
0
            mbedtls_mpi_init(&N); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q);
54
0
            mbedtls_mpi_init(&D); mbedtls_mpi_init(&E); mbedtls_mpi_init(&DP);
55
0
            mbedtls_mpi_init(&DQ); mbedtls_mpi_init(&QP);
56
57
0
            rsa = mbedtls_pk_rsa(pk);
58
0
            if (mbedtls_rsa_export(rsa, &N, &P, &Q, &D, &E) != 0) {
59
0
                abort();
60
0
            }
61
0
            if (mbedtls_rsa_export_crt(rsa, &DP, &DQ, &QP) != 0) {
62
0
                abort();
63
0
            }
64
65
0
            mbedtls_mpi_free(&N); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q);
66
0
            mbedtls_mpi_free(&D); mbedtls_mpi_free(&E); mbedtls_mpi_free(&DP);
67
0
            mbedtls_mpi_free(&DQ); mbedtls_mpi_free(&QP);
68
0
        } else
69
0
#endif
70
0
#if defined(MBEDTLS_ECP_C)
71
0
        if (mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY ||
72
0
            mbedtls_pk_get_type(&pk) == MBEDTLS_PK_ECKEY_DH) {
73
0
            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec(pk);
74
0
            mbedtls_ecp_group_id grp_id = mbedtls_ecp_keypair_get_group_id(ecp);
75
0
            const mbedtls_ecp_curve_info *curve_info =
76
0
                mbedtls_ecp_curve_info_from_grp_id(grp_id);
77
78
            /* If the curve is not supported, the key should not have been
79
             * accepted. */
80
0
            if (curve_info == NULL) {
81
0
                abort();
82
0
            }
83
0
        } else
84
0
#endif
85
0
        {
86
            /* The key is valid but is not of a supported type.
87
             * This should not happen. */
88
0
            abort();
89
0
        }
90
0
    }
91
27
exit:
92
27
    mbedtls_entropy_free(&entropy);
93
27
    mbedtls_ctr_drbg_free(&ctr_drbg);
94
27
    mbedtls_pk_free(&pk);
95
27
#if defined(MBEDTLS_USE_PSA_CRYPTO)
96
27
    mbedtls_psa_crypto_free();
97
27
#endif /* MBEDTLS_USE_PSA_CRYPTO */
98
#else
99
    (void) Data;
100
    (void) Size;
101
#endif // MBEDTLS_PK_PARSE_C && MBEDTLS_CTR_DRBG_C && MBEDTLS_ENTROPY_C
102
103
27
    return 0;
104
0
}