Add break-tests-android.sh script. This addition duplicates the existing break-tests.sh script, but for the Android context. Change-Id: I54d0881e11231770978633f03af4bf9dc228611b Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/38465 Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/util/fipstools/break-tests-android.sh b/util/fipstools/break-tests-android.sh new file mode 100644 index 0000000..f6d9b1a --- /dev/null +++ b/util/fipstools/break-tests-android.sh
@@ -0,0 +1,117 @@ +# Copyright (c) 2019, Google Inc. +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +# This script exists to exercise breaking each of the FIPS tests on an Android +# device. Since, on Android, BoringCrypto exists in both 32- and 64-bit +# versions, the first argument must be either "32" or "64" to select which is +# being tested. The Android source tree must have been setup (with "lunch") for +# a matching build configuration before using this script to build the +# binaries. (Although it'll fail non-silently if there's a mismatch.) +# +# Since each test needs the FIPS module to be compiled differently, and that +# can take a long time, this script is run twice: once with "build" as the +# second argument to run the builds, and then with "run" as the second argument +# to run each test. +# +# Run it with /bin/bash, not /bin/sh, otherwise "read" may fail. +# +# In order to reconfigure the build for each test, it needs to set a define. It +# does so by rewriting a template in external/boringssl/Android.bp and you must +# add the template value before doing the builds. To do so, insert +# -DBORINGSSL_FIPS_BREAK_XXX=1 in the cflags list for the module, probably by +# putting it in the "boringssl_flags" stanza. + +set -x +set -e + +if [ ! -f external/boringssl/Android.bp ]; then + echo "Must be run from the top-level of an Android source tree." + exit 1 +fi + +. build/envsetup.sh + +TESTS="NONE ECDSA_PWCT CRNG RSA_PWCT AES_CBC AES_GCM DES SHA_1 SHA_256 SHA_512 RSA_SIG DRBG ECDSA_SIG" + +if [ "x$1" = "x32" ]; then + lib="lib" + bits="32" +elif [ "x$1" = "x64" ] ; then + lib="lib64" + bits="64" +else + echo "First argument must be 32 or 64" + exit 1 +fi + +if [ "x$2" = "xbuild" ]; then + if ! grep -q DBORINGSSL_FIPS_BREAK_XXX=1 external/boringssl/Android.bp; then + echo "Missing DBORINGSSL_FIPS_BREAK_XXX in external/boringssl/Android.bp. Edit the file and insert -DBORINGSSL_FIPS_BREAK_XXX=1 in the cflags for the FIPS module" + exit 1 + fi + + printf "\\x1b[1mBuilding modules\\x1b[0m\n" + for test in $TESTS; do + printf "\\x1b[1mBuilding for ${test}\\x1b[0m\n" + cp external/boringssl/Android.bp external/boringssl/Android.bp.orig + sed -i -e "s/DBORINGSSL_FIPS_BREAK_XXX/DBORINGSSL_FIPS_BREAK_${test}/" external/boringssl/Android.bp + m test_fips + dir=test-${bits}-${test} + rm -Rf $dir + mkdir $dir + cp ${ANDROID_PRODUCT_OUT}/system/${lib}/libcrypto.so $dir + cp ${ANDROID_PRODUCT_OUT}/system/bin/test_fips $dir + if [ $bits = "32" ] ; then + if ! file ${dir}/test_fips | grep -q "32-bit" ; then + echo "32-bit build requested but binaries don't appear to be 32-bit:" + file ${dir}/test_fips + exit 1 + fi + else + if ! file ${dir}/test_fips | grep -q "64-bit" ; then + echo "64-bit build requested but binaries don't appear to be 64-bit:" + file ${dir}/test_fips + exit 1 + fi + fi + cp external/boringssl/Android.bp.orig external/boringssl/Android.bp + done +elif [ "x$2" = "xrun" ]; then + printf "\\x1b[1mTesting\\x1b[0m\n" + for test in $TESTS; do + dir=test-${bits}-${test} + if [ ! '(' -d ${dir} -a -f ${dir}/test_fips -a -f ${dir}/libcrypto.so ')' ] ; then + echo "Build directory ${dir} is missing or is missing files" + exit 1 + fi + adb push ${dir}/* /data/local/tmp + printf "\\x1b[1mTesting ${test}\\x1b[0m\n" + adb shell -n -t -x LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/test_fips + read + done + + printf "\\x1b[1mTesting integrity}\\x1b[0m\n" + src=test-${bits}-NONE + dir=test-${bits}-INT + rm -Rf $dir + mkdir $dir + go run external/boringssl/src/util/fipstools/break-hash.go ${src}/libcrypto.so ${dir}/libcrypto.so + cp ${src}/test_fips $dir + adb push ${dir}/* /data/local/tmp + adb shell -n -t -x LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/test_fips + read +else + echo "Second argument must be build or run" + exit 1 +fi