jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java
author weijun
Fri, 21 Jun 2013 18:26:13 +0800
changeset 18536 092411ced388
child 18542 7b1fa08a804e
permissions -rw-r--r--
8001326: Improve Kerberos caching Reviewed-by: valeriep
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18536
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     1
/*
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     2
 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     4
 *
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     7
 * published by the Free Software Foundation.
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     8
 *
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    13
 * accompanied this code).
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    14
 *
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    18
 *
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    21
 * questions.
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    22
 */
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    23
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    24
/*
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    25
 * @test
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    26
 * @bug 7152176
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    27
 * @summary More krb5 tests
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    28
 * @library ../../../../java/security/testlibrary/
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    29
 * @compile -XDignore.symbol.file ReplayCacheTestProc.java
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    30
 * @run main/othervm/timeout=100 ReplayCacheTestProc
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    31
 */
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    32
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    33
import java.io.*;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    34
import java.nio.BufferUnderflowException;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    35
import java.nio.channels.SeekableByteChannel;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    36
import java.nio.file.Files;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    37
import java.nio.file.Paths;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    38
import java.nio.file.StandardCopyOption;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    39
import java.nio.file.StandardOpenOption;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    40
import java.security.MessageDigest;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    41
import java.util.*;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    42
import sun.security.jgss.GSSUtil;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    43
import sun.security.krb5.internal.APReq;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    44
import sun.security.krb5.internal.rcache.AuthTime;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    45
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    46
// This test runs multiple acceptor Procs to mimin AP-REQ replays.
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    47
public class ReplayCacheTestProc {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    48
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    49
    private static Proc[] ps;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    50
    private static Proc pc;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    51
    private static List<Req> reqs = new ArrayList<>();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    52
    private static String HOST = "localhost";
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    53
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    54
    // Where should the rcache be saved. It seems KRB5RCACHEDIR is not
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    55
    // recognized on Solaris. Maybe version too low? I see 1.6.
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    56
    private static String cwd =
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    57
            System.getProperty("os.name").startsWith("SunOS") ?
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    58
                "/var/krb5/rcache/" :
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    59
                System.getProperty("user.dir");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    60
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    61
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    62
    private static int uid;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    63
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    64
    public static void main0(String[] args) throws Exception {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    65
        System.setProperty("java.security.krb5.conf", OneKDC.KRB5_CONF);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    66
        if (args.length == 0) { // The controller
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    67
            int ns = 5;     // number of servers
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    68
            int nu = 5;     // number of users
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    69
            int nx = 50;    // number of experiments
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    70
            int np = 5;     // number of peers (services)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    71
            int mode = 0;   // native(1), random(0), java(-1)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    72
            boolean random = true;      // random experiments choreograph
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    73
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    74
            try {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    75
                Class<?> clazz = Class.forName(
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    76
                        "com.sun.security.auth.module.UnixSystem");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    77
                uid = (int)(long)(Long)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    78
                        clazz.getMethod("getUid").invoke(clazz.newInstance());
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    79
            } catch (Exception e) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    80
                uid = -1;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    81
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    82
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    83
            KDC kdc = KDC.create(OneKDC.REALM, HOST, 0, true);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    84
            for (int i=0; i<nu; i++) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    85
                kdc.addPrincipal(user(i), OneKDC.PASS);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    86
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    87
            kdc.addPrincipalRandKey("krbtgt/" + OneKDC.REALM);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    88
            for (int i=0; i<np; i++) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    89
                kdc.addPrincipalRandKey(peer(i));
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    90
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    91
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    92
            kdc.writeKtab(OneKDC.KTAB);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    93
            KDC.saveConfig(OneKDC.KRB5_CONF, kdc);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    94
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    95
            pc = Proc.create("ReplayCacheTestProc").debug("C")
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    96
                    .args("client")
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    97
                    .start();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    98
            ps = new Proc[ns];
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
    99
            Ex[] result = new Ex[nx];
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   100
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   101
            if (!random) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   102
                // 2 experiments, 2 server, 1 peer, 1 user
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   103
                nx = 2; ns = 2; np = 1; nu = 1;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   104
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   105
                // Creates reqs from user# to peer#
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   106
                req(0, 0);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   107
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   108
                // Creates server#
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   109
                ps[0] = ns(0);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   110
                ps[1] = js(1);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   111
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   112
                // Runs ex# using req# to server# with expected result
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   113
                result[0] = round(0, 0, 0, true);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   114
                result[1] = round(1, 0, 1, false);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   115
            } else {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   116
                Random r = new Random();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   117
                for (int i=0; i<ns; i++) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   118
                    boolean useNative = (mode == 1) ? true
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   119
                            : (mode == -1 ? false : r.nextBoolean());
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   120
                    ps[i] = useNative?ns(i):js(i);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   121
                }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   122
                for (int i=0; i<nx; i++) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   123
                    result[i] = new Ex();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   124
                    int old;    // which req to send
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   125
                    boolean expected;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   126
                    if (reqs.isEmpty() || r.nextBoolean()) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   127
                        Proc.d("Console get new AP-REQ");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   128
                        old = req(r.nextInt(nu), r.nextInt(np));
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   129
                        expected = true;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   130
                    } else {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   131
                        Proc.d("Console resue old");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   132
                        old = r.nextInt(reqs.size());
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   133
                        expected = false;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   134
                    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   135
                    int s = r.nextInt(ns);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   136
                    Proc.d("Console send to " + s);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   137
                    result[i] = round(i, old, s, expected);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   138
                    Proc.d("Console sees " + result[i].actual);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   139
                }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   140
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   141
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   142
            pc.println("END");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   143
            for (int i=0; i<ns; i++) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   144
                ps[i].println("END");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   145
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   146
            System.out.println("Result\n======");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   147
            boolean finalOut = true;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   148
            for (int i=0; i<nx; i++) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   149
                boolean out = result[i].expected==result[i].actual;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   150
                finalOut &= out;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   151
                System.out.printf("%3d: %s (%2d): u%d h%d %s %s   %s %2d\n",
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   152
                        i,
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   153
                        result[i].expected?"----":"    ",
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   154
                        result[i].old,
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   155
                        result[i].user, result[i].peer, result[i].server,
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   156
                        result[i].actual?"Good":"Bad ",
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   157
                        out?"   ":"xxx",
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   158
                        result[i].csize);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   159
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   160
            if (!finalOut) throw new Exception();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   161
        } else if (args[0].equals("client")) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   162
            while (true) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   163
                String title = Proc.textIn();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   164
                Proc.d("Client see " + title);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   165
                if (title.equals("END")) break;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   166
                String[] cas = title.split(" ");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   167
                Context c = Context.fromUserPass(cas[0], OneKDC.PASS, false);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   168
                c.startAsClient(cas[1], GSSUtil.GSS_KRB5_MECH_OID);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   169
                c.x().requestCredDeleg(true);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   170
                byte[] token = c.take(new byte[0]);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   171
                Proc.d("Client AP-REQ generated");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   172
                Proc.binOut(token);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   173
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   174
        } else {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   175
            Proc.d("Server start");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   176
            Context s = Context.fromUserKtab("*", OneKDC.KTAB, true);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   177
            Proc.d("Server login");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   178
            while (true) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   179
                String title = Proc.textIn();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   180
                Proc.d("Server " + args[0] + " sees " + title);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   181
                if (title.equals("END")) break;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   182
                s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   183
                byte[] token = Proc.binIn();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   184
                try {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   185
                    s.take(token);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   186
                    Proc.textOut("true");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   187
                    Proc.d(args[0] + " Good");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   188
                } catch (Exception e) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   189
                    Proc.textOut("false");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   190
                    Proc.d(args[0] + " Bad");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   191
                }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   192
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   193
        }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   194
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   195
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   196
    public static void main(String[] args) throws Exception {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   197
        try {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   198
            main0(args);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   199
        } catch (Exception e) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   200
            Proc.d(e);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   201
            throw e;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   202
        }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   203
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   204
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   205
    // returns the user name
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   206
    private static String user(int p) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   207
        return "USER" + p;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   208
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   209
    // returns the peer name
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   210
    private static String peer(int p) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   211
        return "host" + p + "/" + HOST;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   212
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   213
    // returns the dfl name for a host
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   214
    private static String dfl(int p) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   215
        return cwd + "host" + p + (uid == -1 ? "" : ("_"+uid));
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   216
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   217
    // generates an ap-req and save into reqs, returns the index
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   218
    private static int req(int user, int peer) throws Exception {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   219
        pc.println(user(user) + " " + peer(peer));
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   220
        Req req = new Req(user, peer, pc.readData());
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   221
        reqs.add(req);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   222
        return reqs.size() - 1;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   223
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   224
    // carries out a round of experiment
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   225
    // i: ex#, old: which req, server: which server, expected: result?
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   226
    private static Ex round(int i, int old, int server, boolean expected)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   227
            throws Exception {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   228
        ps[server].println("TEST");
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   229
        ps[server].println(reqs.get(old).msg);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   230
        String reply = ps[server].readData();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   231
        Ex result = new Ex();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   232
        result.i = i;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   233
        result.expected = expected;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   234
        result.server = ps[server].debug();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   235
        result.actual = Boolean.valueOf(reply);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   236
        result.user = reqs.get(old).user;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   237
        result.peer = reqs.get(old).peer;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   238
        result.old = old;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   239
        result.csize = csize(result.peer);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   240
        result.hash = hash(reqs.get(old).msg);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   241
        if (new File(dfl(result.peer)).exists()) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   242
            Files.copy(Paths.get(dfl(result.peer)), Paths.get(
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   243
                String.format("%03d-USER%d-host%d-%s-%s",
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   244
                    i, result.user, result.peer, result.server,
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   245
                    result.actual)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   246
                + "-" + result.hash),
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   247
                StandardCopyOption.COPY_ATTRIBUTES);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   248
        }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   249
        return result;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   250
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   251
    // create a native server
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   252
    private static Proc ns(int i) throws Exception {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   253
        return Proc.create("ReplayCacheTestProc")
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   254
                .args("N"+i)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   255
                .env("KRB5_CONFIG", OneKDC.KRB5_CONF)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   256
                .env("KRB5_KTNAME", OneKDC.KTAB)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   257
                .env("KRB5RCACHEDIR", cwd)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   258
                .prop("sun.security.jgss.native", "true")
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   259
                .prop("javax.security.auth.useSubjectCredsOnly", "false")
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   260
                .prop("sun.security.nativegss.debug", "true")
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   261
                .debug("N"+i)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   262
                .start();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   263
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   264
    // creates a java server
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   265
    private static Proc js(int i) throws Exception {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   266
        return Proc.create("ReplayCacheTestProc")
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   267
                .debug("S"+i)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   268
                .args("S"+i)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   269
                .prop("sun.security.krb5.rcache", "dfl")
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   270
                .prop("java.io.tmpdir", cwd)
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   271
                .start();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   272
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   273
    // generates hash of authenticator inside ap-req inside initsectoken
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   274
    private static String hash(String req) throws Exception {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   275
        byte[] data = Base64.getDecoder().decode(req);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   276
        data = Arrays.copyOfRange(data, 17, data.length);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   277
        byte[] hash = MessageDigest.getInstance("MD5").digest(new APReq(data).authenticator.getBytes());
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   278
        char[] h = new char[hash.length * 2];
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   279
        char[] hexConst = "0123456789ABCDEF".toCharArray();
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   280
        for (int i=0; i<hash.length; i++) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   281
            h[2*i] = hexConst[(hash[i]&0xff)>>4];
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   282
            h[2*i+1] = hexConst[hash[i]&0xf];
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   283
        }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   284
        return new String(h);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   285
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   286
    // return size of dfl file, excluding the null hash ones
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   287
    private static int csize(int p) throws Exception {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   288
        try (SeekableByteChannel chan = Files.newByteChannel(
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   289
                Paths.get(dfl(p)), StandardOpenOption.READ)) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   290
            chan.position(6);
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   291
            int cc = 0;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   292
            while (true) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   293
                try {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   294
                    if (AuthTime.readFrom(chan) != null) cc++;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   295
                } catch (BufferUnderflowException e) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   296
                    break;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   297
                }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   298
            }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   299
            return cc;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   300
        } catch (IOException ioe) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   301
            return 0;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   302
        }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   303
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   304
    // models an experiement
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   305
    private static class Ex {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   306
        int i;              // #
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   307
        boolean expected;   // expected result
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   308
        boolean actual;     // actual output
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   309
        int old;            // which ap-req to send
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   310
        String server;      // which server to send to
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   311
        String hash;        // the hash of req
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   312
        int user;           // which initiator
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   313
        int peer;           // which acceptor
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   314
        int csize;          // size of rcache after test
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   315
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   316
    // models a saved ap-req msg
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   317
    private static class Req {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   318
        String msg;         // based64-ed req
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   319
        int user;           // which initiator
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   320
        int peer;           // which accceptor
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   321
        Req(int user, int peer, String msg) {
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   322
            this.msg = msg;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   323
            this.user= user;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   324
            this.peer = peer;
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   325
        }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   326
    }
092411ced388 8001326: Improve Kerberos caching
weijun
parents:
diff changeset
   327
}