Coverage Report

Created: 2022-08-24 06:30

/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_BN128_R : public ExecutorBignumCalc {
68
    public:
69
        ExecutorBignumCalc_Mod_BN128_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_BN128_P : public ExecutorBignumCalc {
74
    public:
75
        ExecutorBignumCalc_Mod_BN128_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_ED25519 : public ExecutorBignumCalc {
80
    public:
81
        ExecutorBignumCalc_Mod_ED25519(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_Edwards_R : public ExecutorBignumCalc {
86
    public:
87
        ExecutorBignumCalc_Mod_Edwards_R(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_Edwards_P : public ExecutorBignumCalc {
92
    public:
93
        ExecutorBignumCalc_Mod_Edwards_P(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_MNT4_R : public ExecutorBignumCalc {
98
    public:
99
        ExecutorBignumCalc_Mod_MNT4_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_MNT4_P : public ExecutorBignumCalc {
104
    public:
105
        ExecutorBignumCalc_Mod_MNT4_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_MNT6_R : public ExecutorBignumCalc {
110
    public:
111
        ExecutorBignumCalc_Mod_MNT6_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_MNT6_P : public ExecutorBignumCalc {
116
    public:
117
        ExecutorBignumCalc_Mod_MNT6_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_2Exp64 : public ExecutorBignumCalc {
122
    public:
123
        ExecutorBignumCalc_Mod_2Exp64(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_2Exp128 : public ExecutorBignumCalc {
128
    public:
129
        ExecutorBignumCalc_Mod_2Exp128(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_2Exp256 : public ExecutorBignumCalc {
134
    public:
135
        ExecutorBignumCalc_Mod_2Exp256(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_2Exp512 : public ExecutorBignumCalc {
140
    public:
141
        ExecutorBignumCalc_Mod_2Exp512(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_SECP256K1 : public ExecutorBignumCalc {
146
    public:
147
        ExecutorBignumCalc_Mod_SECP256K1(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_SECP256K1_P : public ExecutorBignumCalc {
152
    public:
153
        ExecutorBignumCalc_Mod_SECP256K1_P(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_Fp2 : public ExecutorBase<component::Fp2, operation::BignumCalc_Fp2> {
158
    private:
159
        std::optional<component::Fp2> callModule(std::shared_ptr<Module> module, operation::BignumCalc_Fp2& op) const override;
160
    protected:
161
        std::optional<component::Bignum> modulo = std::nullopt;
162
    public:
163
        ExecutorBignumCalc_Fp2(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
164
        void SetModulo(const std::string& modulo);
165
};
166
167
class ExecutorBignumCalc_Fp12 : public ExecutorBase<component::Fp12, operation::BignumCalc_Fp12> {
168
    private:
169
        std::optional<component::Fp12> callModule(std::shared_ptr<Module> module, operation::BignumCalc_Fp12& op) const override;
170
    protected:
171
        std::optional<component::Bignum> modulo = std::nullopt;
172
    public:
173
        ExecutorBignumCalc_Fp12(const uint64_t operationID, const std::map<uint64_t, std::shared_ptr<Module> >& modules, const Options& options);
174
        void SetModulo(const std::string& modulo);
175
};
176
177
/* Declare aliases */
178
using ExecutorDigest = ExecutorBase<component::Digest, operation::Digest>;
179
using ExecutorHMAC = ExecutorBase<component::MAC, operation::HMAC>;
180
using ExecutorUMAC = ExecutorBase<component::MAC, operation::UMAC>;
181
using ExecutorCMAC = ExecutorBase<component::MAC, operation::CMAC>;
182
using ExecutorSymmetricEncrypt = ExecutorBase<component::Ciphertext, operation::SymmetricEncrypt>;
183
using ExecutorSymmetricDecrypt = ExecutorBase<component::Cleartext, operation::SymmetricDecrypt>;
184
using ExecutorKDF_SCRYPT = ExecutorBase<component::Key, operation::KDF_SCRYPT>;
185
using ExecutorKDF_HKDF = ExecutorBase<component::Key, operation::KDF_HKDF>;
186
using ExecutorKDF_TLS1_PRF = ExecutorBase<component::Key, operation::KDF_TLS1_PRF>;
187
using ExecutorKDF_PBKDF = ExecutorBase<component::Key, operation::KDF_PBKDF>;
188
using ExecutorKDF_PBKDF1 = ExecutorBase<component::Key, operation::KDF_PBKDF1>;
189
using ExecutorKDF_PBKDF2 = ExecutorBase<component::Key, operation::KDF_PBKDF2>;
190
using ExecutorKDF_ARGON2 = ExecutorBase<component::Key, operation::KDF_ARGON2>;
191
using ExecutorKDF_SSH = ExecutorBase<component::Key, operation::KDF_SSH>;
192
using ExecutorKDF_X963 = ExecutorBase<component::Key, operation::KDF_X963>;
193
using ExecutorKDF_BCRYPT = ExecutorBase<component::Key, operation::KDF_BCRYPT>;
194
using ExecutorKDF_SP_800_108 = ExecutorBase<component::Key, operation::KDF_SP_800_108>;
195
using ExecutorECC_PrivateToPublic = ExecutorBase<component::ECC_PublicKey, operation::ECC_PrivateToPublic>;
196
using ExecutorECC_ValidatePubkey = ExecutorBase<bool, operation::ECC_ValidatePubkey>;
197
using ExecutorECC_GenerateKeyPair = ExecutorBase<component::ECC_KeyPair, operation::ECC_GenerateKeyPair>;
198
using ExecutorECDSA_Sign = ExecutorBase<component::ECDSA_Signature, operation::ECDSA_Sign>;
199
using ExecutorECGDSA_Sign = ExecutorBase<component::ECGDSA_Signature, operation::ECGDSA_Sign>;
200
using ExecutorECRDSA_Sign = ExecutorBase<component::ECRDSA_Signature, operation::ECRDSA_Sign>;
201
using ExecutorSchnorr_Sign = ExecutorBase<component::Schnorr_Signature, operation::Schnorr_Sign>;
202
using ExecutorECDSA_Verify = ExecutorBase<bool, operation::ECDSA_Verify>;
203
using ExecutorECGDSA_Verify = ExecutorBase<bool, operation::ECGDSA_Verify>;
204
using ExecutorECRDSA_Verify = ExecutorBase<bool, operation::ECRDSA_Verify>;
205
using ExecutorSchnorr_Verify = ExecutorBase<bool, operation::Schnorr_Verify>;
206
using ExecutorECDSA_Recover = ExecutorBase<component::ECC_PublicKey, operation::ECDSA_Recover>;
207
using ExecutorECDH_Derive = ExecutorBase<component::Secret, operation::ECDH_Derive>;
208
using ExecutorECIES_Encrypt = ExecutorBase<component::Ciphertext, operation::ECIES_Encrypt>;
209
using ExecutorECIES_Decrypt = ExecutorBase<component::Cleartext, operation::ECIES_Decrypt>;
210
using ExecutorECC_Point_Add = ExecutorBase<component::ECC_Point, operation::ECC_Point_Add>;
211
using ExecutorECC_Point_Mul = ExecutorBase<component::ECC_Point, operation::ECC_Point_Mul>;
212
using ExecutorECC_Point_Neg = ExecutorBase<component::ECC_Point, operation::ECC_Point_Neg>;
213
using ExecutorECC_Point_Dbl = ExecutorBase<component::ECC_Point, operation::ECC_Point_Dbl>;
214
using ExecutorDH_GenerateKeyPair = ExecutorBase<component::DH_KeyPair, operation::DH_GenerateKeyPair>;
215
using ExecutorDH_Derive = ExecutorBase<component::Bignum, operation::DH_Derive>;
216
using ExecutorBLS_PrivateToPublic = ExecutorBase<component::BLS_PublicKey, operation::BLS_PrivateToPublic>;
217
using ExecutorBLS_PrivateToPublic_G2 = ExecutorBase<component::G2, operation::BLS_PrivateToPublic_G2>;
218
using ExecutorBLS_Sign = ExecutorBase<component::BLS_Signature, operation::BLS_Sign>;
219
using ExecutorBLS_Verify = ExecutorBase<bool, operation::BLS_Verify>;
220
using ExecutorBLS_BatchSign = ExecutorBase<component::BLS_BatchSignature, operation::BLS_BatchSign>;
221
using ExecutorBLS_BatchVerify = ExecutorBase<bool, operation::BLS_BatchVerify>;
222
using ExecutorBLS_Aggregate_G1 = ExecutorBase<component::G1, operation::BLS_Aggregate_G1>;
223
using ExecutorBLS_Aggregate_G2 = ExecutorBase<component::G2, operation::BLS_Aggregate_G2>;
224
using ExecutorBLS_Pairing = ExecutorBase<component::Fp12, operation::BLS_Pairing>;
225
using ExecutorBLS_MillerLoop = ExecutorBase<component::Fp12, operation::BLS_MillerLoop>;
226
using ExecutorBLS_FinalExp = ExecutorBase<component::Fp12, operation::BLS_FinalExp>;
227
using ExecutorBLS_HashToG1 = ExecutorBase<component::G1, operation::BLS_HashToG1>;
228
using ExecutorBLS_HashToG2 = ExecutorBase<component::G2, operation::BLS_HashToG2>;
229
using ExecutorBLS_MapToG1 = ExecutorBase<component::G1, operation::BLS_MapToG1>;
230
using ExecutorBLS_MapToG2 = ExecutorBase<component::G2, operation::BLS_MapToG2>;
231
using ExecutorBLS_IsG1OnCurve = ExecutorBase<bool, operation::BLS_IsG1OnCurve>;
232
using ExecutorBLS_IsG2OnCurve = ExecutorBase<bool, operation::BLS_IsG2OnCurve>;
233
using ExecutorBLS_GenerateKeyPair = ExecutorBase<component::BLS_KeyPair, operation::BLS_GenerateKeyPair>;
234
using ExecutorBLS_Decompress_G1 = ExecutorBase<component::G1, operation::BLS_Decompress_G1>;
235
using ExecutorBLS_Compress_G1 = ExecutorBase<component::Bignum, operation::BLS_Compress_G1>;
236
using ExecutorBLS_Decompress_G2 = ExecutorBase<component::G2, operation::BLS_Decompress_G2>;
237
using ExecutorBLS_Compress_G2 = ExecutorBase<component::G1, operation::BLS_Compress_G2>;
238
using ExecutorBLS_G1_Add = ExecutorBase<component::G1, operation::BLS_G1_Add>;
239
using ExecutorBLS_G1_Mul = ExecutorBase<component::G1, operation::BLS_G1_Mul>;
240
using ExecutorBLS_G1_IsEq = ExecutorBase<bool, operation::BLS_G1_IsEq>;
241
using ExecutorBLS_G1_Neg = ExecutorBase<component::G1, operation::BLS_G1_Neg>;
242
using ExecutorBLS_G2_Add = ExecutorBase<component::G2, operation::BLS_G2_Add>;
243
using ExecutorBLS_G2_Mul = ExecutorBase<component::G2, operation::BLS_G2_Mul>;
244
using ExecutorBLS_G2_IsEq = ExecutorBase<bool, operation::BLS_G2_IsEq>;
245
using ExecutorBLS_G2_Neg = ExecutorBase<component::G2, operation::BLS_G2_Neg>;
246
using ExecutorMisc = ExecutorBase<Buffer, operation::Misc>;
247
using ExecutorSR25519_Verify = ExecutorBase<bool, operation::SR25519_Verify>;
248
249
} /* namespace cryptofuzz */