/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  | 4.42k  | std::optional<component::Bignum> libgmp::OpBignumCalc(operation::BignumCalc& op) { | 
25  | 4.42k  |     std::optional<component::Bignum> ret = std::nullopt;  | 
26  | 4.42k  |     Datasource ds(op.modifier.GetPtr(), op.modifier.GetSize());  | 
27  | 4.42k  |     std::unique_ptr<libgmp_bignum::Operation> opRunner = nullptr;  | 
28  |  |  | 
29  | 4.42k  |     libgmp_bignum::BignumCluster bn{ds, | 
30  | 4.42k  |         libgmp_bignum::Bignum(),  | 
31  | 4.42k  |         libgmp_bignum::Bignum(),  | 
32  | 4.42k  |         libgmp_bignum::Bignum(),  | 
33  | 4.42k  |         libgmp_bignum::Bignum()  | 
34  | 4.42k  |     };  | 
35  | 4.42k  |     libgmp_bignum::Bignum res;  | 
36  |  |  | 
37  | 4.42k  |     if ( op.calcOp.Is(CF_CALCOP("Set(A)")) ) { | 
38  | 0  |         CF_CHECK_EQ(res.Set("0"), true); | 
39  | 4.42k  |     } else { | 
40  | 4.42k  |         CF_NORET(res.Randomize(ds));  | 
41  | 4.42k  |     }  | 
42  | 4.42k  |     CF_CHECK_EQ(bn.Set(0, op.bn0.ToString(ds)), true);  | 
43  | 4.42k  |     CF_CHECK_EQ(bn.Set(1, op.bn1.ToString(ds)), true);  | 
44  | 4.42k  |     CF_CHECK_EQ(bn.Set(2, op.bn2.ToString(ds)), true);  | 
45  | 4.42k  |     CF_CHECK_EQ(bn.Set(3, op.bn3.ToString(ds)), true);  | 
46  |  |  | 
47  |  |  | 
48  | 4.42k  |     switch ( op.calcOp.Get() ) { | 
49  | 73  |         case    CF_CALCOP("Add(A,B)"): | 
50  | 73  |             opRunner = std::make_unique<libgmp_bignum::Add>();  | 
51  | 73  |             break;  | 
52  | 173  |         case    CF_CALCOP("Sub(A,B)"): | 
53  | 173  |             opRunner = std::make_unique<libgmp_bignum::Sub>();  | 
54  | 173  |             break;  | 
55  | 121  |         case    CF_CALCOP("Mul(A,B)"): | 
56  | 121  |             opRunner = std::make_unique<libgmp_bignum::Mul>();  | 
57  | 121  |             break;  | 
58  | 0  |         case    CF_CALCOP("Div(A,B)"): | 
59  | 0  |             opRunner = std::make_unique<libgmp_bignum::Div>();  | 
60  | 0  |             break;  | 
61  | 0  |         case    CF_CALCOP("ExpMod(A,B,C)"): | 
62  | 0  |             opRunner = std::make_unique<libgmp_bignum::ExpMod>();  | 
63  | 0  |             break;  | 
64  | 756  |         case    CF_CALCOP("GCD(A,B)"): | 
65  | 756  |             opRunner = std::make_unique<libgmp_bignum::GCD>();  | 
66  | 756  |             break;  | 
67  | 74  |         case    CF_CALCOP("ExtGCD_X(A,B)"): | 
68  | 74  |             opRunner = std::make_unique<libgmp_bignum::ExtGCD_X>();  | 
69  | 74  |             break;  | 
70  | 83  |         case    CF_CALCOP("ExtGCD_Y(A,B)"): | 
71  | 83  |             opRunner = std::make_unique<libgmp_bignum::ExtGCD_Y>();  | 
72  | 83  |             break;  | 
73  | 0  |         case    CF_CALCOP("Jacobi(A,B)"): | 
74  | 0  |             opRunner = std::make_unique<libgmp_bignum::Jacobi>();  | 
75  | 0  |             break;  | 
76  | 0  |         case    CF_CALCOP("Cmp(A,B)"): | 
77  | 0  |             opRunner = std::make_unique<libgmp_bignum::Cmp>();  | 
78  | 0  |             break;  | 
79  | 0  |         case    CF_CALCOP("LCM(A,B)"): | 
80  | 0  |             opRunner = std::make_unique<libgmp_bignum::LCM>();  | 
81  | 0  |             break;  | 
82  | 30  |         case    CF_CALCOP("Xor(A,B)"): | 
83  | 30  |             opRunner = std::make_unique<libgmp_bignum::Xor>();  | 
84  | 30  |             break;  | 
85  | 26  |         case    CF_CALCOP("And(A,B)"): | 
86  | 26  |             opRunner = std::make_unique<libgmp_bignum::And>();  | 
87  | 26  |             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  | 329  |         case    CF_CALCOP("Sqr(A)"): | 
101  | 329  |             opRunner = std::make_unique<libgmp_bignum::Sqr>();  | 
102  | 329  |             break;  | 
103  | 0  |         case    CF_CALCOP("CmpAbs(A,B)"): | 
104  | 0  |             opRunner = std::make_unique<libgmp_bignum::CmpAbs>();  | 
105  | 0  |             break;  | 
106  | 5  |         case    CF_CALCOP("IsZero(A)"): | 
107  | 5  |             opRunner = std::make_unique<libgmp_bignum::IsZero>();  | 
108  | 5  |             break;  | 
109  | 0  |         case    CF_CALCOP("IsNeg(A)"): | 
110  | 0  |             opRunner = std::make_unique<libgmp_bignum::IsNeg>();  | 
111  | 0  |             break;  | 
112  | 200  |         case    CF_CALCOP("AddMod(A,B,C)"): | 
113  | 200  |             opRunner = std::make_unique<libgmp_bignum::AddMod>();  | 
114  | 200  |             break;  | 
115  | 246  |         case    CF_CALCOP("SubMod(A,B,C)"): | 
116  | 246  |             opRunner = std::make_unique<libgmp_bignum::SubMod>();  | 
117  | 246  |             break;  | 
118  | 123  |         case    CF_CALCOP("MulMod(A,B,C)"): | 
119  | 123  |             opRunner = std::make_unique<libgmp_bignum::MulMod>();  | 
120  | 123  |             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  | 73  |         case    CF_CALCOP("Bit(A,B)"): | 
146  | 73  |             opRunner = std::make_unique<libgmp_bignum::Bit>();  | 
147  | 73  |             break;  | 
148  | 1.45k  |         case    CF_CALCOP("InvMod(A,B)"): | 
149  | 1.45k  |             opRunner = std::make_unique<libgmp_bignum::InvMod>();  | 
150  | 1.45k  |             break;  | 
151  | 10  |         case    CF_CALCOP("IsOdd(A)"): | 
152  | 10  |             opRunner = std::make_unique<libgmp_bignum::IsOdd>();  | 
153  | 10  |             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  | 26  |         case    CF_CALCOP("Or(A,B)"): | 
188  | 26  |             opRunner = std::make_unique<libgmp_bignum::Or>();  | 
189  | 26  |             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  | 283  |         case    CF_CALCOP("Mod(A,B)"): | 
215  | 283  |             opRunner = std::make_unique<libgmp_bignum::Mod>();  | 
216  | 283  |             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  | 4.42k  |     }  | 
230  |  |  | 
231  | 4.42k  |     CF_CHECK_NE(opRunner, nullptr);  | 
232  | 4.08k  |     CF_CHECK_EQ(opRunner->Run(ds, res, bn), true);  | 
233  |  |  | 
234  | 3.92k  |     ret = res.ToComponentBignum();  | 
235  |  |  | 
236  | 4.42k  | end:  | 
237  | 4.42k  |     return ret;  | 
238  | 3.92k  | }  | 
239  |  |  | 
240  |  | } /* namespace module */  | 
241  |  | } /* namespace cryptofuzz */  |