| #!/bin/bash |
| # |
| # Copyright (C) 2009 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| # |
| # This script imports new versions of OpenSSL (http://openssl.org/source) into the |
| # Android source tree. To run, (1) fetch the appropriate tarball from the OpenSSL repository, |
| # (2) check the gpg/pgp signature, and then (3) run: |
| # ./import_openssl.sh import openssl-*.tar.gz |
| # |
| # IMPORTANT: See README.android for additional details. |
| |
| # turn on exit on error as well as a warning when it happens |
| set -e |
| trap "echo WARNING: Exiting on non-zero subprocess exit code" ERR; |
| |
| # Make sure we're in the right directory. |
| cd $(dirname $0) |
| |
| # Ensure consistent sorting order / tool output. |
| export LANG=C |
| export LC_ALL=C |
| PERL_EXE="perl -C0" |
| |
| function die() { |
| declare -r message=$1 |
| |
| echo $message |
| exit 1 |
| } |
| |
| function usage() { |
| declare -r message=$1 |
| |
| if [ ! "$message" = "" ]; then |
| echo $message |
| fi |
| echo "Usage:" |
| echo " ./import_openssl.sh import </path/to/openssl-*.tar.gz>" |
| echo " ./import_openssl.sh regenerate <patch/*.patch>" |
| echo " ./import_openssl.sh generate <patch/*.patch> </path/to/openssl-*.tar.gz>" |
| exit 1 |
| } |
| |
| function main() { |
| if [ ! -d patches ]; then |
| die "OpenSSL patch directory patches/ not found" |
| fi |
| |
| if [ ! -f openssl.version ]; then |
| die "openssl.version not found" |
| fi |
| |
| source ./openssl.version |
| if [ "$OPENSSL_VERSION" == "" ]; then |
| die "Invalid openssl.version; see README.android for more information" |
| fi |
| |
| OPENSSL_DIR=openssl-$OPENSSL_VERSION |
| OPENSSL_DIR_ORIG=$OPENSSL_DIR.orig |
| |
| if [ ! -f openssl.config ]; then |
| die "openssl.config not found" |
| fi |
| |
| source ./openssl.config |
| if [ "$CONFIGURE_ARGS" == "" -o "$UNNEEDED_SOURCES" == "" -o "$NEEDED_SOURCES" == "" ]; then |
| die "Invalid openssl.config; see README.android for more information" |
| fi |
| |
| declare -r command=$1 |
| shift || usage "No command specified. Try import, regenerate, or generate." |
| if [ "$command" = "import" ]; then |
| declare -r tar=$1 |
| shift || usage "No tar file specified." |
| import $tar |
| elif [ "$command" = "regenerate" ]; then |
| declare -r patch=$1 |
| shift || usage "No patch file specified." |
| [ -d $OPENSSL_DIR ] || usage "$OPENSSL_DIR not found, did you mean to use generate?" |
| [ -d $OPENSSL_DIR_ORIG ] || usage "$OPENSSL_DIR_ORIG not found, did you mean to use generate?" |
| regenerate $patch |
| elif [ "$command" = "generate" ]; then |
| declare -r patch=$1 |
| shift || usage "No patch file specified." |
| declare -r tar=$1 |
| shift || usage "No tar file specified." |
| generate $patch $tar |
| else |
| usage "Unknown command specified $command. Try import, regenerate, or generate." |
| fi |
| } |
| |
| # Compute the name of an assembly source file generated by one of the |
| # gen_asm_xxxx() functions below. The logic is the following: |
| # - if "$2" is not empty, output it directly |
| # - otherwise, change the file extension of $1 from .pl to .S and output |
| # it. |
| # Usage: default_asm_file "$1" "$2" |
| # or default_asm_file "$@" |
| # |
| # $1: generator path (perl script) |
| # $2: optional output file name. |
| function default_asm_file () { |
| if [ "$2" ]; then |
| echo "$2" |
| else |
| echo "${1%%.pl}.S" |
| fi |
| } |
| |
| # Generate an ARM assembly file. |
| # $1: generator (perl script) |
| # $2: [optional] output file name |
| function gen_asm_arm () { |
| local OUT |
| OUT=$(default_asm_file "$@") |
| $PERL_EXE "$1" void "$OUT" > "$OUT" |
| } |
| |
| # Generate an ARMv8 64-bit assembly file. |
| # $1: generator (perl script) |
| # $2: [optional] output file name |
| function gen_asm_arm64 () { |
| local OUT |
| OUT=$(default_asm_file "$@") |
| $PERL_EXE "$1" linux64 "$OUT" > "$OUT" |
| } |
| |
| function gen_asm_mips () { |
| local OUT |
| OUT=$(default_asm_file "$@") |
| # The perl scripts expect to run the target compiler as $CC to determine |
| # the endianess of the target. Setting CC to true is a hack that forces the scripts |
| # to generate little endian output |
| CC=true $PERL_EXE "$1" o32 > "$OUT" |
| } |
| |
| # TODO: gen_asm_mips64 |
| |
| function gen_asm_x86 () { |
| local OUT |
| OUT=$(default_asm_file "$@") |
| $PERL_EXE "$1" elf -fPIC $(print_values_with_prefix -D $OPENSSL_CRYPTO_DEFINES_x86) > "$OUT" |
| } |
| |
| function gen_asm_x86_64 () { |
| local OUT |
| OUT=$(default_asm_file "$@") |
| $PERL_EXE "$1" elf "$OUT" > "$OUT" |
| } |
| |
| |
| # Filter all items in a list that match a given pattern. |
| # $1: space-separated list |
| # $2: egrep pattern. |
| # Out: items in $1 that match $2 |
| function filter_by_egrep() { |
| declare -r pattern=$1 |
| shift |
| echo "$@" | tr ' ' '\n' | grep -e "$pattern" | tr '\n' ' ' |
| } |
| |
| # Sort and remove duplicates in a space-separated list |
| # $1: space-separated list |
| # Out: new space-separated list |
| function uniq_sort () { |
| echo "$@" | tr ' ' '\n' | sort -u | tr '\n' ' ' |
| } |
| |
| function print_autogenerated_header() { |
| echo "# Auto-generated - DO NOT EDIT!" |
| echo "# To regenerate, edit openssl.config, then run:" |
| echo "# ./import_openssl.sh import /path/to/openssl-$OPENSSL_VERSION.tar.gz" |
| echo "#" |
| } |
| |
| function run_verbose() { |
| echo Running: $@ |
| $@ |
| } |
| |
| function scan_opensslconf_for_flags() { |
| for flag in "$@"; do |
| awk "/^#define ${flag}$/ { print \$2 }" crypto/opensslconf.h |
| done |
| } |
| |
| CRYPTO_CONF_FLAGS=( |
| OPENSSL_CPUID_OBJ |
| DES_LONG |
| DES_PTR |
| DES_RISC1 |
| DES_RISC2 |
| DES_UNROLL |
| RC4_INT |
| RC4_CHUNK |
| RC4_INDEX |
| ) |
| |
| function check_asm_flags() { |
| local arch="$1" |
| local target="$2" |
| local unsorted_flags |
| local expected_flags |
| local actual_flags |
| local defines="OPENSSL_CRYPTO_DEFINES_$arch" |
| |
| PERL=/usr/bin/perl run_verbose ./Configure $CONFIGURE_ARGS $target |
| |
| unsorted_flags="$(awk '/^CFLAG=/ { sub(/^CFLAG= .*-Wall /, ""); gsub(/-D/, ""); print; }' Makefile)" |
| unsorted_flags="$unsorted_flags $(scan_opensslconf_for_flags "${CRYPTO_CONF_FLAGS[@]}")" |
| |
| expected_flags="$(echo $unsorted_flags | tr ' ' '\n' | sort | tr '\n' ' ')" |
| actual_flags="$(echo ${!defines} | tr ' ' '\n' | sort | tr '\n' ' ')" |
| |
| if [[ $actual_flags != $expected_flags ]]; then |
| echo ${defines} is wrong! |
| echo " $actual_flags" |
| echo Please update to: |
| echo " $expected_flags" |
| exit 1 |
| fi |
| } |
| |
| # Run Configure and generate headers |
| # $1: 32 for 32-bit arch, 64 for 64-bit arch, trusty for Trusty |
| # $2: 1 if building for static version |
| # Out: returns the cflags and depflags in variable $flags |
| function generate_build_config_headers() { |
| chmod +x ./Configure |
| local configure_args_bits=CONFIGURE_ARGS_$1 |
| local configure_args_stat='' |
| local outname=$1 |
| if [[ $2 == 1 ]] ; then |
| configure_args_stat=CONFIGURE_ARGS_STATIC |
| outname="static-$1" |
| fi |
| |
| if [[ $1 == trusty ]] ; then |
| PERL=/usr/bin/perl run_verbose ./Configure $CONFIGURE_ARGS_TRUSTY |
| else |
| PERL=/usr/bin/perl run_verbose ./Configure $CONFIGURE_ARGS ${!configure_args_bits} ${!configure_args_stat} |
| fi |
| |
| rm -f apps/CA.pl.bak crypto/opensslconf.h.bak |
| mv -f crypto/opensslconf.h crypto/opensslconf-$outname.h |
| cp -f crypto/opensslconf-$outname.h include/openssl/opensslconf-$outname.h |
| |
| local tmpfile=$(mktemp tmp.XXXXXXXXXX) |
| (grep -e -D Makefile | grep -v CONFIGURE_ARGS= | grep -v OPTIONS= | \ |
| grep -v -e -DOPENSSL_NO_DEPRECATED) > $tmpfile |
| declare -r cflags=$(filter_by_egrep "^-D" $(grep -e "^CFLAG=" $tmpfile)) |
| declare -r depflags=$(filter_by_egrep "^-D" $(grep -e "^DEPFLAG=" $tmpfile)) |
| rm -f $tmpfile |
| |
| flags="$cflags $depflags" |
| } |
| |
| # Run Configure and generate makefiles |
| function generate_build_config_mk() { |
| chmod +x ./Configure |
| for bits in 32 64 trusty; do |
| # Header flags are output in $flags, first static, then dynamic |
| generate_build_config_headers $bits 1 |
| local flags_static=$flags |
| generate_build_config_headers $bits |
| |
| echo "Generating build-config-$bits.mk" |
| ( |
| print_autogenerated_header |
| |
| echo "openssl_cflags_$bits := \\" |
| for flag in $flags ; do echo " $flag \\" ; done |
| echo "" |
| |
| echo "openssl_cflags_static_$bits := \\" |
| for flag in $flags_static; do echo " $flag \\" ; done |
| echo "" |
| ) > ../build-config-$bits.mk |
| done |
| } |
| |
| # Generate crypto/opensslconf.h file including arch-specific files |
| function generate_opensslconf_h() { |
| echo "Generating opensslconf.h" |
| ( |
| echo "// Auto-generated - DO NOT EDIT!" |
| echo "#ifndef OPENSSL_SYS_TRUSTY" |
| echo "#if defined(__LP64__)" |
| echo "#include \"opensslconf-64.h\"" |
| echo "#else" |
| echo "#include \"opensslconf-32.h\"" |
| echo "#endif" |
| echo "#else" |
| echo "#include \"opensslconf-trusty.h\"" |
| echo "#endif" |
| ) > crypto/opensslconf.h |
| # Generate a compatible version for the static library builds |
| echo "Generating opensslconf-static.h" |
| ( |
| echo "// Auto-generated - DO NOT EDIT!" |
| echo "#if defined(__LP64__)" |
| echo "#include \"opensslconf-static-64.h\"" |
| echo "#else" |
| echo "#include \"opensslconf-static-32.h\"" |
| echo "#endif" |
| ) > crypto/opensslconf-static.h |
| # move it to output include files as well |
| cp -f crypto/opensslconf-static.h include/openssl/opensslconf-static.h |
| } |
| |
| # Return the value of a computed variable name. |
| # E.g.: |
| # FOO=foo |
| # BAR=bar |
| # echo $(var_value FOO_$BAR) -> prints the value of ${FOO_bar} |
| # $1: Variable name |
| # Out: variable value |
| var_value() { |
| # Note: don't use 'echo' here, because it's sensitive to values |
| # that begin with an underscore (e.g. "-n") |
| eval printf \"%s\\n\" \$$1 |
| } |
| |
| # Same as var_value, but returns sorted output without duplicates. |
| # $1: Variable name |
| # Out: variable value (if space-separated list, sorted with no duplicates) |
| var_sorted_value() { |
| uniq_sort $(var_value $1) |
| } |
| |
| # Print the values in a list with a prefix |
| # $1: prefix to use |
| # $2+: values of list |
| print_values_with_prefix() { |
| declare -r prefix=$1 |
| shift |
| for src; do |
| echo -n " $prefix$src " |
| done |
| } |
| |
| # Print the definition of a given variable in a GNU Make build file. |
| # $1: Variable name (e.g. common_src_files) |
| # $2: prefix for each variable contents |
| # $3+: Variable value (e.g. list of sources) |
| print_vardef_with_prefix_in_mk() { |
| declare -r varname=$1 |
| declare -r prefix=$2 |
| shift |
| shift |
| if [ -z "$1" ]; then |
| echo "$varname :=" |
| else |
| echo "$varname := \\" |
| for src; do |
| echo " $prefix$src \\" |
| done |
| fi |
| echo "" |
| } |
| # Print the definition of a given variable in a GNU Make build file. |
| # $1: Variable name (e.g. common_src_files) |
| # $2+: Variable value (e.g. list of sources) |
| print_vardef_in_mk() { |
| declare -r varname=$1 |
| shift |
| print_vardef_with_prefix_in_mk $varname "" $@ |
| } |
| |
| # Same as print_vardef_in_mk, but print a CFLAGS definition from |
| # a list of compiler defines. |
| # $1: Variable name (e.g. common_cflags) |
| # $2: List of defines (e.g. OPENSSL_NO_CAMELLIA ...) |
| print_defines_in_mk() { |
| declare -r varname=$1 |
| shift |
| if [ -z "$1" ]; then |
| echo "$varname :=" |
| else |
| echo "$varname := \\" |
| for def; do |
| echo " -D$def \\" |
| done |
| fi |
| echo "" |
| } |
| |
| # Generate a configuration file like Crypto-config.mk |
| # This uses variable definitions from openssl.config to build a config |
| # file that can compute the list of target- and host-specific sources / |
| # compiler flags for a given component. |
| # |
| # $1: Target file name. (e.g. Crypto-config.mk) |
| # $2: Variable prefix. (e.g. CRYPTO) |
| # $3: "host" or "target" |
| function generate_config_mk() { |
| declare -r output="$1" |
| declare -r prefix="$2" |
| declare -r all_archs="arm arm64 x86 x86_64 mips mips64" |
| declare -r variant_archs="mips32r6" |
| |
| echo "Generating $(basename $output)" |
| ( |
| print_autogenerated_header |
| echo \ |
| "# This script will append to the following variables: |
| # |
| # LOCAL_CFLAGS |
| # LOCAL_C_INCLUDES |
| # LOCAL_SRC_FILES_\$(TARGET_ARCH) |
| # LOCAL_SRC_FILES_\$(TARGET_2ND_ARCH) |
| # LOCAL_CFLAGS_\$(TARGET_ARCH) |
| # LOCAL_CFLAGS_\$(TARGET_2ND_ARCH) |
| # LOCAL_ADDITIONAL_DEPENDENCIES" |
| if [ $prefix != "APPS" ] ; then |
| echo "# LOCAL_EXPORT_C_INCLUDE_DIRS" |
| fi |
| echo " |
| |
| LOCAL_ADDITIONAL_DEPENDENCIES += \$(LOCAL_PATH)/$(basename $output) |
| " |
| |
| common_defines=$(var_sorted_value OPENSSL_${prefix}_DEFINES) |
| print_defines_in_mk common_cflags $common_defines |
| |
| common_sources=$(var_sorted_value OPENSSL_${prefix}_SOURCES) |
| print_vardef_in_mk common_src_files $common_sources |
| |
| common_includes=$(var_sorted_value OPENSSL_${prefix}_INCLUDES) |
| print_vardef_with_prefix_in_mk common_c_includes external/openssl/ $common_includes |
| |
| for arch in $all_archs $variant_archs; do |
| arch_clang_asflags=$(var_sorted_value OPENSSL_${prefix}_CLANG_ASFLAGS_${arch}) |
| print_vardef_in_mk ${arch}_clang_asflags $arch_clang_asflags |
| |
| arch_defines=$(var_sorted_value OPENSSL_${prefix}_DEFINES_${arch}) |
| print_defines_in_mk ${arch}_cflags $arch_defines |
| |
| arch_sources=$(var_sorted_value OPENSSL_${prefix}_SOURCES_${arch}) |
| print_vardef_in_mk ${arch}_src_files $arch_sources |
| |
| arch_exclude_sources=$(var_sorted_value OPENSSL_${prefix}_SOURCES_EXCLUDES_${arch}) |
| print_vardef_in_mk ${arch}_exclude_files $arch_exclude_sources |
| |
| done |
| |
| if [ $prefix == "CRYPTO" ]; then |
| echo " |
| # \"Temporary\" hack until this can be fixed in openssl.config |
| x86_64_cflags += -DRC4_INT=\"unsigned int\"" |
| fi |
| |
| if [ $prefix != "APPS" ] ; then |
| echo " |
| LOCAL_EXPORT_C_INCLUDE_DIRS := \$(LOCAL_PATH)/include" |
| fi |
| |
| echo " |
| ifdef ARCH_MIPS_REV6 |
| mips_cflags := \$(mips32r6_cflags) |
| mips_src_files := \$(mips32r6_src_files) |
| mips_exclude_files := \$(mips32r6_exclude_files) |
| endif" |
| |
| if [ $3 == "target" ]; then |
| echo " |
| LOCAL_CFLAGS += \$(common_cflags) |
| LOCAL_C_INCLUDES += \$(common_c_includes)" |
| for arch in $all_archs; do |
| echo " |
| LOCAL_SRC_FILES_${arch} += \$(filter-out \$(${arch}_exclude_files),\$(common_src_files) \$(${arch}_src_files)) |
| LOCAL_CFLAGS_${arch} += \$(${arch}_cflags) |
| LOCAL_CLANG_ASFLAGS_${arch} += \$(${arch}_clang_asflags)" |
| done |
| else |
| echo " |
| LOCAL_CFLAGS += \$(common_cflags) |
| LOCAL_C_INCLUDES += \$(common_c_includes) \$(local_c_includes) |
| |
| ifeq (\$(HOST_OS),linux) |
| LOCAL_CFLAGS_x86 += \$(x86_cflags) |
| LOCAL_SRC_FILES_x86 += \$(filter-out \$(x86_exclude_files), \$(common_src_files) \$(x86_src_files)) |
| LOCAL_CFLAGS_x86_64 += \$(x86_64_cflags) |
| LOCAL_SRC_FILES_x86_64 += \$(filter-out \$(x86_64_exclude_files), \$(common_src_files) \$(x86_64_src_files)) |
| else |
| \$(warning Unknown host OS \$(HOST_OS)) |
| LOCAL_SRC_FILES += \$(common_src_files) |
| endif" |
| fi |
| ) > "$output" |
| } |
| |
| function import() { |
| declare -r OPENSSL_SOURCE=$1 |
| untar $OPENSSL_SOURCE readonly |
| applypatches $OPENSSL_DIR |
| convert_iso8859_to_utf8 $OPENSSL_DIR |
| |
| cd $OPENSSL_DIR |
| |
| # Check the ASM flags for each arch |
| check_asm_flags arm linux-armv4 |
| check_asm_flags arm64 linux-aarch64 |
| check_asm_flags x86 linux-elf |
| check_asm_flags x86_64 linux-x86_64 |
| |
| generate_build_config_mk |
| generate_opensslconf_h |
| |
| cp -f LICENSE ../NOTICE |
| touch ../MODULE_LICENSE_BSD_LIKE |
| |
| # Avoid checking in symlinks |
| for i in `find include/openssl -type l`; do |
| target=`readlink $i` |
| rm -f $i |
| if [ -f include/openssl/$target ]; then |
| cp include/openssl/$target $i |
| fi |
| done |
| |
| # Generate arm asm |
| gen_asm_arm crypto/aes/asm/aes-armv4.pl |
| gen_asm_arm crypto/aes/asm/aesv8-armx.pl |
| gen_asm_arm crypto/aes/asm/bsaes-armv7.pl |
| gen_asm_arm crypto/bn/asm/armv4-gf2m.pl |
| gen_asm_arm crypto/bn/asm/armv4-mont.pl |
| gen_asm_arm crypto/modes/asm/ghash-armv4.pl |
| gen_asm_arm crypto/modes/asm/ghashv8-armx.pl |
| gen_asm_arm crypto/sha/asm/sha1-armv4-large.pl |
| gen_asm_arm crypto/sha/asm/sha256-armv4.pl |
| gen_asm_arm crypto/sha/asm/sha512-armv4.pl |
| |
| # Generate armv8 asm |
| gen_asm_arm64 crypto/aes/asm/aesv8-armx.pl crypto/aes/asm/aesv8-armx-64.S |
| gen_asm_arm64 crypto/modes/asm/ghashv8-armx.pl crypto/modes/asm/ghashv8-armx-64.S |
| gen_asm_arm64 crypto/sha/asm/sha1-armv8.pl |
| gen_asm_arm64 crypto/sha/asm/sha512-armv8.pl crypto/sha/asm/sha256-armv8.S |
| gen_asm_arm64 crypto/sha/asm/sha512-armv8.pl |
| |
| # Generate mips asm |
| gen_asm_mips crypto/aes/asm/aes-mips.pl |
| gen_asm_mips crypto/bn/asm/mips.pl crypto/bn/asm/bn-mips.S |
| gen_asm_mips crypto/bn/asm/mips-mont.pl |
| gen_asm_mips crypto/sha/asm/sha1-mips.pl |
| gen_asm_mips crypto/sha/asm/sha512-mips.pl crypto/sha/asm/sha256-mips.S |
| |
| # TODO: Generate mips32r6 asm |
| |
| # TODO: Generate mips64 asm |
| |
| # Generate x86 asm |
| gen_asm_x86 crypto/x86cpuid.pl |
| gen_asm_x86 crypto/aes/asm/aes-586.pl |
| gen_asm_x86 crypto/aes/asm/vpaes-x86.pl |
| gen_asm_x86 crypto/aes/asm/aesni-x86.pl |
| gen_asm_x86 crypto/bn/asm/bn-586.pl |
| gen_asm_x86 crypto/bn/asm/co-586.pl |
| gen_asm_x86 crypto/bn/asm/x86-mont.pl |
| gen_asm_x86 crypto/bn/asm/x86-gf2m.pl |
| gen_asm_x86 crypto/modes/asm/ghash-x86.pl |
| gen_asm_x86 crypto/sha/asm/sha1-586.pl |
| gen_asm_x86 crypto/sha/asm/sha256-586.pl |
| gen_asm_x86 crypto/sha/asm/sha512-586.pl |
| gen_asm_x86 crypto/md5/asm/md5-586.pl |
| gen_asm_x86 crypto/des/asm/des-586.pl |
| gen_asm_x86 crypto/des/asm/crypt586.pl |
| gen_asm_x86 crypto/bf/asm/bf-586.pl |
| |
| # Generate x86_64 asm |
| gen_asm_x86_64 crypto/x86_64cpuid.pl |
| gen_asm_x86_64 crypto/sha/asm/sha1-x86_64.pl |
| gen_asm_x86_64 crypto/sha/asm/sha512-x86_64.pl crypto/sha/asm/sha256-x86_64.S |
| gen_asm_x86_64 crypto/sha/asm/sha512-x86_64.pl |
| gen_asm_x86_64 crypto/modes/asm/ghash-x86_64.pl |
| gen_asm_x86_64 crypto/aes/asm/aesni-x86_64.pl |
| gen_asm_x86_64 crypto/aes/asm/vpaes-x86_64.pl |
| gen_asm_x86_64 crypto/aes/asm/bsaes-x86_64.pl |
| gen_asm_x86_64 crypto/aes/asm/aes-x86_64.pl |
| gen_asm_x86_64 crypto/aes/asm/aesni-sha1-x86_64.pl |
| gen_asm_x86_64 crypto/md5/asm/md5-x86_64.pl |
| gen_asm_x86_64 crypto/bn/asm/modexp512-x86_64.pl |
| gen_asm_x86_64 crypto/bn/asm/x86_64-mont.pl |
| gen_asm_x86_64 crypto/bn/asm/x86_64-gf2m.pl |
| gen_asm_x86_64 crypto/bn/asm/x86_64-mont5.pl |
| gen_asm_x86_64 crypto/rc4/asm/rc4-x86_64.pl |
| gen_asm_x86_64 crypto/rc4/asm/rc4-md5-x86_64.pl |
| |
| # Setup android.testssl directory |
| mkdir android.testssl |
| cat test/testssl | \ |
| sed 's#../util/shlib_wrap.sh ./ssltest#adb shell /system/bin/ssltest#' | \ |
| sed 's#../util/shlib_wrap.sh ../apps/openssl#adb shell /system/bin/openssl#' | \ |
| sed 's#adb shell /system/bin/openssl no-dh#[ `adb shell /system/bin/openssl no-dh` = no-dh ]#' | \ |
| sed 's#adb shell /system/bin/openssl no-rsa#[ `adb shell /system/bin/openssl no-rsa` = no-dh ]#' | \ |
| sed 's#../apps/server2.pem#/sdcard/android.testssl/server2.pem#' | \ |
| cat > \ |
| android.testssl/testssl |
| chmod +x android.testssl/testssl |
| cat test/Uss.cnf | sed 's#./.rnd#/sdcard/android.testssl/.rnd#' >> android.testssl/Uss.cnf |
| cat test/CAss.cnf | sed 's#./.rnd#/sdcard/android.testssl/.rnd#' >> android.testssl/CAss.cnf |
| cp apps/server2.pem android.testssl/ |
| cp ../patches/testssl.sh android.testssl/ |
| |
| cd .. |
| |
| generate_config_mk Crypto-config-target.mk CRYPTO target |
| generate_config_mk Crypto-config-host.mk CRYPTO host |
| generate_config_mk Crypto-config-trusty.mk CRYPTO_TRUSTY target |
| generate_config_mk Ssl-config-target.mk SSL target |
| generate_config_mk Ssl-config-host.mk SSL host |
| generate_config_mk Apps-config-target.mk APPS target |
| generate_config_mk Apps-config-host.mk APPS host |
| |
| # Prune unnecessary sources |
| prune |
| |
| NEEDED_SOURCES="$NEEDED_SOURCES android.testssl" |
| for i in $NEEDED_SOURCES; do |
| echo "Updating $i" |
| rm -r $i |
| mv $OPENSSL_DIR/$i . |
| done |
| |
| cleantar |
| } |
| |
| function regenerate() { |
| declare -r patch=$1 |
| |
| generatepatch $patch |
| } |
| |
| function generate() { |
| declare -r patch=$1 |
| declare -r OPENSSL_SOURCE=$2 |
| |
| untar $OPENSSL_SOURCE |
| applypatches $OPENSSL_DIR_ORIG $patch |
| prune |
| |
| for i in $NEEDED_SOURCES; do |
| echo "Restoring $i" |
| rm -r $OPENSSL_DIR/$i |
| cp -rf $i $OPENSSL_DIR/$i |
| done |
| |
| generatepatch $patch |
| cleantar |
| } |
| |
| # Find all files in a sub-directory that are encoded in ISO-8859 |
| # $1: Directory. |
| # Out: list of files in $1 that are encoded as ISO-8859. |
| function find_iso8859_files() { |
| find $1 -type f -print0 | xargs -0 file --mime-encoding | grep -i "iso-8859" | cut -d: -f1 |
| } |
| |
| # Convert all ISO-8859 files in a given subdirectory to UTF-8 |
| # $1: Directory name |
| function convert_iso8859_to_utf8() { |
| declare -r iso_files=$(find_iso8859_files "$1") |
| for iso_file in $iso_files; do |
| iconv --from-code iso-8859-1 --to-code utf-8 $iso_file > $iso_file.tmp |
| rm -f $iso_file |
| mv $iso_file.tmp $iso_file |
| done |
| } |
| |
| function untar() { |
| declare -r OPENSSL_SOURCE=$1 |
| declare -r readonly=$2 |
| |
| # Remove old source |
| cleantar |
| |
| # Process new source |
| tar -zxf $OPENSSL_SOURCE |
| cp -RfP $OPENSSL_DIR $OPENSSL_DIR_ORIG |
| if [ ! -z $readonly ]; then |
| find $OPENSSL_DIR_ORIG -type f -print0 | xargs -0 chmod a-w |
| fi |
| } |
| |
| function prune() { |
| echo "Removing $UNNEEDED_SOURCES" |
| (cd $OPENSSL_DIR_ORIG && rm -rf $UNNEEDED_SOURCES) |
| (cd $OPENSSL_DIR && rm -r $UNNEEDED_SOURCES) |
| } |
| |
| function cleantar() { |
| rm -rf $OPENSSL_DIR_ORIG |
| rm -rf $OPENSSL_DIR |
| } |
| |
| function applypatches () { |
| declare -r dir=$1 |
| declare -r skip_patch=$2 |
| |
| cd $dir |
| |
| # Apply appropriate patches |
| patches=(../patches/[0-9][0-9][0-9][0-9]-*.patch) |
| for i in "${patches[@]}"; do |
| if [[ $skip_patch != ${i##*/} ]]; then |
| echo "Applying patch $i" |
| patch -p1 < $i || die "Could not apply $i. Fix source and run: $0 regenerate patches/${i##*/}" |
| else |
| echo "Skiping patch ${i##*/}" |
| fi |
| |
| done |
| |
| # Cleanup patch output |
| find . \( -type f -o -type l \) -name "*.orig" -print0 | xargs -0 rm -f |
| |
| cd .. |
| } |
| |
| function generatepatch() { |
| declare -r patch=$1 |
| |
| # Cleanup stray files before generating patch |
| find $OPENSSL_DIR -type f -name "*.orig" -print0 | xargs -0 rm -f |
| find $OPENSSL_DIR -type f -name "*~" -print0 | xargs -0 rm -f |
| |
| # Find the files the patch touches and only keep those in the output patch |
| declare -r sources=`patch -p1 --dry-run -d $OPENSSL_DIR < $patch | awk '/^patching file / { print $3 }'` |
| |
| rm -f $patch |
| touch $patch |
| for i in $sources; do |
| LC_ALL=C TZ=UTC0 diff -aup $OPENSSL_DIR_ORIG/$i $OPENSSL_DIR/$i >> $patch && die "ERROR: No diff for patch $path in file $i" |
| done |
| echo "Generated patch $patch" |
| echo "NOTE To make sure there are not unwanted changes from conflicting patches, be sure to review the generated patch." |
| } |
| |
| main $@ |