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