| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package sun.security.jgss.krb5;  | 
 | 
 | 
 | 
import javax.security.auth.kerberos.KerberosTicket;  | 
 | 
import javax.security.auth.kerberos.KerberosKey;  | 
 | 
import javax.security.auth.kerberos.KerberosPrincipal;  | 
 | 
import javax.security.auth.kerberos.KeyTab;  | 
 | 
import javax.security.auth.Subject;  | 
 | 
import javax.security.auth.login.LoginException;  | 
 | 
import java.security.AccessControlContext;  | 
 | 
import sun.security.jgss.GSSUtil;  | 
 | 
import sun.security.jgss.GSSCaller;  | 
 | 
 | 
 | 
import sun.security.krb5.Credentials;  | 
 | 
import sun.security.krb5.EncryptionKey;  | 
 | 
import sun.security.krb5.KrbException;  | 
 | 
import java.io.IOException;  | 
 | 
import java.util.ArrayList;  | 
 | 
import java.util.List;  | 
 | 
import sun.security.krb5.KerberosSecrets;  | 
 | 
import sun.security.krb5.PrincipalName;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public class Krb5Util { | 
 | 
 | 
 | 
    static final boolean DEBUG =  | 
 | 
        java.security.AccessController.doPrivileged(  | 
 | 
            new sun.security.action.GetBooleanAction  | 
 | 
            ("sun.security.krb5.debug")).booleanValue(); | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    private Krb5Util() {  // Cannot create one of these | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public static KerberosTicket getTicketFromSubjectAndTgs(GSSCaller caller,  | 
 | 
        String clientPrincipal, String serverPrincipal, String tgsPrincipal,  | 
 | 
        AccessControlContext acc)  | 
 | 
        throws LoginException, KrbException, IOException { | 
 | 
 | 
 | 
          | 
 | 
        Subject accSubj = Subject.getSubject(acc);  | 
 | 
        KerberosTicket ticket = SubjectComber.find(accSubj,  | 
 | 
            serverPrincipal, clientPrincipal, KerberosTicket.class);  | 
 | 
 | 
 | 
        if (ticket != null) { | 
 | 
            return ticket;    | 
 | 
        }  | 
 | 
 | 
 | 
        Subject loginSubj = null;  | 
 | 
        if (!GSSUtil.useSubjectCredsOnly(caller)) { | 
 | 
              | 
 | 
            try { | 
 | 
                loginSubj = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID);  | 
 | 
                ticket = SubjectComber.find(loginSubj,  | 
 | 
                    serverPrincipal, clientPrincipal, KerberosTicket.class);  | 
 | 
                if (ticket != null) { | 
 | 
                    return ticket;   | 
 | 
                }  | 
 | 
            } catch (LoginException e) { | 
 | 
                // No login entry to use  | 
 | 
                // ignore and continue  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        // Service ticket not found in subject or login  | 
 | 
        // Try to get TGT to acquire service ticket  | 
 | 
 | 
 | 
          | 
 | 
        KerberosTicket tgt = SubjectComber.find(accSubj,  | 
 | 
            tgsPrincipal, clientPrincipal, KerberosTicket.class);  | 
 | 
 | 
 | 
        boolean fromAcc;  | 
 | 
        if (tgt == null && loginSubj != null) { | 
 | 
              | 
 | 
            tgt = SubjectComber.find(loginSubj,  | 
 | 
                tgsPrincipal, clientPrincipal, KerberosTicket.class);  | 
 | 
            fromAcc = false;  | 
 | 
        } else { | 
 | 
            fromAcc = true;  | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        if (tgt != null) { | 
 | 
            Credentials tgtCreds = ticketToCreds(tgt);  | 
 | 
            Credentials serviceCreds = Credentials.acquireServiceCreds(  | 
 | 
                        serverPrincipal, tgtCreds);  | 
 | 
            if (serviceCreds != null) { | 
 | 
                ticket = credsToTicket(serviceCreds);  | 
 | 
 | 
 | 
                  | 
 | 
                if (fromAcc && accSubj != null && !accSubj.isReadOnly()) { | 
 | 
                    accSubj.getPrivateCredentials().add(ticket);  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }  | 
 | 
        return ticket;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    static KerberosTicket getServiceTicket(GSSCaller caller,  | 
 | 
        String clientPrincipal, String serverPrincipal,  | 
 | 
        AccessControlContext acc) throws LoginException { | 
 | 
 | 
 | 
          | 
 | 
        Subject accSubj = Subject.getSubject(acc);  | 
 | 
        KerberosTicket ticket =  | 
 | 
            SubjectComber.find(accSubj, serverPrincipal, clientPrincipal,  | 
 | 
                  KerberosTicket.class);  | 
 | 
 | 
 | 
        return ticket;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    static KerberosTicket getInitialTicket(GSSCaller caller,  | 
 | 
            String clientPrincipal,  | 
 | 
            AccessControlContext acc) throws LoginException { | 
 | 
 | 
 | 
          | 
 | 
        Subject accSubj = Subject.getSubject(acc);  | 
 | 
        KerberosTicket ticket =  | 
 | 
                SubjectComber.find(accSubj, null, clientPrincipal,  | 
 | 
                        KerberosTicket.class);  | 
 | 
 | 
 | 
          | 
 | 
        if (ticket == null && !GSSUtil.useSubjectCredsOnly(caller)) { | 
 | 
            Subject subject = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID);  | 
 | 
            ticket = SubjectComber.find(subject,  | 
 | 
                    null, clientPrincipal, KerberosTicket.class);  | 
 | 
        }  | 
 | 
        return ticket;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public static Subject getSubject(GSSCaller caller,  | 
 | 
        AccessControlContext acc) throws LoginException { | 
 | 
 | 
 | 
          | 
 | 
        Subject subject = Subject.getSubject(acc);  | 
 | 
 | 
 | 
          | 
 | 
        if (subject == null && !GSSUtil.useSubjectCredsOnly(caller)) { | 
 | 
            subject = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID);  | 
 | 
        }  | 
 | 
        return subject;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public static ServiceCreds getServiceCreds(GSSCaller caller,  | 
 | 
        String serverPrincipal, AccessControlContext acc)  | 
 | 
                throws LoginException { | 
 | 
 | 
 | 
        Subject accSubj = Subject.getSubject(acc);  | 
 | 
        ServiceCreds sc = null;  | 
 | 
        if (accSubj != null) { | 
 | 
            sc = ServiceCreds.getInstance(accSubj, serverPrincipal);  | 
 | 
        }  | 
 | 
        if (sc == null && !GSSUtil.useSubjectCredsOnly(caller)) { | 
 | 
            Subject subject = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID);  | 
 | 
            sc = ServiceCreds.getInstance(subject, serverPrincipal);  | 
 | 
        }  | 
 | 
        return sc;  | 
 | 
    }  | 
 | 
 | 
 | 
    public static KerberosTicket credsToTicket(Credentials serviceCreds) { | 
 | 
        EncryptionKey sessionKey =  serviceCreds.getSessionKey();  | 
 | 
        KerberosTicket kt = new KerberosTicket(  | 
 | 
            serviceCreds.getEncoded(),  | 
 | 
            new KerberosPrincipal(serviceCreds.getClient().getName()),  | 
 | 
            new KerberosPrincipal(serviceCreds.getServer().getName(),  | 
 | 
                                KerberosPrincipal.KRB_NT_SRV_INST),  | 
 | 
            sessionKey.getBytes(),  | 
 | 
            sessionKey.getEType(),  | 
 | 
            serviceCreds.getFlags(),  | 
 | 
            serviceCreds.getAuthTime(),  | 
 | 
            serviceCreds.getStartTime(),  | 
 | 
            serviceCreds.getEndTime(),  | 
 | 
            serviceCreds.getRenewTill(),  | 
 | 
            serviceCreds.getClientAddresses());  | 
 | 
        PrincipalName clientAlias = serviceCreds.getClientAlias();  | 
 | 
        PrincipalName serverAlias = serviceCreds.getServerAlias();  | 
 | 
        if (clientAlias != null) { | 
 | 
            KerberosSecrets.getJavaxSecurityAuthKerberosAccess()  | 
 | 
                    .kerberosTicketSetClientAlias(kt, new KerberosPrincipal(  | 
 | 
                            clientAlias.getName(), clientAlias.getNameType()));  | 
 | 
        }  | 
 | 
        if (serverAlias != null) { | 
 | 
            KerberosSecrets.getJavaxSecurityAuthKerberosAccess()  | 
 | 
                    .kerberosTicketSetServerAlias(kt, new KerberosPrincipal(  | 
 | 
                            serverAlias.getName(), serverAlias.getNameType()));  | 
 | 
        }  | 
 | 
        return kt;  | 
 | 
    };  | 
 | 
 | 
 | 
    public static Credentials ticketToCreds(KerberosTicket kerbTicket)  | 
 | 
            throws KrbException, IOException { | 
 | 
        KerberosPrincipal clientAlias = KerberosSecrets  | 
 | 
                .getJavaxSecurityAuthKerberosAccess()  | 
 | 
                .kerberosTicketGetClientAlias(kerbTicket);  | 
 | 
        KerberosPrincipal serverAlias = KerberosSecrets  | 
 | 
                .getJavaxSecurityAuthKerberosAccess()  | 
 | 
                .kerberosTicketGetServerAlias(kerbTicket);  | 
 | 
        return new Credentials(  | 
 | 
            kerbTicket.getEncoded(),  | 
 | 
            kerbTicket.getClient().getName(),  | 
 | 
            (clientAlias != null ? clientAlias.getName() : null),  | 
 | 
            kerbTicket.getServer().getName(),  | 
 | 
            (serverAlias != null ? serverAlias.getName() : null),  | 
 | 
            kerbTicket.getSessionKey().getEncoded(),  | 
 | 
            kerbTicket.getSessionKeyType(),  | 
 | 
            kerbTicket.getFlags(),  | 
 | 
            kerbTicket.getAuthTime(),  | 
 | 
            kerbTicket.getStartTime(),  | 
 | 
            kerbTicket.getEndTime(),  | 
 | 
            kerbTicket.getRenewTill(),  | 
 | 
            kerbTicket.getClientAddresses());  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public static sun.security.krb5.internal.ktab.KeyTab  | 
 | 
            snapshotFromJavaxKeyTab(KeyTab ktab) { | 
 | 
        return KerberosSecrets.getJavaxSecurityAuthKerberosAccess()  | 
 | 
                .keyTabTakeSnapshot(ktab);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public static EncryptionKey[] keysFromJavaxKeyTab(  | 
 | 
            KeyTab ktab, PrincipalName cname) { | 
 | 
        return snapshotFromJavaxKeyTab(ktab).readServiceKeys(cname);  | 
 | 
    }  | 
 | 
}  |