BasicProc.java revision 12304:47d6ef0dd448
1/*
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 8009977
27 * @summary A test library to launch multiple Java processes
28 * @library ../../../../java/security/testlibrary/
29 * @compile -XDignore.symbol.file BasicProc.java
30 * @run main/othervm BasicProc
31 */
32
33import java.io.File;
34import org.ietf.jgss.Oid;
35
36import javax.security.auth.PrivateCredentialPermission;
37
38public class BasicProc {
39
40    static String CONF = "krb5.conf";
41    static String KTAB = "ktab";
42    public static void main(String[] args) throws Exception {
43        String HOST = "localhost";
44        String SERVER = "server/" + HOST;
45        String BACKEND = "backend/" + HOST;
46        String USER = "user";
47        char[] PASS = "password".toCharArray();
48        String REALM = "REALM";
49
50        Oid oid = new Oid("1.2.840.113554.1.2.2");
51
52        if (args.length == 0) {
53            System.setProperty("java.security.krb5.conf", CONF);
54            KDC kdc = KDC.create(REALM, HOST, 0, true);
55            kdc.addPrincipal(USER, PASS);
56            kdc.addPrincipalRandKey("krbtgt/" + REALM);
57            kdc.addPrincipalRandKey(SERVER);
58            kdc.addPrincipalRandKey(BACKEND);
59
60            String cwd = System.getProperty("user.dir");
61            kdc.writeKtab(KTAB);
62            KDC.saveConfig(CONF, kdc, "forwardable = true");
63
64            Proc pc = Proc.create("BasicProc")
65                    .args("client")
66                    .prop("java.security.krb5.conf", CONF)
67                    .prop("java.security.manager", "")
68                    .perm(new java.util.PropertyPermission(
69                            "sun.security.krb5.principal", "read"))
70                    .perm(new javax.security.auth.AuthPermission(
71                            "modifyPrincipals"))
72                    .perm(new javax.security.auth.AuthPermission(
73                            "modifyPrivateCredentials"))
74                    .perm(new javax.security.auth.AuthPermission("doAs"))
75                    .perm(new javax.security.auth.kerberos.ServicePermission(
76                            "krbtgt/" + REALM + "@" + REALM, "initiate"))
77                    .perm(new javax.security.auth.kerberos.ServicePermission(
78                            "server/localhost@" + REALM, "initiate"))
79                    .perm(new javax.security.auth.kerberos.DelegationPermission(
80                            "\"server/localhost@" + REALM + "\" " +
81                                    "\"krbtgt/" + REALM + "@" + REALM + "\""))
82                    .debug("C")
83                    .start();
84            Proc ps = Proc.create("BasicProc")
85                    .args("server")
86                    .prop("java.security.krb5.conf", CONF)
87                    .prop("java.security.manager", "")
88                    .perm(new java.util.PropertyPermission(
89                            "sun.security.krb5.principal", "read"))
90                    .perm(new javax.security.auth.AuthPermission(
91                            "modifyPrincipals"))
92                    .perm(new javax.security.auth.AuthPermission(
93                            "modifyPrivateCredentials"))
94                    .perm(new javax.security.auth.AuthPermission("doAs"))
95                    .perm(new PrivateCredentialPermission(
96                            "javax.security.auth.kerberos.KeyTab * \"*\"",
97                            "read"))
98                    .perm(new javax.security.auth.kerberos.ServicePermission(
99                            "server/localhost@" + REALM, "accept"))
100                    .perm(new java.io.FilePermission(
101                            cwd + File.separator + KTAB, "read"))
102                    .perm(new javax.security.auth.kerberos.ServicePermission(
103                            "backend/localhost@" + REALM, "initiate"))
104                    .debug("S")
105                    .start();
106            Proc pb = Proc.create("BasicProc")
107                    .args("backend")
108                    .prop("java.security.krb5.conf", CONF)
109                    .prop("java.security.manager", "")
110                    .perm(new java.util.PropertyPermission(
111                            "sun.security.krb5.principal", "read"))
112                    .perm(new javax.security.auth.AuthPermission(
113                            "modifyPrincipals"))
114                    .perm(new javax.security.auth.AuthPermission(
115                            "modifyPrivateCredentials"))
116                    .perm(new javax.security.auth.AuthPermission("doAs"))
117                    .perm(new PrivateCredentialPermission(
118                            "javax.security.auth.kerberos.KeyTab * \"*\"",
119                            "read"))
120                    .perm(new javax.security.auth.kerberos.ServicePermission(
121                            "backend/localhost@" + REALM, "accept"))
122                    .perm(new java.io.FilePermission(
123                            cwd + File.separator + KTAB, "read"))
124                    .debug("B")
125                    .start();
126
127            // Client and server handshake
128            String token = pc.readData();
129            ps.println(token);
130            token = ps.readData();
131            pc.println(token);
132            // Server and backend handshake
133            token = ps.readData();
134            pb.println(token);
135            token = pb.readData();
136            ps.println(token);
137            // wrap/unwrap/getMic/verifyMic and plain text
138            token = ps.readData();
139            pb.println(token);
140            token = pb.readData();
141            ps.println(token);
142            token = pb.readData();
143            ps.println(token);
144
145            if ((pc.waitFor() | ps.waitFor() | pb.waitFor()) != 0) {
146                throw new Exception();
147            }
148        } else if (args[0].equals("client")) {
149            Context c = Context.fromUserPass(USER, PASS, false);
150            c.startAsClient(SERVER, oid);
151            c.x().requestCredDeleg(true);
152            Proc.binOut(c.take(new byte[0]));
153            byte[] token = Proc.binIn();
154            c.take(token);
155        } else if (args[0].equals("server")) {
156            Context s = Context.fromUserKtab(SERVER, KTAB, true);
157            s.startAsServer(oid);
158            byte[] token = Proc.binIn();
159            token = s.take(token);
160            Proc.binOut(token);
161            Context s2 = s.delegated();
162            s2.startAsClient(BACKEND, oid);
163            Proc.binOut(s2.take(new byte[0]));
164            token = Proc.binIn();
165            s2.take(token);
166            byte[] msg = "Hello".getBytes();
167            Proc.binOut(s2.wrap(msg, true));
168            s2.verifyMic(Proc.binIn(), msg);
169            String in = Proc.textIn();
170            if (!in.equals("Hello")) {
171                throw new Exception();
172            }
173        } else if (args[0].equals("backend")) {
174            Context b = Context.fromUserKtab(BACKEND, KTAB, true);
175            b.startAsServer(oid);
176            byte[] token = Proc.binIn();
177            Proc.binOut(b.take(token));
178            byte[] msg = b.unwrap(Proc.binIn(), true);
179            Proc.binOut(b.getMic(msg));
180            Proc.textOut(new String(msg));
181        }
182    }
183    // create a native server
184    private static Proc ns(Proc p) throws Exception {
185        return p
186            .env("KRB5_CONFIG", CONF)
187            .env("KRB5_KTNAME", KTAB)
188            .prop("sun.security.jgss.native", "true")
189            .prop("javax.security.auth.useSubjectCredsOnly", "false")
190            .prop("sun.security.nativegss.debug", "true");
191    }
192}
193