/src/cryptofuzz/components.cpp
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | #include <cryptofuzz/crypto.h>  | 
2  |  | #include <cryptofuzz/generic.h>  | 
3  |  | #include <cryptofuzz/components.h>  | 
4  |  | #include <cryptofuzz/util.h>  | 
5  |  | #include <boost/multiprecision/cpp_int.hpp>  | 
6  |  | #include <cryptofuzz/repository.h>  | 
7  |  | #include "third_party/json/json.hpp"  | 
8  |  | #include "config.h"  | 
9  |  |  | 
10  |  | namespace cryptofuzz { | 
11  |  |  | 
12  |  | /* Type */  | 
13  |  |  | 
14  |  | Type::Type(Datasource& ds) :  | 
15  |  |     type ( ds.Get<uint64_t>(0) )  | 
16  | 13.3k  | { } | 
17  |  |  | 
18  |  | Type::Type(const Type& other) :  | 
19  |  |     type(other.type)  | 
20  | 149k  | { } | 
21  |  |  | 
22  |  | Type::Type(nlohmann::json json) :  | 
23  |  |     type(json.get<uint64_t>())  | 
24  | 0  | { } | 
25  |  |  | 
26  | 136k  | uint64_t Type::Get(void) const { | 
27  | 136k  |     return type;  | 
28  | 136k  | }  | 
29  |  |  | 
30  | 54.3k  | bool Type::Is(const uint64_t t) const { | 
31  | 54.3k  |     return type == t;  | 
32  | 54.3k  | }  | 
33  |  |  | 
34  | 0  | bool Type::Is(const std::vector<uint64_t> t) const { | 
35  | 0  |     return std::find(t.begin(), t.end(), type) != t.end();  | 
36  | 0  | }  | 
37  |  |  | 
38  | 0  | nlohmann::json Type::ToJSON(void) const { | 
39  | 0  |     nlohmann::json j;  | 
40  |  |     /* Store as string, not as number, because JavaScript's number  | 
41  |  |      * type has only 53 bits of precision.  | 
42  |  |      */  | 
43  | 0  |     j = std::to_string(type);  | 
44  | 0  |     return j;  | 
45  | 0  | }  | 
46  |  |  | 
47  | 0  | bool Type::operator==(const Type& rhs) const { | 
48  | 0  |     return type == rhs.type;  | 
49  | 0  | }  | 
50  |  |  | 
51  | 0  | void Type::Serialize(Datasource& ds) const { | 
52  | 0  |     ds.Put<>(type);  | 
53  | 0  | }  | 
54  |  |  | 
55  |  | /* Buffer */  | 
56  |  |  | 
57  |  | Buffer::Buffer(Datasource& ds) :  | 
58  |  |     data( ds.GetData(0, 0, (10*1024*1024)) )  | 
59  | 34.7k  | { } | 
60  |  |  | 
61  | 0  | Buffer::Buffer(nlohmann::json json) { | 
62  | 0  |     const auto s = json.get<std::string>();  | 
63  | 0  |     boost::algorithm::unhex(s, std::back_inserter(data));  | 
64  | 0  | }  | 
65  |  |  | 
66  |  | Buffer::Buffer(const std::vector<uint8_t>& data) :  | 
67  |  |     data(data)  | 
68  | 838  | { } | 
69  |  |  | 
70  |  | Buffer::Buffer(const uint8_t* data, const size_t size) :  | 
71  |  |     data(data, data + size)  | 
72  | 34.3k  | { } | 
73  |  |  | 
74  | 817  | Buffer::Buffer(void) { } | 
75  |  |  | 
76  | 2.65k  | std::vector<uint8_t> Buffer::Get(void) const { | 
77  | 2.65k  |     return data;  | 
78  | 2.65k  | }  | 
79  |  |  | 
80  | 176k  | const uint8_t* Buffer::GetPtr(fuzzing::datasource::Datasource* ds) const { | 
81  | 176k  |     if ( data.size() == 0 ) { | 
82  | 31.3k  |         return util::GetNullPtr(ds);  | 
83  | 145k  |     } else { | 
84  | 145k  |         return data.data();  | 
85  | 145k  |     }  | 
86  | 176k  | }  | 
87  |  |  | 
88  | 31.6k  | std::vector<uint8_t>& Buffer::GetVectorPtr(void) { | 
89  | 31.6k  |     return data;  | 
90  | 31.6k  | }  | 
91  |  |  | 
92  | 68.0k  | const std::vector<uint8_t>& Buffer::GetConstVectorPtr(void) const { | 
93  | 68.0k  |     return data;  | 
94  | 68.0k  | }  | 
95  |  |  | 
96  | 351k  | size_t Buffer::GetSize(void) const { | 
97  | 351k  |     return data.size();  | 
98  | 351k  | }  | 
99  |  |  | 
100  | 13.9k  | bool Buffer::operator==(const Buffer& rhs) const { | 
101  | 13.9k  |     return data == rhs.data;  | 
102  | 13.9k  | }  | 
103  |  |  | 
104  | 0  | nlohmann::json Buffer::ToJSON(void) const { | 
105  | 0  |     nlohmann::json j;  | 
106  | 0  |     std::string asHex;  | 
107  | 0  |     boost::algorithm::hex(data, std::back_inserter(asHex));  | 
108  | 0  |     j = asHex;  | 
109  | 0  |     return j;  | 
110  | 0  | }  | 
111  |  |  | 
112  | 1.19k  | std::string Buffer::ToHex(void) const { | 
113  | 1.19k  |     std::string asHex;  | 
114  | 1.19k  |     boost::algorithm::hex(data, std::back_inserter(asHex));  | 
115  | 1.19k  |     return asHex;  | 
116  | 1.19k  | }  | 
117  |  |  | 
118  | 0  | void Buffer::Serialize(Datasource& ds) const { | 
119  | 0  |     ds.PutData(data);  | 
120  | 0  | }  | 
121  |  |  | 
122  | 0  | Datasource Buffer::AsDatasource(void) const { | 
123  | 0  |     return Datasource(data.data(), data.size());  | 
124  | 0  | }  | 
125  |  |  | 
126  | 0  | std::string Buffer::AsString(void) const { | 
127  | 0  |     return std::string(data.data(), data.data() + data.size());  | 
128  | 0  | }  | 
129  |  |  | 
130  | 0  | Buffer Buffer::ECDSA_Pad(const size_t retSize) const { | 
131  | 0  |     size_t bufSize = GetSize();  | 
132  |  | 
  | 
133  | 0  |     if ( bufSize > retSize ) { | 
134  | 0  |         bufSize = retSize;  | 
135  | 0  |     }  | 
136  |  | 
  | 
137  | 0  |     std::vector<uint8_t> ret(retSize);  | 
138  |  | 
  | 
139  | 0  |     if ( retSize != 0 ) { | 
140  | 0  |         const size_t delta = retSize - bufSize;  | 
141  |  | 
  | 
142  | 0  |         if ( delta != 0 ) { | 
143  | 0  |             memset(ret.data(), 0, delta);  | 
144  | 0  |         }  | 
145  |  | 
  | 
146  | 0  |         if ( bufSize != 0 ) { | 
147  | 0  |             memcpy(ret.data() + delta, GetPtr(), bufSize);  | 
148  | 0  |         }  | 
149  | 0  |     }  | 
150  |  | 
  | 
151  | 0  |     return Buffer(ret);  | 
152  | 0  | }  | 
153  |  |  | 
154  |  | /* Randomly modify an ECDSA input in such a way that it remains equivalent  | 
155  |  |  * to ECDSA verify/sign functions  | 
156  |  |  */  | 
157  | 838  | Buffer Buffer::ECDSA_RandomPad(Datasource& ds, const Type& curveType) const { | 
158  | 838  |     const auto numBits = cryptofuzz::repository::ECC_CurveToBits(curveType.Get());  | 
159  | 838  |     if ( numBits == std::nullopt ) { | 
160  |  |         /* The size of this curve is not known, so return the original buffer */  | 
161  | 0  |         return Buffer(data);  | 
162  | 0  |     }  | 
163  |  |  | 
164  | 838  |     if ( *numBits % 8 != 0 ) { | 
165  |  |         /* Curve sizes which are not a byte multiple are currently not supported,  | 
166  |  |          * so return the original buffer  | 
167  |  |          */  | 
168  | 94  |         return Buffer(data);  | 
169  | 94  |     }  | 
170  |  |  | 
171  | 744  |     const size_t numBytes = (*numBits + 7) / 8;  | 
172  |  |  | 
173  | 744  |     std::vector<uint8_t> stripped;  | 
174  | 744  |     { | 
175  | 744  |         size_t startPos;  | 
176  | 744  |         const size_t endPos = GetSize() > numBytes ? numBytes : GetSize();  | 
177  |  |  | 
178  | 1.07k  |         for (startPos = 0; startPos < endPos; startPos++) { | 
179  | 1.05k  |             if ( data[startPos] != 0 ) { | 
180  | 728  |                 break;  | 
181  | 728  |             }  | 
182  | 1.05k  |         }  | 
183  | 744  |         const auto& ref = GetConstVectorPtr();  | 
184  |  |  | 
185  | 744  |         stripped.insert(std::end(stripped), std::begin(ref) + startPos, std::begin(ref) + endPos);  | 
186  | 744  |     }  | 
187  |  |  | 
188  |  |     /* Decide how many bytes to insert */  | 
189  | 744  |     uint16_t numInserts = 0;  | 
190  | 744  |     try { | 
191  | 744  |         numInserts = ds.Get<uint16_t>();  | 
192  | 744  |     } catch ( fuzzing::datasource::Datasource::OutOfData ) { } | 
193  |  |  | 
194  | 744  |     std::vector<uint8_t> ret;  | 
195  |  |  | 
196  |  |     /* Left-pad the input until it is the curve size */  | 
197  | 744  |     { | 
198  | 744  |         if ( stripped.size() < numBytes ) { | 
199  | 298  |             const size_t needed = numBytes - stripped.size();  | 
200  | 298  |             const std::vector<uint8_t> zeroes(numInserts > needed ? needed : numInserts, 0);  | 
201  | 298  |             ret.insert(std::end(ret), std::begin(zeroes), std::end(zeroes));  | 
202  | 298  |             numInserts -= zeroes.size();  | 
203  | 298  |         }  | 
204  | 744  |     }  | 
205  |  |  | 
206  |  |     /* Insert the input */  | 
207  | 744  |     ret.insert(std::end(ret), std::begin(stripped), std::end(stripped));  | 
208  |  |  | 
209  |  |     /* Right-pad the input with random bytes (if available) or zeroes */  | 
210  | 744  |     if ( numInserts > 0 ) { | 
211  | 164  |         std::vector<uint8_t> toInsert;  | 
212  | 164  |         try { | 
213  | 164  |             toInsert = ds.GetData(0, numInserts, numInserts);  | 
214  | 164  |         } catch ( fuzzing::datasource::Datasource::OutOfData ) { | 
215  | 144  |             toInsert = std::vector<uint8_t>(numInserts, 0);  | 
216  | 144  |         }  | 
217  | 164  |         ret.insert(std::end(ret), std::begin(toInsert), std::end(toInsert));  | 
218  | 164  |     }  | 
219  |  |  | 
220  | 744  |     return Buffer(ret);  | 
221  | 744  | }  | 
222  |  |  | 
223  | 0  | Buffer Buffer::SHA256(void) const { | 
224  | 0  |     const auto hash = crypto::sha256(Get());  | 
225  | 0  |     return Buffer(hash);  | 
226  | 0  | }  | 
227  |  |  | 
228  | 85  | bool Buffer::IsZero(void) const { | 
229  | 216  |     for (size_t i = 0; i < data.size(); i++) { | 
230  | 210  |         if ( data[i] != 0 ) { | 
231  | 79  |             return false;  | 
232  | 79  |         }  | 
233  | 210  |     }  | 
234  |  |  | 
235  | 6  |     return true;  | 
236  | 85  | }  | 
237  |  |  | 
238  |  | /* Bignum */  | 
239  |  |  | 
240  |  | Bignum::Bignum(Datasource& ds) :  | 
241  | 29.4k  |     data(ds) { | 
242  | 29.4k  |     transform();  | 
243  | 29.4k  | }  | 
244  |  |  | 
245  |  | Bignum::Bignum(nlohmann::json json) :  | 
246  |  |     Bignum(json.get<std::string>())  | 
247  | 0  | { | 
248  | 0  | }  | 
249  |  |  | 
250  |  | Bignum::Bignum(const std::string s) :  | 
251  |  |     data((const uint8_t*)s.data(), s.size())  | 
252  | 21.0k  | { } | 
253  |  |  | 
254  | 29.4k  | void Bignum::transform(void) { | 
255  | 29.4k  |     auto& ptr = data.GetVectorPtr();  | 
256  |  |  | 
257  | 7.35M  |     for (size_t i = 0; i < ptr.size(); i++) { | 
258  | 7.32M  |         if ( isdigit(ptr[i]) ) continue;  | 
259  | 2.64M  |         if ( config::kNegativeIntegers == true ) { | 
260  | 0  |             if ( i == 0 && ptr[i] == '-') continue;  | 
261  | 0  |         }  | 
262  | 2.64M  |         ptr[i] %= 10;  | 
263  | 2.64M  |         ptr[i] += '0';  | 
264  | 2.64M  |     }  | 
265  | 29.4k  | }  | 
266  |  |  | 
267  | 10.5k  | bool Bignum::operator==(const Bignum& rhs) const { | 
268  | 10.5k  |     return data == rhs.data;  | 
269  | 10.5k  | }  | 
270  |  |  | 
271  | 72.4k  | size_t Bignum::GetSize(void) const { | 
272  | 72.4k  |     return data.GetSize();  | 
273  | 72.4k  | }  | 
274  |  |  | 
275  | 0  | bool Bignum::IsZero(void) const { | 
276  | 0  |     const auto t = ToTrimmedString();  | 
277  | 0  |     return t == "0" || t == "-" || t == "-0";  | 
278  | 0  | }  | 
279  |  |  | 
280  | 92.6k  | bool Bignum::IsNegative(void) const { | 
281  | 92.6k  |     return data.GetSize() && data.GetConstVectorPtr()[0] == '-';  | 
282  | 92.6k  | }  | 
283  |  |  | 
284  | 0  | bool Bignum::IsPositive(void) const { | 
285  | 0  |     return !IsZero() && !IsNegative();  | 
286  | 0  | }  | 
287  |  |  | 
288  | 167  | bool Bignum::IsGreaterThan(const std::string& other) const { | 
289  | 167  |     CF_ASSERT(IsNegative() == false, "IsGreaterThan on negative numbers not supported");  | 
290  | 167  |     const auto s = ToTrimmedString();  | 
291  | 167  |     if ( s.size() > other.size() ) { | 
292  | 26  |         return true;  | 
293  | 141  |     } else if ( s.size() < other.size() ) { | 
294  | 8  |         return false;  | 
295  | 133  |     } else { | 
296  | 153  |         for (size_t i = 0; i < s.size(); i++) { | 
297  | 153  |             const int a = s[i];  | 
298  | 153  |             const int b = other[i];  | 
299  | 153  |             if ( a > b ) { | 
300  | 56  |                 return true;  | 
301  | 97  |             } else if ( a < b ) { | 
302  | 77  |                 return false;  | 
303  | 77  |             }  | 
304  | 153  |         }  | 
305  | 133  |     }  | 
306  |  |  | 
307  | 0  |     CF_ASSERT(s == other, "Logic error");  | 
308  | 0  |     return false;  | 
309  | 0  | }  | 
310  |  |  | 
311  | 1.07k  | bool Bignum::IsLessThan(const std::string& other) const { | 
312  | 1.07k  |     boost::multiprecision::cpp_int A(ToTrimmedString());  | 
313  | 1.07k  |     boost::multiprecision::cpp_int B(other);  | 
314  | 1.07k  |     return A < B;  | 
315  | 1.07k  | }  | 
316  |  |  | 
317  | 0  | void Bignum::ToPositive(void) { | 
318  | 0  |     if ( !IsNegative() ) { | 
319  | 0  |         return;  | 
320  | 0  |     }  | 
321  |  |  | 
322  | 0  |     data.GetVectorPtr().erase(data.GetVectorPtr().begin());  | 
323  | 0  | }  | 
324  |  |  | 
325  | 82  | void Bignum::SubFrom(const std::string& v) { | 
326  | 82  |     boost::multiprecision::cpp_int A(ToTrimmedString());  | 
327  | 82  |     boost::multiprecision::cpp_int B(v);  | 
328  | 82  |     boost::multiprecision::cpp_int res = B - A;  | 
329  | 82  |     const auto s = res.str();  | 
330  | 82  |     data = {(const uint8_t*)s.data(), s.size()}; | 
331  | 82  | }  | 
332  |  |  | 
333  | 136k  | std::string Bignum::ToString(void) const { | 
334  | 136k  |     const auto ptr = data.GetPtr();  | 
335  | 136k  |     return std::string(ptr, ptr + data.GetSize());  | 
336  | 136k  | }  | 
337  |  |  | 
338  | 135k  | std::string Bignum::ToTrimmedString(void) const { | 
339  | 135k  |     auto s = ToString();  | 
340  | 135k  |     trim_left_if(s, boost::is_any_of("0")); | 
341  |  |  | 
342  | 135k  |     if ( s == "" ) { | 
343  | 30.6k  |         return "0";  | 
344  | 104k  |     } else { | 
345  | 104k  |         return s;  | 
346  | 104k  |     }  | 
347  | 135k  | }  | 
348  |  |  | 
349  |  | /* Prefix the string with a pseudo-random amount of zeroes */  | 
350  | 54.6k  | std::string Bignum::ToString(Datasource& ds) const { | 
351  | 54.6k  |     std::string zeros;  | 
352  |  |  | 
353  | 54.6k  |     try { | 
354  | 76.1k  |         while ( ds.Get<bool>() == true ) { | 
355  | 21.5k  |             zeros += "0";  | 
356  | 21.5k  |         }  | 
357  | 54.6k  |     } catch ( fuzzing::datasource::Datasource::OutOfData ) { } | 
358  |  |  | 
359  | 54.6k  |     auto s = ToTrimmedString();  | 
360  | 54.6k  |     const bool isNegative = IsNegative();  | 
361  | 54.6k  |     if ( s.size() && s[0] == '-' ) { | 
362  | 0  |         s.erase(0, 1);  | 
363  | 0  |     }  | 
364  | 54.6k  |     return (isNegative ? "-" : "") + zeros + s;  | 
365  | 54.6k  | }  | 
366  |  |  | 
367  | 0  | std::optional<std::vector<uint8_t>> Bignum::ToBin(std::optional<size_t> size) const { | 
368  | 0  |     return util::DecToBin(ToTrimmedString(), size);  | 
369  | 0  | }  | 
370  |  |  | 
371  | 0  | nlohmann::json Bignum::ToJSON(void) const { | 
372  | 0  |     return ToString();  | 
373  | 0  | }  | 
374  |  |  | 
375  | 0  | void Bignum::Serialize(Datasource& ds) const { | 
376  | 0  |     data.Serialize(ds);  | 
377  | 0  | }  | 
378  |  |  | 
379  |  | namespace component { | 
380  |  | /* SymmetricCipher */  | 
381  |  |  | 
382  |  | SymmetricCipher::SymmetricCipher(Datasource& ds) :  | 
383  |  |     iv(ds),  | 
384  |  |     key(ds),  | 
385  |  |     cipherType(ds)  | 
386  | 738  | { } | 
387  |  |  | 
388  |  | SymmetricCipher::SymmetricCipher(nlohmann::json json) :  | 
389  |  |     iv(json["iv"]),  | 
390  |  |     key(json["key"]),  | 
391  |  |     cipherType(json["cipherType"])  | 
392  | 0  | { } | 
393  |  |  | 
394  | 0  | nlohmann::json SymmetricCipher::ToJSON(void) const { | 
395  | 0  |     nlohmann::json j;  | 
396  | 0  |     j["iv"] = iv.ToJSON();  | 
397  | 0  |     j["key"] = key.ToJSON();  | 
398  | 0  |     j["cipherType"] = cipherType.ToJSON();  | 
399  | 0  |     return j;  | 
400  | 0  | }  | 
401  |  |  | 
402  | 0  | bool SymmetricCipher::operator==(const SymmetricCipher& rhs) const { | 
403  | 0  |     return  | 
404  | 0  |         (iv == rhs.iv) &&  | 
405  | 0  |         (key == rhs.key) &&  | 
406  | 0  |         (cipherType == rhs.cipherType);  | 
407  | 0  | }  | 
408  | 0  | void SymmetricCipher::Serialize(Datasource& ds) const { | 
409  | 0  |     iv.Serialize(ds);  | 
410  | 0  |     key.Serialize(ds);  | 
411  | 0  |     cipherType.Serialize(ds);  | 
412  | 0  | }  | 
413  |  |  | 
414  |  | /* Ciphertext */  | 
415  |  |  | 
416  |  | Ciphertext::Ciphertext(Datasource& ds) :  | 
417  |  |     ciphertext(ds),  | 
418  |  |     tag( ds.Get<bool>() ? std::nullopt : std::make_optional<Tag>(ds) )  | 
419  | 0  | { } | 
420  |  |  | 
421  |  | Ciphertext::Ciphertext(Buffer ciphertext, std::optional<Tag> tag) :  | 
422  |  |     ciphertext(ciphertext),  | 
423  |  |     tag(tag)  | 
424  | 0  | { } | 
425  |  |  | 
426  | 0  | bool Ciphertext::operator==(const Ciphertext& rhs) const { | 
427  | 0  |     return (ciphertext == rhs.ciphertext) && (tag == rhs.tag);  | 
428  | 0  | }  | 
429  |  |  | 
430  | 0  | void Ciphertext::Serialize(Datasource& ds) const { | 
431  | 0  |     ciphertext.Serialize(ds);  | 
432  | 0  |     if ( tag == std::nullopt ) { | 
433  | 0  |         ds.Put<bool>(true);  | 
434  | 0  |     } else { | 
435  | 0  |         ds.Put<bool>(false);  | 
436  | 0  |         tag->Serialize(ds);  | 
437  | 0  |     }  | 
438  | 0  | }  | 
439  |  |  | 
440  |  | /* BignumPair */  | 
441  |  |  | 
442  |  | BignumPair::BignumPair(Datasource& ds) :  | 
443  |  |     first(ds),  | 
444  |  |     second(ds)  | 
445  | 3.07k  | { } | 
446  |  |  | 
447  |  | BignumPair::BignumPair(const std::string first, const std::string second) :  | 
448  |  |     first(first),  | 
449  |  |     second(second)  | 
450  | 4.09k  | { } | 
451  |  |  | 
452  |  | BignumPair::BignumPair(nlohmann::json json) :  | 
453  |  |     first(json[0].get<std::string>()),  | 
454  |  |     second(json[1].get<std::string>())  | 
455  | 0  | { } | 
456  |  |  | 
457  |  |  | 
458  | 1.14k  | bool BignumPair::operator==(const BignumPair& rhs) const { | 
459  | 1.14k  |     return  | 
460  | 1.14k  |         (first == rhs.first) &&  | 
461  | 1.14k  |         (second == rhs.second);  | 
462  | 1.14k  | }  | 
463  |  |  | 
464  | 0  | void BignumPair::Serialize(Datasource& ds) const { | 
465  | 0  |     first.Serialize(ds);  | 
466  | 0  |     second.Serialize(ds);  | 
467  | 0  | }  | 
468  |  |  | 
469  | 0  | nlohmann::json BignumPair::ToJSON(void) const { | 
470  | 0  |     return std::vector<nlohmann::json>{first.ToJSON(), second.ToJSON()}; | 
471  | 0  | }  | 
472  |  |  | 
473  |  | /* ECC_KeyPair */  | 
474  |  |  | 
475  |  | ECC_KeyPair::ECC_KeyPair(Datasource& ds) :  | 
476  |  |     priv(ds),  | 
477  |  |     pub(ds)  | 
478  | 0  | { } | 
479  |  |  | 
480  |  | ECC_KeyPair::ECC_KeyPair(ECC_PrivateKey priv, BignumPair pub) :  | 
481  |  |     priv(priv),  | 
482  |  |     pub(pub)  | 
483  | 0  | { } | 
484  |  |  | 
485  | 0  | bool ECC_KeyPair::operator==(const ECC_KeyPair& rhs) const { | 
486  | 0  |     return  | 
487  | 0  |         (priv == rhs.priv) &&  | 
488  | 0  |         (pub == rhs.pub);  | 
489  | 0  | }  | 
490  |  |  | 
491  | 0  | void ECC_KeyPair::Serialize(Datasource& ds) const { | 
492  | 0  |     priv.Serialize(ds);  | 
493  | 0  |     pub.Serialize(ds);  | 
494  | 0  | }  | 
495  |  |  | 
496  | 0  | nlohmann::json ECC_KeyPair::ToJSON(void) const { | 
497  | 0  |     return std::vector<nlohmann::json>{priv.ToJSON(), pub.ToJSON()}; | 
498  | 0  | }  | 
499  |  |  | 
500  |  | /* ECCSI_Signature */  | 
501  |  | ECCSI_Signature::ECCSI_Signature(Datasource& ds) :  | 
502  |  |     signature(ds),  | 
503  |  |     pub(ds),  | 
504  |  |     pvt(ds)  | 
505  | 0  | { } | 
506  |  |  | 
507  |  | ECCSI_Signature::ECCSI_Signature(BignumPair signature, ECC_PublicKey pub, BignumPair pvt) :  | 
508  |  |     signature(signature),  | 
509  |  |     pub(pub),  | 
510  |  |     pvt(pvt)  | 
511  | 0  | { } | 
512  |  |  | 
513  |  | ECCSI_Signature::ECCSI_Signature(nlohmann::json json) :  | 
514  |  |     signature(json["signature"]),  | 
515  |  |     pub(json["pub"]),  | 
516  |  |     pvt(json["pvt"])  | 
517  | 0  | { } | 
518  |  |  | 
519  | 0  | bool ECCSI_Signature::operator==(const ECCSI_Signature& rhs) const { | 
520  | 0  |     return  | 
521  | 0  |         (signature == rhs.signature) &&  | 
522  | 0  |         (pub == rhs.pub) &&  | 
523  | 0  |         (pvt == rhs.pvt);  | 
524  | 0  | }  | 
525  |  |  | 
526  | 0  | void ECCSI_Signature::Serialize(Datasource& ds) const { | 
527  | 0  |     signature.Serialize(ds);  | 
528  | 0  |     pub.Serialize(ds);  | 
529  | 0  |     pvt.Serialize(ds);  | 
530  | 0  | }  | 
531  |  |  | 
532  | 0  | nlohmann::json ECCSI_Signature::ToJSON(void) const { | 
533  | 0  |     return std::vector<nlohmann::json>{signature.ToJSON(), pub.ToJSON()}; | 
534  | 0  | }  | 
535  |  |  | 
536  |  | /* ECDSA_Signature */  | 
537  |  | ECDSA_Signature::ECDSA_Signature(Datasource& ds) :  | 
538  |  |     signature(ds),  | 
539  |  |     pub(ds)  | 
540  | 802  | { } | 
541  |  |  | 
542  |  | ECDSA_Signature::ECDSA_Signature(BignumPair signature, ECC_PublicKey pub) :  | 
543  |  |     signature(signature),  | 
544  |  |     pub(pub)  | 
545  | 1.19k  | { } | 
546  |  |  | 
547  |  | ECDSA_Signature::ECDSA_Signature(nlohmann::json json) :  | 
548  |  |     signature(json["signature"]),  | 
549  |  |     pub(json["pub"])  | 
550  | 0  | { } | 
551  |  |  | 
552  | 121  | bool ECDSA_Signature::operator==(const ECDSA_Signature& rhs) const { | 
553  | 121  |     return  | 
554  | 121  |         (signature == rhs.signature) &&  | 
555  | 121  |         (pub == rhs.pub);  | 
556  | 121  | }  | 
557  |  |  | 
558  | 0  | void ECDSA_Signature::Serialize(Datasource& ds) const { | 
559  | 0  |     signature.Serialize(ds);  | 
560  | 0  |     pub.Serialize(ds);  | 
561  | 0  | }  | 
562  |  |  | 
563  | 0  | nlohmann::json ECDSA_Signature::ToJSON(void) const { | 
564  | 0  |     return std::vector<nlohmann::json>{signature.ToJSON(), pub.ToJSON()}; | 
565  | 0  | }  | 
566  |  |  | 
567  |  | /* MACType */  | 
568  |  |  | 
569  |  | MACType::MACType(Datasource& ds) :  | 
570  |  |     mode(ds.Get<bool>()),  | 
571  |  |     type(ds)  | 
572  | 0  | { } | 
573  |  |  | 
574  |  | MACType::MACType(nlohmann::json json) :  | 
575  |  |     mode(json["mode"].get<bool>()),  | 
576  |  |     type(json["type"])  | 
577  | 0  | { } | 
578  |  |  | 
579  | 0  | nlohmann::json MACType::ToJSON(void) const { | 
580  | 0  |     nlohmann::json j;  | 
581  | 0  |     j["mode"] = mode;  | 
582  | 0  |     j["type"] = type.ToJSON();  | 
583  | 0  |     return j;  | 
584  | 0  | }  | 
585  |  |  | 
586  | 0  | bool MACType::operator==(const MACType& rhs) const { | 
587  | 0  |     return  | 
588  | 0  |         (mode == rhs.mode) &&  | 
589  | 0  |         (type == rhs.type);  | 
590  | 0  | }  | 
591  |  |  | 
592  | 0  | void MACType::Serialize(Datasource& ds) const { | 
593  | 0  |     ds.Put<>(mode);  | 
594  | 0  |     type.Serialize(ds);  | 
595  | 0  | }  | 
596  |  |  | 
597  |  | G2::G2(nlohmann::json json) :  | 
598  |  |     first(json[0]),  | 
599  | 0  |     second(json[1]) { | 
600  | 0  | }  | 
601  |  |  | 
602  | 0  | nlohmann::json G2::ToJSON(void) const { | 
603  | 0  |     return std::vector<nlohmann::json>{ | 
604  | 0  |         first.first.ToJSON(), first.second.ToJSON(),  | 
605  | 0  |         second.first.ToJSON(), second.second.ToJSON()  | 
606  | 0  |     };  | 
607  | 0  | }  | 
608  |  |  | 
609  | 0  | void G2::Serialize(Datasource& ds) const { | 
610  | 0  |     first.Serialize(ds);  | 
611  | 0  |     second.Serialize(ds);  | 
612  | 0  | }  | 
613  |  |  | 
614  | 0  | nlohmann::json Fp12::ToJSON(void) const { | 
615  | 0  |     return std::vector<nlohmann::json>{ | 
616  | 0  |         bn1.ToJSON(),  | 
617  | 0  |         bn2.ToJSON(),  | 
618  | 0  |         bn3.ToJSON(),  | 
619  | 0  |         bn4.ToJSON(),  | 
620  | 0  |         bn5.ToJSON(),  | 
621  | 0  |         bn6.ToJSON(),  | 
622  | 0  |         bn7.ToJSON(),  | 
623  | 0  |         bn8.ToJSON(),  | 
624  | 0  |         bn9.ToJSON(),  | 
625  | 0  |         bn10.ToJSON(),  | 
626  | 0  |         bn11.ToJSON(),  | 
627  | 0  |         bn12.ToJSON(),  | 
628  | 0  |     };  | 
629  | 0  | }  | 
630  |  |  | 
631  |  | Fp12::Fp12(nlohmann::json json) :  | 
632  |  |     bn1(json[0].get<std::string>()),  | 
633  |  |     bn2(json[1].get<std::string>()),  | 
634  |  |     bn3(json[2].get<std::string>()),  | 
635  |  |     bn4(json[3].get<std::string>()),  | 
636  |  |     bn5(json[4].get<std::string>()),  | 
637  |  |     bn6(json[5].get<std::string>()),  | 
638  |  |     bn7(json[6].get<std::string>()),  | 
639  |  |     bn8(json[7].get<std::string>()),  | 
640  |  |     bn9(json[8].get<std::string>()),  | 
641  |  |     bn10(json[9].get<std::string>()),  | 
642  |  |     bn11(json[10].get<std::string>()),  | 
643  |  |     bn12(json[11].get<std::string>())  | 
644  | 0  | { } | 
645  |  |  | 
646  | 0  | void Fp12::Serialize(Datasource& ds) const { | 
647  | 0  |     bn1.Serialize(ds);  | 
648  | 0  |     bn2.Serialize(ds);  | 
649  | 0  |     bn3.Serialize(ds);  | 
650  | 0  |     bn4.Serialize(ds);  | 
651  | 0  |     bn5.Serialize(ds);  | 
652  | 0  |     bn6.Serialize(ds);  | 
653  | 0  |     bn7.Serialize(ds);  | 
654  | 0  |     bn8.Serialize(ds);  | 
655  | 0  |     bn9.Serialize(ds);  | 
656  | 0  |     bn10.Serialize(ds);  | 
657  | 0  |     bn11.Serialize(ds);  | 
658  | 0  |     bn12.Serialize(ds);  | 
659  | 0  | }  | 
660  |  |  | 
661  | 0  | nlohmann::json DSA_Parameters::ToJSON(void) const { | 
662  | 0  |     return std::vector<nlohmann::json>{ | 
663  | 0  |         p.ToJSON(),  | 
664  | 0  |         q.ToJSON(),  | 
665  | 0  |         g.ToJSON(),  | 
666  | 0  |     };  | 
667  | 0  | }  | 
668  |  |  | 
669  |  | DSA_Parameters::DSA_Parameters(nlohmann::json json) :  | 
670  |  |     p(json["p"].get<std::string>()),  | 
671  |  |     q(json["q"].get<std::string>()),  | 
672  |  |     g(json["g"].get<std::string>())  | 
673  | 0  | { } | 
674  |  |  | 
675  | 0  | void DSA_Parameters::Serialize(Datasource& ds) const { | 
676  | 0  |     p.Serialize(ds);  | 
677  | 0  |     q.Serialize(ds);  | 
678  | 0  |     g.Serialize(ds);  | 
679  | 0  | }  | 
680  |  |  | 
681  |  | /* DSA_Signature */  | 
682  |  | DSA_Signature::DSA_Signature(Datasource& ds) :  | 
683  |  |     signature(ds),  | 
684  |  |     pub(ds)  | 
685  | 0  | { } | 
686  |  |  | 
687  |  | DSA_Signature::DSA_Signature(BignumPair signature, Bignum pub) :  | 
688  |  |     signature(signature),  | 
689  |  |     pub(pub)  | 
690  | 0  | { } | 
691  |  |  | 
692  |  | DSA_Signature::DSA_Signature(nlohmann::json json) :  | 
693  |  |     signature(json["signature"]),  | 
694  |  |     pub(json["pub"])  | 
695  | 0  | { } | 
696  |  |  | 
697  | 0  | bool DSA_Signature::operator==(const DSA_Signature& rhs) const { | 
698  | 0  |     return  | 
699  | 0  |         (signature == rhs.signature) &&  | 
700  | 0  |         (pub == rhs.pub);  | 
701  | 0  | }  | 
702  |  |  | 
703  | 0  | void DSA_Signature::Serialize(Datasource& ds) const { | 
704  | 0  |     signature.Serialize(ds);  | 
705  | 0  |     pub.Serialize(ds);  | 
706  | 0  | }  | 
707  |  |  | 
708  | 0  | nlohmann::json DSA_Signature::ToJSON(void) const { | 
709  | 0  |     return std::vector<nlohmann::json>{signature.ToJSON(), pub.ToJSON()}; | 
710  | 0  | }  | 
711  |  |  | 
712  |  | /* BLS_Signature */  | 
713  |  | BLS_Signature::BLS_Signature(Datasource& ds) :  | 
714  |  |     signature(ds),  | 
715  |  |     pub(ds)  | 
716  | 0  | { } | 
717  |  |  | 
718  |  | BLS_Signature::BLS_Signature(G2 signature, ECC_PublicKey pub) :  | 
719  |  |     signature(signature),  | 
720  |  |     pub(pub)  | 
721  | 0  | { } | 
722  |  |  | 
723  |  | BLS_Signature::BLS_Signature(nlohmann::json json) :  | 
724  |  |     signature(json["signature"]),  | 
725  |  |     pub(json["pub"])  | 
726  | 0  | { } | 
727  |  |  | 
728  | 0  | bool BLS_Signature::operator==(const BLS_Signature& rhs) const { | 
729  | 0  |     return  | 
730  | 0  |         (signature == rhs.signature) &&  | 
731  | 0  |         (pub == rhs.pub);  | 
732  | 0  | }  | 
733  |  |  | 
734  | 0  | void BLS_Signature::Serialize(Datasource& ds) const { | 
735  | 0  |     signature.Serialize(ds);  | 
736  | 0  |     pub.Serialize(ds);  | 
737  | 0  | }  | 
738  |  |  | 
739  | 0  | nlohmann::json BLS_Signature::ToJSON(void) const { | 
740  | 0  |     return std::vector<nlohmann::json>{signature.ToJSON(), pub.ToJSON()}; | 
741  | 0  | }  | 
742  |  |  | 
743  |  | /* BLS_BatchSign_Vector */  | 
744  |  |  | 
745  | 0  | BLS_BatchSign_Vector::BLS_BatchSign_Vector(Datasource& ds) { | 
746  | 0  |     const auto num = ds.Get<uint32_t>(0);  | 
747  | 0  |     for (size_t i = 0; i < num; i++) { | 
748  | 0  |         c.push_back( BatchSign_single{{ds}, {ds}} ); | 
749  | 0  |     }  | 
750  | 0  | }  | 
751  |  |  | 
752  | 0  | BLS_BatchSign_Vector::BLS_BatchSign_Vector(nlohmann::json json) { | 
753  | 0  |     for (const auto& j : json) { | 
754  | 0  |         c.push_back( BatchSign_single{ | 
755  | 0  |                 j["priv"],  | 
756  | 0  |                 {j["g1_x"], j["g1_y"]} }); | 
757  | 0  |     }  | 
758  | 0  | }  | 
759  |  |  | 
760  | 0  | void BLS_BatchSign_Vector::Serialize(Datasource& ds) const { | 
761  | 0  |     ds.Put<uint32_t>(c.size());  | 
762  | 0  |     for (const auto& component : c) { | 
763  | 0  |         component.priv.Serialize(ds);  | 
764  | 0  |         component.g1.Serialize(ds);  | 
765  | 0  |     }  | 
766  | 0  | }  | 
767  |  |  | 
768  |  | /* BLS_BatchSignature */  | 
769  |  |  | 
770  |  | BLS_BatchSignature::BLS_BatchSignature(std::vector< std::pair<G1, G2> > msgpub) :  | 
771  |  |     msgpub(msgpub)  | 
772  | 0  | { } | 
773  |  |  | 
774  | 0  | bool BLS_BatchSignature::operator==(const BLS_BatchSignature& rhs) const { | 
775  | 0  |     return  | 
776  | 0  |         (msgpub == rhs.msgpub);  | 
777  | 0  | }  | 
778  |  |  | 
779  | 0  | void BLS_BatchSignature::Serialize(Datasource& ds) const { | 
780  | 0  |     ds.Put<uint32_t>(msgpub.size());  | 
781  | 0  |     for (const auto& component : msgpub) { | 
782  | 0  |         component.first.Serialize(ds);  | 
783  | 0  |         component.second.Serialize(ds);  | 
784  | 0  |     }  | 
785  | 0  | }  | 
786  |  |  | 
787  | 0  | nlohmann::json BLS_BatchSignature::ToJSON(void) const { | 
788  | 0  |     return {}; /* TODO */ | 
789  | 0  | }  | 
790  |  |  | 
791  |  |  | 
792  |  | /* BLS_KeyPair */  | 
793  |  |  | 
794  |  | BLS_KeyPair::BLS_KeyPair(Datasource& ds) :  | 
795  |  |     priv(ds),  | 
796  |  |     pub(ds)  | 
797  | 0  | { } | 
798  |  |  | 
799  |  | BLS_KeyPair::BLS_KeyPair(BLS_PrivateKey priv, BignumPair pub) :  | 
800  |  |     priv(priv),  | 
801  |  |     pub(pub)  | 
802  | 0  | { } | 
803  |  |  | 
804  | 0  | bool BLS_KeyPair::operator==(const BLS_KeyPair& rhs) const { | 
805  | 0  |     return  | 
806  | 0  |         (priv == rhs.priv) &&  | 
807  | 0  |         (pub == rhs.pub);  | 
808  | 0  | }  | 
809  |  |  | 
810  | 0  | void BLS_KeyPair::Serialize(Datasource& ds) const { | 
811  | 0  |     priv.Serialize(ds);  | 
812  | 0  |     pub.Serialize(ds);  | 
813  | 0  | }  | 
814  |  |  | 
815  | 0  | nlohmann::json BLS_KeyPair::ToJSON(void) const { | 
816  | 0  |     return std::vector<nlohmann::json>{priv.ToJSON(), pub.ToJSON()}; | 
817  | 0  | }  | 
818  |  |  | 
819  |  | /* BLS_BatchVerify_Vector */  | 
820  |  |  | 
821  | 0  | BLS_BatchVerify_Vector::BLS_BatchVerify_Vector(Datasource& ds) { | 
822  | 0  |     const auto num = ds.Get<uint32_t>(0);  | 
823  | 0  |     for (size_t i = 0; i < num; i++) { | 
824  | 0  |         c.push_back( BatchVerify_single{{ds}, {ds}} ); | 
825  | 0  |     }  | 
826  | 0  | }  | 
827  |  |  | 
828  | 0  | BLS_BatchVerify_Vector::BLS_BatchVerify_Vector(nlohmann::json json) { | 
829  | 0  |     for (const auto& j : json) { | 
830  | 0  |         c.push_back( BatchVerify_single{ | 
831  | 0  |                 {j["g1_x"], j["g1_y"]}, | 
832  | 0  |                 {j["g2_v"], j["g2_w"], j["g2_x"], j["g2_y"]} }); | 
833  | 0  |     }  | 
834  | 0  | }  | 
835  |  |  | 
836  | 0  | void BLS_BatchVerify_Vector::Serialize(Datasource& ds) const { | 
837  | 0  |     ds.Put<uint32_t>(c.size());  | 
838  | 0  |     for (const auto& component : c) { | 
839  | 0  |         component.g1.Serialize(ds);  | 
840  | 0  |         component.g2.Serialize(ds);  | 
841  | 0  |     }  | 
842  | 0  | }  | 
843  |  |  | 
844  | 0  | nlohmann::json BLS_BatchVerify_Vector::ToJSON(void) const { | 
845  | 0  |     nlohmann::json j = nlohmann::json::array();  | 
846  | 0  |     for (const auto& cur : c) { | 
847  | 0  |         nlohmann::json curj;  | 
848  | 0  |         curj["g1_x"] = cur.g1.first.ToJSON();  | 
849  | 0  |         curj["g1_y"] = cur.g1.second.ToJSON();  | 
850  |  | 
  | 
851  | 0  |         curj["g2_v"] = cur.g2.first.first.ToJSON();  | 
852  | 0  |         curj["g2_w"] = cur.g2.first.second.ToJSON();  | 
853  | 0  |         curj["g2_x"] = cur.g2.second.first.ToJSON();  | 
854  | 0  |         curj["g2_y"] = cur.g2.second.second.ToJSON();  | 
855  |  | 
  | 
856  | 0  |         j.push_back(curj);  | 
857  | 0  |     }  | 
858  | 0  |     return j;  | 
859  | 0  | }  | 
860  |  |  | 
861  |  | /* BLS_G1_Vector */  | 
862  |  |  | 
863  | 0  | BLS_G1_Vector::BLS_G1_Vector(Datasource& ds) { | 
864  | 0  |     const auto num = ds.Get<uint32_t>(0);  | 
865  | 0  |     for (size_t i = 0; i < num; i++) { | 
866  | 0  |         points.push_back( component::G1(ds) );  | 
867  | 0  |     }  | 
868  | 0  | }  | 
869  |  |  | 
870  | 0  | BLS_G1_Vector::BLS_G1_Vector(nlohmann::json json) { | 
871  | 0  |     for (const auto& j : json) { | 
872  | 0  |         points.push_back( component::G1{j["x"], j["y"]} ); | 
873  | 0  |     }  | 
874  | 0  | }  | 
875  |  |  | 
876  | 0  | void BLS_G1_Vector::Serialize(Datasource& ds) const { | 
877  | 0  |     ds.Put<uint32_t>(points.size());  | 
878  | 0  |     for (const auto& signature : points) { | 
879  | 0  |         signature.Serialize(ds);  | 
880  | 0  |     }  | 
881  | 0  | }  | 
882  |  |  | 
883  |  | /* BLS_G2_Vector */  | 
884  |  |  | 
885  | 0  | BLS_G2_Vector::BLS_G2_Vector(Datasource& ds) { | 
886  | 0  |     const auto num = ds.Get<uint32_t>(0);  | 
887  | 0  |     for (size_t i = 0; i < num; i++) { | 
888  | 0  |         points.push_back( component::G2(ds) );  | 
889  | 0  |     }  | 
890  | 0  | }  | 
891  |  |  | 
892  | 0  | BLS_G2_Vector::BLS_G2_Vector(nlohmann::json json) { | 
893  | 0  |     for (const auto& j : json) { | 
894  | 0  |         points.push_back( component::G2{j["v"], j["w"], j["x"], j["y"]} ); | 
895  | 0  |     }  | 
896  | 0  | }  | 
897  |  |  | 
898  | 0  | void BLS_G2_Vector::Serialize(Datasource& ds) const { | 
899  | 0  |     ds.Put<uint32_t>(points.size());  | 
900  | 0  |     for (const auto& signature : points) { | 
901  | 0  |         signature.Serialize(ds);  | 
902  | 0  |     }  | 
903  | 0  | }  | 
904  |  |  | 
905  |  | /* SR25519_Signature */  | 
906  |  | SR25519_Signature::SR25519_Signature(Datasource& ds) :  | 
907  |  |     signature(ds),  | 
908  |  |     pub(ds)  | 
909  | 0  | { } | 
910  |  |  | 
911  |  | SR25519_Signature::SR25519_Signature(BignumPair signature, Bignum pub) :  | 
912  |  |     signature(signature),  | 
913  |  |     pub(pub)  | 
914  | 0  | { } | 
915  |  |  | 
916  |  | SR25519_Signature::SR25519_Signature(nlohmann::json json) :  | 
917  |  |     signature(json["signature"]),  | 
918  |  |     pub(json["pub"])  | 
919  | 0  | { } | 
920  |  |  | 
921  | 0  | bool SR25519_Signature::operator==(const SR25519_Signature& rhs) const { | 
922  | 0  |     return  | 
923  | 0  |         (signature == rhs.signature) &&  | 
924  | 0  |         (pub == rhs.pub);  | 
925  | 0  | }  | 
926  |  |  | 
927  | 0  | void SR25519_Signature::Serialize(Datasource& ds) const { | 
928  | 0  |     signature.Serialize(ds);  | 
929  | 0  |     pub.Serialize(ds);  | 
930  | 0  | }  | 
931  |  |  | 
932  | 0  | nlohmann::json SR25519_Signature::ToJSON(void) const { | 
933  | 0  |     return std::vector<nlohmann::json>{signature.ToJSON(), pub.ToJSON()}; | 
934  | 0  | }  | 
935  |  |  | 
936  |  | } /* namespace component */  | 
937  |  |  | 
938  |  | } /* namespace cryptofuzz */  |