Path: blob/master/test/jdk/java/security/SecureClassLoader/DefineClass.java
41149 views
/*1* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import java.io.ByteArrayInputStream;24import java.io.File;25import java.io.InputStream;26import java.io.IOException;27import java.io.OutputStream;28import java.net.URL;29import java.security.CodeSource;30import java.security.Key;31import java.security.KeyStoreException;32import java.security.KeyStoreSpi;33import java.security.NoSuchAlgorithmException;34import java.security.Permission;35import java.security.Policy;36import java.security.ProtectionDomain;37import java.security.Provider;38import java.security.SecureClassLoader;39import java.security.Security;40import java.security.UnrecoverableKeyException;41import java.security.URIParameter;42import java.security.cert.Certificate;43import java.security.cert.CertificateException;44import java.security.cert.CertificateFactory;45import java.util.ArrayList;46import java.util.Arrays;47import java.util.Base64;48import java.util.Collections;49import java.util.Date;50import java.util.Enumeration;51import java.util.List;52import java.util.PropertyPermission;5354/*55* @test56* @bug 6826789 8131486 813018157* @summary Make sure equivalent ProtectionDomains are granted the same58* permissions when the CodeSource URLs are different but resolve59* to the same ip address after name service resolution.60* @run main/othervm -Djava.security.manager=allow DefineClass61*/6263public class DefineClass {6465// permissions that are expected to be granted by the policy file66private final static Permission[] GRANTED_PERMS = new Permission[] {67new PropertyPermission("user.home", "read"),68new PropertyPermission("user.name", "read")69};7071// Base64 encoded bytes of simple class: "package foo; public class Foo {}"72private final static String FOO_CLASS =73"yv66vgAAADMADQoAAwAKBwALBwAMAQAGPGluaXQ+AQADKClWAQAEQ29kZQEA" +74"D0xpbmVOdW1iZXJUYWJsZQEAClNvdXJjZUZpbGUBAAhGb28uamF2YQwABAAF" +75"AQAHZm9vL0ZvbwEAEGphdmEvbGFuZy9PYmplY3QAIQACAAMAAAAAAAEAAQAE" +76"AAUAAQAGAAAAHQABAAEAAAAFKrcAAbEAAAABAAcAAAAGAAEAAAABAAEACAAA" +77"AAIACQ==";7879// Base64 encoded bytes of simple class: "package bar; public class Bar {}"80private final static String BAR_CLASS =81"yv66vgAAADMADQoAAwAKBwALBwAMAQAGPGluaXQ+AQADKClWAQAEQ29kZQEA" +82"D0xpbmVOdW1iZXJUYWJsZQEAClNvdXJjZUZpbGUBAAhCYXIuamF2YQwABAAF" +83"AQAHYmFyL0JhcgEAEGphdmEvbGFuZy9PYmplY3QAIQACAAMAAAAAAAEAAQAE" +84"AAUAAQAGAAAAHQABAAEAAAAFKrcAAbEAAAABAAcAAAAGAAEAAAABAAEACAAA" +85"AAIACQ==";8687// Base64 encoded bytes of simple class: "package baz; public class Baz {}"88private final static String BAZ_CLASS =89"yv66vgAAADQADQoAAwAKBwALBwAMAQAGPGluaXQ+AQADKClWAQAEQ29kZQEA" +90"D0xpbmVOdW1iZXJUYWJsZQEAClNvdXJjZUZpbGUBAAhCYXouamF2YQwABAAF" +91"AQAHYmF6L0JhegEAEGphdmEvbGFuZy9PYmplY3QAIQACAAMAAAAAAAEAAQAE" +92"AAUAAQAGAAAAHQABAAEAAAAFKrcAAbEAAAABAAcAAAAGAAEAAAABAAEACAAA" +93"AAIACQ==";9495private final static String BAZ_CERT =96"-----BEGIN CERTIFICATE-----\n" +97"MIIEFzCCA8OgAwIBAgIESpPf8TANBglghkgBZQMEAwIFADAOMQwwCgYDVQQDEwNG\n" +98"b28wHhcNMTUwNzE1MTY1ODM5WhcNMTUxMDEzMTY1ODM5WjAOMQwwCgYDVQQDEwNG\n" +99"b28wggNCMIICNQYHKoZIzjgEATCCAigCggEBAI95Ndm5qum/q+2Ies9JUbbzLsWe\n" +100"O683GOjqxJYfPv02BudDUanEGDM5uAnnwq4cU5unR1uF0BGtuLR5h3VJhGlcrA6P\n" +101"FLM2CCiiL/onEQo9YqmTRTQJoP5pbEZY+EvdIIGcNwmgEFexla3NACM9ulSEtikf\n" +102"nWSO+INEhneXnOwEtDSmrC516Zhd4j2wKS/BEYyf+p2BgeczjbeStzDXueNJWS9o\n" +103"CZhyFTkV6j1ri0ZTxjNFj4A7MqTC4PJykCVuTj+KOwg4ocRQ5OGMGimjfd9eoUPe\n" +104"S2b/BJA+1c8WI+FY1IfGCOl/IRzYHcojy244B2X4IuNCvkhMBXY5OWAc1mcCHQC6\n" +105"9pamhXj3397n+mfJd8eF7zKyM7rlgMC81WldAoIBABamXFggSFBwTnUCo5dXBA00\n" +106"2jo0eMFU1OSlwC0kLuBPluYeS9CQSr2sjzfuseCfMYLSPJBDy2QviABBYO35ygmz\n" +107"IHannDKmJ/JHPpGHm6LE50S9IIFUTLVbgCw2jR+oPtSJ6U4PoGiOMkKKXHjEeMaN\n" +108"BSe3HJo6uwsL4SxEaJY559POdNsQGmWqK4f2TGgm2z7HL0tVmYNLtO2wL3yQ6aSW\n" +109"06VdU1vr/EXU9hn2Pz3tu4c5JcLyJOB3MSltqIfsHkdI+H77X963VIQxayIy3uVT\n" +110"3a8CESsNHwLaMJcyJP4nrtqLnUspItm6i+Oe2eEDpjxSgQvGiLfi7UMW4e8X294D\n" +111"ggEFAAKCAQBsGeU8/STExzQsJ8kFM9xarA/2VAFMzyUpd3IQ2UGHQC5rEnGh/RiU\n" +112"T20y7a2hCpQ1f/qgLnY8hku9GRVY3z8WamBzWLzCAEAx67EsS58mf4o8R3sUbkH5\n" +113"/mRaZoNVSPUy+tXoLmTzIetU4W+JT8Rq4OcXXU9uo9TreeBehhVexS3vpVgQeUIn\n" +114"MmMma8WHpovIJQQlp4cyjalX7Beda/tqX/HPLkAS4TRqQAz7hFr3FqFrVMKFSGo4\n" +115"fTS06GGdQ4tw9c6NQLuQ9WF9BxYSwSk9yENQvKDZaBNarqPMnsh1Gi/QcKMRBVhM\n" +116"RT/9vb4QUi/pOowhhKCDBLgjY60QgX3HoyEwHzAdBgNVHQ4EFgQUa787CE+3ZNAb\n" +117"g1ql9yJVVrRCdx0wDQYJYIZIAWUDBAMCBQADPwAwPAIcCUkZIRrBlKdTzhKYBEOm\n" +118"E1i45MMum1RuHc28agIcfHQkkjBA4FfH5UMRgKpIyRR8V/dVboxDj4hKOA==\n" +119"-----END CERTIFICATE-----";120121public static void main(String[] args) throws Exception {122123Security.addProvider(new TestProvider());124125MySecureClassLoader scl = new MySecureClassLoader();126127File policyFile = new File(System.getProperty("test.src", "."),128"DefineClass.policy");129Policy p = Policy.getInstance("JavaPolicy",130new URIParameter(policyFile.toURI()));131Policy.setPolicy(p);132133System.setSecurityManager(new SecurityManager());134ArrayList<Permission> perms1 = getPermissions(scl, p,135"http://localhost/",136"foo.Foo", FOO_CLASS,137null);138checkPerms(perms1, GRANTED_PERMS);139ArrayList<Permission> perms2 = getPermissions(scl, p,140"http://127.0.0.1/",141"bar.Bar", BAR_CLASS,142null);143checkPerms(perms2, GRANTED_PERMS);144assert(perms1.equals(perms2));145146// check that class signed by baz is granted an additional permission147Certificate[] chain = new Certificate[] {getCert(BAZ_CERT)};148ArrayList<Permission> perms3 = getPermissions(scl, p,149"http://localhost/",150"baz.Baz", BAZ_CLASS,151chain);152List<Permission> perms = new ArrayList<>(Arrays.asList(GRANTED_PERMS));153perms.add(new PropertyPermission("user.dir", "read"));154checkPerms(perms3, perms.toArray(new Permission[0]));155}156157// returns the permissions granted to the codebase URL158private static ArrayList<Permission> getPermissions(MySecureClassLoader scl,159Policy p, String url,160String className,161String classBytes,162Certificate[] chain)163throws IOException {164CodeSource cs = new CodeSource(new URL(url), chain);165Base64.Decoder bd = Base64.getDecoder();166byte[] bytes = bd.decode(classBytes);167Class<?> c = scl.defineMyClass(className, bytes, cs);168ProtectionDomain pd = c.getProtectionDomain();169return Collections.list(p.getPermissions(pd).elements());170}171172private static void checkPerms(List<Permission> perms,173Permission... grantedPerms)174throws Exception175{176if (!perms.containsAll(Arrays.asList(grantedPerms))) {177throw new Exception("Granted permissions not correct");178}179}180181private static Certificate getCert(String base64Cert) throws Exception {182CertificateFactory cf = CertificateFactory.getInstance("X.509");183InputStream is = new ByteArrayInputStream(base64Cert.getBytes("UTF-8"));184return cf.generateCertificate(is);185}186187// A SecureClassLoader that allows the test to define its own classes188private static class MySecureClassLoader extends SecureClassLoader {189Class<?> defineMyClass(String name, byte[] b, CodeSource cs) {190return super.defineClass(name, b, 0, b.length, cs);191}192}193194private static class TestProvider extends Provider {195TestProvider() {196super("Test8131486", "0.0", "For testing only");197putService(new Provider.Service(this, "KeyStore", "Test8131486",198"DefineClass$TestKeyStore", null, null));199}200}201202/**203* A KeyStore containing a single certificate entry named "baz".204*/205public static class TestKeyStore extends KeyStoreSpi {206private final String baz = "baz";207private final List<String> aliases = Collections.singletonList(baz);208private final Certificate bazCert;209210public TestKeyStore() {211try {212this.bazCert = getCert(BAZ_CERT);213} catch (Exception e) {214throw new Error();215}216}217218@Override219public Enumeration<String> engineAliases() {220return Collections.enumeration(aliases);221}222223@Override224public boolean engineContainsAlias(String alias) {225return alias.equals(baz);226}227228@Override229public void engineDeleteEntry(String alias) throws KeyStoreException {230throw new KeyStoreException();231}232233@Override234public Certificate engineGetCertificate(String alias) {235return alias.equals(baz) ? bazCert : null;236}237238@Override239public String engineGetCertificateAlias(Certificate cert) {240return cert.equals(bazCert) ? baz : null;241}242243@Override244public Certificate[] engineGetCertificateChain(String alias) {245return alias.equals(baz) ? new Certificate[] {bazCert} : null;246}247248@Override249public Date engineGetCreationDate(String alias) {250return alias.equals(baz) ? new Date() : null;251}252253@Override254public Key engineGetKey(String alias, char[] password)255throws NoSuchAlgorithmException, UnrecoverableKeyException {256return null;257}258259@Override260public boolean engineIsCertificateEntry(String alias) {261return alias.equals(baz);262}263264@Override265public boolean engineIsKeyEntry(String alias) {266return false;267}268269@Override270public void engineLoad(InputStream stream, char[] password)271throws IOException, NoSuchAlgorithmException, CertificateException {272}273274@Override275public void engineSetCertificateEntry(String alias, Certificate cert)276throws KeyStoreException {277throw new KeyStoreException();278}279280@Override281public void engineSetKeyEntry(String alias, byte[] key,282Certificate[] chain)283throws KeyStoreException {284throw new KeyStoreException();285}286287@Override288public void engineSetKeyEntry(String alias, Key key, char[] password,289Certificate[] chain)290throws KeyStoreException {291throw new KeyStoreException();292}293294@Override295public int engineSize() { return 1; }296297@Override298public void engineStore(OutputStream stream, char[] password)299throws IOException, NoSuchAlgorithmException, CertificateException {300}301}302}303304305