Coverage Report

Created: 2024-09-11 06:39

/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 {
37
0
            (void)module;
38
0
            (void)op;
39
0
            ::abort();
40
0
        }
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
41
42
        void abort(std::vector<std::string> moduleNames, const std::string operation, const std::string algorithm, const std::string reason) const;
43
    public:
44
        void Run(Datasource& parentDs, const uint8_t* data, const size_t size) const;
45
        ExecutorBase(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
46
        virtual ~ExecutorBase();
47
};
48
49
class ExecutorBignumCalc : public ExecutorBase<component::Bignum, operation::BignumCalc> {
50
    private:
51
        std::optional<component::Bignum> callModule(std::shared_ptr<Module> module, operation::BignumCalc& op) const override;
52
    protected:
53
        std::optional<component::Bignum> modulo = std::nullopt;
54
    public:
55
        ExecutorBignumCalc(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
56
        void SetModulo(const std::string& modulo);
57
};
58
59
class ExecutorBignumCalc_Mod_BLS12_381_R : public ExecutorBignumCalc {
60
    public:
61
        ExecutorBignumCalc_Mod_BLS12_381_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
62
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
63
};
64
65
class ExecutorBignumCalc_Mod_BLS12_381_P : public ExecutorBignumCalc {
66
    public:
67
        ExecutorBignumCalc_Mod_BLS12_381_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
68
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
69
};
70
71
class ExecutorBignumCalc_Mod_BLS12_377_R : public ExecutorBignumCalc {
72
    public:
73
        ExecutorBignumCalc_Mod_BLS12_377_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
74
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
75
};
76
77
class ExecutorBignumCalc_Mod_BLS12_377_P : public ExecutorBignumCalc {
78
    public:
79
        ExecutorBignumCalc_Mod_BLS12_377_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
80
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
81
};
82
83
class ExecutorBignumCalc_Mod_BN128_R : public ExecutorBignumCalc {
84
    public:
85
        ExecutorBignumCalc_Mod_BN128_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
86
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
87
};
88
89
class ExecutorBignumCalc_Mod_BN128_P : public ExecutorBignumCalc {
90
    public:
91
        ExecutorBignumCalc_Mod_BN128_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
92
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
93
};
94
95
class ExecutorBignumCalc_Mod_Vesta_R : public ExecutorBignumCalc {
96
    public:
97
        ExecutorBignumCalc_Mod_Vesta_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
98
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
99
};
100
101
class ExecutorBignumCalc_Mod_Vesta_P : public ExecutorBignumCalc {
102
    public:
103
        ExecutorBignumCalc_Mod_Vesta_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
104
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
105
};
106
107
class ExecutorBignumCalc_Mod_ED25519 : public ExecutorBignumCalc {
108
    public:
109
        ExecutorBignumCalc_Mod_ED25519(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
110
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
111
};
112
113
class ExecutorBignumCalc_Mod_Edwards_R : public ExecutorBignumCalc {
114
    public:
115
        ExecutorBignumCalc_Mod_Edwards_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
116
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
117
};
118
119
class ExecutorBignumCalc_Mod_Edwards_P : public ExecutorBignumCalc {
120
    public:
121
        ExecutorBignumCalc_Mod_Edwards_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
122
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
123
};
124
125
class ExecutorBignumCalc_Mod_Goldilocks : public ExecutorBignumCalc {
126
    public:
127
        ExecutorBignumCalc_Mod_Goldilocks(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
128
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
129
};
130
131
class ExecutorBignumCalc_Mod_MNT4_R : public ExecutorBignumCalc {
132
    public:
133
        ExecutorBignumCalc_Mod_MNT4_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
134
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
135
};
136
137
class ExecutorBignumCalc_Mod_MNT4_P : public ExecutorBignumCalc {
138
    public:
139
        ExecutorBignumCalc_Mod_MNT4_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
140
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
141
};
142
143
class ExecutorBignumCalc_Mod_MNT6_R : public ExecutorBignumCalc {
144
    public:
145
        ExecutorBignumCalc_Mod_MNT6_R(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
146
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
147
};
148
149
class ExecutorBignumCalc_Mod_MNT6_P : public ExecutorBignumCalc {
150
    public:
151
        ExecutorBignumCalc_Mod_MNT6_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
152
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
153
};
154
155
class ExecutorBignumCalc_Mod_2Exp64 : public ExecutorBignumCalc {
156
    public:
157
        ExecutorBignumCalc_Mod_2Exp64(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
158
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
159
};
160
161
class ExecutorBignumCalc_Mod_2Exp128 : public ExecutorBignumCalc {
162
    public:
163
        ExecutorBignumCalc_Mod_2Exp128(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
164
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
165
};
166
167
class ExecutorBignumCalc_Mod_2Exp256 : public ExecutorBignumCalc {
168
    public:
169
        ExecutorBignumCalc_Mod_2Exp256(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
170
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
171
};
172
173
class ExecutorBignumCalc_Mod_2Exp512 : public ExecutorBignumCalc {
174
    public:
175
        ExecutorBignumCalc_Mod_2Exp512(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
176
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
177
};
178
179
class ExecutorBignumCalc_Mod_SECP256K1 : public ExecutorBignumCalc {
180
    public:
181
        ExecutorBignumCalc_Mod_SECP256K1(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
182
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
183
};
184
185
class ExecutorBignumCalc_Mod_SECP256K1_P : public ExecutorBignumCalc {
186
    public:
187
        ExecutorBignumCalc_Mod_SECP256K1_P(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
188
        operation::BignumCalc getOpPostprocess(Datasource* parentDs, operation::BignumCalc op) const override;
189
};
190
191
class ExecutorBignumCalc_Fp2 : public ExecutorBase<component::Fp2, operation::BignumCalc_Fp2> {
192
    private:
193
        std::optional<component::Fp2> callModule(std::shared_ptr<Module> module, operation::BignumCalc_Fp2& op) const override;
194
    protected:
195
        std::optional<component::Bignum> modulo = std::nullopt;
196
    public:
197
        ExecutorBignumCalc_Fp2(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
198
        void SetModulo(const std::string& modulo);
199
};
200
201
class ExecutorBignumCalc_Fp12 : public ExecutorBase<component::Fp12, operation::BignumCalc_Fp12> {
202
    private:
203
        std::optional<component::Fp12> callModule(std::shared_ptr<Module> module, operation::BignumCalc_Fp12& op) const override;
204
    protected:
205
        std::optional<component::Bignum> modulo = std::nullopt;
206
    public:
207
        ExecutorBignumCalc_Fp12(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
208
        void SetModulo(const std::string& modulo);
209
};
210
211
/* Declare aliases */
212
using ExecutorDigest = ExecutorBase<component::Digest, operation::Digest>;
213
using ExecutorHMAC = ExecutorBase<component::MAC, operation::HMAC>;
214
using ExecutorUMAC = ExecutorBase<component::MAC, operation::UMAC>;
215
using ExecutorCMAC = ExecutorBase<component::MAC, operation::CMAC>;
216
using ExecutorSymmetricEncrypt = ExecutorBase<component::Ciphertext, operation::SymmetricEncrypt>;
217
using ExecutorSymmetricDecrypt = ExecutorBase<component::Cleartext, operation::SymmetricDecrypt>;
218
using ExecutorKDF_SCRYPT = ExecutorBase<component::Key, operation::KDF_SCRYPT>;
219
using ExecutorKDF_HKDF = ExecutorBase<component::Key, operation::KDF_HKDF>;
220
using ExecutorKDF_TLS1_PRF = ExecutorBase<component::Key, operation::KDF_TLS1_PRF>;
221
using ExecutorKDF_PBKDF = ExecutorBase<component::Key, operation::KDF_PBKDF>;
222
using ExecutorKDF_PBKDF1 = ExecutorBase<component::Key, operation::KDF_PBKDF1>;
223
using ExecutorKDF_PBKDF2 = ExecutorBase<component::Key, operation::KDF_PBKDF2>;
224
using ExecutorKDF_ARGON2 = ExecutorBase<component::Key, operation::KDF_ARGON2>;
225
using ExecutorKDF_SSH = ExecutorBase<component::Key, operation::KDF_SSH>;
226
using ExecutorKDF_X963 = ExecutorBase<component::Key, operation::KDF_X963>;
227
using ExecutorKDF_BCRYPT = ExecutorBase<component::Key, operation::KDF_BCRYPT>;
228
using ExecutorKDF_SP_800_108 = ExecutorBase<component::Key, operation::KDF_SP_800_108>;
229
using ExecutorKDF_SRTP = ExecutorBase<component::Key3, operation::KDF_SRTP>;
230
using ExecutorKDF_SRTCP = ExecutorBase<component::Key3, operation::KDF_SRTCP>;
231
using ExecutorECC_PrivateToPublic = ExecutorBase<component::ECC_PublicKey, operation::ECC_PrivateToPublic>;
232
using ExecutorECC_ValidatePubkey = ExecutorBase<bool, operation::ECC_ValidatePubkey>;
233
using ExecutorECC_GenerateKeyPair = ExecutorBase<component::ECC_KeyPair, operation::ECC_GenerateKeyPair>;
234
using ExecutorECCSI_Sign = ExecutorBase<component::ECCSI_Signature, operation::ECCSI_Sign>;
235
using ExecutorECDSA_Sign = ExecutorBase<component::ECDSA_Signature, operation::ECDSA_Sign>;
236
using ExecutorECGDSA_Sign = ExecutorBase<component::ECGDSA_Signature, operation::ECGDSA_Sign>;
237
using ExecutorECRDSA_Sign = ExecutorBase<component::ECRDSA_Signature, operation::ECRDSA_Sign>;
238
using ExecutorSchnorr_Sign = ExecutorBase<component::Schnorr_Signature, operation::Schnorr_Sign>;
239
using ExecutorECCSI_Verify = ExecutorBase<bool, operation::ECCSI_Verify>;
240
using ExecutorECDSA_Verify = ExecutorBase<bool, operation::ECDSA_Verify>;
241
using ExecutorECGDSA_Verify = ExecutorBase<bool, operation::ECGDSA_Verify>;
242
using ExecutorECRDSA_Verify = ExecutorBase<bool, operation::ECRDSA_Verify>;
243
using ExecutorSchnorr_Verify = ExecutorBase<bool, operation::Schnorr_Verify>;
244
using ExecutorECDSA_Recover = ExecutorBase<component::ECC_PublicKey, operation::ECDSA_Recover>;
245
using ExecutorDSA_Verify = ExecutorBase<bool, operation::DSA_Verify>;
246
using ExecutorDSA_Sign = ExecutorBase<component::DSA_Signature, operation::DSA_Sign>;
247
using ExecutorDSA_GenerateParameters = ExecutorBase<component::DSA_Parameters, operation::DSA_GenerateParameters>;
248
using ExecutorDSA_PrivateToPublic = ExecutorBase<component::Bignum, operation::DSA_PrivateToPublic>;
249
using ExecutorDSA_GenerateKeyPair = ExecutorBase<component::DSA_KeyPair, operation::DSA_GenerateKeyPair>;
250
using ExecutorECDH_Derive = ExecutorBase<component::Secret, operation::ECDH_Derive>;
251
using ExecutorECIES_Encrypt = ExecutorBase<component::Ciphertext, operation::ECIES_Encrypt>;
252
using ExecutorECIES_Decrypt = ExecutorBase<component::Cleartext, operation::ECIES_Decrypt>;
253
using ExecutorECC_Point_Add = ExecutorBase<component::ECC_Point, operation::ECC_Point_Add>;
254
using ExecutorECC_Point_Sub = ExecutorBase<component::ECC_Point, operation::ECC_Point_Sub>;
255
using ExecutorECC_Point_Mul = ExecutorBase<component::ECC_Point, operation::ECC_Point_Mul>;
256
using ExecutorECC_Point_Neg = ExecutorBase<component::ECC_Point, operation::ECC_Point_Neg>;
257
using ExecutorECC_Point_Dbl = ExecutorBase<component::ECC_Point, operation::ECC_Point_Dbl>;
258
using ExecutorECC_Point_Cmp = ExecutorBase<bool, operation::ECC_Point_Cmp>;
259
using ExecutorDH_GenerateKeyPair = ExecutorBase<component::DH_KeyPair, operation::DH_GenerateKeyPair>;
260
using ExecutorDH_Derive = ExecutorBase<component::Bignum, operation::DH_Derive>;
261
using ExecutorBLS_PrivateToPublic = ExecutorBase<component::BLS_PublicKey, operation::BLS_PrivateToPublic>;
262
using ExecutorBLS_PrivateToPublic_G2 = ExecutorBase<component::G2, operation::BLS_PrivateToPublic_G2>;
263
using ExecutorBLS_Sign = ExecutorBase<component::BLS_Signature, operation::BLS_Sign>;
264
using ExecutorBLS_Verify = ExecutorBase<bool, operation::BLS_Verify>;
265
using ExecutorBLS_BatchSign = ExecutorBase<component::BLS_BatchSignature, operation::BLS_BatchSign>;
266
using ExecutorBLS_BatchVerify = ExecutorBase<bool, operation::BLS_BatchVerify>;
267
using ExecutorBLS_Aggregate_G1 = ExecutorBase<component::G1, operation::BLS_Aggregate_G1>;
268
using ExecutorBLS_Aggregate_G2 = ExecutorBase<component::G2, operation::BLS_Aggregate_G2>;
269
using ExecutorBLS_Pairing = ExecutorBase<component::Fp12, operation::BLS_Pairing>;
270
using ExecutorBLS_MillerLoop = ExecutorBase<component::Fp12, operation::BLS_MillerLoop>;
271
using ExecutorBLS_FinalExp = ExecutorBase<component::Fp12, operation::BLS_FinalExp>;
272
using ExecutorBLS_HashToG1 = ExecutorBase<component::G1, operation::BLS_HashToG1>;
273
using ExecutorBLS_HashToG2 = ExecutorBase<component::G2, operation::BLS_HashToG2>;
274
using ExecutorBLS_MapToG1 = ExecutorBase<component::G1, operation::BLS_MapToG1>;
275
using ExecutorBLS_MapToG2 = ExecutorBase<component::G2, operation::BLS_MapToG2>;
276
using ExecutorBLS_IsG1OnCurve = ExecutorBase<bool, operation::BLS_IsG1OnCurve>;
277
using ExecutorBLS_IsG2OnCurve = ExecutorBase<bool, operation::BLS_IsG2OnCurve>;
278
using ExecutorBLS_GenerateKeyPair = ExecutorBase<component::BLS_KeyPair, operation::BLS_GenerateKeyPair>;
279
using ExecutorBLS_Decompress_G1 = ExecutorBase<component::G1, operation::BLS_Decompress_G1>;
280
using ExecutorBLS_Compress_G1 = ExecutorBase<component::Bignum, operation::BLS_Compress_G1>;
281
using ExecutorBLS_Decompress_G2 = ExecutorBase<component::G2, operation::BLS_Decompress_G2>;
282
using ExecutorBLS_Compress_G2 = ExecutorBase<component::G1, operation::BLS_Compress_G2>;
283
using ExecutorBLS_G1_Add = ExecutorBase<component::G1, operation::BLS_G1_Add>;
284
using ExecutorBLS_G1_Mul = ExecutorBase<component::G1, operation::BLS_G1_Mul>;
285
using ExecutorBLS_G1_IsEq = ExecutorBase<bool, operation::BLS_G1_IsEq>;
286
using ExecutorBLS_G1_Neg = ExecutorBase<component::G1, operation::BLS_G1_Neg>;
287
using ExecutorBLS_G2_Add = ExecutorBase<component::G2, operation::BLS_G2_Add>;
288
using ExecutorBLS_G2_Mul = ExecutorBase<component::G2, operation::BLS_G2_Mul>;
289
using ExecutorBLS_G2_IsEq = ExecutorBase<bool, operation::BLS_G2_IsEq>;
290
using ExecutorBLS_G2_Neg = ExecutorBase<component::G2, operation::BLS_G2_Neg>;
291
using ExecutorBLS_G1_MultiExp = ExecutorBase<component::G1, operation::BLS_G1_MultiExp>;
292
using ExecutorMisc = ExecutorBase<Buffer, operation::Misc>;
293
using ExecutorSR25519_Verify = ExecutorBase<bool, operation::SR25519_Verify>;
294
295
} /* namespace cryptofuzz */