From 384fc9b87fdf3f97003ae751038e16d265a8bbae Mon Sep 17 00:00:00 2001 From: Samy Date: Wed, 26 Aug 2026 15:50:48 +0200 Subject: [PATCH] tests: add Bulletproof+ fuzz test --- contrib/fuzz_testing/fuzz.sh | 6 +-- tests/data/fuzz/bulletproof-plus/BP0 | Bin 0 -> 611 bytes tests/data/fuzz/bulletproof-plus/BP1 | Bin 0 -> 707 bytes tests/data/fuzz/bulletproof-plus/BP2 | Bin 0 -> 835 bytes tests/data/fuzz/bulletproof-plus/BP3 | Bin 0 -> 1027 bytes tests/data/fuzz/bulletproof-plus/BP4 | Bin 0 -> 1347 bytes tests/fuzz/CMakeLists.txt | 12 +++++ tests/fuzz/bulletproof-plus.cpp | 65 +++++++++++++++++++++++++++ 8 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 tests/data/fuzz/bulletproof-plus/BP0 create mode 100644 tests/data/fuzz/bulletproof-plus/BP1 create mode 100644 tests/data/fuzz/bulletproof-plus/BP2 create mode 100644 tests/data/fuzz/bulletproof-plus/BP3 create mode 100644 tests/data/fuzz/bulletproof-plus/BP4 create mode 100644 tests/fuzz/bulletproof-plus.cpp diff --git a/contrib/fuzz_testing/fuzz.sh b/contrib/fuzz_testing/fuzz.sh index 065dcc381..45904c608 100755 --- a/contrib/fuzz_testing/fuzz.sh +++ b/contrib/fuzz_testing/fuzz.sh @@ -10,12 +10,12 @@ fi type="$1" if test -z "$type" then - echo "usage: $0 block|transaction|signature|cold-outputs|cold-transaction|load-from-binary|load-from-json|base58|parse-url|http-client|levin|bulletproof|utf8|clsag|clsag_cout|clsag_message|clsag_pubs" + echo "usage: $0 block|transaction|signature|cold-outputs|cold-transaction|load-from-binary|load-from-json|base58|parse-url|http-client|levin|bulletproof|bulletproof-plus|utf8|clsag|clsag_cout|clsag_message|clsag_pubs" exit 1 fi case "$type" in - block|transaction|signature|cold-outputs|cold-transaction|load-from-binary|load-from-json|base58|parse-url|http-client|levin|bulletproof|utf8|clsag|clsag_cout|clsag_message|clsag_pubs) ;; - *) echo "usage: $0 block|transaction|signature|cold-outputs|cold-transaction|load-from-binary|load-from-json|base58|parse-url|http-client|levin|bulletproof|utf8|clsag|clsag_cout|clsag_message|clsag_pubs"; exit 1 ;; + block|transaction|signature|cold-outputs|cold-transaction|load-from-binary|load-from-json|base58|parse-url|http-client|levin|bulletproof|bulletproof-plus|utf8|clsag|clsag_cout|clsag_message|clsag_pubs) ;; + *) echo "usage: $0 block|transaction|signature|cold-outputs|cold-transaction|load-from-binary|load-from-json|base58|parse-url|http-client|levin|bulletproof|bulletproof-plus|utf8|clsag|clsag_cout|clsag_message|clsag_pubs"; exit 1 ;; esac if test -d "fuzz-out/$type" diff --git a/tests/data/fuzz/bulletproof-plus/BP0 b/tests/data/fuzz/bulletproof-plus/BP0 new file mode 100644 index 0000000000000000000000000000000000000000..a82eda814b33f61c50eeeca71bc58847a40be3dd GIT binary patch literal 611 zcmV-p0-XH;vWrYm`zhG*rkH5FN^(C#$J6A?W(q>JAA#NdD&k4ke?caQ1u(5MPd9!f z^d0BUEZQqr=EO5L#gUlfHA1H(orq@QI=ZLx3cTt{Y??pLe7_ni9xg#W@JPu~?%2p? z9KkicCxCIVIexeryE8|o8O3Mv9h4pBPYZLjT>9+T9f>X7wew4uf{bKI_%baJ>AGpz zA36ArJZ#?Wo3mdIM!yQ$o1zRGHjE+m*9VS4v7CDFK5E+hmHVJ=1iuOj>_AkQDUTiZ51|vX`6Tx2q(@u0hw@Me0Z*SA;32K`5!pXz` zC@SbPl@1)HO|!~fjaJs72xYG@9G)=0dSMxeJ3Xmf`aEK`%v)zO-5k1~29y$SZXQKy z+OkTlZvN3R!XJjI@BddrO1%=6jYQ;IH+5lJ-X~gr%dR#u3|oVml7GAfr0*V3!3_=r zGZ;7VaV&^D$jCB-Q2_4AB?b1CdWHTppvM-F#Xugl6L8uM=YIl1NrG+&Qjk{{xq-vS z!1$Iu@3M`6x&}c=>Yz85JwV;xBR~e%jb1;UB1dvRQ_egaGV);58CmS+zKIGu^mn*P za!g?f?f-qzN(%fE+sko?n9b(JO*Ri-1%( x$;`d8XiqFPPElS~Y`|GvWgvvaZorrHmidid^aB~>=t6ll84nbuO?c=|*GnNMBo_bx literal 0 HcmV?d00001 diff --git a/tests/data/fuzz/bulletproof-plus/BP1 b/tests/data/fuzz/bulletproof-plus/BP1 new file mode 100644 index 0000000000000000000000000000000000000000..0abf7b82d59ede353c9cb2955d2a07152f415540 GIT binary patch literal 707 zcmV;!0zCZ!Clu>K?yvK~BZ(V?GhEj~5@c70bXtg=6nbyhVWhULv`IU_1KJ-x3Q6^K z&f&_D8V4mm#Mn|>V~!Q?4pS{vGhDqGigntz0O=&76sNkT#66(EQ5NVRkjf@k{>xcALPHyF0R-AMtgJzE@S8(`p&BMdkp`lm?&uEyWx{Gz71 zh5S~#qJT#kGLEp0^&>{Bf0(kssGo>5rqD%$NRlWr1E8)*`4$RH8;RTu=4{K?mMmCu zJ`w30SY4Lr2snC1{NZE7A|ytU-_XzsfzDa?0v5QrNqG=kOq>)!+kdHN))JrxmAO#W z_r^#C2QlY3WzDQqwXlIyW%`Sdf;NQw0Xy(FCMEHT0bJsAT}LmQz*A12^k1?yb8pa5 zEB|HM?etx(N~l@})0aB8vCSJ!zSE(Wn&bN{l5Nz&c#RQt=}$NNtELD!Tlz?}UjmGY zxha?X3tK(yqKFPvdXA^VAIJi#+-go_tm>ZIJscwf+)GsSR$oQxV!IL!2nxrIH;qPI znM_=hi1bX6vOgVpN#L3`7ZkQH%7nSWS{>jROH|o+&@Glqf^VlEaR&m5St6rs$5w$MeA4FuK$1^LW z1t+!_Z*W25t6kkC1P(>av{o5A@AhD{O;cw8)e+`ww=8 zA>b6#Ld9BdGbmiU>FR4p7PQ^?&+GLP{j@(?&M^A5N)rH#77m?%e3kn&2VQ<=){%CAdjvEr|z4$rE zK$h~DeSkpvFTrOu8Oo~9&rWjO5cWvnr=n>e7SwnVvDCzF7vG&9GXy*e4QALrMOv}V zl6h@wt{Te$^xFs{+cCLpjBWsPqBCU<0q^2DJMl;;FHI|Z|FG{xgV%v0j!4*X<~X_6I`kJfjmjh#BO`>pxoJ@YZ~6{D1i%;x5j!HMrt z=S(Q3XWr;U%ND;Q+1GPWVB@ZsxM&n=daZZqB{){Wz&(#T)fTQN0rTL#3pud(LO8R@ zhr^fezSjZceWanQUBembp%A0_duC|nM`{rFIFgIdRC5j zY$r%#c!6wKU!TMRt*sp`e~Yy08JxjLOQQR5$L=nFgtqtR0vR8@69#!kZdgVOX8yq{ zrhM!m5g5S}@l}KdgU20A#9yfo9xkaM>crj1D)Qp2Mcz|>-`IDQybu*(EsK*+%#Ov} z?MHCffFe>R+8L{!F6iegQ87=@(Anj=*d_U8d;FzP4{jS!suTbK literal 0 HcmV?d00001 diff --git a/tests/data/fuzz/bulletproof-plus/BP3 b/tests/data/fuzz/bulletproof-plus/BP3 new file mode 100644 index 0000000000000000000000000000000000000000..b24511cfa9606b85885f6a1ae63dc626add08d74 GIT binary patch literal 1027 zcmV+e1pNC5w!2pzh;*Upb|J`!7fhfUV7_66PQD-&V*2}FAo|w$#Ys-KA--MS zYq$XrX;fR5z-ZjXw`_ldR`J>8S{gn{AD!?|C+#TXBG9$VVA1uIB>jds0a1z%Ui%hM zb5H})@bBzBVJ4mdT8h#a--f|VB7pm`%RenXi0(oPH>i|bmN|JfK(JG9@K`eMvpLfC zRtIYk>P*2R_ny=WZ+oyO%MDj$h13`SvaqXC#$)c<(Nft_;*_EfY!cP0jBfn-CPO!g zY7(m+JiJprT`;T~?%a=nUjyN2AiP0|zpz^m&l^ghiZjQ#I)d;PL0r=_ei>i#%yU3J zL7&PL$w&4JyJK7?WTPA|jWT`n+63+?Xt%jZE~#O*=yNkULa?U=2^xFb{p$W3C03>e z4{`Kz&)|0j6+X!`mC%81eJVin-K_(Ld`hJjK^0%4rI~E7>Zo4G;nBL1>4v_^$l z#TyP=Zuz#W69MNkVcjywfeF1_Nz}u{51y2;UUcZdoz*WhXWyKoZ0r4In&^aLFQ{A? z4Y6N5`P_bh>h%HvlIKI!cNi^M>_3OLuha?g(bo4RxwP5bG?3<-TeP1 z@rAyIQSf5%&Zq!i%w^m3llbeiA+wXdgp%j~NVDeDE&e3s`BE2|HcS|*$I+}woGUq? x+i`%=g{}B~0Hy!{ literal 0 HcmV?d00001 diff --git a/tests/data/fuzz/bulletproof-plus/BP4 b/tests/data/fuzz/bulletproof-plus/BP4 new file mode 100644 index 0000000000000000000000000000000000000000..050857d078621ec8644947256acfa3039b9de917 GIT binary patch literal 1347 zcmV-J1-$wY&g4KX^I*0;2IsV~^GTqVa*m_*cy;cN@yA3NRh%3iUBoEy z{_L^jrFit)V>k8j=GW*i!@|2mRGRS>yuO3XiRXO;%D6bOTq){(Zg&k5sJHU(^eBCu zG^t7a(I9tog$t5pQz!b3vp{IpLvDVWZhq4Ev6v-?dSu-5P5bMAlVz<@aO_Z{79)vA z!uIufq9};5<}HL(MzM;r)BqdjB)i+v^g+0Wg%%4U6JLcchoimz8trdHO`YM&EUB0h za$YLOQV43nilwZ2ImPu7MxLJ_31a*(WbiGg#zsNF`X}bK<2clb1i_7MX+-l37aRGK zdRBQHk7FYub@uk0%(3WXe8x=8}uwCRVCt~nJ@tXW;NO@3&9F8Dx zP!K|dnTkf(uxCm9*z@z&Yt}Bpk@f{U+pr7l{089)TkX5k80(jb0@ZmSUq^3=`B{k3vf%eJ?^YD25o^Q3U7`X>hQ3j;QzPND^TVs z@IB{&3dUuC=}@{wyBHT?J5=8@(tQbfzsS?!Em!ieN|=H=WbD`S?VU7nK)lqmP4Ax0dPNXr>H@O7B-AVDEu53+5`*7%{K z;2522^2Tx&`to_L}1BH zJix5N*IoE{3r(^Cy5n@@Fo4_iBfy>$V4_ybA698#1&%ZrJHA6)GSyhHU<#GY7JI2I z;8-AbGVWdFxXT&tJ*grOj@%{omu5Yv=A;^7Va-QvghM7ql_!C7k?=Ds|JMTUioLDU zidFl;CD~KzdpH^x$g^5Ih>pQ*{hAyg8I(>{+LRZFT$u1&ZY= z{98xETP`5IUSyp`4kyXZ7UocwuoO}*YV^zfZRbpw-){IMW+2|CG;GC(5TeV +#include + +namespace +{ + struct fuzz_input + { + rct::keyV commitments; + rct::BulletproofPlus proof; + + BEGIN_SERIALIZE_OBJECT() + FIELD(commitments) + FIELD(proof) + END_SERIALIZE() + }; +} + +BEGIN_INIT_SIMPLE_FUZZER() +END_INIT_SIMPLE_FUZZER() + +BEGIN_SIMPLE_FUZZER() + if (len > 4096) + return 0; + + fuzz_input input; + const std::string blob{reinterpret_cast(buf), len}; + if (!serialization::parse_binary(blob, input)) + return 0; + + input.proof.V = std::move(input.commitments); + rct::bulletproof_plus_VERIFY(input.proof); +END_SIMPLE_FUZZER()