concise_jarsigner.sh 8.7 KB
Newer Older
1
#
2
# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
19 20 21
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
22 23 24
#

# @test
M
mbalao 已提交
25
# @bug 6802846 8172529 8227758
26 27
# @summary jarsigner needs enhanced cert validation(options)
#
28
# @run shell/timeout=240 concise_jarsigner.sh
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#

if [ "${TESTJAVA}" = "" ] ; then
  JAVAC_CMD=`which javac`
  TESTJAVA=`dirname $JAVAC_CMD`/..
fi

# set platform-dependent variables
OS=`uname -s`
case "$OS" in
  Windows_* )
    FS="\\"
    ;;
  * )
    FS="/"
    ;;
esac

47 48
# Choose 1024-bit RSA to make sure it runs fine and fast on all platforms. In
# fact, every keyalg/keysize combination is OK for this test.
49

50
TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US"
51

52 53 54 55 56 57 58
KS=js.ks
KT="$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -storepass changeit -keypass changeit -keystore $KS -keyalg rsa -keysize 1024"
JAR="$TESTJAVA${FS}bin${FS}jar ${TESTTOOLVMOPTS}"
JARSIGNER="$TESTJAVA${FS}bin${FS}jarsigner ${TESTTOOLVMOPTS} -debug"
JAVAC="$TESTJAVA${FS}bin${FS}javac ${TESTTOOLVMOPTS} ${TESTJAVACOPTS}"

rm $KS
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

echo class A1 {} > A1.java
echo class A2 {} > A2.java
echo class A3 {} > A3.java
echo class A4 {} > A4.java
echo class A5 {} > A5.java
echo class A6 {} > A6.java

$JAVAC A1.java A2.java A3.java A4.java A5.java A6.java
YEAR=`date +%Y`

# ==========================================================
# First part: output format
# ==========================================================

74 75
$KT -genkeypair -alias a1 -dname CN=a1 -validity 366
$KT -genkeypair -alias a2 -dname CN=a2 -validity 366
76 77 78

# a.jar includes 8 unsigned, 2 signed by a1 and a2, 2 signed by a3
$JAR cvf a.jar A1.class A2.class
79
$JARSIGNER -keystore $KS -storepass changeit a.jar a1
80
$JAR uvf a.jar A3.class A4.class
81
$JARSIGNER -keystore $KS -storepass changeit a.jar a2
82 83 84 85 86 87
$JAR uvf a.jar A5.class A6.class

# Verify OK
$JARSIGNER -verify a.jar
[ $? = 0 ] || exit $LINENO

88
# 4(chainNotValidated)+16(hasUnsignedEntry)
89
$JARSIGNER -verify a.jar -strict
90
[ $? = 20 ] || exit $LINENO
91 92

# 16(hasUnsignedEntry)
93
$JARSIGNER -verify a.jar -strict -keystore $KS -storepass changeit
94 95 96
[ $? = 16 ] || exit $LINENO

# 16(hasUnsignedEntry)+32(notSignedByAlias)
97
$JARSIGNER -verify a.jar a1 -strict -keystore $KS -storepass changeit
98 99 100
[ $? = 48 ] || exit $LINENO

# 16(hasUnsignedEntry)
101
$JARSIGNER -verify a.jar a1 a2 -strict -keystore $KS -storepass changeit
102 103 104 105 106 107 108 109 110 111
[ $? = 16 ] || exit $LINENO

# 12 entries all together
LINES=`$JARSIGNER -verify a.jar -verbose | grep $YEAR | wc -l`
[ $LINES = 12 ] || exit $LINENO

# 12 entries all listed
LINES=`$JARSIGNER -verify a.jar -verbose:grouped | grep $YEAR | wc -l`
[ $LINES = 12 ] || exit $LINENO

112
# 4 groups: MANIFST, unrelated, signed, unsigned
113
LINES=`$JARSIGNER -verify a.jar -verbose:summary | grep $YEAR | wc -l`
114 115 116 117
[ $LINES = 4 ] || exit $LINENO

# still 4 groups, but MANIFEST group has no other file
LINES=`$JARSIGNER -verify a.jar -verbose:summary | grep "more)" | wc -l`
118 119
[ $LINES = 3 ] || exit $LINENO

120
# 5 groups: MANIFEST, unrelated, signed by a1/a2, signed by a2, unsigned
121
LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep $YEAR | wc -l`
122
[ $LINES = 5 ] || exit $LINENO
123

124
# 2 for MANIFEST, 2*2 for A1/A2, 2 for A3/A4
125
LINES=`$JARSIGNER -verify a.jar -verbose -certs | grep "\[certificate" | wc -l`
126
[ $LINES = 8 ] || exit $LINENO
127

128
# a1,a2 for MANIFEST, a1,a2 for A1/A2, a2 for A3/A4
129
LINES=`$JARSIGNER -verify a.jar -verbose:grouped -certs | grep "\[certificate" | wc -l`
130
[ $LINES = 5 ] || exit $LINENO
131

132
# a1,a2 for MANIFEST, a1,a2 for A1/A2, a2 for A3/A4
133
LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep "\[certificate" | wc -l`
134
[ $LINES = 5 ] || exit $LINENO
135

136
# still 5 groups, but MANIFEST group has no other file
137 138 139 140
LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep "more)" | wc -l`
[ $LINES = 4 ] || exit $LINENO

# ==========================================================
141
# Second part: exit code 2, 4, 8.
142 143 144 145
# 16 and 32 already covered in the first part
# ==========================================================

$KT -genkeypair -alias ca -dname CN=ca -ext bc -validity 365
146 147 148 149 150 151 152 153 154 155 156 157
$KT -genkeypair -alias expired -dname CN=expired
$KT -certreq -alias expired | $KT -gencert -alias ca -startdate -10m | $KT -import -alias expired
$KT -genkeypair -alias notyetvalid -dname CN=notyetvalid
$KT -certreq -alias notyetvalid | $KT -gencert -alias ca -startdate +1m | $KT -import -alias notyetvalid
$KT -genkeypair -alias badku -dname CN=badku
$KT -certreq -alias badku | $KT -gencert -alias ca -ext KU=cRLSign -validity 365 | $KT -import -alias badku
$KT -genkeypair -alias badeku -dname CN=badeku
$KT -certreq -alias badeku | $KT -gencert -alias ca -ext EKU=sa -validity 365 | $KT -import -alias badeku
$KT -genkeypair -alias goodku -dname CN=goodku
$KT -certreq -alias goodku | $KT -gencert -alias ca -ext KU=dig -validity 365 | $KT -import -alias goodku
$KT -genkeypair -alias goodeku -dname CN=goodeku
$KT -certreq -alias goodeku | $KT -gencert -alias ca -ext EKU=codesign -validity 365 | $KT -import -alias goodeku
158

159
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar expired
160 161
[ $? = 4 ] || exit $LINENO

162
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar notyetvalid
163 164
[ $? = 4 ] || exit $LINENO

165
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar badku
166 167
[ $? = 8 ] || exit $LINENO

168
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar badeku
169 170
[ $? = 8 ] || exit $LINENO

171
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar goodku
172 173
[ $? = 0 ] || exit $LINENO

174
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar goodeku
175 176
[ $? = 0 ] || exit $LINENO

177
# badchain signed by ca1, but ca1 is removed later
178
$KT -genkeypair -alias badchain -dname CN=badchain -validity 365
179 180
$KT -genkeypair -alias ca1 -dname CN=ca1 -ext bc -validity 365
$KT -certreq -alias badchain | $KT -gencert -alias ca1 -validity 365 | \
181
        $KT -importcert -alias badchain
182 183 184
# save ca1.cert for easy replay
$KT -exportcert -file ca1.cert -alias ca1
$KT -delete -alias ca1
185

186
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar badchain
187 188 189 190 191 192 193 194 195
[ $? = 4 ] || exit $LINENO

$JARSIGNER -verify a.jar
[ $? = 0 ] || exit $LINENO

# ==========================================================
# Third part: -certchain test
# ==========================================================

196
# altchain signed by ca2
197 198 199 200 201
$KT -genkeypair -alias altchain -dname CN=altchain -validity 365
$KT -genkeypair -alias ca2 -dname CN=ca2 -ext bc -validity 365
$KT -certreq -alias altchain | $KT -gencert -alias ca2 -validity 365 -rfc > certchain
$KT -exportcert -alias ca2 -rfc >> certchain

202
# Self-signed cert does not work
203
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar altchain
204 205 206 207
[ $? = 4 ] || exit $LINENO

# -certchain works
$JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain
208 209
[ $? = 0 ] || exit $LINENO

M
mbalao 已提交
210 211
# if ca2 is removed and cert is imported, -certchain won't work because this certificate
# entry is not trusted
212 213
# save ca2.cert for easy replay
$KT -exportcert -file ca2.cert -alias ca2
214
$KT -delete -alias ca2
215 216
$KT -importcert -file certchain -alias altchain -noprompt
$JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain
217 218 219 220 221
[ $? = 4 ] || exit $LINENO

$JARSIGNER -verify a.jar
[ $? = 0 ] || exit $LINENO

222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
# ==========================================================
# 8172529
# ==========================================================

$KT -genkeypair -alias ee -dname CN=ee
$KT -genkeypair -alias caone -dname CN=caone
$KT -genkeypair -alias catwo -dname CN=catwo

$KT -certreq -alias ee | $KT -gencert -alias catwo -rfc > ee.cert
$KT -certreq -alias catwo | $KT -gencert -alias caone -sigalg MD5withRSA -rfc > catwo.cert

# This certchain contains a cross-signed weak catwo.cert
cat ee.cert catwo.cert | $KT -importcert -alias ee

$JAR cvf a.jar A1.class
$JARSIGNER -strict -keystore $KS -storepass changeit a.jar ee
[ $? = 0 ] || exit $LINENO
$JARSIGNER -strict -keystore $KS -storepass changeit -verify a.jar
[ $? = 0 ] || exit $LINENO

242 243
echo OK
exit 0