#!/bin/bash
#
# Copyright (C) 2010 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 Bouncy Castle (http://bouncycastle.org) into the
# Android source tree. To run, (1) fetch the appropriate tarball from the Bouncy Castle repository,
# (2) check the checksum, and then (3) run:
# ./import_bouncycastle.sh bcprov-jdk*-*.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;
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_bouncycastle.sh import </path/to/bcprov-jdk*-*.tar.gz>"
echo " ./import_bouncycastle.sh regenerate <patch/*.patch>"
echo " ./import_bouncycastle.sh generate <patch/*.patch> </path/to/bcprov-jdk*-*.tar.gz>"
exit 1
}
function main() {
if [ ! -d patches ]; then
die "Bouncy Castle patch directory patches/ not found"
fi
if [ ! -f bouncycastle.version ]; then
die "bouncycastle.version not found"
fi
source bouncycastle.version
if [ "$BOUNCYCASTLE_JDK" == "" -o "$BOUNCYCASTLE_VERSION" == "" ]; then
die "Invalid bouncycastle.version; see README.android for more information"
fi
BOUNCYCASTLE_DIR=bcprov-jdk$BOUNCYCASTLE_JDK-$BOUNCYCASTLE_VERSION
BOUNCYCASTLE_DIR_ORIG=$BOUNCYCASTLE_DIR.orig
if [ ! -f bouncycastle.config ]; then
die "bouncycastle.config not found"
fi
source bouncycastle.config
if [ "$UNNEEDED_SOURCES" == "" -o "$NEEDED_SOURCES" == "" ]; then
die "Invalid bouncycastle.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 $BOUNCYCASTLE_DIR ] || usage "$BOUNCYCASTLE_DIR not found, did you mean to use generate?"
[ -d $BOUNCYCASTLE_DIR_ORIG ] || usage "$BOUNCYCASTLE_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
}
function import() {
declare -r BOUNCYCASTLE_SOURCE=$1
untar $BOUNCYCASTLE_SOURCE
applypatches
cd $BOUNCYCASTLE_DIR
cp -f LICENSE.html ../NOTICE
touch ../MODULE_LICENSE_BSD_LIKE
cd ..
rm -r src
mkdir -p src/main/java/
for i in $NEEDED_SOURCES; do
echo "Updating $i"
mv $BOUNCYCASTLE_DIR/$i src/main/java/
done
# if [ $BOUNCYCASTLE_VERSION -ge 145 ]; then
# # move test directories from src/main/java to src/test/java
# for from in `find src/main/java -name test`; do
# to=`dirname $from | sed s,src/main/java/,src/test/java/,`
# echo "Moving $from to $to"
# mkdir -p $to
# mv $from $to
# done
# fi
# # move stray test files from src/main/java to src/test/java
# if [ $BOUNCYCASTLE_VERSION -ge 137 ]; then
# mkdir -p src/test/java/org/bouncycastle/util/
# echo "Moving src/main/java/org/bouncycastle/util tests"
# mv src/main/java/org/bouncycastle/util/*Test*.java src/test/java/org/bouncycastle/util/
# fi
cleantar
}
function regenerate() {
declare -r patch=$1
generatepatch $patch
}
function generate() {
declare -r patch=$1
declare -r BOUNCYCASTLE_SOURCE=$2
untar $BOUNCYCASTLE_SOURCE
applypatches
# # restore stray test files from src/test/java back to src/main/java
# if [ $BOUNCYCASTLE_VERSION -ge 137 ]; then
# echo "Restoring src/test/java/org/bouncycastle/util"
# mv src/test/java/org/bouncycastle/util/* src/main/java/org/bouncycastle/util/
# fi
# # restore test directories from src/test/java back to src/main/java
# if [ $BOUNCYCASTLE_VERSION -ge 145 ]; then
# for from in `find src/test/java -name test`; do
# to=`dirname $from | sed s,src/test/java/,src/main/java/,`
# echo "Restoring $from to $to"
# mkdir -p $to
# mv $from $to
# done
# fi
for i in $NEEDED_SOURCES; do
echo "Restoring $i"
rm -r $BOUNCYCASTLE_DIR/$i
cp -rf src/main/java/$i $BOUNCYCASTLE_DIR/$i
done
generatepatch $patch
cleantar
}
function untar() {
declare -r BOUNCYCASTLE_SOURCE=$1
# Remove old source
cleantar
# Process new source
tar -zxf $BOUNCYCASTLE_SOURCE
mv $BOUNCYCASTLE_DIR $BOUNCYCASTLE_DIR_ORIG
find $BOUNCYCASTLE_DIR_ORIG -type f -print0 | xargs -0 chmod a-w
(cd $BOUNCYCASTLE_DIR_ORIG && unzip -q src.zip)
tar -zxf $BOUNCYCASTLE_SOURCE
(cd $BOUNCYCASTLE_DIR && unzip -q src.zip)
# Prune unnecessary sources
echo "Removing $UNNEEDED_SOURCES"
(cd $BOUNCYCASTLE_DIR_ORIG && rm -rf $UNNEEDED_SOURCES)
(cd $BOUNCYCASTLE_DIR && rm -r $UNNEEDED_SOURCES)
}
function cleantar() {
rm -rf $BOUNCYCASTLE_DIR_ORIG
rm -rf $BOUNCYCASTLE_DIR
}
function applypatches () {
cd $BOUNCYCASTLE_DIR
# Apply appropriate patches
for i in $BOUNCYCASTLE_PATCHES; do
echo "Applying patch $i"
patch -p1 < ../patches/$i || die "Could not apply patches/$i. Fix source and run: $0 regenerate patches/$i"
# make sure no UNNEEDED_SOURCES got into the patch
problem=0
for s in $UNNEEDED_SOURCES; do
if [ -e $s ]; then
echo Unneeded source $s restored by patch $i
problem=1
fi
done
if [ $problem = 1 ]; then
exit 1
fi
done
# Cleanup patch output
find . -type f -name "*.orig" -print0 | xargs -0 rm -f
cd ..
}
function generatepatch() {
declare -r patch=$1
# Cleanup stray files before generating patch
find $BOUNCYCASTLE_DIR -type f -name "*.orig" -print0 | xargs -0 rm -f
find $BOUNCYCASTLE_DIR -type f -name "*~" -print0 | xargs -0 rm -f
rm -f $patch
LC_ALL=C TZ=UTC0 diff -Naur $BOUNCYCASTLE_DIR_ORIG $BOUNCYCASTLE_DIR >> $patch && die "ERROR: No diff for patch $path in file $i"
echo "Generated patch $patch"
}
main $@