Coverage Report

Created: 2025-03-09 06:52

/src/cryptofuzz/modules/libgmp/module.cpp
Line
Count
Source (jump to first uncovered line)
1
#include "module.h"
2
#include <cryptofuzz/util.h>
3
#include <cryptofuzz/repository.h>
4
#include <fuzzing/datasource/id.hpp>
5
#include "bn_ops.h"
6
7
namespace cryptofuzz {
8
namespace module {
9
10
#if !defined(HAVE_MINI_GMP)
11
namespace libgmp_detail {
12
    gmp_randstate_t rng_state;
13
}
14
#endif
15
16
libgmp::libgmp(void) :
17
2
    Module("libgmp") {
18
2
#if !defined(HAVE_MINI_GMP)
19
2
    /* noret */ gmp_randinit_default(libgmp_detail::rng_state);
20
2
    /* noret */ gmp_randseed_ui(libgmp_detail::rng_state, rand());
21
2
#endif
22
2
}
23
24
13.8k
std::optional<component::Bignum> libgmp::OpBignumCalc(operation::BignumCalc& op) {
25
13.8k
    std::optional<component::Bignum> ret = std::nullopt;
26
13.8k
    Datasource ds(op.modifier.GetPtr(), op.modifier.GetSize());
27
13.8k
    std::unique_ptr<libgmp_bignum::Operation> opRunner = nullptr;
28
29
13.8k
    libgmp_bignum::BignumCluster bn{ds,
30
13.8k
        libgmp_bignum::Bignum(),
31
13.8k
        libgmp_bignum::Bignum(),
32
13.8k
        libgmp_bignum::Bignum(),
33
13.8k
        libgmp_bignum::Bignum()
34
13.8k
    };
35
13.8k
    libgmp_bignum::Bignum res;
36
37
13.8k
    if ( op.calcOp.Is(CF_CALCOP("Set(A)")) ) {
38
69
        CF_CHECK_EQ(res.Set("0"), true);
39
13.7k
    } else {
40
13.7k
        CF_NORET(res.Randomize(ds));
41
13.7k
    }
42
13.8k
    CF_CHECK_EQ(bn.Set(0, op.bn0.ToString(ds)), true);
43
13.8k
    CF_CHECK_EQ(bn.Set(1, op.bn1.ToString(ds)), true);
44
13.8k
    CF_CHECK_EQ(bn.Set(2, op.bn2.ToString(ds)), true);
45
13.7k
    CF_CHECK_EQ(bn.Set(3, op.bn3.ToString(ds)), true);
46
47
48
13.7k
    switch ( op.calcOp.Get() ) {
49
121
        case    CF_CALCOP("Add(A,B)"):
50
121
            opRunner = std::make_unique<libgmp_bignum::Add>();
51
121
            break;
52
148
        case    CF_CALCOP("Sub(A,B)"):
53
148
            opRunner = std::make_unique<libgmp_bignum::Sub>();
54
148
            break;
55
115
        case    CF_CALCOP("Mul(A,B)"):
56
115
            opRunner = std::make_unique<libgmp_bignum::Mul>();
57
115
            break;
58
335
        case    CF_CALCOP("Div(A,B)"):
59
335
            opRunner = std::make_unique<libgmp_bignum::Div>();
60
335
            break;
61
1.63k
        case    CF_CALCOP("ExpMod(A,B,C)"):
62
1.63k
            opRunner = std::make_unique<libgmp_bignum::ExpMod>();
63
1.63k
            break;
64
522
        case    CF_CALCOP("GCD(A,B)"):
65
522
            opRunner = std::make_unique<libgmp_bignum::GCD>();
66
522
            break;
67
41
        case    CF_CALCOP("ExtGCD_X(A,B)"):
68
41
            opRunner = std::make_unique<libgmp_bignum::ExtGCD_X>();
69
41
            break;
70
35
        case    CF_CALCOP("ExtGCD_Y(A,B)"):
71
35
            opRunner = std::make_unique<libgmp_bignum::ExtGCD_Y>();
72
35
            break;
73
1.19k
        case    CF_CALCOP("Jacobi(A,B)"):
74
1.19k
            opRunner = std::make_unique<libgmp_bignum::Jacobi>();
75
1.19k
            break;
76
94
        case    CF_CALCOP("Cmp(A,B)"):
77
94
            opRunner = std::make_unique<libgmp_bignum::Cmp>();
78
94
            break;
79
305
        case    CF_CALCOP("LCM(A,B)"):
80
305
            opRunner = std::make_unique<libgmp_bignum::LCM>();
81
305
            break;
82
99
        case    CF_CALCOP("Xor(A,B)"):
83
99
            opRunner = std::make_unique<libgmp_bignum::Xor>();
84
99
            break;
85
124
        case    CF_CALCOP("And(A,B)"):
86
124
            opRunner = std::make_unique<libgmp_bignum::And>();
87
124
            break;
88
25
        case    CF_CALCOP("Abs(A)"):
89
25
            opRunner = std::make_unique<libgmp_bignum::Abs>();
90
25
            break;
91
21
        case    CF_CALCOP("Neg(A)"):
92
21
            opRunner = std::make_unique<libgmp_bignum::Neg>();
93
21
            break;
94
124
        case    CF_CALCOP("Sqrt(A)"):
95
124
            opRunner = std::make_unique<libgmp_bignum::Sqrt>();
96
124
            break;
97
569
        case    CF_CALCOP("SqrtCeil(A)"):
98
569
            opRunner = std::make_unique<libgmp_bignum::SqrtCeil>();
99
569
            break;
100
16
        case    CF_CALCOP("Sqr(A)"):
101
16
            opRunner = std::make_unique<libgmp_bignum::Sqr>();
102
16
            break;
103
45
        case    CF_CALCOP("CmpAbs(A,B)"):
104
45
            opRunner = std::make_unique<libgmp_bignum::CmpAbs>();
105
45
            break;
106
5
        case    CF_CALCOP("IsZero(A)"):
107
5
            opRunner = std::make_unique<libgmp_bignum::IsZero>();
108
5
            break;
109
17
        case    CF_CALCOP("IsNeg(A)"):
110
17
            opRunner = std::make_unique<libgmp_bignum::IsNeg>();
111
17
            break;
112
44
        case    CF_CALCOP("AddMod(A,B,C)"):
113
44
            opRunner = std::make_unique<libgmp_bignum::AddMod>();
114
44
            break;
115
53
        case    CF_CALCOP("SubMod(A,B,C)"):
116
53
            opRunner = std::make_unique<libgmp_bignum::SubMod>();
117
53
            break;
118
49
        case    CF_CALCOP("MulMod(A,B,C)"):
119
49
            opRunner = std::make_unique<libgmp_bignum::MulMod>();
120
49
            break;
121
21
        case    CF_CALCOP("SqrMod(A,B)"):
122
21
            opRunner = std::make_unique<libgmp_bignum::SqrMod>();
123
21
            break;
124
4
        case    CF_CALCOP("Mod_NIST_192(A)"):
125
4
            opRunner = std::make_unique<libgmp_bignum::Mod_NIST_192>();
126
4
            break;
127
6
        case    CF_CALCOP("Mod_NIST_224(A)"):
128
6
            opRunner = std::make_unique<libgmp_bignum::Mod_NIST_224>();
129
6
            break;
130
3
        case    CF_CALCOP("Mod_NIST_256(A)"):
131
3
            opRunner = std::make_unique<libgmp_bignum::Mod_NIST_256>();
132
3
            break;
133
55
        case    CF_CALCOP("Mod_NIST_384(A)"):
134
55
            opRunner = std::make_unique<libgmp_bignum::Mod_NIST_384>();
135
55
            break;
136
6
        case    CF_CALCOP("Mod_NIST_521(A)"):
137
6
            opRunner = std::make_unique<libgmp_bignum::Mod_NIST_521>();
138
6
            break;
139
24
        case    CF_CALCOP("SetBit(A,B)"):
140
24
            opRunner = std::make_unique<libgmp_bignum::SetBit>();
141
24
            break;
142
34
        case    CF_CALCOP("ClearBit(A,B)"):
143
34
            opRunner = std::make_unique<libgmp_bignum::ClearBit>();
144
34
            break;
145
17
        case    CF_CALCOP("Bit(A,B)"):
146
17
            opRunner = std::make_unique<libgmp_bignum::Bit>();
147
17
            break;
148
1.37k
        case    CF_CALCOP("InvMod(A,B)"):
149
1.37k
            opRunner = std::make_unique<libgmp_bignum::InvMod>();
150
1.37k
            break;
151
2
        case    CF_CALCOP("IsOdd(A)"):
152
2
            opRunner = std::make_unique<libgmp_bignum::IsOdd>();
153
2
            break;
154
7
        case    CF_CALCOP("IsEven(A)"):
155
7
            opRunner = std::make_unique<libgmp_bignum::IsEven>();
156
7
            break;
157
5
        case    CF_CALCOP("IsPow2(A)"):
158
5
            opRunner = std::make_unique<libgmp_bignum::IsPow2>();
159
5
            break;
160
12
        case    CF_CALCOP("NumLSZeroBits(A)"):
161
12
            opRunner = std::make_unique<libgmp_bignum::NumLSZeroBits>();
162
12
            break;
163
15
        case    CF_CALCOP("Factorial(A)"):
164
15
            opRunner = std::make_unique<libgmp_bignum::Factorial>();
165
15
            break;
166
145
        case    CF_CALCOP("Cbrt(A)"):
167
145
            opRunner = std::make_unique<libgmp_bignum::Cbrt>();
168
145
            break;
169
10
        case    CF_CALCOP("SqrtRem(A)"):
170
10
            opRunner = std::make_unique<libgmp_bignum::SqrtRem>();
171
10
            break;
172
380
        case    CF_CALCOP("CbrtRem(A)"):
173
380
            opRunner = std::make_unique<libgmp_bignum::CbrtRem>();
174
380
            break;
175
156
        case    CF_CALCOP("Nthrt(A,B)"):
176
156
            opRunner = std::make_unique<libgmp_bignum::Nthrt>();
177
156
            break;
178
59
        case    CF_CALCOP("NthrtRem(A,B)"):
179
59
            opRunner = std::make_unique<libgmp_bignum::NthrtRem>();
180
59
            break;
181
85
        case    CF_CALCOP("IsSquare(A)"):
182
85
            opRunner = std::make_unique<libgmp_bignum::IsSquare>();
183
85
            break;
184
138
        case    CF_CALCOP("Exp(A,B)"):
185
138
            opRunner = std::make_unique<libgmp_bignum::Exp>();
186
138
            break;
187
125
        case    CF_CALCOP("Or(A,B)"):
188
125
            opRunner = std::make_unique<libgmp_bignum::Or>();
189
125
            break;
190
123
        case    CF_CALCOP("AddMul(A,B,C)"):
191
123
            opRunner = std::make_unique<libgmp_bignum::AddMul>();
192
123
            break;
193
48
        case    CF_CALCOP("SubMul(A,B,C)"):
194
48
            opRunner = std::make_unique<libgmp_bignum::SubMul>();
195
48
            break;
196
9
        case    CF_CALCOP("Primorial(A)"):
197
9
            opRunner = std::make_unique<libgmp_bignum::Primorial>();
198
9
            break;
199
113
        case    CF_CALCOP("Lucas(A)"):
200
113
            opRunner = std::make_unique<libgmp_bignum::Lucas>();
201
113
            break;
202
85
        case    CF_CALCOP("Fibonacci(A)"):
203
85
            opRunner = std::make_unique<libgmp_bignum::Fibonacci>();
204
85
            break;
205
69
        case    CF_CALCOP("Set(A)"):
206
69
            opRunner = std::make_unique<libgmp_bignum::Set>();
207
69
            break;
208
1.16k
        case    CF_CALCOP("BinCoeff(A,B)"):
209
1.16k
            opRunner = std::make_unique<libgmp_bignum::BinCoeff>();
210
1.16k
            break;
211
36
        case    CF_CALCOP("HamDist(A,B)"):
212
36
            opRunner = std::make_unique<libgmp_bignum::HamDist>();
213
36
            break;
214
77
        case    CF_CALCOP("Mod(A,B)"):
215
77
            opRunner = std::make_unique<libgmp_bignum::Mod>();
216
77
            break;
217
537
        case    CF_CALCOP("IsPower(A)"):
218
537
            opRunner = std::make_unique<libgmp_bignum::IsPower>();
219
537
            break;
220
1.28k
        case    CF_CALCOP("Prime()"):
221
1.28k
            opRunner = std::make_unique<libgmp_bignum::Prime>();
222
1.28k
            break;
223
758
        case    CF_CALCOP("IsPrime(A)"):
224
758
            opRunner = std::make_unique<libgmp_bignum::IsPrime>();
225
758
            break;
226
48
        case    CF_CALCOP("Rand()"):
227
48
            opRunner = std::make_unique<libgmp_bignum::Rand>();
228
48
            break;
229
8
        case    CF_CALCOP("NumBits(A)"):
230
8
            opRunner = std::make_unique<libgmp_bignum::NumBits>();
231
8
            break;
232
7
        case    CF_CALCOP("CondAdd(A,B,C)"):
233
7
            opRunner = std::make_unique<libgmp_bignum::CondAdd>();
234
7
            break;
235
17
        case    CF_CALCOP("CondSub(A,B,C)"):
236
17
            opRunner = std::make_unique<libgmp_bignum::CondSub>();
237
17
            break;
238
40
        case    CF_CALCOP("RandRange(A,B)"):
239
40
            opRunner = std::make_unique<libgmp_bignum::RandRange>();
240
40
            break;
241
13.7k
    }
242
243
13.7k
    CF_CHECK_NE(opRunner, nullptr);
244
12.8k
    CF_CHECK_EQ(opRunner->Run(ds, res, bn), true);
245
246
11.6k
    ret = res.ToComponentBignum();
247
248
13.8k
end:
249
13.8k
    return ret;
250
11.6k
}
251
252
} /* namespace module */
253
} /* namespace cryptofuzz */