Coverage Report

Created: 2025-11-16 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cryptofuzz-openssl-api/modules/wolfcrypt-openssl/module_internal.h
Line
Count
Source
1
#pragma once
2
3
namespace cryptofuzz {
4
namespace module {
5
6
template <class T>
7
class CTX_Copier {
8
    private:
9
        T* ctx = nullptr;
10
        Datasource& ds;
11
12
        T* newCTX(void) const;
13
        int copyCTX(T* dest, T* src) const;
14
        void freeCTX(T* ctx) const;
15
16
109k
        T* copy(void) {
17
109k
            return ctx;
18
0
            bool doCopyCTX = true;
19
0
            try {
20
0
                doCopyCTX = ds.Get<bool>();
21
0
            } catch ( fuzzing::datasource::Datasource::OutOfData ) { }
22
23
0
            if ( doCopyCTX == true ) {
24
0
                T* tmpCtx = newCTX();
25
0
                if ( tmpCtx != nullptr ) {
26
0
                    if ( copyCTX(tmpCtx, ctx) == 1 ) {
27
                        /* Copy succeeded, free the old ctx */
28
0
                        freeCTX(ctx);
29
30
                        /* Use the copied ctx */
31
0
                        ctx = tmpCtx;
32
0
                    } else {
33
0
                        freeCTX(tmpCtx);
34
0
                    }
35
0
                }
36
0
            }
37
38
0
            return ctx;
39
0
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EVP_MD_CTX>::copy()
Line
Count
Source
16
28.8k
        T* copy(void) {
17
28.8k
            return ctx;
18
0
            bool doCopyCTX = true;
19
0
            try {
20
0
                doCopyCTX = ds.Get<bool>();
21
0
            } catch ( fuzzing::datasource::Datasource::OutOfData ) { }
22
23
0
            if ( doCopyCTX == true ) {
24
0
                T* tmpCtx = newCTX();
25
0
                if ( tmpCtx != nullptr ) {
26
0
                    if ( copyCTX(tmpCtx, ctx) == 1 ) {
27
                        /* Copy succeeded, free the old ctx */
28
0
                        freeCTX(ctx);
29
30
                        /* Use the copied ctx */
31
0
                        ctx = tmpCtx;
32
0
                    } else {
33
0
                        freeCTX(tmpCtx);
34
0
                    }
35
0
                }
36
0
            }
37
38
0
            return ctx;
39
0
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_HMAC_CTX>::copy()
Line
Count
Source
16
4.88k
        T* copy(void) {
17
4.88k
            return ctx;
18
0
            bool doCopyCTX = true;
19
0
            try {
20
0
                doCopyCTX = ds.Get<bool>();
21
0
            } catch ( fuzzing::datasource::Datasource::OutOfData ) { }
22
23
0
            if ( doCopyCTX == true ) {
24
0
                T* tmpCtx = newCTX();
25
0
                if ( tmpCtx != nullptr ) {
26
0
                    if ( copyCTX(tmpCtx, ctx) == 1 ) {
27
                        /* Copy succeeded, free the old ctx */
28
0
                        freeCTX(ctx);
29
30
                        /* Use the copied ctx */
31
0
                        ctx = tmpCtx;
32
0
                    } else {
33
0
                        freeCTX(tmpCtx);
34
0
                    }
35
0
                }
36
0
            }
37
38
0
            return ctx;
39
0
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EVP_CIPHER_CTX>::copy()
Line
Count
Source
16
66.2k
        T* copy(void) {
17
66.2k
            return ctx;
18
0
            bool doCopyCTX = true;
19
0
            try {
20
0
                doCopyCTX = ds.Get<bool>();
21
0
            } catch ( fuzzing::datasource::Datasource::OutOfData ) { }
22
23
0
            if ( doCopyCTX == true ) {
24
0
                T* tmpCtx = newCTX();
25
0
                if ( tmpCtx != nullptr ) {
26
0
                    if ( copyCTX(tmpCtx, ctx) == 1 ) {
27
                        /* Copy succeeded, free the old ctx */
28
0
                        freeCTX(ctx);
29
30
                        /* Use the copied ctx */
31
0
                        ctx = tmpCtx;
32
0
                    } else {
33
0
                        freeCTX(tmpCtx);
34
0
                    }
35
0
                }
36
0
            }
37
38
0
            return ctx;
39
0
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_CMAC_CTX>::copy()
Line
Count
Source
16
4.37k
        T* copy(void) {
17
4.37k
            return ctx;
18
0
            bool doCopyCTX = true;
19
0
            try {
20
0
                doCopyCTX = ds.Get<bool>();
21
0
            } catch ( fuzzing::datasource::Datasource::OutOfData ) { }
22
23
0
            if ( doCopyCTX == true ) {
24
0
                T* tmpCtx = newCTX();
25
0
                if ( tmpCtx != nullptr ) {
26
0
                    if ( copyCTX(tmpCtx, ctx) == 1 ) {
27
                        /* Copy succeeded, free the old ctx */
28
0
                        freeCTX(ctx);
29
30
                        /* Use the copied ctx */
31
0
                        ctx = tmpCtx;
32
0
                    } else {
33
0
                        freeCTX(tmpCtx);
34
0
                    }
35
0
                }
36
0
            }
37
38
0
            return ctx;
39
0
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EC_KEY>::copy()
Line
Count
Source
16
5.49k
        T* copy(void) {
17
5.49k
            return ctx;
18
0
            bool doCopyCTX = true;
19
0
            try {
20
0
                doCopyCTX = ds.Get<bool>();
21
0
            } catch ( fuzzing::datasource::Datasource::OutOfData ) { }
22
23
0
            if ( doCopyCTX == true ) {
24
0
                T* tmpCtx = newCTX();
25
0
                if ( tmpCtx != nullptr ) {
26
0
                    if ( copyCTX(tmpCtx, ctx) == 1 ) {
27
                        /* Copy succeeded, free the old ctx */
28
0
                        freeCTX(ctx);
29
30
                        /* Use the copied ctx */
31
0
                        ctx = tmpCtx;
32
0
                    } else {
33
0
                        freeCTX(tmpCtx);
34
0
                    }
35
0
                }
36
0
            }
37
38
0
            return ctx;
39
0
        }
40
41
    public:
42
        CTX_Copier(Datasource& ds) :
43
10.1k
            ds(ds) {
44
10.1k
            ctx = newCTX();
45
10.1k
            if ( ctx == nullptr ) {
46
0
                abort();
47
0
            }
48
10.1k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EVP_MD_CTX>::CTX_Copier(fuzzing::datasource::Datasource&)
Line
Count
Source
43
1.55k
            ds(ds) {
44
1.55k
            ctx = newCTX();
45
1.55k
            if ( ctx == nullptr ) {
46
0
                abort();
47
0
            }
48
1.55k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_HMAC_CTX>::CTX_Copier(fuzzing::datasource::Datasource&)
Line
Count
Source
43
141
            ds(ds) {
44
141
            ctx = newCTX();
45
141
            if ( ctx == nullptr ) {
46
0
                abort();
47
0
            }
48
141
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EVP_CIPHER_CTX>::CTX_Copier(fuzzing::datasource::Datasource&)
Line
Count
Source
43
5.16k
            ds(ds) {
44
5.16k
            ctx = newCTX();
45
5.16k
            if ( ctx == nullptr ) {
46
0
                abort();
47
0
            }
48
5.16k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_CMAC_CTX>::CTX_Copier(fuzzing::datasource::Datasource&)
Line
Count
Source
43
715
            ds(ds) {
44
715
            ctx = newCTX();
45
715
            if ( ctx == nullptr ) {
46
0
                abort();
47
0
            }
48
715
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EC_KEY>::CTX_Copier(fuzzing::datasource::Datasource&)
Line
Count
Source
43
2.58k
            ds(ds) {
44
2.58k
            ctx = newCTX();
45
2.58k
            if ( ctx == nullptr ) {
46
0
                abort();
47
0
            }
48
2.58k
        }
49
50
109k
        T* GetPtr(void) {
51
109k
            return copy();
52
109k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EVP_MD_CTX>::GetPtr()
Line
Count
Source
50
28.8k
        T* GetPtr(void) {
51
28.8k
            return copy();
52
28.8k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_HMAC_CTX>::GetPtr()
Line
Count
Source
50
4.88k
        T* GetPtr(void) {
51
4.88k
            return copy();
52
4.88k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EVP_CIPHER_CTX>::GetPtr()
Line
Count
Source
50
66.2k
        T* GetPtr(void) {
51
66.2k
            return copy();
52
66.2k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_CMAC_CTX>::GetPtr()
Line
Count
Source
50
4.37k
        T* GetPtr(void) {
51
4.37k
            return copy();
52
4.37k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EC_KEY>::GetPtr()
Line
Count
Source
50
5.49k
        T* GetPtr(void) {
51
5.49k
            return copy();
52
5.49k
        }
53
54
10.1k
        ~CTX_Copier() {
55
10.1k
            freeCTX(ctx);
56
10.1k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EVP_MD_CTX>::~CTX_Copier()
Line
Count
Source
54
1.55k
        ~CTX_Copier() {
55
1.55k
            freeCTX(ctx);
56
1.55k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_HMAC_CTX>::~CTX_Copier()
Line
Count
Source
54
141
        ~CTX_Copier() {
55
141
            freeCTX(ctx);
56
141
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EVP_CIPHER_CTX>::~CTX_Copier()
Line
Count
Source
54
5.16k
        ~CTX_Copier() {
55
5.16k
            freeCTX(ctx);
56
5.16k
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_CMAC_CTX>::~CTX_Copier()
Line
Count
Source
54
715
        ~CTX_Copier() {
55
715
            freeCTX(ctx);
56
715
        }
cryptofuzz::module::CTX_Copier<WOLFSSL_EC_KEY>::~CTX_Copier()
Line
Count
Source
54
2.58k
        ~CTX_Copier() {
55
2.58k
            freeCTX(ctx);
56
2.58k
        }
57
};
58
59
class EC_GROUP_Copier {
60
    private:
61
        bool locked = false;
62
        const int curveNID;
63
        EC_GROUP* group = nullptr;
64
        Datasource& ds;
65
66
2.85k
        EC_GROUP* newGroup(void) {
67
2.85k
            return EC_GROUP_new_by_curve_name(curveNID);
68
2.85k
        }
69
70
#if !defined(CRYPTOFUZZ_BORINGSSL) && !defined(CRYPTOFUZZ_WOLFCRYPT_OPENSSL)
71
        int copyGroup(EC_GROUP* dest, EC_GROUP* src) {
72
            return EC_GROUP_copy(dest, src);
73
        }
74
#endif
75
2.85k
        void freeGroup(EC_GROUP* group) {
76
2.85k
            /* noret */ EC_GROUP_free(group);
77
2.85k
        }
78
79
0
        EC_GROUP* copy(void) {
80
0
            bool doCopyGroup = true;
81
0
            try {
82
0
                doCopyGroup = ds.Get<bool>();
83
0
            } catch ( fuzzing::datasource::Datasource::OutOfData ) { }
84
85
0
            if ( doCopyGroup == true ) {
86
#if !defined(CRYPTOFUZZ_BORINGSSL) && !defined(CRYPTOFUZZ_WOLFCRYPT_OPENSSL)
87
                EC_GROUP* tmpGroup = newGroup();
88
                if ( tmpGroup != nullptr ) {
89
                    if ( copyGroup(tmpGroup, group) == 1 ) {
90
                        /* Copy succeeded, free the old group */
91
                        freeGroup(group);
92
93
                        /* Use the copied group */
94
                        group = tmpGroup;
95
                    } else {
96
                        freeGroup(tmpGroup);
97
                    }
98
                }
99
#endif
100
0
            }
101
102
0
            return group;
103
0
        }
104
105
    public:
106
        EC_GROUP_Copier(Datasource& ds, const int curveNID) :
107
2.85k
            curveNID(curveNID), ds(ds) {
108
2.85k
            group = newGroup();
109
2.85k
        }
110
111
2.85k
        void Lock(void) {
112
2.85k
            locked = true;
113
2.85k
        }
114
115
18.0k
        EC_GROUP* GetPtr(void) {
116
18.0k
            if ( locked == true ) {
117
18.0k
                return group;
118
18.0k
            } else {
119
0
                return copy();
120
0
            }
121
18.0k
        }
122
123
2.85k
        ~EC_GROUP_Copier() {
124
2.85k
            freeGroup(group);
125
2.85k
        }
126
};
127
128
class EC_POINT_Copier {
129
    private:
130
        std::shared_ptr<EC_GROUP_Copier> group;
131
        EC_POINT* point = nullptr;
132
        Datasource& ds;
133
134
8.25k
        EC_POINT* newPoint(void) {
135
8.25k
            return EC_POINT_new(group->GetPtr());
136
8.25k
        }
137
138
5.16k
        int copyPoint(EC_POINT* dest, EC_POINT* src) {
139
5.16k
            return EC_POINT_copy(dest, src);
140
5.16k
        }
141
8.25k
        void freePoint(EC_POINT* point) {
142
8.25k
            /* noret */ EC_POINT_free(point);
143
8.25k
        }
144
145
5.66k
        EC_POINT* copy(void) {
146
5.66k
            bool doCopyPoint = true;
147
5.66k
            try {
148
5.66k
                doCopyPoint = ds.Get<bool>();
149
5.66k
            } catch ( fuzzing::datasource::Datasource::OutOfData ) { }
150
151
5.66k
            if ( doCopyPoint == true ) {
152
5.16k
                EC_POINT* tmpPoint = newPoint();
153
5.16k
                if ( tmpPoint != nullptr ) {
154
5.16k
                    if ( copyPoint(tmpPoint, point) == 1 ) {
155
                        /* Copy succeeded, free the old point */
156
5.16k
                        freePoint(point);
157
158
                        /* Use the copied point */
159
5.16k
                        point = tmpPoint;
160
5.16k
                    } else {
161
0
                        freePoint(tmpPoint);
162
0
                    }
163
5.16k
                }
164
5.16k
            }
165
166
5.66k
            return point;
167
5.66k
        }
168
169
1.56k
        bool set(OpenSSL_bignum::Bignum& pub_x, OpenSSL_bignum::Bignum& pub_y) {
170
1.56k
            bool ret = false;
171
172
1.56k
            CF_CHECK_NE(EC_POINT_set_affine_coordinates(group->GetPtr(), GetPtr(), pub_x.GetPtr(), pub_y.GetPtr(), nullptr), 0);
173
174
1.11k
            ret = true;
175
1.56k
end:
176
1.56k
            return ret;
177
1.11k
        }
178
179
    public:
180
        EC_POINT_Copier(Datasource& ds, std::shared_ptr<EC_GROUP_Copier> group) :
181
3.08k
            group(group), ds(ds) {
182
3.08k
            point = newPoint();
183
3.08k
            if ( point == nullptr ) {
184
0
                abort();
185
0
            }
186
3.08k
        }
187
188
1.56k
        bool Set(OpenSSL_bignum::Bignum& pub_x, OpenSSL_bignum::Bignum& pub_y) {
189
1.56k
            return set(pub_x, pub_y);
190
1.56k
        }
191
192
1.61k
        bool Set(const component::Bignum& pub_x, const component::Bignum& pub_y) {
193
1.61k
            bool ret = false;
194
195
1.61k
            OpenSSL_bignum::Bignum _pub_x(ds), _pub_y(ds);
196
197
1.61k
            CF_CHECK_EQ(_pub_x.Set(pub_x.ToString(ds)), true);
198
1.59k
            CF_CHECK_EQ(_pub_y.Set(pub_y.ToString(ds)), true);
199
200
1.56k
            CF_CHECK_TRUE(Set(_pub_x, _pub_y));
201
202
1.11k
            ret = true;
203
1.61k
end:
204
1.61k
            return ret;
205
1.11k
        }
206
207
128
        bool Get(OpenSSL_bignum::Bignum& pub_x, OpenSSL_bignum::Bignum& pub_y) {
208
128
            bool ret = false;
209
210
128
            CF_CHECK_NE(EC_POINT_get_affine_coordinates(group->GetPtr(), GetPtr(), pub_x.GetDestPtr(), pub_y.GetDestPtr(), nullptr), 0);
211
212
116
            ret = true;
213
128
end:
214
128
            return ret;
215
116
        }
216
217
128
        std::optional<component::ECC_Point> Get(void) {
218
128
            std::optional<component::ECC_Point> ret = std::nullopt;
219
220
128
            char* x_str = nullptr;
221
128
            char* y_str = nullptr;
222
223
128
            OpenSSL_bignum::Bignum x(ds);
224
128
            OpenSSL_bignum::Bignum y(ds);
225
226
128
            CF_CHECK_EQ(x.New(), true);
227
128
            CF_CHECK_EQ(y.New(), true);
228
229
128
            CF_CHECK_TRUE(Get(x, y));
230
231
116
            CF_CHECK_NE(x_str = BN_bn2dec(x.GetPtr()), nullptr);
232
116
            CF_CHECK_NE(y_str = BN_bn2dec(y.GetPtr()), nullptr);
233
234
116
            ret = { std::string(x_str), std::string(y_str) };
235
236
128
end:
237
128
            OPENSSL_free(x_str);
238
128
            OPENSSL_free(y_str);
239
240
128
            return ret;
241
116
        }
242
243
5.66k
        EC_POINT* GetPtr(void) {
244
5.66k
            return copy();
245
5.66k
        }
246
247
3.08k
        ~EC_POINT_Copier() {
248
3.08k
            freePoint(point);
249
3.08k
        }
250
};
251
252
#if !defined(CRYPTOFUZZ_OPENSSL_102)
253
1.55k
template<> EVP_MD_CTX* CTX_Copier<EVP_MD_CTX>::newCTX(void) const { return EVP_MD_CTX_new(); }
254
#else
255
template<> EVP_MD_CTX* CTX_Copier<EVP_MD_CTX>::newCTX(void) const {
256
    EVP_MD_CTX* ret = (EVP_MD_CTX*)malloc(sizeof(*ret));
257
    EVP_MD_CTX_init(ret);
258
    return ret;
259
}
260
#endif
261
262
0
template<> int CTX_Copier<EVP_MD_CTX>::copyCTX(EVP_MD_CTX* dest, EVP_MD_CTX* src) const { return EVP_MD_CTX_copy(dest, src); }
263
264
#if !defined(CRYPTOFUZZ_OPENSSL_102)
265
1.55k
template<> void CTX_Copier<EVP_MD_CTX>::freeCTX(EVP_MD_CTX* ctx) const { EVP_MD_CTX_free(ctx); }
266
#else
267
template<> void CTX_Copier<EVP_MD_CTX>::freeCTX(EVP_MD_CTX* ctx) const { EVP_MD_CTX_cleanup(ctx); free(ctx); }
268
#endif
269
270
5.16k
template<> EVP_CIPHER_CTX* CTX_Copier<EVP_CIPHER_CTX>::newCTX(void) const { return EVP_CIPHER_CTX_new(); }
271
0
template<> int CTX_Copier<EVP_CIPHER_CTX>::copyCTX(EVP_CIPHER_CTX* dest, EVP_CIPHER_CTX* src) const {
272
#if !defined(CRYPTOFUZZ_WOLFCRYPT_OPENSSL)
273
    return EVP_CIPHER_CTX_copy(dest, src);
274
#else
275
0
    (void)dest;
276
0
    (void)src;
277
278
    /* EVP_CIPHER_CTX_copy is not implemented in wolfCrypt; return failure */
279
0
    return 0;
280
0
#endif
281
0
}
282
5.16k
template<> void CTX_Copier<EVP_CIPHER_CTX>::freeCTX(EVP_CIPHER_CTX* ctx) const { return EVP_CIPHER_CTX_free(ctx); }
283
284
#if !defined(CRYPTOFUZZ_OPENSSL_102)
285
141
template<> HMAC_CTX* CTX_Copier<HMAC_CTX>::newCTX(void) const { return HMAC_CTX_new(); }
286
0
template<> int CTX_Copier<HMAC_CTX>::copyCTX(HMAC_CTX* dest, HMAC_CTX* src) const { return HMAC_CTX_copy(dest, src); }
287
141
template<> void CTX_Copier<HMAC_CTX>::freeCTX(HMAC_CTX* ctx) const { return HMAC_CTX_free(ctx); }
288
#endif
289
290
715
template<> CMAC_CTX* CTX_Copier<CMAC_CTX>::newCTX(void) const { return CMAC_CTX_new(); }
291
0
template<> int CTX_Copier<CMAC_CTX>::copyCTX(CMAC_CTX* dest, CMAC_CTX* src) const {
292
0
    (void)dest;
293
0
    (void)src;
294
0
    return 0;
295
0
}
296
715
template<> void CTX_Copier<CMAC_CTX>::freeCTX(CMAC_CTX* ctx) const { return CMAC_CTX_free(ctx); }
297
298
2.58k
template<> EC_KEY* CTX_Copier<EC_KEY>::newCTX(void) const { return EC_KEY_new(); }
299
0
template<> int CTX_Copier<EC_KEY>::copyCTX(EC_KEY* dest, EC_KEY* src) const {
300
#if !defined(CRYPTOFUZZ_BORINGSSL) && !defined(CRYPTOFUZZ_WOLFCRYPT_OPENSSL)
301
    return EC_KEY_copy(dest, src) == nullptr ? 0 : 1;
302
#else
303
0
    (void)dest;
304
0
    (void)src;
305
0
    return 0;
306
0
#endif
307
0
}
308
2.58k
template<> void CTX_Copier<EC_KEY>::freeCTX(EC_KEY* ctx) const { return EC_KEY_free(ctx); }
309
310
using CF_EVP_MD_CTX = CTX_Copier<EVP_MD_CTX>;
311
using CF_EVP_CIPHER_CTX = CTX_Copier<EVP_CIPHER_CTX>;
312
using CF_HMAC_CTX = CTX_Copier<HMAC_CTX>;
313
using CF_CMAC_CTX = CTX_Copier<CMAC_CTX>;
314
using CF_EC_KEY = CTX_Copier<EC_KEY>;
315
using CF_EC_POINT = EC_POINT_Copier;
316
using CF_EC_GROUP = EC_GROUP_Copier;
317
} /* namespace module */
318
} /* namespace cryptofuzz */