/src/cryptofuzz/executor.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <cryptofuzz/module.h> |
4 | | #include <cryptofuzz/options.h> |
5 | | #include <cstddef> |
6 | | #include <cstdint> |
7 | | #include <fuzzing/datasource/datasource.hpp> |
8 | | #include <map> |
9 | | #include <memory> |
10 | | #include <utility> |
11 | | #include <vector> |
12 | | |
13 | | namespace cryptofuzz { |
14 | | |
15 | | template <class ResultType, class OperationType> |
16 | | class ExecutorBase { |
17 | | private: |
18 | | const uint64_t operationID; |
19 | | const std::map<uint64_t, std::shared_ptr<Module> > modules; |
20 | | protected: |
21 | | const Options& options; |
22 | | private: |
23 | | using ResultPair = std::pair< std::shared_ptr<Module>, std::optional<ResultType> >; |
24 | | using ResultSet = std::vector<ResultPair>; |
25 | | |
26 | | ResultSet filter(const ResultSet& results) const; |
27 | | bool dontCompare(const OperationType& operation) const; |
28 | | void compare(const std::vector< std::pair<std::shared_ptr<Module>, OperationType> >& operations, const ResultSet& results, const uint8_t* data, const size_t size) const; |
29 | | OperationType getOp(Datasource* parentDs, const uint8_t* data, const size_t size) const; |
30 | | virtual OperationType getOpPostprocess(Datasource* parentDs, OperationType op) const; |
31 | | std::shared_ptr<Module> getModule(Datasource& ds) const; |
32 | | |
33 | | /* To be implemented by specializations of ExecutorBase */ |
34 | | void updateExtraCounters(const uint64_t moduleID, OperationType& op) const; |
35 | | void postprocess(std::shared_ptr<Module> module, OperationType& op, const ResultPair& result) const; |
36 | 0 | virtual std::optional<ResultType> callModule(std::shared_ptr<Module> module, OperationType& op) const { ::abort(); } Unexecuted instantiation: cryptofuzz::ExecutorBase<cryptofuzz::Bignum, cryptofuzz::operation::BignumCalc>::callModule(std::__1::shared_ptr<cryptofuzz::Module>, cryptofuzz::operation::BignumCalc&) const Unexecuted instantiation: cryptofuzz::ExecutorBase<cryptofuzz::component::BignumPair, cryptofuzz::operation::BignumCalc_Fp2>::callModule(std::__1::shared_ptr<cryptofuzz::Module>, cryptofuzz::operation::BignumCalc_Fp2&) const Unexecuted instantiation: cryptofuzz::ExecutorBase<cryptofuzz::component::Fp12, cryptofuzz::operation::BignumCalc_Fp12>::callModule(std::__1::shared_ptr<cryptofuzz::Module>, cryptofuzz::operation::BignumCalc_Fp12&) const |
37 | | |
38 | | void abort(std::vector<std::string> moduleNames, const std::string operation, const std::string algorithm, const std::string reason) const; |
39 | | public: |
40 | | void Run(Datasource& parentDs, const uint8_t* data, const size_t size) const; |
41 | | ExecutorBase(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
42 | | virtual ~ExecutorBase(); |
43 | | }; |
44 | | |
45 | | class ExecutorBignumCalc : public ExecutorBase<component::Bignum, operation::BignumCalc> { |
46 | | private: |
47 | | std::optional<component::Bignum> callModule(std::shared_ptr<Module> module, operation::BignumCalc& op) const override; |
48 | | protected: |
49 | | std::optional<component::Bignum> modulo = std::nullopt; |
50 | | public: |
51 | | ExecutorBignumCalc(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
52 | | void SetModulo(const std::string& modulo); |
53 | | }; |
54 | | |
55 | | class ExecutorBignumCalc_Mod_BLS12_381_R : public ExecutorBignumCalc { |
56 | | public: |
57 | | ExecutorBignumCalc_Mod_BLS12_381_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
58 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
59 | | }; |
60 | | |
61 | | class ExecutorBignumCalc_Mod_BLS12_381_P : public ExecutorBignumCalc { |
62 | | public: |
63 | | ExecutorBignumCalc_Mod_BLS12_381_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
64 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
65 | | }; |
66 | | |
67 | | class ExecutorBignumCalc_Mod_BLS12_377_R : public ExecutorBignumCalc { |
68 | | public: |
69 | | ExecutorBignumCalc_Mod_BLS12_377_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
70 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
71 | | }; |
72 | | |
73 | | class ExecutorBignumCalc_Mod_BLS12_377_P : public ExecutorBignumCalc { |
74 | | public: |
75 | | ExecutorBignumCalc_Mod_BLS12_377_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
76 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
77 | | }; |
78 | | |
79 | | class ExecutorBignumCalc_Mod_BN128_R : public ExecutorBignumCalc { |
80 | | public: |
81 | | ExecutorBignumCalc_Mod_BN128_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
82 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
83 | | }; |
84 | | |
85 | | class ExecutorBignumCalc_Mod_BN128_P : public ExecutorBignumCalc { |
86 | | public: |
87 | | ExecutorBignumCalc_Mod_BN128_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
88 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
89 | | }; |
90 | | |
91 | | class ExecutorBignumCalc_Mod_ED25519 : public ExecutorBignumCalc { |
92 | | public: |
93 | | ExecutorBignumCalc_Mod_ED25519(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
94 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
95 | | }; |
96 | | |
97 | | class ExecutorBignumCalc_Mod_Edwards_R : public ExecutorBignumCalc { |
98 | | public: |
99 | | ExecutorBignumCalc_Mod_Edwards_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
100 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
101 | | }; |
102 | | |
103 | | class ExecutorBignumCalc_Mod_Edwards_P : public ExecutorBignumCalc { |
104 | | public: |
105 | | ExecutorBignumCalc_Mod_Edwards_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
106 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
107 | | }; |
108 | | |
109 | | class ExecutorBignumCalc_Mod_MNT4_R : public ExecutorBignumCalc { |
110 | | public: |
111 | | ExecutorBignumCalc_Mod_MNT4_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
112 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
113 | | }; |
114 | | |
115 | | class ExecutorBignumCalc_Mod_MNT4_P : public ExecutorBignumCalc { |
116 | | public: |
117 | | ExecutorBignumCalc_Mod_MNT4_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
118 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
119 | | }; |
120 | | |
121 | | class ExecutorBignumCalc_Mod_MNT6_R : public ExecutorBignumCalc { |
122 | | public: |
123 | | ExecutorBignumCalc_Mod_MNT6_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
124 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
125 | | }; |
126 | | |
127 | | class ExecutorBignumCalc_Mod_MNT6_P : public ExecutorBignumCalc { |
128 | | public: |
129 | | ExecutorBignumCalc_Mod_MNT6_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
130 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
131 | | }; |
132 | | |
133 | | class ExecutorBignumCalc_Mod_2Exp64 : public ExecutorBignumCalc { |
134 | | public: |
135 | | ExecutorBignumCalc_Mod_2Exp64(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
136 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
137 | | }; |
138 | | |
139 | | class ExecutorBignumCalc_Mod_2Exp128 : public ExecutorBignumCalc { |
140 | | public: |
141 | | ExecutorBignumCalc_Mod_2Exp128(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
142 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
143 | | }; |
144 | | |
145 | | class ExecutorBignumCalc_Mod_2Exp256 : public ExecutorBignumCalc { |
146 | | public: |
147 | | ExecutorBignumCalc_Mod_2Exp256(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
148 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
149 | | }; |
150 | | |
151 | | class ExecutorBignumCalc_Mod_2Exp512 : public ExecutorBignumCalc { |
152 | | public: |
153 | | ExecutorBignumCalc_Mod_2Exp512(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
154 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
155 | | }; |
156 | | |
157 | | class ExecutorBignumCalc_Mod_SECP256K1 : public ExecutorBignumCalc { |
158 | | public: |
159 | | ExecutorBignumCalc_Mod_SECP256K1(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
160 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
161 | | }; |
162 | | |
163 | | class ExecutorBignumCalc_Mod_SECP256K1_P : public ExecutorBignumCalc { |
164 | | public: |
165 | | ExecutorBignumCalc_Mod_SECP256K1_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
166 | | operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override; |
167 | | }; |
168 | | |
169 | | class ExecutorBignumCalc_Fp2 : public ExecutorBase<component::Fp2, operation::BignumCalc_Fp2> { |
170 | | private: |
171 | | std::optional<component::Fp2> callModule(std::shared_ptr<Module> module, operation::BignumCalc_Fp2& op) const override; |
172 | | protected: |
173 | | std::optional<component::Bignum> modulo = std::nullopt; |
174 | | public: |
175 | | ExecutorBignumCalc_Fp2(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
176 | | void SetModulo(const std::string& modulo); |
177 | | }; |
178 | | |
179 | | class ExecutorBignumCalc_Fp12 : public ExecutorBase<component::Fp12, operation::BignumCalc_Fp12> { |
180 | | private: |
181 | | std::optional<component::Fp12> callModule(std::shared_ptr<Module> module, operation::BignumCalc_Fp12& op) const override; |
182 | | protected: |
183 | | std::optional<component::Bignum> modulo = std::nullopt; |
184 | | public: |
185 | | ExecutorBignumCalc_Fp12(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options); |
186 | | void SetModulo(const std::string& modulo); |
187 | | }; |
188 | | |
189 | | /* Declare aliases */ |
190 | | using ExecutorDigest = ExecutorBase<component::Digest, operation::Digest>; |
191 | | using ExecutorHMAC = ExecutorBase<component::MAC, operation::HMAC>; |
192 | | using ExecutorUMAC = ExecutorBase<component::MAC, operation::UMAC>; |
193 | | using ExecutorCMAC = ExecutorBase<component::MAC, operation::CMAC>; |
194 | | using ExecutorSymmetricEncrypt = ExecutorBase<component::Ciphertext, operation::SymmetricEncrypt>; |
195 | | using ExecutorSymmetricDecrypt = ExecutorBase<component::Cleartext, operation::SymmetricDecrypt>; |
196 | | using ExecutorKDF_SCRYPT = ExecutorBase<component::Key, operation::KDF_SCRYPT>; |
197 | | using ExecutorKDF_HKDF = ExecutorBase<component::Key, operation::KDF_HKDF>; |
198 | | using ExecutorKDF_TLS1_PRF = ExecutorBase<component::Key, operation::KDF_TLS1_PRF>; |
199 | | using ExecutorKDF_PBKDF = ExecutorBase<component::Key, operation::KDF_PBKDF>; |
200 | | using ExecutorKDF_PBKDF1 = ExecutorBase<component::Key, operation::KDF_PBKDF1>; |
201 | | using ExecutorKDF_PBKDF2 = ExecutorBase<component::Key, operation::KDF_PBKDF2>; |
202 | | using ExecutorKDF_ARGON2 = ExecutorBase<component::Key, operation::KDF_ARGON2>; |
203 | | using ExecutorKDF_SSH = ExecutorBase<component::Key, operation::KDF_SSH>; |
204 | | using ExecutorKDF_X963 = ExecutorBase<component::Key, operation::KDF_X963>; |
205 | | using ExecutorKDF_BCRYPT = ExecutorBase<component::Key, operation::KDF_BCRYPT>; |
206 | | using ExecutorKDF_SP_800_108 = ExecutorBase<component::Key, operation::KDF_SP_800_108>; |
207 | | using ExecutorECC_PrivateToPublic = ExecutorBase<component::ECC_PublicKey, operation::ECC_PrivateToPublic>; |
208 | | using ExecutorECC_ValidatePubkey = ExecutorBase<bool, operation::ECC_ValidatePubkey>; |
209 | | using ExecutorECC_GenerateKeyPair = ExecutorBase<component::ECC_KeyPair, operation::ECC_GenerateKeyPair>; |
210 | | using ExecutorECCSI_Sign = ExecutorBase<component::ECCSI_Signature, operation::ECCSI_Sign>; |
211 | | using ExecutorECDSA_Sign = ExecutorBase<component::ECDSA_Signature, operation::ECDSA_Sign>; |
212 | | using ExecutorECGDSA_Sign = ExecutorBase<component::ECGDSA_Signature, operation::ECGDSA_Sign>; |
213 | | using ExecutorECRDSA_Sign = ExecutorBase<component::ECRDSA_Signature, operation::ECRDSA_Sign>; |
214 | | using ExecutorSchnorr_Sign = ExecutorBase<component::Schnorr_Signature, operation::Schnorr_Sign>; |
215 | | using ExecutorECCSI_Verify = ExecutorBase<bool, operation::ECCSI_Verify>; |
216 | | using ExecutorECDSA_Verify = ExecutorBase<bool, operation::ECDSA_Verify>; |
217 | | using ExecutorECGDSA_Verify = ExecutorBase<bool, operation::ECGDSA_Verify>; |
218 | | using ExecutorECRDSA_Verify = ExecutorBase<bool, operation::ECRDSA_Verify>; |
219 | | using ExecutorSchnorr_Verify = ExecutorBase<bool, operation::Schnorr_Verify>; |
220 | | using ExecutorECDSA_Recover = ExecutorBase<component::ECC_PublicKey, operation::ECDSA_Recover>; |
221 | | using ExecutorDSA_Verify = ExecutorBase<bool, operation::DSA_Verify>; |
222 | | using ExecutorDSA_Sign = ExecutorBase<component::DSA_Signature, operation::DSA_Sign>; |
223 | | using ExecutorDSA_GenerateParameters = ExecutorBase<component::DSA_Parameters, operation::DSA_GenerateParameters>; |
224 | | using ExecutorDSA_PrivateToPublic = ExecutorBase<component::Bignum, operation::DSA_PrivateToPublic>; |
225 | | using ExecutorDSA_GenerateKeyPair = ExecutorBase<component::DSA_KeyPair, operation::DSA_GenerateKeyPair>; |
226 | | using ExecutorECDH_Derive = ExecutorBase<component::Secret, operation::ECDH_Derive>; |
227 | | using ExecutorECIES_Encrypt = ExecutorBase<component::Ciphertext, operation::ECIES_Encrypt>; |
228 | | using ExecutorECIES_Decrypt = ExecutorBase<component::Cleartext, operation::ECIES_Decrypt>; |
229 | | using ExecutorECC_Point_Add = ExecutorBase<component::ECC_Point, operation::ECC_Point_Add>; |
230 | | using ExecutorECC_Point_Mul = ExecutorBase<component::ECC_Point, operation::ECC_Point_Mul>; |
231 | | using ExecutorECC_Point_Neg = ExecutorBase<component::ECC_Point, operation::ECC_Point_Neg>; |
232 | | using ExecutorECC_Point_Dbl = ExecutorBase<component::ECC_Point, operation::ECC_Point_Dbl>; |
233 | | using ExecutorECC_Point_Cmp = ExecutorBase<bool, operation::ECC_Point_Cmp>; |
234 | | using ExecutorDH_GenerateKeyPair = ExecutorBase<component::DH_KeyPair, operation::DH_GenerateKeyPair>; |
235 | | using ExecutorDH_Derive = ExecutorBase<component::Bignum, operation::DH_Derive>; |
236 | | using ExecutorBLS_PrivateToPublic = ExecutorBase<component::BLS_PublicKey, operation::BLS_PrivateToPublic>; |
237 | | using ExecutorBLS_PrivateToPublic_G2 = ExecutorBase<component::G2, operation::BLS_PrivateToPublic_G2>; |
238 | | using ExecutorBLS_Sign = ExecutorBase<component::BLS_Signature, operation::BLS_Sign>; |
239 | | using ExecutorBLS_Verify = ExecutorBase<bool, operation::BLS_Verify>; |
240 | | using ExecutorBLS_BatchSign = ExecutorBase<component::BLS_BatchSignature, operation::BLS_BatchSign>; |
241 | | using ExecutorBLS_BatchVerify = ExecutorBase<bool, operation::BLS_BatchVerify>; |
242 | | using ExecutorBLS_Aggregate_G1 = ExecutorBase<component::G1, operation::BLS_Aggregate_G1>; |
243 | | using ExecutorBLS_Aggregate_G2 = ExecutorBase<component::G2, operation::BLS_Aggregate_G2>; |
244 | | using ExecutorBLS_Pairing = ExecutorBase<component::Fp12, operation::BLS_Pairing>; |
245 | | using ExecutorBLS_MillerLoop = ExecutorBase<component::Fp12, operation::BLS_MillerLoop>; |
246 | | using ExecutorBLS_FinalExp = ExecutorBase<component::Fp12, operation::BLS_FinalExp>; |
247 | | using ExecutorBLS_HashToG1 = ExecutorBase<component::G1, operation::BLS_HashToG1>; |
248 | | using ExecutorBLS_HashToG2 = ExecutorBase<component::G2, operation::BLS_HashToG2>; |
249 | | using ExecutorBLS_MapToG1 = ExecutorBase<component::G1, operation::BLS_MapToG1>; |
250 | | using ExecutorBLS_MapToG2 = ExecutorBase<component::G2, operation::BLS_MapToG2>; |
251 | | using ExecutorBLS_IsG1OnCurve = ExecutorBase<bool, operation::BLS_IsG1OnCurve>; |
252 | | using ExecutorBLS_IsG2OnCurve = ExecutorBase<bool, operation::BLS_IsG2OnCurve>; |
253 | | using ExecutorBLS_GenerateKeyPair = ExecutorBase<component::BLS_KeyPair, operation::BLS_GenerateKeyPair>; |
254 | | using ExecutorBLS_Decompress_G1 = ExecutorBase<component::G1, operation::BLS_Decompress_G1>; |
255 | | using ExecutorBLS_Compress_G1 = ExecutorBase<component::Bignum, operation::BLS_Compress_G1>; |
256 | | using ExecutorBLS_Decompress_G2 = ExecutorBase<component::G2, operation::BLS_Decompress_G2>; |
257 | | using ExecutorBLS_Compress_G2 = ExecutorBase<component::G1, operation::BLS_Compress_G2>; |
258 | | using ExecutorBLS_G1_Add = ExecutorBase<component::G1, operation::BLS_G1_Add>; |
259 | | using ExecutorBLS_G1_Mul = ExecutorBase<component::G1, operation::BLS_G1_Mul>; |
260 | | using ExecutorBLS_G1_IsEq = ExecutorBase<bool, operation::BLS_G1_IsEq>; |
261 | | using ExecutorBLS_G1_Neg = ExecutorBase<component::G1, operation::BLS_G1_Neg>; |
262 | | using ExecutorBLS_G2_Add = ExecutorBase<component::G2, operation::BLS_G2_Add>; |
263 | | using ExecutorBLS_G2_Mul = ExecutorBase<component::G2, operation::BLS_G2_Mul>; |
264 | | using ExecutorBLS_G2_IsEq = ExecutorBase<bool, operation::BLS_G2_IsEq>; |
265 | | using ExecutorBLS_G2_Neg = ExecutorBase<component::G2, operation::BLS_G2_Neg>; |
266 | | using ExecutorMisc = ExecutorBase<Buffer, operation::Misc>; |
267 | | using ExecutorSR25519_Verify = ExecutorBase<bool, operation::SR25519_Verify>; |
268 | | |
269 | | } /* namespace cryptofuzz */ |