Coverage Report

Created: 2023-02-22 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 { ::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 */