• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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