diff --git a/.gitignore b/.gitignore index 5992c9e6b..4b4fcebbf 100644 --- a/.gitignore +++ b/.gitignore @@ -109,3 +109,5 @@ libzcashconsensus.pc contrib/debian/files contrib/debian/substvars + +src/fuzzing/*/output diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index 391772652..eae9d027b 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -188,6 +188,7 @@ bool AppInit(int argc, char* argv[]) } #include "fuzz.h" #ifdef ZCASH_FUZZ +#warning BUILDING A FUZZER, NOT THE REAL MAIN #include "fuzz.cpp" #else int main(int argc, char* argv[]) diff --git a/src/fuzz.cpp b/src/fuzz.cpp index 4c68bfab3..6e8f0e9f4 100644 --- a/src/fuzz.cpp +++ b/src/fuzz.cpp @@ -14,5 +14,4 @@ int fuzz_DecodeHexTx (int argc, char *argv[]) { else { fprintf(stderr, "Could not decode hex string") ; return -1; } } -int main (int argc, char *argv[]) { return ZCASH_FUZZER_MAIN(argc, argv); } -#warning BUILDING A FUZZER, NOT THE REAL MAIN +int main (int argc, char *argv[]) { return fuzz_DecodeHexTx(argc, argv); } diff --git a/src/fuzz.h b/src/fuzz.h index 1199e5891..e69de29bb 100644 --- a/src/fuzz.h +++ b/src/fuzz.h @@ -1,2 +0,0 @@ -//#define ZCASH_FUZZ -#define ZCASH_FUZZER_MAIN fuzz_DecodeHexTx diff --git a/src/fuzzing/DecodeHexTx/fuzz.cpp b/src/fuzzing/DecodeHexTx/fuzz.cpp new file mode 100644 index 000000000..6e8f0e9f4 --- /dev/null +++ b/src/fuzzing/DecodeHexTx/fuzz.cpp @@ -0,0 +1,17 @@ +extern bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx); + +bool fuzz_DecodeHexTxFunction (const std::string& strHexTx) { + CTransaction tx; + return DecodeHexTx(tx, strHexTx); +} + + +int fuzz_DecodeHexTx (int argc, char *argv[]) { + std::ifstream t(argv[1]); + std::string str((std::istreambuf_iterator(t)), + std::istreambuf_iterator()); + if (fuzz_DecodeHexTxFunction (str)) { fprintf(stdout, "Decoded hex string") ; return 0; } + else { fprintf(stderr, "Could not decode hex string") ; return -1; } +} + +int main (int argc, char *argv[]) { return fuzz_DecodeHexTx(argc, argv); } diff --git a/src/fuzzing/DecodeHexTx/fuzz.h b/src/fuzzing/DecodeHexTx/fuzz.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/fuzzing/DecodeHexTx/input/coinbase.txt b/src/fuzzing/DecodeHexTx/input/coinbase.txt new file mode 100644 index 000000000..16966e228 --- /dev/null +++ b/src/fuzzing/DecodeHexTx/input/coinbase.txt @@ -0,0 +1 @@ +0400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff2a03677b090004e161a75d0edb51e814ae3737f790e3c94f11495327270fdfbd6132d5e90f87507455844cffffffff023f1e9b3b000000001976a914e0082ee3d89f84adbadaaebddd1746bb20e6d4ee88ac80b2e60e0000000017a914ce811a7457b9f4553af120e553bc8ddd8bb33ce98700000000000000000000000000000000000000 \ No newline at end of file diff --git a/src/fuzzing/DecodeHexTx/input/manyoutputs.txt b/src/fuzzing/DecodeHexTx/input/manyoutputs.txt new file mode 100644 index 000000000..d6ab6b4e6 --- /dev/null +++ b/src/fuzzing/DecodeHexTx/input/manyoutputs.txt @@ -0,0 +1 @@ +0400008085202f8902befc1c37af31039fc287f26ce1240524a8aa209e4b668cd9bd928347e62355c2000000006a47304402206f85716662f762565b040b21059d7a1e8a1cc520b781d6d46a1c2a685d6ac125022063dedfa9b036169a1a9b81bffcd4e7717c993286a507d84224fa630590fe82d0012102a1e96e2736efd7dbd5b6dc807c24b657fdcc6d3a7e6c7fac5607a9f3e47b8748ffffffffc5d479c0fa4ff1b932b4c80105643dfd8df963f45fe363bf2794a3c86473e985050000006b48304502210081dfd38fcc7a39aebbf26606e987a1ed68d10faaca0a200aa65f040065b88ac80220082eccb4fbd4d0bf1b55fc14b7b4f25d76a1e93fe6181922bd0cfe9d77d1fa9d012102a1e96e2736efd7dbd5b6dc807c24b657fdcc6d3a7e6c7fac5607a9f3e47b8748ffffffff47c204d31d000000001976a91478a6c1f4016e651d17a861b027fd6d217472d27288acc703ac00000000001976a914b70661b7ddf8450e44b06b9f8e466cb209c504a688acc2fa4701000000001976a9143d6d2394b9f0b9a4a56c1536f4c6adf979eb772488acae8f0703000000001976a9140f5ebfa68d92de9f10110a874fe69fb2c2ae122088acde342200000000001976a9142c3ef04a3a41df528234ebfa438a96895f94c40d88ac5e2ba400000000001976a9142fb59e414b3e73d2665266f9add4253b83ae455e88ac7fa51500000000001976a9147da516f0a4e5b54e6870c88da34d4cb7951411bd88acbc614900000000001976a91408135077ee8808dc75623dc6c80a9edad8803d9688acd0851003000000001976a914e2a878e046a5006a4adeae1b6e4e004bb07fc57c88ac25494e00000000001976a9144be18cbda2883ebbc5061da1bd471600a59a94cf88ace7821002000000001976a914031a94992926a4e6ebcda8ebb5e865ceb91bebd888ac1b509d00000000001976a91420eb1449216e61aa99ac4a4efc8da3a8288bb8df88aca1070500000000001976a914179e347753c9e04358eb529c43925b68b5d3df1888ac611ea800000000001976a914a2649b4b77da4ee11651182b56b175977efaac3588acd6901000000000001976a914fba4aee4df81f8ec128644b6ffc3fcf7340c312088ac1b5aec000000000017a91441ca4c4997f4158b20831a6bdb3502c2e2668c5c8790e61100000000001976a914d3f19ab072fa80f501733e17aa1c74b974b6f63588ac57e99800000000001976a91477d55248c52900cb278f25a93b366037a273f59388acfb6e0500000000001976a914448d4c46027d917038a6ec1359b428d94a21816088accda91100000000001976a914157b6515820f71cc5fec6cddefba67b39c28945288aca6730f00000000001976a9141e11d2a44c56d52c6030c92484e3cbff7668f85f88acd690a100000000001976a9144340ebe430837105b17270f3db8b4b493125977588ac38e1911a000000001976a914780332e7f8ad8a3b164daa66f358112f3e5da3ca88acacf30d00000000001976a914be547067034818d54721d0639ca2567fab92627388ac12102700000000001976a91482d5fee592be74fb6b5b93132936296f778e5e2588ac5dfba200000000001976a9149e89130245c481e76f898209ffa49a1f1e9b6b3788ac01c5a300000000001976a9146fd439218e6ea0ebfcb71c2c884f62c3072dd1bf88acca201400000000001976a91489d97fc368a849890b71672e4d119e8241dc82b888ac6bd79800000000001976a9146680bb7e80f4633c4fe8f5d454cd6249b09cd84088aca1d10800000000001976a9141957b979db9371ad172db3c2e14828a921c4375c88ac50aa1800000000001976a91431ba04310f5744bf82e389646744f6957e4d804088acde574d00000000001976a914bdb6082119d4f48b164c22d63758aba0fdad926888acc59e9b00000000001976a9144ee4278bfaebe562d022b098adca6c6f0fd6226688ac97960f00000000001976a914a9830a65a06703b7f3479fb76dba84a5c609c27888ac1e96bd00000000001976a9147073f14a83cd3c1409d4654f823b3d212248ac6e88acfd6e9a00000000001976a91495db46ddbdcec98ae44286a27d0e2261b6f7c85688ac29de2000000000001976a9147d9d90e38ab26b1b3bad803fba3d61ce2784a93688ac27fb9800000000001976a914f6f5e13d7d234837f0d87ee78d4ff8c3f4144ed588aca5ec86bf0e0000001976a9148255a41ba998eaffb465a3d8e93c594a1da8f1ab88ac93f33101000000001976a9144dbd328cecc555c670e4cf5fb2797326d9645aad88ac7bdd9900000000001976a9149b4dbcdfa48ec8ad89347dacb084eecb8261006888ac30e60203000000001976a914e1f431e2ae6cefd567231846f9dcf0c66d76e16588ac09daa700000000001976a914401a49d45a413e9696be0db70f975ce70f8c7cf388acdb63cd06000000001976a914708b30c60031ef4ab36787f5cf2a3b4578a4853888ac213f5503000000001976a914719fe2aea706e8aec771905582ded2518c18a22688ac40180200000000001976a914ef4056d82ac0b683fc0d3f07128b180fd03ee2dd88ac91ca1f00000000001976a914f161281ea6a041a88461e940d2c21404bcfab94588ac4aaf1200000000001976a914b69c7339f573f40513cf7a44dd4e5c3cc0a5e4b988acf90075060000000017a914d0ee49d95f1af8813af892f6f8f0b20cc0b2d623876d010200000000001976a914fb0c18362cfca25b7c94b472e6fc7553b0d4738188ac50cf0600000000001976a9142e10260dbb4a0fcbaa3b06c0bcd94c1f37f1c72d88ac722baf00000000001976a914baf763fa7d1cb569203b8be11c05c07baa50fbd588ac47b25d00000000001976a914ee5b497487fcd2790b007421b6031b5c9112dd6788ac75602800000000001976a914eddfc57e127d733926e97a58821839b83adb0b2a88ac76359a00000000001976a91432c5172f4f9ffcb2ac6742d19ca2e669f553513d88ace6a59f00000000001976a91433fc10b166d54a051560ba929388c874b9557edc88ac6e161500000000001976a914f12ca2a753b1d7b0a99432c4b9bf1da85653f55c88acd41a9b00000000001976a91442f117744d7e20658e54dc6dea545e9c5312462888acf76d4d00000000001976a914e34554ba274741b2a3ced9c054c27b91c0c2e03d88aced230200000000001976a91428062481ce9b03fd727d64bfa72b3dffacaf452b88ac418a171e000000001976a9142aec5ce62b93b06089074cd7657fc46694d4bfc088acc0540f00000000001976a9140e4819142771ccf9ab3c54fb17d834636c8f6a9488ac91731100000000001976a914ba5c11856d2c042e3ac4734e7e06b23fd99c0b7288ac76021500000000001976a9144d036eb4c1e0946c30559728001c66a108ee4a1288acf9f38219000000001976a9146f2bc25d2c470ce061f2678b98a1a4ddb4be4d4f88acf9047300000000001976a91438dfba1089757034c516a7949ebeb053ff015d6f88ac44825d00000000001976a91424da8bf275c1fc6efdfb2654bfd9e3e236bd881d88acffef5c00000000001976a9144a9ed8c7b52bf44d835326ff8967ef63f2f4830f88ac83bbfc05000000001976a91430dc5101259b18d053c794ec61731da4b06d182788ac72c0e400000000001976a9149c91bf5ba5c0b1e11e7af0aef690f4bb180bb9b788ac50870a00000000001976a914df89be1a534e1fd4b9a4b3616c27bf99fbc44efc88ac00000000548809000000000000000000000000 \ No newline at end of file diff --git a/src/fuzzing/DecodeHexTx/input/sapling.txt b/src/fuzzing/DecodeHexTx/input/sapling.txt new file mode 100644 index 000000000..333d69007 --- /dev/null +++ b/src/fuzzing/DecodeHexTx/input/sapling.txt @@ -0,0 +1 @@ +0400008085202f89000000000000ec8a0900102700000000000001251409d9698abef6527f651bac9cfd1eb57b7ff934b05e6921879e5fae0678adf9792e02ab24556f3fc6a24519d24ae7f2b8e3aed982cf3e36ea1a0c1243600d953fae63415e818e050048edb6fed27cc3f893d1b163620270bd7d7ce2065f303f57c1d621d3336305bcf9ffb8c13c917fcbcc05b68c27c77abf90a1a7013e1791fe0bfc4c147a66c8cf87a3ede59ba56f585bb6301eb3e0952fe066a0e40cfb8a58c1ed227471e9eafb999169ff7e19a85c3e9c739f7fe974c849309c379c9e3d6ed2d913ddaee302e6c54e929a85193ae7a7eb327fbae9082945732dfbd14a0b1cf66446b20c7e054e7cbd4a428eded695035e5d7144efb73b9e4ce10d2ce23516e95bbb3971403460ced0ac269eb2b86142ddb53d83ef09c6673cdba495f23dc0e1d17317c8debb31d0963c45884d2af79448057084b23a1776feacb8109246d49dc988b3fa7f32d53dbc3c40e5a0932dad6a87c916b6bbbec2d803bd806424ab3374eab7880e69570c6e94495e6c7445ad3911a29bfdf1f702688a66180902a001d887b84e87a1a08147b3ec53b92f7f3f214a1a1c60cded3d7b9e1516033a2586a074ad5b01a178db42b76d16c3db5302d62825347390cf5b760ea2362a27db3063d4a2021514a3c64e3bca0896a6b52c0b8ba4ef9120eb7cf9367ad6ca859d1986b00789a7889d2caf7b016a2e000bd0538359b250871497686c12321941787b6a65364138c7484037e7143d83a6d2606722b27ce75426cb1392e92ae4470dd8aa04f0fdeca4a924c599822496689bd7388214e68c8a94a9e07f0a41d485ff7cdce14fb1442f017231b0d27b7992b17007d034b0df7cb373495fd99668a4be34ceeea5b3a425cda44a1bb726e1cf0ac6b9cd05da93482524bdc60aec7300ae09281d5c62325d3c9ada64c41802358a692fb219712ff1e872476806d690b7f2ff68b023df2942d220a98b09af78dc85d1c1f4e39cc01aa4d4d7892fd665e1c0ec2fc35724586c75a9ff3c5f2d27226b8013562b59a6ee69d4d36e9d858da5a41a32c9769c41e7362681b5c93b5bb915adf1d08b71e2f74f15407dc2f3f48d7043d619d22f613714f21b481a80113a4a2b9616325aa52cf4cc6dd8db54f764ae7c7270476406ee8313b66e1109c14cb4ccd138b41e6c9e8005c593ab6e40a5d6bf5017a52faec7d0fdc3adf600af499d0e3c73a5567bbd2bd366132e2b222095843898814865e3b3a2e8662e87f9618764eb4b962e5eb8e8a7740197365eb2d0c086b4ffd65bd19cec6dba33634eefba2353ac622985f3e4dd6df772691661d58de3297d440ea58edc6297e877790e56320d13adfafa71b79b7381366564befbb40470b254935bb83a9acf4124cc45993c99c1713f500dad49bb3ba6ce70dfbb75091790a0a033a9c3dd0d8975fd005a0c5b9d3ca230c36173c96dc3d41833d3b75ef392edc08c5343f838f8d19714a5ce6afaafe34914a65177e348d56133ec9d1fdec768a4b4e3221d7820f941c0e79f5a97d25ca99a02e3211fd4d74b926cf14fad605fcd8631b2a9ce8156703e9623a1f6ef50e039e71ae0560a9b96a2965c964b6b133d8b3ee35e38f91c18645fab67b798a287fd50c9d48f39b213a1904b8a62102c214a0692ad01f5f74df6ff639cd28d95e720842295cd337d9639dd2e90f8996fcad10911eac82e8aa060ae211ad4620c1c6cc20b277f5b1f45b906625d98f07dfd16b5b70b983cd881571a6af39012ec30c43b8b1e12c3534d852453b26f8c2c50c4a902a339d67a0dc9081668a383ae6f28c0f2c7eb3c9cc0597d16c1ba83062729e1c90407431caf00f46e04c3350277bc318d2cc5d8d9857d294d50729b72dc3b78725a8ad6a40ffcae066d91108ebb9d34a6bfee2bb41b56fc7f08bf4b50e8c52567509215948f414356e5639cfadeceb04fd7d8b3e151fa3ee77f7ba87dbc0337b81e240e03508c69d35d1e5e3d998a589443edb68059b87e39b241cb16e09b6f1da1b381cd467f85df6b1cb29e7d8a89bf6216fdf927ede71ee945c36f313278ca50618da3d160fce0da32b325f27be0afaaeb92856d4dea26dba9922f5c541e76453893bea8f4ad4aed716835fa6ee6a04453d5fa1efe6efb64e060a82406c4230c8ed981f45f4ab078864b4388f3866aee9f76d2b0e2bea8601b4f8e79245fc5c94995be9674c1ae064242f6a65fad2ef9ea28e6bcba11fa07f14fad1c9da5f9cc78b4bb7217015968122f9c9ea59b661c3188c909e76caffd48185f6917ee306be440b67f7712500c5d37d14481e3ea01d78aeeca4178bb9835627d1d799bd5514039ac1f4bde04315bbfa194900885b9718be9871d629b9df14a022821c83c3039aec07f32575d2e84f6c3acc90d02a26a6380d63012310f6abd49c746cec06eb324715a2fa74d6c8e8327c85cabcbd78ece00fcff64cc36822b3ed28f15cc85fd4945e4010192890f30df28b6de4d3354e40e77121647a224e35874175a2de9cabca4dcead549d697a3bb76c0a2280c2a459ba63a9625ff53ce8accddd9b3dabb4a285d4cac4d410e787f5e8b9f1ba509d28fd95a2e0d3400d1c5e27394a64324ed44884eed42b273375bccc8b7df8bc035172eea0198b9ac8c1c99ecbe547102ec8449cc0d436f85567247cbb2942a51abbce1714caeb852afbd4a64649c2655d7b577061591b6a928c88f679a3f914e5608cc400c027e78911c192704f260cf4e05b96c5df0579a22e591e28c9c344320c12088fff7e81e4aef56ad417a2782dc03dc1d94909f0cb2a70304b2e6cabe4165ee53893dd63b58a08968fa43a03851da5151c7609715c3f6d21f01d15b578d8c37426da5008801107e35f62525734cd0a7876f065b920e2ec461c4f3700b792cf89c406893949a1058cf422837ffe1f87209212cc379a3b482e15e8993b468d94565317917870c734555a61db272a24fe52e40479c9a25276a0cc2e0c42404d11e9e1aae1c7545a6f99cbcb2cc2dfc11e889eade5df7f7da7aa38f12af116d217af57f8e3ae575e69190676502088cba9295f775538dfe653eecd0cf504643c2ff6920719d0d83047e16052016459f7fc802b420f0796c771b7d988fd95a42b17f363a692346455e1c6e173298aafeea3fcfca393349ebbefa6899777264b5d0452aa8f70573ae688d9916861447da00d9d847eda7e34f88988086d6734bb43ec53b4a2d9f260103cde700415214614727f24927a7e49fa191153a41eb24e73f78aaf544c10d68fbe459e232be1af6b48fa01b2d018774e28483d2f990d0eae272680f57e5980ff2033907 \ No newline at end of file diff --git a/src/fuzzing/DecodeHexTx/input/sprout.txt b/src/fuzzing/DecodeHexTx/input/sprout.txt new file mode 100644 index 000000000..e2b10f021 --- /dev/null +++ b/src/fuzzing/DecodeHexTx/input/sprout.txt @@ -0,0 +1 @@ +0400008085202f89000000000000ed8a090000000000000000000000010000000000000000102700000000000046e5b5ba294641c0491ef8cb5a97591fe1fcee2bab2301553f9bc0f9acc9bcb70f836c9945bfbae86faf169fd9be228f6c373e0b029fd648e7d0660d8412b50c0597c61387abfc9f1122179f1c612ad72ce09cf6dd8576f60494d0a828c10706f7594b5f237eeec5fd0474f6a16f3923a6e6881a0fe790a5328813abb559dcba268fbbe6e428783271ce752e1b21bedd8b70d7c7ca741651853bcc411ff5099d7cb3dee3ee072fd53bc32b597f0deff17ceb2cd47448bf1432f5bfdc022435060208d9cbd0f9af4dd89bbd62cb05ad865c3bd6b691ef5fa04f5498d32004874acf51385eea2e98e23f9d4b440b00bdbd972f049c559b4934bbbb429029adf8892c7f3c1a86d5d2be4db51cfe098ea31451ea6965fe49e06ada1c6734c3d180068816e8c85e02ecb55f6a4e558590c52b04c768f5d22682b7eb2cfc18c308542e67b85a4831130409b5ae2cb15c18873ab269b3560f1a4d09d723f82dcd4051db4fcaefbfcf923fcfb35befc8777a7afbf7a4ffbee41aeb53172e1b67efbaad4e12e75a08e3bd85b16af909d3262e3d43085a8f54dd8c00047394265d0368323e82bc345da1477026f3dbc5e05d85723ea77b4dd7b98dbf6bbe7c8988eae224ece369106513fc1b3604b6cfb5ac49da226e6269a52d6aa30a3ae70d06dfce27cb497083568cf4e362be2417328107ed01fbf63e1667ba221ee89c4fa37e9460eafcbb15f6f9184c09fff97ba4ca183b46246d354ef47f4423dbbda454738effb3efe0cc0cd7381d73e0d768bb1e7056fce119bf4877ca07c2e959027285c3a24f3b58b8ff31acc3e30f5c09ccdfad7b762ce5e7388d15f154db726a68b8a0f4b9bdb943d9fd9aef8c1a4c7d89709e5b931804d6b32dcc42fc0790c77e0db3c86623f89cc961ad3a41a80a42a5c1700ff2e6c70ce03fdbe498beb8184bb3a2ad5eb806d349fdfbd6bd066133977790df768abfcd02806d33bd5507ec279f5cea71734d9990e3cebee3e2e631caa21253f20a75b5e59f626f4f5d0da425e4387d73f4ab7179b753f396583f39b6b849c0bde5179c15b82d459d1d06e0d929a0b5d6e8d51453b12edc59c402bdcd79872b7a3e53f67ec37c2ad9a024668f62e1c0def0f8b1d11836fc20fe732327721a0b061466240b7fd5de687c01f08f186da67b867767b401395acefa618c012d72f0cee463e0eb73ac8a8b94fdbcb759afc4b337c47eb65a4105986dc82fdd45e65f9fb4a131eaa59257e2e4d28b7463575d9e641df173cfebf32a3cecee2e77d1b46b317b6d55e5c3103893a019d340ee5e91d55365f70ad36eb6d7fed94a052187d856231873df88093d10b4724a635372b4bf0232a88b9d7d3b7681a523d2f8d82a921c6bcd687cdf2aa19aecc202b87fb9fcd1997b73afde048c69e7c6b5c122435bd5df8e6b197042d0e6ab2770551f0cdaf008cbf5a25468aca996d8c13f3de549afbacc363b55e94ee10c1bde4c7d7a55bc014935b65267de17ffe5592cc5ce641a2de2a303cc557bd829a19651971eeac586654b282f92486c59dc8ef335c6a9ecfb178c3e0d6ea6df5c2e84604ca89b2fe5902a26ac3274be48259fcabf0dde398c2821cfedd1c93cb05e9a9cb7dd3107cbac001af08f0a64727447e17d6cf5678dcac770dfe7af08de1e1f16dfbe4df37675a54b0a9c2cdb32b2eaa54850b9e338139974f49e2b3c02646529170e69622d64f300cda3903ea6a83923de195ef2b69528ffcbf182a0297c0ee5e11916e60190981625e819739226f68b924237532175d9b05a6859a92dd78e7abcca7cfc10497857a12f07e5d0fcad158ed0b9b76663902c6508a9f51de19204536de5830a497fa9a75d8a0aa610c868960fa868a45afa466fd70834864b6b85f80ac6ee226920b702415579e8fe1129e60a35dd3dee6ba67a2151c027137ce7ce7c296678360463408fc6f02ea00333d2fec8323fe4cfe2a70c4d4cfb169b5954e31c575474d29d4167a6d3a4fc2ba5a8963aec24e775056c34d7b5ad1a9287f22d55b1d7d22e72ae79c9d55ab4ca67dd05c63e2c0cde5342b79a9d838106b416ce9a858fb8cdfa30174c18314485fe46d2151bc94f43b99544998c127fe504919cc9d9c105544c72b7265314a35dc38e04b282301cd4780352a978fadb080d8d2493ae0b92493be110700f943e63de82e68e129e894a2182a2fcfac30f770ce4f0601f57dc22c01330d409349b4c44b4a627dfc74b8a5c6a066a032fc93c7c7ee1aaeb17a7bfaefc5197e4355a4bd41cdd8ac651fae7d4d2d1c0713ffe1399199275c27da96ca6f959550c1040d46364c7f65fe3af541a43042dae394be74bef1515e25ce1c1d126295b44dc05dbc4a658d076ca39f35504966aa8872008447f38f9259099d0056b0c057ce9926ac208984fb6875b3c1f440e37a1ab9c6cb0957e39972596db5e3eb10252434bff0738aa107152cd4184329ee63dd7cdfdcbb3a3548e3c5431cae2c2ca85f1cd30f2aeeedd04 \ No newline at end of file diff --git a/src/fuzzing/DeserializeTx/fuzz.cpp b/src/fuzzing/DeserializeTx/fuzz.cpp new file mode 100644 index 000000000..0eedf4be4 --- /dev/null +++ b/src/fuzzing/DeserializeTx/fuzz.cpp @@ -0,0 +1,21 @@ +bool fuzz_TxDeserializeFunction (const std::vector txData) { + CTransaction tx; + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + try { + ssData >> tx; + return true; + } catch (const std::exception&) { + return false; + } +} + + +int fuzz_TxDeserialize (int argc, char *argv[]) { + std::ifstream t(argv[1]); + std::vector vec((std::istreambuf_iterator(t)), + std::istreambuf_iterator()); + if (fuzz_TxDeserializeFunction (vec)) { fprintf(stdout, "Deserialized the transaction.") ; return 0; } + else { fprintf(stderr, "Could not deserialize the transaction.") ; return -1; } +} + +int main (int argc, char *argv[]) { return fuzz_TxDeserialize(argc, argv); } diff --git a/src/fuzzing/DeserializeTx/fuzz.h b/src/fuzzing/DeserializeTx/fuzz.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/fuzzing/DeserializeTx/input/coinbase.bin b/src/fuzzing/DeserializeTx/input/coinbase.bin new file mode 100644 index 000000000..ca36e8cad Binary files /dev/null and b/src/fuzzing/DeserializeTx/input/coinbase.bin differ diff --git a/src/fuzzing/DeserializeTx/input/manyoutputs.bin b/src/fuzzing/DeserializeTx/input/manyoutputs.bin new file mode 100644 index 000000000..e726fb74a Binary files /dev/null and b/src/fuzzing/DeserializeTx/input/manyoutputs.bin differ diff --git a/src/fuzzing/DeserializeTx/input/sapling.bin b/src/fuzzing/DeserializeTx/input/sapling.bin new file mode 100644 index 000000000..2ac9414f2 Binary files /dev/null and b/src/fuzzing/DeserializeTx/input/sapling.bin differ diff --git a/src/fuzzing/DeserializeTx/input/sprout.bin b/src/fuzzing/DeserializeTx/input/sprout.bin new file mode 100644 index 000000000..b35aa0d5a Binary files /dev/null and b/src/fuzzing/DeserializeTx/input/sprout.bin differ diff --git a/zcutil/afl/afl-fuzz.sh b/zcutil/afl/afl-fuzz.sh new file mode 100755 index 000000000..13aadca20 --- /dev/null +++ b/zcutil/afl/afl-fuzz.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Builds AFL and an instrumented zcashd, then begins fuzzing. +# This script must be run from within the top level directory of a zcash clone. +# Pass it the name of a directory in ./src/fuzzing. + +set -eu -o pipefail + +FUZZ_CASE="$1" + +export AFL_INSTALL_DIR=$(realpath "./afl-temp") + +if [ ! -d "$AFL_INSTALL_DIR" ]; then + mkdir "$AFL_INSTALL_DIR" + ./zcutil/afl/afl-get.sh "$AFL_INSTALL_DIR" +fi + +cp "./src/fuzzing/$FUZZ_CASE/fuzz.h" src/fuzz.h +cp "./src/fuzzing/$FUZZ_CASE/fuzz.cpp" src/fuzz.cpp + +./zcutil/afl/afl-build.sh "$AFL_INSTALL_DIR" -j$(nproc) + +"$AFL_INSTALL_DIR/afl-fuzz" -i "./src/fuzzing/$FUZZ_CASE/input" -o "./src/fuzzing/$FUZZ_CASE/output" ./src/zcashd