1 #!/bin/bash 2 # 3 # Copyright (C) 2010 The Android Open Source Project 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 # 17 18 # 19 # This script imports new versions of Bouncy Castle (http://bouncycastle.org) into the 20 # Android source tree. To run, (1) fetch the appropriate tarball from the Bouncy Castle repository, 21 # (2) check the checksum, and then (3) run: 22 # ./import_bouncycastle.sh bcprov-jdk*-*.tar.gz 23 # 24 # IMPORTANT: See README.android for additional details. 25 26 # turn on exit on error as well as a warning when it happens 27 set -e 28 trap "echo WARNING: Exiting on non-zero subprocess exit code" ERR; 29 30 function die() { 31 declare -r message=$1 32 33 echo $message 34 exit 1 35 } 36 37 function usage() { 38 declare -r message=$1 39 40 if [ ! "$message" = "" ]; then 41 echo $message 42 fi 43 echo "Usage:" 44 echo " ./import_bouncycastle.sh import </path/to/bcprov-jdk*-*.tar.gz>" 45 echo " ./import_bouncycastle.sh regenerate <patch/*.patch>" 46 echo " ./import_bouncycastle.sh generate <patch/*.patch> </path/to/bcprov-jdk*-*.tar.gz>" 47 exit 1 48 } 49 50 function main() { 51 if [ ! -d patches ]; then 52 die "Bouncy Castle patch directory patches/ not found" 53 fi 54 55 if [ ! -f bouncycastle.version ]; then 56 die "bouncycastle.version not found" 57 fi 58 59 source bouncycastle.version 60 if [ "$BOUNCYCASTLE_JDK" == "" -o "$BOUNCYCASTLE_VERSION" == "" ]; then 61 die "Invalid bouncycastle.version; see README.android for more information" 62 fi 63 64 BOUNCYCASTLE_DIR=bcprov-jdk$BOUNCYCASTLE_JDK-$BOUNCYCASTLE_VERSION 65 BOUNCYCASTLE_DIR_ORIG=$BOUNCYCASTLE_DIR.orig 66 67 if [ ! -f bouncycastle.config ]; then 68 die "bouncycastle.config not found" 69 fi 70 71 source bouncycastle.config 72 if [ "$UNNEEDED_SOURCES" == "" -o "$NEEDED_SOURCES" == "" ]; then 73 die "Invalid bouncycastle.config; see README.android for more information" 74 fi 75 76 declare -r command=$1 77 shift || usage "No command specified. Try import, regenerate, or generate." 78 if [ "$command" = "import" ]; then 79 declare -r tar=$1 80 shift || usage "No tar file specified." 81 import $tar 82 elif [ "$command" = "regenerate" ]; then 83 declare -r patch=$1 84 shift || usage "No patch file specified." 85 [ -d $BOUNCYCASTLE_DIR ] || usage "$BOUNCYCASTLE_DIR not found, did you mean to use generate?" 86 [ -d $BOUNCYCASTLE_DIR_ORIG ] || usage "$BOUNCYCASTLE_DIR_ORIG not found, did you mean to use generate?" 87 regenerate $patch 88 elif [ "$command" = "generate" ]; then 89 declare -r patch=$1 90 shift || usage "No patch file specified." 91 declare -r tar=$1 92 shift || usage "No tar file specified." 93 generate $patch $tar 94 else 95 usage "Unknown command specified $command. Try import, regenerate, or generate." 96 fi 97 } 98 99 function import() { 100 declare -r BOUNCYCASTLE_SOURCE=$1 101 102 untar $BOUNCYCASTLE_SOURCE 103 applypatches 104 105 cd $BOUNCYCASTLE_DIR 106 107 sed 's/<p>/& <BR>/g' LICENSE.html | html2text -width 102 -nobs -ascii > ../NOTICE 108 touch ../MODULE_LICENSE_BSD_LIKE 109 110 cd .. 111 112 rm -r src 113 mkdir -p src/main/java/ 114 for i in $NEEDED_SOURCES; do 115 echo "Updating $i" 116 mv $BOUNCYCASTLE_DIR/$i src/main/java/ 117 done 118 119 # if [ $BOUNCYCASTLE_VERSION -ge 145 ]; then 120 # # move test directories from src/main/java to src/test/java 121 # for from in `find src/main/java -name test`; do 122 # to=`dirname $from | sed s,src/main/java/,src/test/java/,` 123 # echo "Moving $from to $to" 124 # mkdir -p $to 125 # mv $from $to 126 # done 127 # fi 128 129 # # move stray test files from src/main/java to src/test/java 130 # if [ $BOUNCYCASTLE_VERSION -ge 137 ]; then 131 # mkdir -p src/test/java/org/bouncycastle/util/ 132 # echo "Moving src/main/java/org/bouncycastle/util tests" 133 # mv src/main/java/org/bouncycastle/util/*Test*.java src/test/java/org/bouncycastle/util/ 134 # fi 135 136 cleantar 137 } 138 139 function regenerate() { 140 declare -r patch=$1 141 142 generatepatch $patch 143 } 144 145 function generate() { 146 declare -r patch=$1 147 declare -r BOUNCYCASTLE_SOURCE=$2 148 149 untar $BOUNCYCASTLE_SOURCE 150 applypatches 151 152 # # restore stray test files from src/test/java back to src/main/java 153 # if [ $BOUNCYCASTLE_VERSION -ge 137 ]; then 154 # echo "Restoring src/test/java/org/bouncycastle/util" 155 # mv src/test/java/org/bouncycastle/util/* src/main/java/org/bouncycastle/util/ 156 # fi 157 158 # # restore test directories from src/test/java back to src/main/java 159 # if [ $BOUNCYCASTLE_VERSION -ge 145 ]; then 160 # for from in `find src/test/java -name test`; do 161 # to=`dirname $from | sed s,src/test/java/,src/main/java/,` 162 # echo "Restoring $from to $to" 163 # mkdir -p $to 164 # mv $from $to 165 # done 166 # fi 167 168 for i in $NEEDED_SOURCES; do 169 echo "Restoring $i" 170 rm -r $BOUNCYCASTLE_DIR/$i 171 cp -rf src/main/java/$i $BOUNCYCASTLE_DIR/$i 172 done 173 174 generatepatch $patch 175 cleantar 176 } 177 178 function untar() { 179 declare -r BOUNCYCASTLE_SOURCE=$1 180 181 # Remove old source 182 cleantar 183 184 # Process new source 185 tar -zxf $BOUNCYCASTLE_SOURCE 186 mv $BOUNCYCASTLE_DIR $BOUNCYCASTLE_DIR_ORIG 187 find $BOUNCYCASTLE_DIR_ORIG -type f -print0 | xargs -0 chmod a-w 188 (cd $BOUNCYCASTLE_DIR_ORIG && unzip -q src.zip) 189 tar -zxf $BOUNCYCASTLE_SOURCE 190 (cd $BOUNCYCASTLE_DIR && unzip -q src.zip) 191 192 # Prune unnecessary sources 193 echo "Removing $UNNEEDED_SOURCES" 194 (cd $BOUNCYCASTLE_DIR_ORIG && rm -rf $UNNEEDED_SOURCES) 195 (cd $BOUNCYCASTLE_DIR && rm -r $UNNEEDED_SOURCES) 196 } 197 198 function cleantar() { 199 rm -rf $BOUNCYCASTLE_DIR_ORIG 200 rm -rf $BOUNCYCASTLE_DIR 201 } 202 203 function applypatches () { 204 cd $BOUNCYCASTLE_DIR 205 206 # Apply appropriate patches 207 for i in $BOUNCYCASTLE_PATCHES; do 208 echo "Applying patch $i" 209 patch -p1 < ../patches/$i || die "Could not apply patches/$i. Fix source and run: $0 regenerate patches/$i" 210 211 # make sure no UNNEEDED_SOURCES got into the patch 212 problem=0 213 for s in $UNNEEDED_SOURCES; do 214 if [ -e $s ]; then 215 echo Unneeded source $s restored by patch $i 216 problem=1 217 fi 218 done 219 if [ $problem = 1 ]; then 220 exit 1 221 fi 222 done 223 224 # Cleanup patch output 225 find . -type f -name "*.orig" -print0 | xargs -0 rm -f 226 227 cd .. 228 } 229 230 function generatepatch() { 231 declare -r patch=$1 232 233 # Cleanup stray files before generating patch 234 find $BOUNCYCASTLE_DIR -type f -name "*.orig" -print0 | xargs -0 rm -f 235 find $BOUNCYCASTLE_DIR -type f -name "*~" -print0 | xargs -0 rm -f 236 237 rm -f $patch 238 LC_ALL=C TZ=UTC0 diff -Naur $BOUNCYCASTLE_DIR_ORIG $BOUNCYCASTLE_DIR >> $patch && die "ERROR: No diff for patch $path in file $i" 239 echo "Generated patch $patch" 240 } 241 242 main $@ 243