1#!/bin/bash -eu 2# Copyright 2021 Google LLC 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16################################################################################ 17 18export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_NO_OPENSSL -D_LIBCPP_DEBUG=1" 19if [[ "$SANITIZER" = "memory" ]] 20then 21 export CXXFLAGS="$CXXFLAGS -DMSAN" 22fi 23export LIBFUZZER_LINK="$LIB_FUZZING_ENGINE" 24export LINK_FLAGS="" 25 26# Install Boost headers 27cd $SRC/ 28tar jxf boost_1_74_0.tar.bz2 29cd boost_1_74_0/ 30CFLAGS="" CXXFLAGS="" ./bootstrap.sh 31CFLAGS="" CXXFLAGS="" ./b2 headers 32cp -R boost/ /usr/include/ 33 34# Configure Cryptofuzz 35cd $SRC/cryptofuzz/ 36python gen_repository.py 37rm extra_options.h 38echo -n '"' >>extra_options.h 39echo -n "--force-module=blst " >>extra_options.h 40echo -n "--operations=" >>extra_options.h 41echo -n "BignumCalc," >>extra_options.h 42echo -n "BignumCalc_Fp2," >>extra_options.h 43echo -n "BignumCalc_Fp12," >>extra_options.h 44echo -n "BLS_BatchVerify," >>extra_options.h 45echo -n "BLS_FinalExp," >>extra_options.h 46echo -n "BLS_GenerateKeyPair," >>extra_options.h 47echo -n "BLS_HashToG1," >>extra_options.h 48echo -n "BLS_HashToG2," >>extra_options.h 49echo -n "BLS_IsG1OnCurve," >>extra_options.h 50echo -n "BLS_IsG2OnCurve," >>extra_options.h 51echo -n "BLS_Pairing," >>extra_options.h 52echo -n "BLS_PrivateToPublic," >>extra_options.h 53echo -n "BLS_PrivateToPublic_G2," >>extra_options.h 54echo -n "BLS_Sign," >>extra_options.h 55echo -n "BLS_Verify," >>extra_options.h 56echo -n "BLS_Compress_G1," >>extra_options.h 57echo -n "BLS_Compress_G2," >>extra_options.h 58echo -n "BLS_Decompress_G1," >>extra_options.h 59echo -n "BLS_Decompress_G2," >>extra_options.h 60echo -n "BLS_G1_Add," >>extra_options.h 61echo -n "BLS_G1_Mul," >>extra_options.h 62echo -n "BLS_G1_IsEq," >>extra_options.h 63echo -n "BLS_G1_Neg," >>extra_options.h 64echo -n "BLS_G2_Add," >>extra_options.h 65echo -n "BLS_G2_Mul," >>extra_options.h 66echo -n "BLS_G2_IsEq," >>extra_options.h 67echo -n "BLS_G2_Neg," >>extra_options.h 68echo -n "BLS_Aggregate_G1", >>extra_options.h 69echo -n "BLS_Aggregate_G2", >>extra_options.h 70echo -n "BignumCalc_Mod_BLS12_381_P," >>extra_options.h 71echo -n "BignumCalc_Mod_BLS12_381_R," >>extra_options.h 72echo -n "KDF_HKDF," >>extra_options.h 73echo -n "Misc " >>extra_options.h 74echo -n "--digests=SHA256 " >>extra_options.h 75echo -n '"' >>extra_options.h 76 77 78if [[ $CFLAGS = *-m32* ]] 79then 80 # Build and install libgmp 81 cd $SRC/ 82 mkdir $SRC/libgmp-install 83 tar xf gmp-6.2.1.tar.lz 84 cd $SRC/gmp-6.2.1/ 85 autoreconf -ivf 86 if [[ $CFLAGS != *-m32* ]] 87 then 88 ./configure --prefix="$SRC/libgmp-install/" --enable-cxx 89 else 90 setarch i386 ./configure --prefix="$SRC/libgmp-install/" --enable-cxx 91 fi 92 make -j$(nproc) 93 make install 94 export CXXFLAGS="$CXXFLAGS -I $SRC/libgmp-install/include/" 95fi 96 97function build_blst() { 98 if [[ "$SANITIZER" == "memory" ]] 99 then 100 # Patch to disable assembly 101 touch new_no_asm.h 102 echo "#if LIMB_T_BITS==32" >>new_no_asm.h 103 echo "typedef unsigned long long llimb_t;" >>new_no_asm.h 104 echo "#else" >>new_no_asm.h 105 echo "typedef __uint128_t llimb_t;" >>new_no_asm.h 106 echo "#endif" >>new_no_asm.h 107 cat src/no_asm.h >>new_no_asm.h 108 mv new_no_asm.h src/no_asm.h 109 110 CFLAGS="$CFLAGS -D__BLST_NO_ASM__ -D__BLST_PORTABLE__" ./build.sh 111 else 112 ./build.sh 113 fi 114 115 export BLST_LIBBLST_A_PATH=$(realpath libblst.a) 116 export BLST_INCLUDE_PATH=$(realpath bindings/) 117 export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_BLST" 118} 119 120# Build blst (normal) 121cp -R $SRC/blst/ $SRC/blst_normal/ 122cd $SRC/blst_normal/ 123build_blst 124 125# Build Chia 126if [[ $CFLAGS != *sanitize=memory* && $CFLAGS != *-m32* ]] 127then 128 # Build and install libsodium 129 cd $SRC/ 130 mkdir $SRC/libsodium-install 131 tar zxf libsodium-1.0.18-stable.tar.gz 132 cd $SRC/libsodium-stable/ 133 autoreconf -ivf 134 ./configure --prefix="$SRC/libsodium-install/" 135 make -j$(nproc) 136 make install 137 export CXXFLAGS="$CXXFLAGS -I $SRC/libsodium-install/include/" 138 export LINK_FLAGS="$LINK_FLAGS $SRC/libsodium-install/lib/libsodium.a" 139 140 cd $SRC/bls-signatures/ 141 mkdir build/ 142 cd build/ 143 if [[ $CFLAGS = *-m32* ]] 144 then 145 export CHIA_ARCH="X86" 146 else 147 export CHIA_ARCH="X64" 148 fi 149 cmake .. -DBUILD_BLS_PYTHON_BINDINGS=0 -DBUILD_BLS_TESTS=0 -DBUILD_BLS_BENCHMARKS=0 -DARCH=$CHIA_ARCH 150 make -j$(nproc) 151 export CHIA_BLS_LIBBLS_A_PATH=$(realpath src/libbls.a) 152 export CHIA_BLS_LIBRELIC_S_A_PATH=$(realpath _deps/relic-build/lib/librelic_s.a) 153 export CHIA_BLS_LIBSODIUM_A_PATH=$(realpath _deps/sodium-build/libsodium.a) 154 export CHIA_BLS_INCLUDE_PATH=$(realpath ../src/) 155 export CHIA_BLS_RELIC_INCLUDE_PATH_1=$(realpath _deps/relic-build/include/) 156 export CHIA_BLS_RELIC_INCLUDE_PATH_2=$(realpath _deps/relic-src/include/) 157 export LINK_FLAGS="$LINK_FLAGS -lgmp" 158 export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_CHIA_BLS" 159fi 160 161# Build mcl 162if [[ "$SANITIZER" != "memory" ]] 163then 164 cd $SRC/mcl/ 165 mkdir build/ 166 cd build/ 167 if [[ $CFLAGS != *-m32* ]] 168 then 169 cmake .. -DMCL_STATIC_LIB=on 170 export LINK_FLAGS="$LINK_FLAGS -lgmp" 171 else 172 cmake .. -DMCL_STATIC_LIB=on \ 173 -DGMP_INCLUDE_DIR="$SRC/libgmp-install/include/" \ 174 -DGMP_LIBRARY="$SRC/libgmp-install/lib/libgmp.a" \ 175 -DGMP_GMPXX_INCLUDE_DIR="$SRC/libgmp-install/include/" \ 176 -DGMP_GMPXX_LIBRARY="$SRC/libgmp-install/lib/libgmpxx.a" \ 177 -DMCL_USE_ASM=off 178 export LINK_FLAGS="$LINK_FLAGS $SRC/libgmp-install/lib/libgmp.a" 179 fi 180 make 181 export MCL_INCLUDE_PATH=$(realpath ../include/) 182 export MCL_LIBMCL_A_PATH=$(realpath lib/libmcl.a) 183 export MCL_LIBMCLBN384_A_PATH=$(realpath lib/libmclbn384.a) 184 export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_MCL" 185fi 186 187# Build Botan 188cd $SRC/botan/ 189if [[ $CFLAGS != *-m32* ]] 190then 191 ./configure.py --cc-bin=$CXX \ 192 --cc-abi-flags="$CXXFLAGS" \ 193 --disable-shared \ 194 --disable-modules=locking_allocator,x509,tls \ 195 --build-targets=static \ 196 --without-documentation 197else 198 ./configure.py --cpu=x86_32 \ 199 --cc-bin=$CXX \ 200 --cc-abi-flags="$CXXFLAGS" \ 201 --disable-shared \ 202 --disable-modules=locking_allocator,x509,tls \ 203 --build-targets=static \ 204 --without-documentation 205fi 206make -j$(nproc) 207 208export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_BOTAN -DCRYPTOFUZZ_BOTAN_IS_ORACLE" 209export LIBBOTAN_A_PATH="$SRC/botan/libbotan-3.a" 210export BOTAN_INCLUDE_PATH="$SRC/botan/build/include" 211 212# Build modules 213cd $SRC/cryptofuzz/modules/botan/ 214make -B 215 216cd $SRC/cryptofuzz/modules/blst/ 217make -B 218 219if [[ $CFLAGS != *sanitize=memory* && $CFLAGS != *-m32* ]] 220then 221 cd $SRC/cryptofuzz/modules/chia_bls/ 222 make -B 223fi 224 225if [[ "$SANITIZER" != "memory" ]] 226then 227 cd $SRC/cryptofuzz/modules/mcl/ 228 make -B 229fi 230 231# Build Cryptofuzz 232cd $SRC/cryptofuzz/ 233make -B -j 234 235cp cryptofuzz $OUT/cryptofuzz-bls-signatures 236 237# Build blst (optimized for size) 238cp -R $SRC/blst/ $SRC/blst_optimize_size/ 239cd $SRC/blst_optimize_size/ 240export CFLAGS="$CFLAGS -D__OPTIMIZE_SIZE__" 241build_blst 242 243cd $SRC/cryptofuzz/modules/blst/ 244make -B 245 246# Build Cryptofuzz 247cd $SRC/cryptofuzz/ 248rm entry.o; make 249 250cp cryptofuzz $OUT/cryptofuzz-bls-signatures_optimize_size 251