|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
/* |
|
* |
|
* (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; |
|
} |
|
} |