| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
/*  | 
 | 
 *  | 
 | 
 *  (C) Copyright IBM Corp. 1999 All Rights Reserved.  | 
 | 
 *  Copyright 1997 The Open Group Research Institute.  All rights reserved.  | 
 | 
 */  | 
 | 
 | 
 | 
package sun.security.krb5;  | 
 | 
 | 
 | 
import sun.security.krb5.internal.*;  | 
 | 
import sun.security.krb5.internal.crypto.KeyUsage;  | 
 | 
import sun.security.util.*;  | 
 | 
import java.io.IOException;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public class KrbTgsRep extends KrbKdcRep { | 
 | 
    private TGSRep rep;  | 
 | 
    private Credentials creds;  | 
 | 
    private Ticket secondTicket;  | 
 | 
    private static final boolean DEBUG = Krb5.DEBUG;  | 
 | 
 | 
 | 
    KrbTgsRep(byte[] ibuf, KrbTgsReq tgsReq)  | 
 | 
        throws KrbException, IOException { | 
 | 
        DerValue ref = new DerValue(ibuf);  | 
 | 
        TGSReq req = tgsReq.getMessage();  | 
 | 
        TGSRep rep = null;  | 
 | 
        try { | 
 | 
            rep = new TGSRep(ref);  | 
 | 
        } catch (Asn1Exception e) { | 
 | 
            rep = null;  | 
 | 
            KRBError err = new KRBError(ref);  | 
 | 
            String errStr = err.getErrorString();  | 
 | 
            String eText = null;   | 
 | 
            if (errStr != null && errStr.length() > 0) { | 
 | 
                if (errStr.charAt(errStr.length() - 1) == 0)  | 
 | 
                    eText = errStr.substring(0, errStr.length() - 1);  | 
 | 
                else  | 
 | 
                    eText = errStr;  | 
 | 
            }  | 
 | 
            KrbException ke;  | 
 | 
            if (eText == null) { | 
 | 
                  | 
 | 
                ke = new KrbException(err.getErrorCode());  | 
 | 
            } else { | 
 | 
                  | 
 | 
                ke = new KrbException(err.getErrorCode(), eText);  | 
 | 
            }  | 
 | 
            ke.initCause(e);  | 
 | 
            throw ke;  | 
 | 
        }  | 
 | 
        byte[] enc_tgs_rep_bytes = rep.encPart.decrypt(tgsReq.tgsReqKey,  | 
 | 
            tgsReq.usedSubkey() ? KeyUsage.KU_ENC_TGS_REP_PART_SUBKEY :  | 
 | 
            KeyUsage.KU_ENC_TGS_REP_PART_SESSKEY);  | 
 | 
 | 
 | 
        byte[] enc_tgs_rep_part = rep.encPart.reset(enc_tgs_rep_bytes);  | 
 | 
        ref = new DerValue(enc_tgs_rep_part);  | 
 | 
        EncTGSRepPart enc_part = new EncTGSRepPart(ref);  | 
 | 
        rep.encKDCRepPart = enc_part;  | 
 | 
 | 
 | 
        check(false, req, rep, tgsReq.tgsReqKey);  | 
 | 
 | 
 | 
        PrincipalName serverAlias = tgsReq.getServerAlias();  | 
 | 
        if (serverAlias != null) { | 
 | 
            PrincipalName repSname = enc_part.sname;  | 
 | 
            if (serverAlias.equals(repSname) ||  | 
 | 
                    isReferralSname(repSname)) { | 
 | 
                serverAlias = null;  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        PrincipalName clientAlias = null;  | 
 | 
        if (rep.cname.equals(req.reqBody.cname)) { | 
 | 
            // Only propagate the client alias if it is not an  | 
 | 
              | 
 | 
            clientAlias = tgsReq.getClientAlias();  | 
 | 
        }  | 
 | 
 | 
 | 
        this.creds = new Credentials(rep.ticket,  | 
 | 
                                rep.cname,  | 
 | 
                                clientAlias,  | 
 | 
                                enc_part.sname,  | 
 | 
                                serverAlias,  | 
 | 
                                enc_part.key,  | 
 | 
                                enc_part.flags,  | 
 | 
                                enc_part.authtime,  | 
 | 
                                enc_part.starttime,  | 
 | 
                                enc_part.endtime,  | 
 | 
                                enc_part.renewTill,  | 
 | 
                                enc_part.caddr  | 
 | 
                                );  | 
 | 
        this.rep = rep;  | 
 | 
        this.secondTicket = tgsReq.getSecondTicket();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Credentials getCreds() { | 
 | 
        return creds;  | 
 | 
    }  | 
 | 
 | 
 | 
    sun.security.krb5.internal.ccache.Credentials setCredentials() { | 
 | 
        return new sun.security.krb5.internal.ccache.Credentials(rep, secondTicket);  | 
 | 
    }  | 
 | 
 | 
 | 
    private static boolean isReferralSname(PrincipalName sname) { | 
 | 
        if (sname != null) { | 
 | 
            String[] snameStrings = sname.getNameStrings();  | 
 | 
            if (snameStrings.length == 2 &&  | 
 | 
                    snameStrings[0].equals(  | 
 | 
                            PrincipalName.TGS_DEFAULT_SRV_NAME)) { | 
 | 
                return true;  | 
 | 
            }  | 
 | 
        }  | 
 | 
        return false;  | 
 | 
    }  | 
 | 
}  |