Coverage Report

Created: 2025-04-11 06:45

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