# 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
