Coverage Report

Created: 2024-06-28 06:19

/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
    /* noret */ gmp_randinit_default(libgmp_detail::rng_state);
20
    /* noret */ gmp_randseed_ui(libgmp_detail::rng_state, rand());
21
2
#endif
22
2
}
23
24
7.60k
std::optional<component::Bignum> libgmp::OpBignumCalc(operation::BignumCalc& op) {
25
7.60k
    std::optional<component::Bignum> ret = std::nullopt;
26
7.60k
    Datasource ds(op.modifier.GetPtr(), op.modifier.GetSize());
27
7.60k
    std::unique_ptr<libgmp_bignum::Operation> opRunner = nullptr;
28
29
7.60k
    libgmp_bignum::BignumCluster bn{ds,
30
7.60k
        libgmp_bignum::Bignum(),
31
7.60k
        libgmp_bignum::Bignum(),
32
7.60k
        libgmp_bignum::Bignum(),
33
7.60k
        libgmp_bignum::Bignum()
34
7.60k
    };
35
7.60k
    libgmp_bignum::Bignum res;
36
37
7.60k
    if ( op.calcOp.Is(CF_CALCOP("Set(A)")) ) {
38
0
        CF_CHECK_EQ(res.Set("0"), true);
39
7.60k
    } else {
40
7.60k
        CF_NORET(res.Randomize(ds));
41
7.60k
    }
42
7.60k
    CF_CHECK_EQ(bn.Set(0, op.bn0.ToString(ds)), true);
43
7.60k
    CF_CHECK_EQ(bn.Set(1, op.bn1.ToString(ds)), true);
44
7.60k
    CF_CHECK_EQ(bn.Set(2, op.bn2.ToString(ds)), true);
45
7.60k
    CF_CHECK_EQ(bn.Set(3, op.bn3.ToString(ds)), true);
46
47
48
7.60k
    switch ( op.calcOp.Get() ) {
49
100
        case    CF_CALCOP("Add(A,B)"):
50
100
            opRunner = std::make_unique<libgmp_bignum::Add>();
51
100
            break;
52
268
        case    CF_CALCOP("Sub(A,B)"):
53
268
            opRunner = std::make_unique<libgmp_bignum::Sub>();
54
268
            break;
55
124
        case    CF_CALCOP("Mul(A,B)"):
56
124
            opRunner = std::make_unique<libgmp_bignum::Mul>();
57
124
            break;
58
355
        case    CF_CALCOP("Div(A,B)"):
59
355
            opRunner = std::make_unique<libgmp_bignum::Div>();
60
355
            break;
61
2.17k
        case    CF_CALCOP("ExpMod(A,B,C)"):
62
2.17k
            opRunner = std::make_unique<libgmp_bignum::ExpMod>();
63
2.17k
            break;
64
854
        case    CF_CALCOP("GCD(A,B)"):
65
854
            opRunner = std::make_unique<libgmp_bignum::GCD>();
66
854
            break;
67
75
        case    CF_CALCOP("ExtGCD_X(A,B)"):
68
75
            opRunner = std::make_unique<libgmp_bignum::ExtGCD_X>();
69
75
            break;
70
48
        case    CF_CALCOP("ExtGCD_Y(A,B)"):
71
48
            opRunner = std::make_unique<libgmp_bignum::ExtGCD_Y>();
72
48
            break;
73
0
        case    CF_CALCOP("Jacobi(A,B)"):
74
0
            opRunner = std::make_unique<libgmp_bignum::Jacobi>();
75
0
            break;
76
152
        case    CF_CALCOP("Cmp(A,B)"):
77
152
            opRunner = std::make_unique<libgmp_bignum::Cmp>();
78
152
            break;
79
0
        case    CF_CALCOP("LCM(A,B)"):
80
0
            opRunner = std::make_unique<libgmp_bignum::LCM>();
81
0
            break;
82
33
        case    CF_CALCOP("Xor(A,B)"):
83
33
            opRunner = std::make_unique<libgmp_bignum::Xor>();
84
33
            break;
85
34
        case    CF_CALCOP("And(A,B)"):
86
34
            opRunner = std::make_unique<libgmp_bignum::And>();
87
34
            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
166
        case    CF_CALCOP("Sqr(A)"):
101
166
            opRunner = std::make_unique<libgmp_bignum::Sqr>();
102
166
            break;
103
0
        case    CF_CALCOP("CmpAbs(A,B)"):
104
0
            opRunner = std::make_unique<libgmp_bignum::CmpAbs>();
105
0
            break;
106
11
        case    CF_CALCOP("IsZero(A)"):
107
11
            opRunner = std::make_unique<libgmp_bignum::IsZero>();
108
11
            break;
109
0
        case    CF_CALCOP("IsNeg(A)"):
110
0
            opRunner = std::make_unique<libgmp_bignum::IsNeg>();
111
0
            break;
112
147
        case    CF_CALCOP("AddMod(A,B,C)"):
113
147
            opRunner = std::make_unique<libgmp_bignum::AddMod>();
114
147
            break;
115
230
        case    CF_CALCOP("SubMod(A,B,C)"):
116
230
            opRunner = std::make_unique<libgmp_bignum::SubMod>();
117
230
            break;
118
91
        case    CF_CALCOP("MulMod(A,B,C)"):
119
91
            opRunner = std::make_unique<libgmp_bignum::MulMod>();
120
91
            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
83
        case    CF_CALCOP("Bit(A,B)"):
146
83
            opRunner = std::make_unique<libgmp_bignum::Bit>();
147
83
            break;
148
1.94k
        case    CF_CALCOP("InvMod(A,B)"):
149
1.94k
            opRunner = std::make_unique<libgmp_bignum::InvMod>();
150
1.94k
            break;
151
14
        case    CF_CALCOP("IsOdd(A)"):
152
14
            opRunner = std::make_unique<libgmp_bignum::IsOdd>();
153
14
            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
39
        case    CF_CALCOP("Or(A,B)"):
188
39
            opRunner = std::make_unique<libgmp_bignum::Or>();
189
39
            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
163
        case    CF_CALCOP("Mod(A,B)"):
215
163
            opRunner = std::make_unique<libgmp_bignum::Mod>();
216
163
            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
75
        case    CF_CALCOP("NumBits(A)"):
230
75
            opRunner = std::make_unique<libgmp_bignum::NumBits>();
231
75
            break;
232
12
        case    CF_CALCOP("CondAdd(A,B,C)"):
233
12
            opRunner = std::make_unique<libgmp_bignum::CondAdd>();
234
12
            break;
235
34
        case    CF_CALCOP("CondSub(A,B,C)"):
236
34
            opRunner = std::make_unique<libgmp_bignum::CondSub>();
237
34
            break;
238
0
        case    CF_CALCOP("RandRange(A,B)"):
239
0
            opRunner = std::make_unique<libgmp_bignum::RandRange>();
240
0
            break;
241
7.60k
    }
242
243
7.60k
    CF_CHECK_NE(opRunner, nullptr);
244
7.22k
    CF_CHECK_EQ(opRunner->Run(ds, res, bn), true);
245
246
6.72k
    ret = res.ToComponentBignum();
247
248
7.60k
end:
249
7.60k
    return ret;
250
6.72k
}
251
252
} /* namespace module */
253
} /* namespace cryptofuzz */