1*f0865ec9SKyle Evans#/* 2*f0865ec9SKyle Evans# * Copyright (C) 2017 - This file is part of libecc project 3*f0865ec9SKyle Evans# * 4*f0865ec9SKyle Evans# * Authors: 5*f0865ec9SKyle Evans# * Ryad BENADJILA <ryadbenadjila@gmail.com> 6*f0865ec9SKyle Evans# * Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr> 7*f0865ec9SKyle Evans# * Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr> 8*f0865ec9SKyle Evans# * 9*f0865ec9SKyle Evans# * Contributors: 10*f0865ec9SKyle Evans# * Nicolas VIVET <nicolas.vivet@ssi.gouv.fr> 11*f0865ec9SKyle Evans# * Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr> 12*f0865ec9SKyle Evans# * 13*f0865ec9SKyle Evans# * This software is licensed under a dual BSD and GPL v2 license. 14*f0865ec9SKyle Evans# * See LICENSE file at the root folder of the project. 15*f0865ec9SKyle Evans# */ 16*f0865ec9SKyle Evans#!/bin/sh 17*f0865ec9SKyle Evans 18*f0865ec9SKyle Evans# Check if a file $1 exists. Copy it in $2 if 19*f0865ec9SKyle Evans# it exists, or else log and error in $3. 20*f0865ec9SKyle Evanscheck_and_copy(){ 21*f0865ec9SKyle Evans if [ -e $1 ] 22*f0865ec9SKyle Evans then 23*f0865ec9SKyle Evans cp $1 $2 24*f0865ec9SKyle Evans else 25*f0865ec9SKyle Evans echo "$2 did not compile ..." >> $3 26*f0865ec9SKyle Evans fi 27*f0865ec9SKyle Evans} 28*f0865ec9SKyle Evans 29*f0865ec9SKyle Evanscopy_compiled_examples(){ 30*f0865ec9SKyle Evans ROOT_DIR=$1 31*f0865ec9SKyle Evans CROSSBUILD_OUTPUT=$2 32*f0865ec9SKyle Evans triplet=$3 33*f0865ec9SKyle Evans wordsize=$4 34*f0865ec9SKyle Evans ERROR_LOG_FILE=$5 35*f0865ec9SKyle Evans suffix=$6 36*f0865ec9SKyle Evans # Basic 37*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/basic/nn_pollard_rho $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/nn_pollard_rho_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 38*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/basic/fp_square_residue $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/fp_square_residue_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 39*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/basic/curve_basic_examples $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/curve_basic_examples_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 40*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/basic/curve_ecdh $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/curve_ecdh_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 41*f0865ec9SKyle Evans # Hash 42*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/"hash"/"hash" $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/hash_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 43*f0865ec9SKyle Evans # SSS 44*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/sss/sss $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/sss_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 45*f0865ec9SKyle Evans # Signatures 46*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/sig/rsa/rsa $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/rsa_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 47*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/sig/dsa/dsa $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/dsa_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 48*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/sig/sdsa/sdsa $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/sdsa_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 49*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/sig/kcdsa/kcdsa $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/kcdsa_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 50*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/src/examples/sig/gostr34_10_94/gostr34_10_94 $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/gostr34_10_94_"$triplet"_word"$wordsize""$suffix" $ERROR_LOG_FILE 51*f0865ec9SKyle Evans} 52*f0865ec9SKyle Evans 53*f0865ec9SKyle Evanscheck_triplet_wordsize(){ 54*f0865ec9SKyle Evans triplet=$1 55*f0865ec9SKyle Evans wordsize=$2 56*f0865ec9SKyle Evans # Create a temporary workspace and copy the files to compile 57*f0865ec9SKyle Evans ROOT_DIR=$CROSSBUILD_OUTPUT/tmp/ecc_root_"$triplet"_"$wordsize" 58*f0865ec9SKyle Evans mkdir -p $ROOT_DIR 59*f0865ec9SKyle Evans # Copy necessary source files from the root project 60*f0865ec9SKyle Evans cp -r $SRC_DIR/src/ $ROOT_DIR/ 61*f0865ec9SKyle Evans cp -r $SRC_DIR/include/ $ROOT_DIR/ 62*f0865ec9SKyle Evans cp $SRC_DIR/common.mk $ROOT_DIR/ 63*f0865ec9SKyle Evans cp $SRC_DIR/Makefile $ROOT_DIR/ 64*f0865ec9SKyle Evans mkdir -p $ROOT_DIR/build 65*f0865ec9SKyle Evans mkdir -p $CROSSBUILD_OUTPUT/compilation_log 66*f0865ec9SKyle Evans mkdir -p $CROSSBUILD_OUTPUT/error_log 67*f0865ec9SKyle Evans COMPILATION_LOG_FILE=$CROSSBUILD_OUTPUT/compilation_log/compilation_log_"$triplet"_"$wordsize" 68*f0865ec9SKyle Evans ERROR_LOG_FILE=$CROSSBUILD_OUTPUT/error_log/error_log_"$triplet"_"$wordsize" 69*f0865ec9SKyle Evans # NOTE: for 64 bit triplets, multiarch/crossbuild docker's gcc 4.9 has a bug handling loop unrolling in -O3 and 70*f0865ec9SKyle Evans # is mistaken in detecting arrays overflows at compilation time 71*f0865ec9SKyle Evans # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64277 72*f0865ec9SKyle Evans # Also, add the "-Wno-pedantic-ms-format" for specific quikrs of mingw with "%lld" (...) 73*f0865ec9SKyle Evans if [ "$triplet" = "x86_64-w64-mingw32" ] || [ "$triplet" = "aarch64-linux-gnu" ]; then 74*f0865ec9SKyle Evans extra_lib_cflags="-O2" 75*f0865ec9SKyle Evans extra_bin_cflags="" 76*f0865ec9SKyle Evans if [ "$triplet" = "x86_64-w64-mingw32" ] && [ "$wordsize" = "64" ]; then 77*f0865ec9SKyle Evans extra_lib_cflags=$extra_lib_cflags" -Wno-pedantic-ms-format" 78*f0865ec9SKyle Evans fi 79*f0865ec9SKyle Evans # There is also a misbehavior for mingw improperly finding unintialized variables 80*f0865ec9SKyle Evans # Also, add the "-Wno-pedantic-ms-format" for specific quikrs of mingw with "%lld" (...) 81*f0865ec9SKyle Evans elif [ "$triplet" = "i686-w64-mingw32" ]; then 82*f0865ec9SKyle Evans extra_lib_cflags="-Wno-maybe-uninitialized" 83*f0865ec9SKyle Evans extra_bin_cflags="" 84*f0865ec9SKyle Evans if [ "$wordsize" = "64" ]; then 85*f0865ec9SKyle Evans extra_lib_cflags=$extra_lib_cflags" -Wno-pedantic-ms-format" 86*f0865ec9SKyle Evans fi 87*f0865ec9SKyle Evans # NOTE: on darwin based clang, some of our options are too recent for the installed 88*f0865ec9SKyle Evans # llvm ... Hence we remove warnings as errors here 89*f0865ec9SKyle Evans elif [ "$triplet" = "i386-apple-darwin" ] || [ "$triplet" = "x86_64-apple-darwin" ] || [ "$triplet" = "x86_64h-apple-darwin" ]; then 90*f0865ec9SKyle Evans extra_lib_cflags="-Wno-error" 91*f0865ec9SKyle Evans extra_bin_cflags="-Wno-error" 92*f0865ec9SKyle Evans else 93*f0865ec9SKyle Evans extra_lib_cflags="" 94*f0865ec9SKyle Evans extra_bin_cflags="" 95*f0865ec9SKyle Evans fi 96*f0865ec9SKyle Evans ############## Release compilation 97*f0865ec9SKyle Evans echo "======== COMPILING RELEASE FOR $triplet / $wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 98*f0865ec9SKyle Evans # Library, self tests and utils 99*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 100*f0865ec9SKyle Evans mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize" 101*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize" $ERROR_LOG_FILE 102*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize" $ERROR_LOG_FILE 103*f0865ec9SKyle Evans # Examples 104*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 105*f0865ec9SKyle Evans copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "" 106*f0865ec9SKyle Evans # Clean 107*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean 108*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean 109*f0865ec9SKyle Evans ############## Debug compilation 110*f0865ec9SKyle Evans echo "======== COMPILING DEBUG FOR $triplet / $wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 111*f0865ec9SKyle Evans ############## Release compilation 112*f0865ec9SKyle Evans # Library, self tests and utils 113*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 114*f0865ec9SKyle Evans mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize" 115*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_debug $ERROR_LOG_FILE 116*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_debug $ERROR_LOG_FILE 117*f0865ec9SKyle Evans # Examples 118*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 119*f0865ec9SKyle Evans copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_debug" 120*f0865ec9SKyle Evans # Clean 121*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean 122*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean 123*f0865ec9SKyle Evans echo "===========================================" 2>&1 | tee -a $COMPILATION_LOG_FILE 124*f0865ec9SKyle Evans # Compile static binaries for everyone except Mac OS (gcc on it does not support -static) 125*f0865ec9SKyle Evans if [ "$triplet" != "i386-apple-darwin" ] && [ "$triplet" != "x86_64-apple-darwin" ] && [ "$triplet" != "x86_64h-apple-darwin" ]; then 126*f0865ec9SKyle Evans ############## Release compilation with static binaries (for emulation) 127*f0865ec9SKyle Evans echo "======== COMPILING STATIC RELEASE FOR $triplet / $wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 128*f0865ec9SKyle Evans # Library, self tests and utils 129*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" -e BIN_LDFLAGS="-static" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 130*f0865ec9SKyle Evans mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize" 131*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_static $ERROR_LOG_FILE 132*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_static $ERROR_LOG_FILE 133*f0865ec9SKyle Evans # Examples 134*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" -e BIN_LDFLAGS="-static" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 135*f0865ec9SKyle Evans copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_static" 136*f0865ec9SKyle Evans # Clean 137*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean 138*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean 139*f0865ec9SKyle Evans ##### 4096 bits case for 64 bit word size only 140*f0865ec9SKyle Evans ############################################### 141*f0865ec9SKyle Evans if [ "$wordsize" = "64" ]; then 142*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean 143*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean 144*f0865ec9SKyle Evans # Self tests and utils 145*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags -DUSER_NN_BIT_LEN=4096" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags -DUSER_NN_BIT_LEN=4096" -e BIN_LDFLAGS="-static" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 146*f0865ec9SKyle Evans mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize" 147*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_static_4096 $ERROR_LOG_FILE 148*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_static_4096 $ERROR_LOG_FILE 149*f0865ec9SKyle Evans # Examples 150*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags -DUSER_NN_BIT_LEN=4096" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags -DUSER_NN_BIT_LEN=4096" -e BIN_LDFLAGS="-static" multiarch/crossbuild make "$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 151*f0865ec9SKyle Evans copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_static_4096" 152*f0865ec9SKyle Evans # Clean 153*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean 154*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean 155*f0865ec9SKyle Evans fi 156*f0865ec9SKyle Evans ############## Debug compilation with static binaries (for emulation) 157*f0865ec9SKyle Evans echo "======== COMPILING STATIC DEBUG FOR $triplet / $wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 158*f0865ec9SKyle Evans ############## Release compilation with static binaries (for emulation) 159*f0865ec9SKyle Evans # Self tests and utils 160*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" -e BIN_LDFLAGS="-static" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 161*f0865ec9SKyle Evans mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize" 162*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_debug_static $ERROR_LOG_FILE 163*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_debug_static $ERROR_LOG_FILE 164*f0865ec9SKyle Evans # Examples 165*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags" -e BIN_LDFLAGS="-static" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 166*f0865ec9SKyle Evans copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_debug_static" 167*f0865ec9SKyle Evans # Clean 168*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean 169*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean 170*f0865ec9SKyle Evans ##### 4096 bits case for 64 bit word size only 171*f0865ec9SKyle Evans ############################################### 172*f0865ec9SKyle Evans if [ "$wordsize" = "64" ]; then 173*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean 174*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean 175*f0865ec9SKyle Evans # Self tests and utils 176*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR -e EXTRA_LIB_CFLAGS="$extra_lib_cflags -DUSER_NN_BIT_LEN=4096" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags -DUSER_NN_BIT_LEN=4096" -e BIN_LDFLAGS="-static" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 177*f0865ec9SKyle Evans mkdir -p $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize" 178*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_self_tests $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_self_tests_"$triplet"_word"$wordsize"_debug_static_4096 $ERROR_LOG_FILE 179*f0865ec9SKyle Evans check_and_copy $ROOT_DIR/build/ec_utils $CROSSBUILD_OUTPUT/"$triplet"/word"$wordsize"/ec_utils_"$triplet"_word"$wordsize"_debug_static_4096 $ERROR_LOG_FILE 180*f0865ec9SKyle Evans # Examples 181*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/ -w $ROOT_DIR/src/examples -e EXTRA_LIB_CFLAGS="$extra_lib_cflags -DUSER_NN_BIT_LEN=4096" -e EXTRA_BIN_CFLAGS="$extra_bin_cflags -DUSER_NN_BIT_LEN=4096" -e BIN_LDFLAGS="-static" multiarch/crossbuild make debug"$wordsize" 2>&1 | tee -a $COMPILATION_LOG_FILE 182*f0865ec9SKyle Evans copy_compiled_examples "$ROOT_DIR" "$CROSSBUILD_OUTPUT" "$triplet" "$wordsize" "$ERROR_LOG_FILE" "_debug_static_4096" 183*f0865ec9SKyle Evans # Clean 184*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR -w $ROOT_DIR multiarch/crossbuild make clean 185*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -e CROSS_TRIPLE=$triplet -v $ROOT_DIR:$ROOT_DIR/src/examples -w $ROOT_DIR/src/examples multiarch/crossbuild make clean 186*f0865ec9SKyle Evans fi 187*f0865ec9SKyle Evans echo "===========================================" 2>&1 | tee -a $COMPILATION_LOG_FILE 188*f0865ec9SKyle Evans fi 189*f0865ec9SKyle Evans # Cleanup compilation stuff 190*f0865ec9SKyle Evans rm -rf $ROOT_DIR 191*f0865ec9SKyle Evans} 192*f0865ec9SKyle Evans 193*f0865ec9SKyle Evans 194*f0865ec9SKyle Evansprint_help(){ 195*f0865ec9SKyle Evans echo "$0 uses the docker multiarch/crossbuild image to compile libecc on multiple platforms" 196*f0865ec9SKyle Evans echo "with multiple word sizes (16, 32 and 64). The compilation logs and errors as well as" 197*f0865ec9SKyle Evans echo "the produced binaries are kept int the 'crossbuild_out' folder." 198*f0865ec9SKyle Evans echo "Supported platform triplets are:" 199*f0865ec9SKyle Evans echo "arm-linux-gnueabi / arm-linux-gnueabihf / powerpc64le-linux-gnu / aarch64-linux-gnu /" 200*f0865ec9SKyle Evans echo "mipsel-linux-gnu / i386-apple-darwin / x86_64-apple-darwin / i686-w64-mingw32 / x86_64-w64-mingw32." 201*f0865ec9SKyle Evans echo "" 202*f0865ec9SKyle Evans echo "$0 with no argument will test the compilation for all the triplets and the word sizes." 203*f0865ec9SKyle Evans echo " -h: print this help" 204*f0865ec9SKyle Evans echo " -triplet: execute the crossbuild only for a given triplet:" 205*f0865ec9SKyle Evans echo " $ sh $0 -triplet arm-linux-gnueabi" 206*f0865ec9SKyle Evans echo " => This will execute cross-compilation for arm-linux-gnueabi for all the word sizes." 207*f0865ec9SKyle Evans echo " $ sh $0 -triplet arm-linux-gnueabi 64" 208*f0865ec9SKyle Evans echo " => This will execute cross-compilation for arm-linux-gnueabi only for 64-bit word size." 209*f0865ec9SKyle Evans echo " -cpu: will specify the number of tasks used for parallel compilation. The default behaviour is to" 210*f0865ec9SKyle Evans echo " use the maximum available CPUs on the machine, but one can reduce th enumber of parallel" 211*f0865ec9SKyle Evans echo " tasks with this toggle. Warning: this toggle is not compatible with the -triplet toggle." 212*f0865ec9SKyle Evans} 213*f0865ec9SKyle Evans 214*f0865ec9SKyle Evans 215*f0865ec9SKyle Evans######### Script main 216*f0865ec9SKyle Evans 217*f0865ec9SKyle Evans# Adapt our sources directory depending on the calling 218*f0865ec9SKyle Evans# directory 219*f0865ec9SKyle EvansSRC_DIR=`dirname "$(readlink -f "$0")"`/.. 220*f0865ec9SKyle EvansCROSSBUILD_OUTPUT=$SRC_DIR/scripts/crossbuild_out/ 221*f0865ec9SKyle Evans 222*f0865ec9SKyle Evans# Check for the docker command line 223*f0865ec9SKyle EvansCHECK_DOCKER=$(docker -v) 224*f0865ec9SKyle Evansif [ $? -ne 0 ]; then 225*f0865ec9SKyle Evans echo "docker is not installed ... Please install it!" 226*f0865ec9SKyle Evans exit 227*f0865ec9SKyle Evansfi 228*f0865ec9SKyle Evans 229*f0865ec9SKyle Evans# Check for docker image multiarch/crossbuild 230*f0865ec9SKyle Evansif [ -z $(docker images -q multiarch/crossbuild) ] 231*f0865ec9SKyle Evansthen 232*f0865ec9SKyle Evans echo "Please install the multiarch/crossbuild docker image:" 233*f0865ec9SKyle Evans echo "$ docker pull multiarch/crossbuild" 234*f0865ec9SKyle Evans exit 235*f0865ec9SKyle Evansfi 236*f0865ec9SKyle Evans 237*f0865ec9SKyle Evans# Print help if asked 238*f0865ec9SKyle Evansif [ "$1" = "-h" ] 239*f0865ec9SKyle Evansthen 240*f0865ec9SKyle Evans print_help $0 241*f0865ec9SKyle Evans exit 242*f0865ec9SKyle Evansfi 243*f0865ec9SKyle Evans 244*f0865ec9SKyle Evans# If we have arguments, just execute subcommand 245*f0865ec9SKyle Evansif [ "$1" = "-triplet" ] 246*f0865ec9SKyle Evansthen 247*f0865ec9SKyle Evans # Clean stuff if this is an explicit call from command line 248*f0865ec9SKyle Evans if ! [ "$4" = "-automate" ] 249*f0865ec9SKyle Evans then 250*f0865ec9SKyle Evans echo "Cleaning before running ..." 251*f0865ec9SKyle Evans rm -rf $CROSSBUILD_OUTPUT/* 252*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc multiarch/crossbuild make clean 253*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc/src/examples multiarch/crossbuild make clean 254*f0865ec9SKyle Evans docker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc/src/arithmetic_tests multiarch/crossbuild make clean 255*f0865ec9SKyle Evans fi 256*f0865ec9SKyle Evans # If no specific word size has been given, do all the sizes 257*f0865ec9SKyle Evans if [ "$3" = "" ] 258*f0865ec9SKyle Evans then 259*f0865ec9SKyle Evans for wordsize in 16 32 64; 260*f0865ec9SKyle Evans do 261*f0865ec9SKyle Evans check_triplet_wordsize $2 $wordsize 262*f0865ec9SKyle Evans done 263*f0865ec9SKyle Evans else 264*f0865ec9SKyle Evans check_triplet_wordsize $2 $3 265*f0865ec9SKyle Evans fi 266*f0865ec9SKyle Evans exit 267*f0865ec9SKyle Evansfi 268*f0865ec9SKyle Evans 269*f0865ec9SKyle Evans# Clean 270*f0865ec9SKyle Evansecho "Cleaning before running ..." 271*f0865ec9SKyle Evansrm -rf $CROSSBUILD_OUTPUT/* 272*f0865ec9SKyle Evansdocker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc multiarch/crossbuild make clean 273*f0865ec9SKyle Evansdocker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc/src/examples multiarch/crossbuild make clean 274*f0865ec9SKyle Evansdocker run -e VERBOSE=1 -e ASSERT_PRINT="1" -e COMPLETE="$COMPLETE" -e BLINDING="$BLINDING" -e LADDER="$LADDER" -e CRYPTOFUZZ="$CRYPTOFUZZ" --rm -v $SRC_DIR:/ecc -w /ecc/src/arithmetic_tests multiarch/crossbuild make clean 275*f0865ec9SKyle Evans 276*f0865ec9SKyle EvansALL_CHECKS="" 277*f0865ec9SKyle Evansfor wordsize in 16 32 64; 278*f0865ec9SKyle Evansdo 279*f0865ec9SKyle Evans for triplet in arm-linux-gnueabi arm-linux-gnueabihf powerpc64le-linux-gnu aarch64-linux-gnu mipsel-linux-gnu i386-apple-darwin x86_64-apple-darwin x86_64h-apple-darwin i686-w64-mingw32 x86_64-w64-mingw32; 280*f0865ec9SKyle Evans do 281*f0865ec9SKyle Evans ALL_CHECKS="$ALL_CHECKS\n-triplet $triplet $wordsize -automate" 282*f0865ec9SKyle Evans done 283*f0865ec9SKyle Evansdone 284*f0865ec9SKyle Evans 285*f0865ec9SKyle Evansif [ "$1" = "-cpu" ] 286*f0865ec9SKyle Evansthen 287*f0865ec9SKyle Evans if [ "$3" = "-triplet" ] 288*f0865ec9SKyle Evans then 289*f0865ec9SKyle Evans echo "-cpu and -triplet are not compatible ..." 290*f0865ec9SKyle Evans exit 291*f0865ec9SKyle Evans else 292*f0865ec9SKyle Evans # User defined number of CPUs 293*f0865ec9SKyle Evans NCPU=$2 294*f0865ec9SKyle Evans fi 295*f0865ec9SKyle Evanselse 296*f0865ec9SKyle Evans # Get number of CPUs for parallel processing 297*f0865ec9SKyle Evans NCPU=`getconf _NPROCESSORS_ONLN` 298*f0865ec9SKyle Evansfi 299*f0865ec9SKyle Evansecho "Parallelizing on $NCPU processors" 300*f0865ec9SKyle Evans# Unleash the kraken 301*f0865ec9SKyle Evansecho $ALL_CHECKS | xargs -n 4 -P $NCPU sh `readlink -f "$0"` 302*f0865ec9SKyle Evans 303*f0865ec9SKyle Evans# Check if we had an error, and if yes exit with error 304*f0865ec9SKyle Evansfor wordsize in 16 32 64; 305*f0865ec9SKyle Evansdo 306*f0865ec9SKyle Evans for triplet in arm-linux-gnueabi arm-linux-gnueabihf powerpc64le-linux-gnu aarch64-linux-gnu mipsel-linux-gnu i386-apple-darwin x86_64-apple-darwin x86_64h-apple-darwin i686-w64-mingw32 x86_64-w64-mingw32; 307*f0865ec9SKyle Evans do 308*f0865ec9SKyle Evans ERROR_LOG_FILE=$CROSSBUILD_OUTPUT/error_log/error_log_"$triplet"_"$wordsize" 309*f0865ec9SKyle Evans if [ -f "$ERROR_LOG_FILE" ]; then 310*f0865ec9SKyle Evans echo "!!!!!!! There have been compilation errors for $triplet $wordsize ..." 311*f0865ec9SKyle Evans exit 255 312*f0865ec9SKyle Evans fi 313*f0865ec9SKyle Evans done 314*f0865ec9SKyle Evansdone 315*f0865ec9SKyle Evansecho "All compilations went OK!" 316