6641312: Fix krb5 codes indentation problems
Reviewed-by: xuelei, valeriep, wetmore
This commit is contained in:
parent
6797bd9fb2
commit
0f960354ea
@ -75,107 +75,107 @@ public class KrbTgsReq extends KrbKdcReq {
|
||||
null); // EncryptionKey subSessionKey
|
||||
}
|
||||
|
||||
// Called by Credentials, KrbCred
|
||||
KrbTgsReq(
|
||||
KDCOptions options,
|
||||
Credentials asCreds,
|
||||
PrincipalName sname,
|
||||
KerberosTime from,
|
||||
KerberosTime till,
|
||||
KerberosTime rtime,
|
||||
int[] eTypes,
|
||||
HostAddresses addresses,
|
||||
AuthorizationData authorizationData,
|
||||
Ticket[] additionalTickets,
|
||||
EncryptionKey subKey) throws KrbException, IOException {
|
||||
// Called by Credentials, KrbCred
|
||||
KrbTgsReq(
|
||||
KDCOptions options,
|
||||
Credentials asCreds,
|
||||
PrincipalName sname,
|
||||
KerberosTime from,
|
||||
KerberosTime till,
|
||||
KerberosTime rtime,
|
||||
int[] eTypes,
|
||||
HostAddresses addresses,
|
||||
AuthorizationData authorizationData,
|
||||
Ticket[] additionalTickets,
|
||||
EncryptionKey subKey) throws KrbException, IOException {
|
||||
|
||||
princName = asCreds.client;
|
||||
servName = sname;
|
||||
ctime = new KerberosTime(KerberosTime.NOW);
|
||||
|
||||
|
||||
// check if they are valid arguments. The optional fields
|
||||
// should be consistent with settings in KDCOptions.
|
||||
if (options.get(KDCOptions.FORWARDABLE) &&
|
||||
(!(asCreds.flags.get(Krb5.TKT_OPTS_FORWARDABLE)))) {
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.FORWARDED)) {
|
||||
if (!(asCreds.flags.get(KDCOptions.FORWARDABLE)))
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.PROXIABLE) &&
|
||||
(!(asCreds.flags.get(Krb5.TKT_OPTS_PROXIABLE)))) {
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.PROXY)) {
|
||||
if (!(asCreds.flags.get(KDCOptions.PROXIABLE)))
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.ALLOW_POSTDATE) &&
|
||||
(!(asCreds.flags.get(Krb5.TKT_OPTS_MAY_POSTDATE)))) {
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.RENEWABLE) &&
|
||||
(!(asCreds.flags.get(Krb5.TKT_OPTS_RENEWABLE)))) {
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
|
||||
if (options.get(KDCOptions.POSTDATED)) {
|
||||
if (!(asCreds.flags.get(KDCOptions.POSTDATED)))
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
} else {
|
||||
if (from != null) from = null;
|
||||
}
|
||||
if (options.get(KDCOptions.RENEWABLE)) {
|
||||
if (!(asCreds.flags.get(KDCOptions.RENEWABLE)))
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
} else {
|
||||
if (rtime != null) rtime = null;
|
||||
}
|
||||
if (options.get(KDCOptions.ENC_TKT_IN_SKEY)) {
|
||||
if (additionalTickets == null)
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
// in TGS_REQ there could be more than one additional
|
||||
// tickets, but in file-based credential cache,
|
||||
// there is only one additional ticket field.
|
||||
secondTicket = additionalTickets[0];
|
||||
} else {
|
||||
if (additionalTickets != null)
|
||||
additionalTickets = null;
|
||||
}
|
||||
|
||||
tgsReqMessg = createRequest(
|
||||
options,
|
||||
asCreds.ticket,
|
||||
asCreds.key,
|
||||
ctime,
|
||||
princName,
|
||||
princName.getRealm(),
|
||||
servName,
|
||||
from,
|
||||
till,
|
||||
rtime,
|
||||
eTypes,
|
||||
addresses,
|
||||
authorizationData,
|
||||
additionalTickets,
|
||||
subKey);
|
||||
obuf = tgsReqMessg.asn1Encode();
|
||||
|
||||
// XXX We need to revisit this to see if can't move it
|
||||
// up such that FORWARDED flag set in the options
|
||||
// is included in the marshaled request.
|
||||
/*
|
||||
* If this is based on a forwarded ticket, record that in the
|
||||
* options, because the returned TgsRep will contain the
|
||||
* FORWARDED flag set.
|
||||
*/
|
||||
if (asCreds.flags.get(KDCOptions.FORWARDED))
|
||||
options.set(KDCOptions.FORWARDED, true);
|
||||
princName = asCreds.client;
|
||||
servName = sname;
|
||||
ctime = new KerberosTime(KerberosTime.NOW);
|
||||
|
||||
|
||||
// check if they are valid arguments. The optional fields
|
||||
// should be consistent with settings in KDCOptions.
|
||||
if (options.get(KDCOptions.FORWARDABLE) &&
|
||||
(!(asCreds.flags.get(Krb5.TKT_OPTS_FORWARDABLE)))) {
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.FORWARDED)) {
|
||||
if (!(asCreds.flags.get(KDCOptions.FORWARDABLE)))
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.PROXIABLE) &&
|
||||
(!(asCreds.flags.get(Krb5.TKT_OPTS_PROXIABLE)))) {
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.PROXY)) {
|
||||
if (!(asCreds.flags.get(KDCOptions.PROXIABLE)))
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.ALLOW_POSTDATE) &&
|
||||
(!(asCreds.flags.get(Krb5.TKT_OPTS_MAY_POSTDATE)))) {
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
if (options.get(KDCOptions.RENEWABLE) &&
|
||||
(!(asCreds.flags.get(Krb5.TKT_OPTS_RENEWABLE)))) {
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
}
|
||||
|
||||
if (options.get(KDCOptions.POSTDATED)) {
|
||||
if (!(asCreds.flags.get(KDCOptions.POSTDATED)))
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
} else {
|
||||
if (from != null) from = null;
|
||||
}
|
||||
if (options.get(KDCOptions.RENEWABLE)) {
|
||||
if (!(asCreds.flags.get(KDCOptions.RENEWABLE)))
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
} else {
|
||||
if (rtime != null) rtime = null;
|
||||
}
|
||||
if (options.get(KDCOptions.ENC_TKT_IN_SKEY)) {
|
||||
if (additionalTickets == null)
|
||||
throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
|
||||
// in TGS_REQ there could be more than one additional
|
||||
// tickets, but in file-based credential cache,
|
||||
// there is only one additional ticket field.
|
||||
secondTicket = additionalTickets[0];
|
||||
} else {
|
||||
if (additionalTickets != null)
|
||||
additionalTickets = null;
|
||||
}
|
||||
|
||||
tgsReqMessg = createRequest(
|
||||
options,
|
||||
asCreds.ticket,
|
||||
asCreds.key,
|
||||
ctime,
|
||||
princName,
|
||||
princName.getRealm(),
|
||||
servName,
|
||||
from,
|
||||
till,
|
||||
rtime,
|
||||
eTypes,
|
||||
addresses,
|
||||
authorizationData,
|
||||
additionalTickets,
|
||||
subKey);
|
||||
obuf = tgsReqMessg.asn1Encode();
|
||||
|
||||
// XXX We need to revisit this to see if can't move it
|
||||
// up such that FORWARDED flag set in the options
|
||||
// is included in the marshaled request.
|
||||
/*
|
||||
* If this is based on a forwarded ticket, record that in the
|
||||
* options, because the returned TgsRep will contain the
|
||||
* FORWARDED flag set.
|
||||
*/
|
||||
if (asCreds.flags.get(KDCOptions.FORWARDED))
|
||||
options.set(KDCOptions.FORWARDED, true);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a TGS request to the realm of the target.
|
||||
|
@ -54,81 +54,88 @@ import java.math.BigInteger;
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
public class APRep {
|
||||
public int pvno;
|
||||
public int msgType;
|
||||
public EncryptedData encPart;
|
||||
|
||||
public APRep(EncryptedData new_encPart) {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = Krb5.KRB_AP_REP;
|
||||
encPart = new_encPart;
|
||||
}
|
||||
public int pvno;
|
||||
public int msgType;
|
||||
public EncryptedData encPart;
|
||||
|
||||
public APRep(byte[] data) throws Asn1Exception,
|
||||
KrbApErrException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public APRep(EncryptedData new_encPart) {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = Krb5.KRB_AP_REP;
|
||||
encPart = new_encPart;
|
||||
}
|
||||
|
||||
public APRep(byte[] data) throws Asn1Exception,
|
||||
KrbApErrException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public APRep(DerValue encoding) throws Asn1Exception,
|
||||
KrbApErrException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
KrbApErrException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an APRep object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data
|
||||
* stream does not match the pre-defined value.
|
||||
*/
|
||||
/**
|
||||
* Initializes an APRep object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data
|
||||
* stream does not match the pre-defined value.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
KrbApErrException, IOException {
|
||||
KrbApErrException, IOException {
|
||||
|
||||
if (((encoding.getTag() & (byte)(0x1F)) != Krb5.KRB_AP_REP)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true))
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
DerValue der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
if (((encoding.getTag() & (byte) (0x1F)) != Krb5.KRB_AP_REP)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
DerValue subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) != (byte)0x00)
|
||||
}
|
||||
DerValue der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
DerValue subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) != (byte) 0x00) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
pvno = subDer.getData().getBigInteger().intValue();
|
||||
if (pvno != Krb5.PVNO)
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) != (byte)0x01)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
msgType = subDer.getData().getBigInteger().intValue();
|
||||
if (msgType != Krb5.KRB_AP_REP)
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
encPart = EncryptedData.parse(der.getData(), (byte)0x02, false);
|
||||
if (der.getData().available() > 0)
|
||||
if (pvno != Krb5.PVNO) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) != (byte) 0x01) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
msgType = subDer.getData().getBigInteger().intValue();
|
||||
if (msgType != Krb5.KRB_AP_REP) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
}
|
||||
encPart = EncryptedData.parse(der.getData(), (byte) 0x02, false);
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an APRep object.
|
||||
* @return byte array of encoded APRep object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
/**
|
||||
* Encodes an APRep object.
|
||||
* @return byte array of encoded APRep object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), temp);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), encPart.asn1Encode());
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
DerOutputStream aprep = new DerOutputStream();
|
||||
aprep.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)0x0F), temp);
|
||||
return aprep.toByteArray();
|
||||
}
|
||||
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x01), temp);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x02), encPart.asn1Encode());
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
DerOutputStream aprep = new DerOutputStream();
|
||||
aprep.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte) 0x0F), temp);
|
||||
return aprep.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -54,94 +54,98 @@ import java.math.BigInteger;
|
||||
* <a href="http://www.ietf.org/rfc/rfc4120.txt">
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
|
||||
public class APReq {
|
||||
public int pvno;
|
||||
public int msgType;
|
||||
public APOptions apOptions;
|
||||
public Ticket ticket;
|
||||
public EncryptedData authenticator;
|
||||
|
||||
public APReq(
|
||||
APOptions new_apOptions,
|
||||
Ticket new_ticket,
|
||||
EncryptedData new_authenticator
|
||||
) {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = Krb5.KRB_AP_REQ;
|
||||
apOptions = new_apOptions;
|
||||
ticket = new_ticket;
|
||||
authenticator = new_authenticator;
|
||||
}
|
||||
public int pvno;
|
||||
public int msgType;
|
||||
public APOptions apOptions;
|
||||
public Ticket ticket;
|
||||
public EncryptedData authenticator;
|
||||
|
||||
public APReq(byte[] data) throws Asn1Exception,IOException, KrbApErrException, RealmException {
|
||||
public APReq(
|
||||
APOptions new_apOptions,
|
||||
Ticket new_ticket,
|
||||
EncryptedData new_authenticator) {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = Krb5.KRB_AP_REQ;
|
||||
apOptions = new_apOptions;
|
||||
ticket = new_ticket;
|
||||
authenticator = new_authenticator;
|
||||
}
|
||||
|
||||
public APReq(byte[] data) throws Asn1Exception, IOException, KrbApErrException, RealmException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
}
|
||||
|
||||
public APReq(DerValue encoding) throws Asn1Exception, IOException, KrbApErrException, RealmException {
|
||||
init(encoding);
|
||||
}
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an APReq object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data stream does not match the pre-defined value.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbApErrException, RealmException {
|
||||
DerValue der, subDer;
|
||||
if (((encoding.getTag() & (byte)0x1F) != Krb5.KRB_AP_REQ)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true))
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) != (byte)0x00)
|
||||
/**
|
||||
* Initializes an APReq object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data stream does not match the pre-defined value.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbApErrException, RealmException {
|
||||
DerValue der, subDer;
|
||||
if (((encoding.getTag() & (byte) 0x1F) != Krb5.KRB_AP_REQ)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) != (byte) 0x00) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
pvno = subDer.getData().getBigInteger().intValue();
|
||||
if (pvno != Krb5.PVNO)
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) != (byte)0x01)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
msgType = subDer.getData().getBigInteger().intValue();
|
||||
if (msgType != Krb5.KRB_AP_REQ)
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
apOptions = APOptions.parse(der.getData(), (byte)0x02, false);
|
||||
ticket = Ticket.parse(der.getData(), (byte)0x03, false);
|
||||
authenticator = EncryptedData.parse(der.getData(), (byte)0x04, false);
|
||||
if (der.getData().available() > 0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
if (pvno != Krb5.PVNO) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) != (byte) 0x01) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
msgType = subDer.getData().getBigInteger().intValue();
|
||||
if (msgType != Krb5.KRB_AP_REQ) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
}
|
||||
apOptions = APOptions.parse(der.getData(), (byte) 0x02, false);
|
||||
ticket = Ticket.parse(der.getData(), (byte) 0x03, false);
|
||||
authenticator = EncryptedData.parse(der.getData(), (byte) 0x04, false);
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an APReq object.
|
||||
* @return byte array of encoded APReq object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
/**
|
||||
* Encodes an APReq object.
|
||||
* @return byte array of encoded APReq object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), temp);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), apOptions.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), ticket.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), authenticator.asn1Encode());
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
DerOutputStream apreq = new DerOutputStream();
|
||||
apreq.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)0x0E), temp);
|
||||
return apreq.toByteArray();
|
||||
|
||||
}
|
||||
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x01), temp);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x02), apOptions.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x03), ticket.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x04), authenticator.asn1Encode());
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
DerOutputStream apreq = new DerOutputStream();
|
||||
apreq.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte) 0x0E), temp);
|
||||
return apreq.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -40,30 +40,28 @@ import java.io.IOException;
|
||||
|
||||
public class ASRep extends KDCRep {
|
||||
|
||||
public ASRep(
|
||||
PAData[] new_pAData,
|
||||
Realm new_crealm,
|
||||
PrincipalName new_cname,
|
||||
Ticket new_ticket,
|
||||
EncryptedData new_encPart
|
||||
) throws IOException {
|
||||
super(new_pAData, new_crealm, new_cname, new_ticket,
|
||||
new_encPart, Krb5.KRB_AS_REP);
|
||||
}
|
||||
public ASRep(
|
||||
PAData[] new_pAData,
|
||||
Realm new_crealm,
|
||||
PrincipalName new_cname,
|
||||
Ticket new_ticket,
|
||||
EncryptedData new_encPart) throws IOException {
|
||||
super(new_pAData, new_crealm, new_cname, new_ticket,
|
||||
new_encPart, Krb5.KRB_AS_REP);
|
||||
}
|
||||
|
||||
public ASRep(byte[] data) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public ASRep(byte[] data) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public ASRep(DerValue encoding) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(encoding, Krb5.KRB_AS_REP);
|
||||
}
|
||||
public ASRep(DerValue encoding) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(encoding, Krb5.KRB_AS_REP);
|
||||
}
|
||||
}
|
||||
|
@ -36,20 +36,19 @@ import java.io.IOException;
|
||||
|
||||
public class ASReq extends KDCReq {
|
||||
|
||||
public ASReq(PAData[] new_pAData, KDCReqBody new_reqBody) throws IOException {
|
||||
super(new_pAData, new_reqBody, Krb5.KRB_AS_REQ);
|
||||
}
|
||||
public ASReq(PAData[] new_pAData, KDCReqBody new_reqBody) throws IOException {
|
||||
super(new_pAData, new_reqBody, Krb5.KRB_AS_REQ);
|
||||
}
|
||||
|
||||
public ASReq(byte[] data) throws Asn1Exception, KrbException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public ASReq(byte[] data) throws Asn1Exception, KrbException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public ASReq(DerValue encoding) throws Asn1Exception, KrbException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
private void init(DerValue encoding) throws Asn1Exception, IOException, KrbException {
|
||||
super.init(encoding, Krb5.KRB_AS_REQ);
|
||||
}
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
private void init(DerValue encoding) throws Asn1Exception, IOException, KrbException {
|
||||
super.init(encoding, Krb5.KRB_AS_REQ);
|
||||
}
|
||||
}
|
||||
|
@ -34,6 +34,7 @@ import sun.security.util.*;
|
||||
import java.util.Vector;
|
||||
import java.io.IOException;
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Implements the ASN.1 Authenticator type.
|
||||
*
|
||||
@ -58,6 +59,7 @@ import java.math.BigInteger;
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
public class Authenticator {
|
||||
|
||||
public int authenticator_vno;
|
||||
public Realm crealm;
|
||||
public PrincipalName cname;
|
||||
@ -68,137 +70,145 @@ public class Authenticator {
|
||||
Integer seqNumber; //optional
|
||||
public AuthorizationData authorizationData; //optional
|
||||
|
||||
public Authenticator (
|
||||
Realm new_crealm,
|
||||
PrincipalName new_cname,
|
||||
Checksum new_cksum,
|
||||
int new_cusec,
|
||||
KerberosTime new_ctime,
|
||||
EncryptionKey new_subKey,
|
||||
Integer new_seqNumber,
|
||||
AuthorizationData new_authorizationData
|
||||
) {
|
||||
authenticator_vno = Krb5.AUTHNETICATOR_VNO;
|
||||
crealm = new_crealm;
|
||||
cname = new_cname;
|
||||
cksum = new_cksum;
|
||||
cusec = new_cusec;
|
||||
ctime = new_ctime;
|
||||
subKey = new_subKey;
|
||||
seqNumber = new_seqNumber;
|
||||
authorizationData = new_authorizationData;
|
||||
}
|
||||
public Authenticator(
|
||||
Realm new_crealm,
|
||||
PrincipalName new_cname,
|
||||
Checksum new_cksum,
|
||||
int new_cusec,
|
||||
KerberosTime new_ctime,
|
||||
EncryptionKey new_subKey,
|
||||
Integer new_seqNumber,
|
||||
AuthorizationData new_authorizationData) {
|
||||
authenticator_vno = Krb5.AUTHNETICATOR_VNO;
|
||||
crealm = new_crealm;
|
||||
cname = new_cname;
|
||||
cksum = new_cksum;
|
||||
cusec = new_cusec;
|
||||
ctime = new_ctime;
|
||||
subKey = new_subKey;
|
||||
seqNumber = new_seqNumber;
|
||||
authorizationData = new_authorizationData;
|
||||
}
|
||||
|
||||
public Authenticator(byte[] data)
|
||||
throws Asn1Exception, IOException, KrbApErrException, RealmException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public Authenticator(byte[] data)
|
||||
throws Asn1Exception, IOException, KrbApErrException, RealmException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public Authenticator(DerValue encoding)
|
||||
throws Asn1Exception,IOException, KrbApErrException, RealmException {
|
||||
init(encoding);
|
||||
}
|
||||
public Authenticator(DerValue encoding)
|
||||
throws Asn1Exception, IOException, KrbApErrException, RealmException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an Authenticator object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data
|
||||
* stream does not match the pre-defined value.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private void init(DerValue encoding)
|
||||
throws Asn1Exception, IOException, KrbApErrException, RealmException {
|
||||
DerValue der, subDer;
|
||||
//may not be the correct error code for a tag
|
||||
//mismatch on an encrypted structure
|
||||
if (((encoding.getTag() & (byte)0x1F) != (byte)0x02)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true))
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
/**
|
||||
* Initializes an Authenticator object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data
|
||||
* stream does not match the pre-defined value.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private void init(DerValue encoding)
|
||||
throws Asn1Exception, IOException, KrbApErrException, RealmException {
|
||||
DerValue der, subDer;
|
||||
//may not be the correct error code for a tag
|
||||
//mismatch on an encrypted structure
|
||||
if (((encoding.getTag() & (byte) 0x1F) != (byte) 0x02)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) != (byte)0x00)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) != (byte) 0x00) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
authenticator_vno = subDer.getData().getBigInteger().intValue();
|
||||
if (authenticator_vno != 5)
|
||||
if (authenticator_vno != 5) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
crealm = Realm.parse(der.getData(), (byte)0x01, false);
|
||||
cname = PrincipalName.parse(der.getData(), (byte)0x02, false);
|
||||
cksum = Checksum.parse(der.getData(), (byte)0x03, true);
|
||||
}
|
||||
crealm = Realm.parse(der.getData(), (byte) 0x01, false);
|
||||
cname = PrincipalName.parse(der.getData(), (byte) 0x02, false);
|
||||
cksum = Checksum.parse(der.getData(), (byte) 0x03, true);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) == 0x04) {
|
||||
cusec = subDer.getData().getBigInteger().intValue();
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
ctime = KerberosTime.parse(der.getData(), (byte) 0x05, false);
|
||||
if (der.getData().available() > 0) {
|
||||
subKey = EncryptionKey.parse(der.getData(), (byte) 0x06, true);
|
||||
} else {
|
||||
subKey = null;
|
||||
seqNumber = null;
|
||||
authorizationData = null;
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
if ((der.getData().peekByte() & 0x1F) == 0x07) {
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) == 0x04) {
|
||||
cusec = subDer.getData().getBigInteger().intValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) == (byte) 0x07) {
|
||||
seqNumber = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
else throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
ctime = KerberosTime.parse(der.getData(), (byte)0x05, false);
|
||||
if (der.getData().available() > 0) {
|
||||
subKey = EncryptionKey.parse(der.getData(), (byte)0x06, true);
|
||||
}
|
||||
else {
|
||||
subKey = null;
|
||||
seqNumber = null;
|
||||
authorizationData = null;
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
if ((der.getData().peekByte() & 0x1F) == 0x07) {
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) == (byte)0x07)
|
||||
seqNumber = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
}
|
||||
else {
|
||||
seqNumber = null;
|
||||
authorizationData = null;
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
authorizationData = AuthorizationData.parse(der.getData(), (byte)0x08, true);
|
||||
}
|
||||
else authorizationData = null;
|
||||
if (der.getData().available() > 0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
} else {
|
||||
seqNumber = null;
|
||||
authorizationData = null;
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
authorizationData = AuthorizationData.parse(der.getData(), (byte) 0x08, true);
|
||||
} else {
|
||||
authorizationData = null;
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an Authenticator object.
|
||||
* @return byte array of encoded Authenticator object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
Vector<DerValue> v = new Vector<DerValue> ();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(authenticator_vno));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp.toByteArray()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), crealm.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), cname.asn1Encode()));
|
||||
if (cksum != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), cksum.asn1Encode()));
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(cusec));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), temp.toByteArray()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x05), ctime.asn1Encode()));
|
||||
if (subKey != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x06), subKey.asn1Encode()));
|
||||
if (seqNumber != null) {
|
||||
temp = new DerOutputStream();
|
||||
// encode as an unsigned integer (UInt32)
|
||||
temp.putInteger(BigInteger.valueOf(seqNumber.longValue()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x07), temp.toByteArray()));
|
||||
}
|
||||
if (authorizationData != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x08), authorizationData.asn1Encode()));
|
||||
DerValue der[] = new DerValue[v.size()];
|
||||
v.copyInto(der);
|
||||
temp = new DerOutputStream();
|
||||
temp.putSequence(der);
|
||||
DerOutputStream out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)0x02), temp);
|
||||
return out.toByteArray();
|
||||
/**
|
||||
* Encodes an Authenticator object.
|
||||
* @return byte array of encoded Authenticator object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
Vector<DerValue> v = new Vector<DerValue>();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(authenticator_vno));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x00), temp.toByteArray()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x01), crealm.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x02), cname.asn1Encode()));
|
||||
if (cksum != null) {
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x03), cksum.asn1Encode()));
|
||||
}
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(cusec));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x04), temp.toByteArray()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x05), ctime.asn1Encode()));
|
||||
if (subKey != null) {
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x06), subKey.asn1Encode()));
|
||||
}
|
||||
if (seqNumber != null) {
|
||||
temp = new DerOutputStream();
|
||||
// encode as an unsigned integer (UInt32)
|
||||
temp.putInteger(BigInteger.valueOf(seqNumber.longValue()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x07), temp.toByteArray()));
|
||||
}
|
||||
if (authorizationData != null) {
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x08), authorizationData.asn1Encode()));
|
||||
}
|
||||
DerValue der[] = new DerValue[v.size()];
|
||||
v.copyInto(der);
|
||||
temp = new DerOutputStream();
|
||||
temp.putSequence(der);
|
||||
DerOutputStream out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte) 0x02), temp);
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
public final Checksum getChecksum() {
|
||||
return cksum;
|
||||
@ -211,5 +221,4 @@ public class Authenticator {
|
||||
public final EncryptionKey getSubKey() {
|
||||
return subKey;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -53,82 +53,81 @@ import sun.security.krb5.internal.ccache.CCacheOutputStream;
|
||||
* }
|
||||
*/
|
||||
public class AuthorizationData implements Cloneable {
|
||||
private AuthorizationDataEntry[] entry = null;
|
||||
|
||||
private AuthorizationData() {
|
||||
}
|
||||
private AuthorizationDataEntry[] entry = null;
|
||||
|
||||
public AuthorizationData(
|
||||
AuthorizationDataEntry[] new_entries
|
||||
) throws IOException {
|
||||
if (new_entries != null) {
|
||||
entry = new AuthorizationDataEntry[new_entries.length];
|
||||
for (int i = 0; i < new_entries.length; i++) {
|
||||
if (new_entries[i] == null) {
|
||||
throw new IOException("Cannot create an AuthorizationData");
|
||||
} else {
|
||||
entry[i] = (AuthorizationDataEntry)new_entries[i].clone();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private AuthorizationData() {
|
||||
}
|
||||
|
||||
public AuthorizationData(
|
||||
AuthorizationDataEntry new_entry
|
||||
) {
|
||||
entry = new AuthorizationDataEntry[1];
|
||||
entry[0] = new_entry;
|
||||
public AuthorizationData(AuthorizationDataEntry[] new_entries)
|
||||
throws IOException {
|
||||
if (new_entries != null) {
|
||||
entry = new AuthorizationDataEntry[new_entries.length];
|
||||
for (int i = 0; i < new_entries.length; i++) {
|
||||
if (new_entries[i] == null) {
|
||||
throw new IOException("Cannot create an AuthorizationData");
|
||||
} else {
|
||||
entry[i] = (AuthorizationDataEntry) new_entries[i].clone();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Object clone() {
|
||||
AuthorizationData new_authorizationData =
|
||||
new AuthorizationData();
|
||||
if (entry != null) {
|
||||
new_authorizationData.entry =
|
||||
new AuthorizationDataEntry[entry.length];
|
||||
for (int i = 0; i < entry.length; i++)
|
||||
new_authorizationData.entry[i] =
|
||||
(AuthorizationDataEntry)entry[i].clone();
|
||||
}
|
||||
return new_authorizationData;
|
||||
}
|
||||
public AuthorizationData(AuthorizationDataEntry new_entry) {
|
||||
entry = new AuthorizationDataEntry[1];
|
||||
entry[0] = new_entry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new <code>AuthorizationData,</code> instance.
|
||||
* @param der a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public AuthorizationData(DerValue der) throws Asn1Exception, IOException {
|
||||
Vector<AuthorizationDataEntry> v =
|
||||
new Vector<AuthorizationDataEntry> ();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
while (der.getData().available() > 0) {
|
||||
v.addElement(new AuthorizationDataEntry(der.getData().getDerValue()));
|
||||
}
|
||||
if (v.size() > 0) {
|
||||
entry = new AuthorizationDataEntry[v.size()];
|
||||
v.copyInto(entry);
|
||||
}
|
||||
public Object clone() {
|
||||
AuthorizationData new_authorizationData =
|
||||
new AuthorizationData();
|
||||
if (entry != null) {
|
||||
new_authorizationData.entry =
|
||||
new AuthorizationDataEntry[entry.length];
|
||||
for (int i = 0; i < entry.length; i++) {
|
||||
new_authorizationData.entry[i] =
|
||||
(AuthorizationDataEntry) entry[i].clone();
|
||||
}
|
||||
}
|
||||
return new_authorizationData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an <code>AuthorizationData</code> object.
|
||||
* @return byte array of encoded <code>AuthorizationData</code> object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerValue der[] = new DerValue[entry.length];
|
||||
for (int i = 0; i < entry.length; i++) {
|
||||
der[i] = new DerValue(entry[i].asn1Encode());
|
||||
}
|
||||
bytes.putSequence(der);
|
||||
return bytes.toByteArray();
|
||||
/**
|
||||
* Constructs a new <code>AuthorizationData,</code> instance.
|
||||
* @param der a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public AuthorizationData(DerValue der) throws Asn1Exception, IOException {
|
||||
Vector<AuthorizationDataEntry> v =
|
||||
new Vector<AuthorizationDataEntry>();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
while (der.getData().available() > 0) {
|
||||
v.addElement(new AuthorizationDataEntry(der.getData().getDerValue()));
|
||||
}
|
||||
if (v.size() > 0) {
|
||||
entry = new AuthorizationDataEntry[v.size()];
|
||||
v.copyInto(entry);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an <code>AuthorizationData</code> object.
|
||||
* @return byte array of encoded <code>AuthorizationData</code> object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerValue der[] = new DerValue[entry.length];
|
||||
for (int i = 0; i < entry.length; i++) {
|
||||
der[i] = new DerValue(entry[i].asn1Encode());
|
||||
}
|
||||
bytes.putSequence(der);
|
||||
return bytes.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse (unmarshal) an <code>AuthorizationData</code> object from a DER input stream.
|
||||
@ -143,31 +142,30 @@ public class AuthorizationData implements Cloneable {
|
||||
* @return an instance of AuthorizationData.
|
||||
*
|
||||
*/
|
||||
public static AuthorizationData parse(DerInputStream data, byte explicitTag, boolean optional) throws Asn1Exception, IOException{
|
||||
if ((optional) && (((byte)data.peekByte() & (byte)0x1F) != explicitTag)) {
|
||||
return null;
|
||||
}
|
||||
DerValue der = data.getDerValue();
|
||||
if (explicitTag != (der.getTag() & (byte)0x1F)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
else {
|
||||
DerValue subDer = der.getData().getDerValue();
|
||||
return new AuthorizationData(subDer);
|
||||
}
|
||||
public static AuthorizationData parse(DerInputStream data, byte explicitTag, boolean optional) throws Asn1Exception, IOException {
|
||||
if ((optional) && (((byte) data.peekByte() & (byte) 0x1F) != explicitTag)) {
|
||||
return null;
|
||||
}
|
||||
DerValue der = data.getDerValue();
|
||||
if (explicitTag != (der.getTag() & (byte) 0x1F)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
} else {
|
||||
DerValue subDer = der.getData().getDerValue();
|
||||
return new AuthorizationData(subDer);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes <code>AuthorizationData</code> data fields to a output stream.
|
||||
*
|
||||
* @param cos a <code>CCacheOutputStream</code> to be written to.
|
||||
* @exception IOException if an I/O exception occurs.
|
||||
*/
|
||||
public void writeAuth(CCacheOutputStream cos) throws IOException {
|
||||
for (int i = 0; i < entry.length; i++) {
|
||||
entry[i].writeEntry(cos);
|
||||
}
|
||||
/**
|
||||
* Writes <code>AuthorizationData</code> data fields to a output stream.
|
||||
*
|
||||
* @param cos a <code>CCacheOutputStream</code> to be written to.
|
||||
* @exception IOException if an I/O exception occurs.
|
||||
*/
|
||||
public void writeAuth(CCacheOutputStream cos) throws IOException {
|
||||
for (int i = 0; i < entry.length; i++) {
|
||||
entry[i].writeEntry(cos);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
String retVal = "AuthorizationData:\n";
|
||||
|
@ -35,90 +35,90 @@ import sun.security.krb5.Asn1Exception;
|
||||
import sun.security.krb5.internal.ccache.CCacheOutputStream;
|
||||
|
||||
public class AuthorizationDataEntry implements Cloneable {
|
||||
public int adType;
|
||||
public byte[] adData;
|
||||
|
||||
private AuthorizationDataEntry() {
|
||||
public int adType;
|
||||
public byte[] adData;
|
||||
|
||||
private AuthorizationDataEntry() {
|
||||
}
|
||||
|
||||
public AuthorizationDataEntry(
|
||||
int new_adType,
|
||||
byte[] new_adData) {
|
||||
adType = new_adType;
|
||||
adData = new_adData;
|
||||
}
|
||||
|
||||
public Object clone() {
|
||||
AuthorizationDataEntry new_authorizationDataEntry =
|
||||
new AuthorizationDataEntry();
|
||||
new_authorizationDataEntry.adType = adType;
|
||||
if (adData != null) {
|
||||
new_authorizationDataEntry.adData = new byte[adData.length];
|
||||
System.arraycopy(adData, 0,
|
||||
new_authorizationDataEntry.adData, 0, adData.length);
|
||||
}
|
||||
return new_authorizationDataEntry;
|
||||
}
|
||||
|
||||
public AuthorizationDataEntry(
|
||||
int new_adType,
|
||||
byte[] new_adData
|
||||
) {
|
||||
adType = new_adType;
|
||||
adData = new_adData;
|
||||
}
|
||||
|
||||
public Object clone() {
|
||||
AuthorizationDataEntry new_authorizationDataEntry =
|
||||
new AuthorizationDataEntry();
|
||||
new_authorizationDataEntry.adType = adType;
|
||||
if (adData != null) {
|
||||
new_authorizationDataEntry.adData = new byte[adData.length];
|
||||
System.arraycopy(adData, 0,
|
||||
new_authorizationDataEntry.adData, 0, adData.length);
|
||||
}
|
||||
return new_authorizationDataEntry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of AuthorizationDataEntry.
|
||||
* @param encoding a single DER-encoded value.
|
||||
*/
|
||||
public AuthorizationDataEntry(DerValue encoding) throws Asn1Exception, IOException {
|
||||
DerValue der;
|
||||
/**
|
||||
* Constructs an instance of AuthorizationDataEntry.
|
||||
* @param encoding a single DER-encoded value.
|
||||
*/
|
||||
public AuthorizationDataEntry(DerValue encoding) throws Asn1Exception, IOException {
|
||||
DerValue der;
|
||||
if (encoding.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if ((der.getTag() & (byte)0x1F) == (byte)0x00) {
|
||||
adType = der.getData().getBigInteger().intValue();
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if ((der.getTag() & (byte)0x1F) == (byte)0x01) {
|
||||
adData = der.getData().getOctetString();
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
if (encoding.getData().available() > 0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
if ((der.getTag() & (byte) 0x1F) == (byte) 0x00) {
|
||||
adType = der.getData().getBigInteger().intValue();
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if ((der.getTag() & (byte) 0x1F) == (byte) 0x01) {
|
||||
adData = der.getData().getOctetString();
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
if (encoding.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an AuthorizationDataEntry object.
|
||||
* @return byte array of encoded AuthorizationDataEntry object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
/**
|
||||
* Encodes an AuthorizationDataEntry object.
|
||||
* @return byte array of encoded AuthorizationDataEntry object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(adType);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putOctetString(adData);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
return temp.toByteArray();
|
||||
}
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(adType);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putOctetString(adData);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x01), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
return temp.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the entry's data fields in FCC format to an output stream.
|
||||
*
|
||||
* @param cos a <code>CCacheOutputStream</code>.
|
||||
* @exception IOException if an I/O exception occurs.
|
||||
*/
|
||||
public void writeEntry(CCacheOutputStream cos) throws IOException {
|
||||
cos.write16(adType);
|
||||
cos.write32(adData.length);
|
||||
cos.write(adData, 0, adData.length);
|
||||
}
|
||||
/**
|
||||
* Writes the entry's data fields in FCC format to an output stream.
|
||||
*
|
||||
* @param cos a <code>CCacheOutputStream</code>.
|
||||
* @exception IOException if an I/O exception occurs.
|
||||
*/
|
||||
public void writeEntry(CCacheOutputStream cos) throws IOException {
|
||||
cos.write16(adType);
|
||||
cos.write32(adData.length);
|
||||
cos.write(adData, 0, adData.length);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return ("adType=" + adType + " adData.length=" + adData.length);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -55,102 +55,111 @@ import java.math.BigInteger;
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
public class EncAPRepPart {
|
||||
public KerberosTime ctime;
|
||||
public int cusec;
|
||||
|
||||
public KerberosTime ctime;
|
||||
public int cusec;
|
||||
EncryptionKey subKey; //optional
|
||||
Integer seqNumber; //optional
|
||||
|
||||
public EncAPRepPart(
|
||||
KerberosTime new_ctime,
|
||||
int new_cusec,
|
||||
EncryptionKey new_subKey,
|
||||
Integer new_seqNumber
|
||||
) {
|
||||
ctime = new_ctime;
|
||||
cusec = new_cusec;
|
||||
subKey = new_subKey;
|
||||
seqNumber = new_seqNumber;
|
||||
}
|
||||
public EncAPRepPart(
|
||||
KerberosTime new_ctime,
|
||||
int new_cusec,
|
||||
EncryptionKey new_subKey,
|
||||
Integer new_seqNumber) {
|
||||
ctime = new_ctime;
|
||||
cusec = new_cusec;
|
||||
subKey = new_subKey;
|
||||
seqNumber = new_seqNumber;
|
||||
}
|
||||
|
||||
public EncAPRepPart(byte[] data)
|
||||
throws Asn1Exception, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public EncAPRepPart(byte[] data)
|
||||
throws Asn1Exception, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public EncAPRepPart(DerValue encoding)
|
||||
throws Asn1Exception, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
public EncAPRepPart(DerValue encoding)
|
||||
throws Asn1Exception, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an EncaPRepPart object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception, IOException {
|
||||
DerValue der, subDer;
|
||||
if (((encoding.getTag() & (byte)0x1F) != (byte)0x1B)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true))
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
/**
|
||||
* Initializes an EncaPRepPart object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception, IOException {
|
||||
DerValue der, subDer;
|
||||
if (((encoding.getTag() & (byte) 0x1F) != (byte) 0x1B)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
ctime = KerberosTime.parse(der.getData(), (byte)0x00, true);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) == (byte)0x01) {
|
||||
cusec = subDer.getData().getBigInteger().intValue();
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
if (der.getData().available() > 0) {
|
||||
subKey = EncryptionKey.parse(der.getData(), (byte)0x02, true);
|
||||
}
|
||||
else {
|
||||
subKey = null;
|
||||
seqNumber = null;
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) != 0x03) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
seqNumber = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
else seqNumber = null;
|
||||
if (der.getData().available() > 0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
ctime = KerberosTime.parse(der.getData(), (byte) 0x00, true);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) == (byte) 0x01) {
|
||||
cusec = subDer.getData().getBigInteger().intValue();
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
subKey = EncryptionKey.parse(der.getData(), (byte) 0x02, true);
|
||||
} else {
|
||||
subKey = null;
|
||||
seqNumber = null;
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) != 0x03) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
seqNumber = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
} else {
|
||||
seqNumber = null;
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an EncAPRepPart object.
|
||||
* @return byte array of encoded EncAPRepPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException{
|
||||
Vector<DerValue> v = new Vector<DerValue> ();
|
||||
/**
|
||||
* Encodes an EncAPRepPart object.
|
||||
* @return byte array of encoded EncAPRepPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
Vector<DerValue> v = new Vector<DerValue>();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), ctime.asn1Encode()));
|
||||
temp.putInteger(BigInteger.valueOf(cusec));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), temp.toByteArray()));
|
||||
if (subKey != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), subKey.asn1Encode()));
|
||||
if (seqNumber != null) {
|
||||
temp = new DerOutputStream();
|
||||
// encode as an unsigned integer (UInt32)
|
||||
temp.putInteger(BigInteger.valueOf(seqNumber.longValue()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), temp.toByteArray()));
|
||||
}
|
||||
DerValue der[] = new DerValue[v.size()];
|
||||
v.copyInto(der);
|
||||
temp = new DerOutputStream();
|
||||
temp.putSequence(der);
|
||||
DerOutputStream out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)0x1B), temp);
|
||||
return out.toByteArray();
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x00), ctime.asn1Encode()));
|
||||
temp.putInteger(BigInteger.valueOf(cusec));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x01), temp.toByteArray()));
|
||||
if (subKey != null) {
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x02), subKey.asn1Encode()));
|
||||
}
|
||||
if (seqNumber != null) {
|
||||
temp = new DerOutputStream();
|
||||
// encode as an unsigned integer (UInt32)
|
||||
temp.putInteger(BigInteger.valueOf(seqNumber.longValue()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x03), temp.toByteArray()));
|
||||
}
|
||||
DerValue der[] = new DerValue[v.size()];
|
||||
v.copyInto(der);
|
||||
temp = new DerOutputStream();
|
||||
temp.putSequence(der);
|
||||
DerOutputStream out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_APPLICATION,
|
||||
true, (byte) 0x1B), temp);
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
public final EncryptionKey getSubKey() {
|
||||
return subKey;
|
||||
@ -159,5 +168,4 @@ public class EncAPRepPart {
|
||||
public final Integer getSeqNumber() {
|
||||
return seqNumber;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -36,57 +36,55 @@ import java.io.IOException;
|
||||
|
||||
public class EncASRepPart extends EncKDCRepPart {
|
||||
|
||||
public EncASRepPart(
|
||||
EncryptionKey new_key,
|
||||
LastReq new_lastReq,
|
||||
int new_nonce,
|
||||
KerberosTime new_keyExpiration,
|
||||
TicketFlags new_flags,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
Realm new_srealm,
|
||||
PrincipalName new_sname,
|
||||
HostAddresses new_caddr
|
||||
) {
|
||||
super(
|
||||
new_key,
|
||||
new_lastReq,
|
||||
new_nonce,
|
||||
new_keyExpiration,
|
||||
new_flags,
|
||||
new_authtime,
|
||||
new_starttime,
|
||||
new_endtime,
|
||||
new_renewTill,
|
||||
new_srealm,
|
||||
new_sname,
|
||||
new_caddr,
|
||||
Krb5.KRB_ENC_AS_REP_PART
|
||||
//may need to use Krb5.KRB_ENC_TGS_REP_PART to mimic
|
||||
//behavior of other implementaions, instead of above
|
||||
public EncASRepPart(
|
||||
EncryptionKey new_key,
|
||||
LastReq new_lastReq,
|
||||
int new_nonce,
|
||||
KerberosTime new_keyExpiration,
|
||||
TicketFlags new_flags,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
Realm new_srealm,
|
||||
PrincipalName new_sname,
|
||||
HostAddresses new_caddr) {
|
||||
super(
|
||||
new_key,
|
||||
new_lastReq,
|
||||
new_nonce,
|
||||
new_keyExpiration,
|
||||
new_flags,
|
||||
new_authtime,
|
||||
new_starttime,
|
||||
new_endtime,
|
||||
new_renewTill,
|
||||
new_srealm,
|
||||
new_sname,
|
||||
new_caddr,
|
||||
Krb5.KRB_ENC_AS_REP_PART
|
||||
);
|
||||
}
|
||||
//may need to use Krb5.KRB_ENC_TGS_REP_PART to mimic
|
||||
//behavior of other implementaions, instead of above
|
||||
}
|
||||
|
||||
public EncASRepPart(byte[] data) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public EncASRepPart(byte[] data) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public EncASRepPart(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(encoding);
|
||||
}
|
||||
public EncASRepPart(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(encoding, Krb5.KRB_ENC_AS_REP_PART);
|
||||
}
|
||||
|
||||
public byte[] asn1Encode() throws Asn1Exception,
|
||||
IOException {
|
||||
return asn1Encode(Krb5.KRB_ENC_AS_REP_PART);
|
||||
}
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(encoding, Krb5.KRB_ENC_AS_REP_PART);
|
||||
}
|
||||
|
||||
public byte[] asn1Encode() throws Asn1Exception,
|
||||
IOException {
|
||||
return asn1Encode(Krb5.KRB_ENC_AS_REP_PART);
|
||||
}
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ import sun.security.util.*;
|
||||
import java.util.Vector;
|
||||
import java.io.IOException;
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Implements the ASN.1 EncKDCRepPart type.
|
||||
*
|
||||
@ -63,143 +64,163 @@ import java.math.BigInteger;
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
public class EncKDCRepPart {
|
||||
public EncryptionKey key;
|
||||
public LastReq lastReq;
|
||||
public int nonce;
|
||||
public KerberosTime keyExpiration; //optional
|
||||
public TicketFlags flags;
|
||||
public KerberosTime authtime;
|
||||
public KerberosTime starttime; //optional
|
||||
public KerberosTime endtime;
|
||||
public KerberosTime renewTill; //optional
|
||||
public Realm srealm;
|
||||
public PrincipalName sname;
|
||||
public HostAddresses caddr; //optional
|
||||
public int msgType; //not included in sequence
|
||||
|
||||
public EncKDCRepPart(
|
||||
EncryptionKey new_key,
|
||||
LastReq new_lastReq,
|
||||
int new_nonce,
|
||||
KerberosTime new_keyExpiration,
|
||||
TicketFlags new_flags,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
Realm new_srealm,
|
||||
PrincipalName new_sname,
|
||||
HostAddresses new_caddr,
|
||||
int new_msgType
|
||||
) {
|
||||
key = new_key;
|
||||
lastReq = new_lastReq;
|
||||
nonce = new_nonce;
|
||||
keyExpiration = new_keyExpiration;
|
||||
flags = new_flags;
|
||||
authtime = new_authtime;
|
||||
starttime = new_starttime;
|
||||
endtime = new_endtime;
|
||||
renewTill = new_renewTill;
|
||||
srealm = new_srealm;
|
||||
sname = new_sname;
|
||||
caddr = new_caddr;
|
||||
msgType = new_msgType;
|
||||
}
|
||||
public EncryptionKey key;
|
||||
public LastReq lastReq;
|
||||
public int nonce;
|
||||
public KerberosTime keyExpiration; //optional
|
||||
public TicketFlags flags;
|
||||
public KerberosTime authtime;
|
||||
public KerberosTime starttime; //optional
|
||||
public KerberosTime endtime;
|
||||
public KerberosTime renewTill; //optional
|
||||
public Realm srealm;
|
||||
public PrincipalName sname;
|
||||
public HostAddresses caddr; //optional
|
||||
public int msgType; //not included in sequence
|
||||
|
||||
public EncKDCRepPart() {
|
||||
}
|
||||
public EncKDCRepPart(
|
||||
EncryptionKey new_key,
|
||||
LastReq new_lastReq,
|
||||
int new_nonce,
|
||||
KerberosTime new_keyExpiration,
|
||||
TicketFlags new_flags,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
Realm new_srealm,
|
||||
PrincipalName new_sname,
|
||||
HostAddresses new_caddr,
|
||||
int new_msgType) {
|
||||
key = new_key;
|
||||
lastReq = new_lastReq;
|
||||
nonce = new_nonce;
|
||||
keyExpiration = new_keyExpiration;
|
||||
flags = new_flags;
|
||||
authtime = new_authtime;
|
||||
starttime = new_starttime;
|
||||
endtime = new_endtime;
|
||||
renewTill = new_renewTill;
|
||||
srealm = new_srealm;
|
||||
sname = new_sname;
|
||||
caddr = new_caddr;
|
||||
msgType = new_msgType;
|
||||
}
|
||||
|
||||
public EncKDCRepPart(byte[] data, int rep_type)
|
||||
throws Asn1Exception, IOException, RealmException{
|
||||
init(new DerValue(data), rep_type);
|
||||
}
|
||||
public EncKDCRepPart() {
|
||||
}
|
||||
|
||||
public EncKDCRepPart(DerValue encoding, int rep_type)
|
||||
throws Asn1Exception, IOException, RealmException
|
||||
{
|
||||
init(encoding, rep_type);
|
||||
}
|
||||
public EncKDCRepPart(byte[] data, int rep_type)
|
||||
throws Asn1Exception, IOException, RealmException {
|
||||
init(new DerValue(data), rep_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an EncKDCRepPart object.
|
||||
*
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @param rep_type type of the encrypted reply message.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception RealmException if an error occurs while decoding an Realm object.
|
||||
*/
|
||||
protected void init(DerValue encoding, int rep_type)
|
||||
throws Asn1Exception, IOException, RealmException
|
||||
{
|
||||
DerValue der, subDer;
|
||||
//implementations return the incorrect tag value, so
|
||||
//we don't use the above line; instead we use the following
|
||||
msgType = (encoding.getTag() & (byte)0x1F);
|
||||
public EncKDCRepPart(DerValue encoding, int rep_type)
|
||||
throws Asn1Exception, IOException, RealmException {
|
||||
init(encoding, rep_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an EncKDCRepPart object.
|
||||
*
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @param rep_type type of the encrypted reply message.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception RealmException if an error occurs while decoding an Realm object.
|
||||
*/
|
||||
protected void init(DerValue encoding, int rep_type)
|
||||
throws Asn1Exception, IOException, RealmException {
|
||||
DerValue der, subDer;
|
||||
//implementations return the incorrect tag value, so
|
||||
//we don't use the above line; instead we use the following
|
||||
msgType = (encoding.getTag() & (byte) 0x1F);
|
||||
if (msgType != Krb5.KRB_ENC_AS_REP_PART &&
|
||||
msgType != Krb5.KRB_ENC_TGS_REP_PART)
|
||||
msgType != Krb5.KRB_ENC_TGS_REP_PART) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
key = EncryptionKey.parse(der.getData(), (byte)0x00, false);
|
||||
lastReq = LastReq.parse(der.getData(), (byte)0x01, false);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) == (byte)0x02)
|
||||
nonce = subDer.getData().getBigInteger().intValue();
|
||||
else throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
keyExpiration = KerberosTime.parse(der.getData(), (byte)0x03, true);
|
||||
flags = TicketFlags.parse(der.getData(), (byte)0x04, false);
|
||||
authtime = KerberosTime.parse(der.getData(), (byte)0x05, false);
|
||||
starttime = KerberosTime.parse(der.getData(), (byte)0x06, true);
|
||||
endtime = KerberosTime.parse(der.getData(), (byte)0x07, false);
|
||||
renewTill = KerberosTime.parse(der.getData(), (byte)0x08, true);
|
||||
srealm = Realm.parse(der.getData(), (byte)0x09, false);
|
||||
sname = PrincipalName.parse(der.getData(), (byte)0x0A, false);
|
||||
if (der.getData().available() > 0)
|
||||
caddr = HostAddresses.parse(der.getData(), (byte)0x0B, true);
|
||||
if (der.getData().available() > 0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
key = EncryptionKey.parse(der.getData(), (byte) 0x00, false);
|
||||
lastReq = LastReq.parse(der.getData(), (byte) 0x01, false);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) == (byte) 0x02) {
|
||||
nonce = subDer.getData().getBigInteger().intValue();
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
keyExpiration = KerberosTime.parse(der.getData(), (byte) 0x03, true);
|
||||
flags = TicketFlags.parse(der.getData(), (byte) 0x04, false);
|
||||
authtime = KerberosTime.parse(der.getData(), (byte) 0x05, false);
|
||||
starttime = KerberosTime.parse(der.getData(), (byte) 0x06, true);
|
||||
endtime = KerberosTime.parse(der.getData(), (byte) 0x07, false);
|
||||
renewTill = KerberosTime.parse(der.getData(), (byte) 0x08, true);
|
||||
srealm = Realm.parse(der.getData(), (byte) 0x09, false);
|
||||
sname = PrincipalName.parse(der.getData(), (byte) 0x0A, false);
|
||||
if (der.getData().available() > 0) {
|
||||
caddr = HostAddresses.parse(der.getData(), (byte) 0x0B, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an EncKDCRepPart object.
|
||||
* @param rep_type type of encrypted reply message.
|
||||
* @return byte array of encoded EncKDCRepPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode(int rep_type) throws Asn1Exception,
|
||||
IOException {
|
||||
/**
|
||||
* Encodes an EncKDCRepPart object.
|
||||
* @param rep_type type of encrypted reply message.
|
||||
* @return byte array of encoded EncKDCRepPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode(int rep_type) throws Asn1Exception,
|
||||
IOException {
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), key.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), lastReq.asn1Encode());
|
||||
temp.putInteger(BigInteger.valueOf(nonce));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), temp);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x00), key.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x01), lastReq.asn1Encode());
|
||||
temp.putInteger(BigInteger.valueOf(nonce));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x02), temp);
|
||||
|
||||
if (keyExpiration != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), keyExpiration.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), flags.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x05), authtime.asn1Encode());
|
||||
if (starttime != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x06), starttime.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x07), endtime.asn1Encode());
|
||||
if (renewTill != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x08), renewTill.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x09), srealm.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x0A), sname.asn1Encode());
|
||||
if (caddr != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x0B), caddr.asn1Encode());
|
||||
//should use the rep_type to build the encoding
|
||||
//but other implementations do not; it is ignored and
|
||||
//the cached msgType is used instead
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)msgType), temp);
|
||||
return bytes.toByteArray();
|
||||
if (keyExpiration != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x03), keyExpiration.asn1Encode());
|
||||
}
|
||||
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x04), flags.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x05), authtime.asn1Encode());
|
||||
if (starttime != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x06), starttime.asn1Encode());
|
||||
}
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x07), endtime.asn1Encode());
|
||||
if (renewTill != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x08), renewTill.asn1Encode());
|
||||
}
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x09), srealm.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x0A), sname.asn1Encode());
|
||||
if (caddr != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x0B), caddr.asn1Encode());
|
||||
}
|
||||
//should use the rep_type to build the encoding
|
||||
//but other implementations do not; it is ignored and
|
||||
//the cached msgType is used instead
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_APPLICATION,
|
||||
true, (byte) msgType), temp);
|
||||
return bytes.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ import sun.security.krb5.RealmException;
|
||||
import java.util.Vector;
|
||||
import java.io.IOException;
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Implements the ASN.1 EncKrbCredPart type.
|
||||
*
|
||||
@ -57,148 +58,158 @@ import java.math.BigInteger;
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
public class EncKrbCredPart {
|
||||
public KrbCredInfo[] ticketInfo = null;
|
||||
public KerberosTime timeStamp; //optional
|
||||
|
||||
private Integer nonce; //optional
|
||||
private Integer usec; //optional
|
||||
private HostAddress sAddress; //optional
|
||||
private HostAddresses rAddress; //optional
|
||||
public KrbCredInfo[] ticketInfo = null;
|
||||
public KerberosTime timeStamp; //optional
|
||||
private Integer nonce; //optional
|
||||
private Integer usec; //optional
|
||||
private HostAddress sAddress; //optional
|
||||
private HostAddresses rAddress; //optional
|
||||
|
||||
public EncKrbCredPart(
|
||||
KrbCredInfo[] new_ticketInfo,
|
||||
KerberosTime new_timeStamp,
|
||||
Integer new_usec,
|
||||
Integer new_nonce,
|
||||
HostAddress new_sAddress,
|
||||
HostAddresses new_rAddress
|
||||
) throws IOException {
|
||||
if (new_ticketInfo != null) {
|
||||
ticketInfo = new KrbCredInfo[new_ticketInfo.length];
|
||||
for (int i = 0; i < new_ticketInfo.length; i++) {
|
||||
if (new_ticketInfo[i] == null) {
|
||||
throw new IOException("Cannot create a EncKrbCredPart");
|
||||
} else {
|
||||
ticketInfo[i] = (KrbCredInfo)new_ticketInfo[i].clone();
|
||||
}
|
||||
}
|
||||
public EncKrbCredPart(
|
||||
KrbCredInfo[] new_ticketInfo,
|
||||
KerberosTime new_timeStamp,
|
||||
Integer new_usec,
|
||||
Integer new_nonce,
|
||||
HostAddress new_sAddress,
|
||||
HostAddresses new_rAddress) throws IOException {
|
||||
if (new_ticketInfo != null) {
|
||||
ticketInfo = new KrbCredInfo[new_ticketInfo.length];
|
||||
for (int i = 0; i < new_ticketInfo.length; i++) {
|
||||
if (new_ticketInfo[i] == null) {
|
||||
throw new IOException("Cannot create a EncKrbCredPart");
|
||||
} else {
|
||||
ticketInfo[i] = (KrbCredInfo) new_ticketInfo[i].clone();
|
||||
}
|
||||
timeStamp = new_timeStamp;
|
||||
usec = new_usec;
|
||||
nonce = new_nonce;
|
||||
sAddress = new_sAddress;
|
||||
rAddress = new_rAddress;
|
||||
}
|
||||
}
|
||||
timeStamp = new_timeStamp;
|
||||
usec = new_usec;
|
||||
nonce = new_nonce;
|
||||
sAddress = new_sAddress;
|
||||
rAddress = new_rAddress;
|
||||
}
|
||||
|
||||
public EncKrbCredPart(byte[] data) throws Asn1Exception,
|
||||
IOException, RealmException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public EncKrbCredPart(byte[] data) throws Asn1Exception,
|
||||
IOException, RealmException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public EncKrbCredPart(DerValue encoding) throws Asn1Exception,
|
||||
IOException, RealmException {
|
||||
init(encoding);
|
||||
}
|
||||
public EncKrbCredPart(DerValue encoding) throws Asn1Exception,
|
||||
IOException, RealmException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an EncKrbCredPart object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
IOException, RealmException {
|
||||
DerValue der, subDer;
|
||||
//may not be the correct error code for a tag
|
||||
//mismatch on an encrypted structure
|
||||
nonce = null;
|
||||
timeStamp = null;
|
||||
usec= null;
|
||||
/**
|
||||
* Initializes an EncKrbCredPart object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
IOException, RealmException {
|
||||
DerValue der, subDer;
|
||||
//may not be the correct error code for a tag
|
||||
//mismatch on an encrypted structure
|
||||
nonce = null;
|
||||
timeStamp = null;
|
||||
usec = null;
|
||||
sAddress = null;
|
||||
rAddress = null;
|
||||
if (((encoding.getTag() & (byte)0x1F) != (byte)0x1D)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true))
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
if (((encoding.getTag() & (byte) 0x1F) != (byte) 0x1D)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) == (byte) 0x00) {
|
||||
DerValue derValues[] = subDer.getData().getSequence(1);
|
||||
ticketInfo = new KrbCredInfo[derValues.length];
|
||||
for (int i = 0; i < derValues.length; i++) {
|
||||
ticketInfo[i] = new KrbCredInfo(derValues[i]);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
if (((byte) (der.getData().peekByte()) & (byte) 0x1F) == (byte) 0x01) {
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) == (byte)0x00) {
|
||||
DerValue derValues[] = subDer.getData().getSequence(1);
|
||||
ticketInfo = new KrbCredInfo[derValues.length];
|
||||
for (int i = 0; i < derValues.length; i++) {
|
||||
ticketInfo[i] = new KrbCredInfo(derValues[i]);
|
||||
}
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
if (der.getData().available() > 0) {
|
||||
if (((byte)(der.getData().peekByte()) & (byte)0x1F) == (byte)0x01) {
|
||||
subDer = der.getData().getDerValue();
|
||||
nonce = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
}
|
||||
if (der.getData().available() >0) {
|
||||
timeStamp = KerberosTime.parse(der.getData(), (byte)0x02, true);
|
||||
}
|
||||
if (der.getData().available() >0) {
|
||||
if (((byte)(der.getData().peekByte()) & (byte)0x1F) == (byte)0x03) {
|
||||
subDer = der.getData().getDerValue();
|
||||
usec = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
}
|
||||
if (der.getData().available() >0) {
|
||||
sAddress = HostAddress.parse(der.getData(), (byte)0x04, true);
|
||||
}
|
||||
if (der.getData().available() >0) {
|
||||
rAddress = HostAddresses.parse(der.getData(), (byte)0x05, true);
|
||||
}
|
||||
if (der.getData().available() >0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
nonce = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
timeStamp = KerberosTime.parse(der.getData(), (byte) 0x02, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
if (((byte) (der.getData().peekByte()) & (byte) 0x1F) == (byte) 0x03) {
|
||||
subDer = der.getData().getDerValue();
|
||||
usec = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
sAddress = HostAddress.parse(der.getData(), (byte) 0x04, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
rAddress = HostAddresses.parse(der.getData(), (byte) 0x05, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an EncKrbCredPart object.
|
||||
* @return byte array of encoded EncKrbCredPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException{
|
||||
/**
|
||||
* Encodes an EncKrbCredPart object.
|
||||
* @return byte array of encoded EncKrbCredPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
DerValue[] tickets = new DerValue[ticketInfo.length];
|
||||
for (int i = 0; i < ticketInfo.length; i++)
|
||||
tickets[i] = new DerValue(ticketInfo[i].asn1Encode());
|
||||
temp.putSequence(tickets);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
|
||||
|
||||
if (nonce != null) {
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(nonce.intValue()));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), temp);
|
||||
}
|
||||
if (timeStamp != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), timeStamp.asn1Encode());
|
||||
}
|
||||
if (usec != null) {
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(usec.intValue()));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), temp);
|
||||
}
|
||||
if (sAddress != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), sAddress.asn1Encode());
|
||||
}
|
||||
if (rAddress != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x05), rAddress.asn1Encode());
|
||||
}
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)0x1D), temp);
|
||||
return bytes.toByteArray();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
DerValue[] tickets = new DerValue[ticketInfo.length];
|
||||
for (int i = 0; i < ticketInfo.length; i++) {
|
||||
tickets[i] = new DerValue(ticketInfo[i].asn1Encode());
|
||||
}
|
||||
temp.putSequence(tickets);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x00), temp);
|
||||
|
||||
if (nonce != null) {
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(nonce.intValue()));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x01), temp);
|
||||
}
|
||||
if (timeStamp != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x02), timeStamp.asn1Encode());
|
||||
}
|
||||
if (usec != null) {
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(usec.intValue()));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x03), temp);
|
||||
}
|
||||
if (sAddress != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x04), sAddress.asn1Encode());
|
||||
}
|
||||
if (rAddress != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x05), rAddress.asn1Encode());
|
||||
}
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_APPLICATION,
|
||||
true, (byte) 0x1D), temp);
|
||||
return bytes.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -55,114 +55,119 @@ import java.math.BigInteger;
|
||||
* <a href="http://www.ietf.org/rfc/rfc4120.txt">
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
|
||||
public class EncKrbPrivPart {
|
||||
public byte[] userData = null;
|
||||
public KerberosTime timestamp; //optional
|
||||
public Integer usec; //optional
|
||||
public Integer seqNumber; //optional
|
||||
public HostAddress sAddress; //optional
|
||||
public HostAddress rAddress; //optional
|
||||
|
||||
public EncKrbPrivPart(
|
||||
byte[] new_userData,
|
||||
KerberosTime new_timestamp,
|
||||
Integer new_usec,
|
||||
Integer new_seqNumber,
|
||||
HostAddress new_sAddress,
|
||||
HostAddress new_rAddress
|
||||
) {
|
||||
if (new_userData != null) {
|
||||
userData = new_userData.clone();
|
||||
}
|
||||
timestamp = new_timestamp;
|
||||
usec = new_usec;
|
||||
seqNumber = new_seqNumber;
|
||||
sAddress = new_sAddress;
|
||||
rAddress = new_rAddress;
|
||||
public byte[] userData = null;
|
||||
public KerberosTime timestamp; //optional
|
||||
public Integer usec; //optional
|
||||
public Integer seqNumber; //optional
|
||||
public HostAddress sAddress; //optional
|
||||
public HostAddress rAddress; //optional
|
||||
|
||||
public EncKrbPrivPart(
|
||||
byte[] new_userData,
|
||||
KerberosTime new_timestamp,
|
||||
Integer new_usec,
|
||||
Integer new_seqNumber,
|
||||
HostAddress new_sAddress,
|
||||
HostAddress new_rAddress) {
|
||||
if (new_userData != null) {
|
||||
userData = new_userData.clone();
|
||||
}
|
||||
timestamp = new_timestamp;
|
||||
usec = new_usec;
|
||||
seqNumber = new_seqNumber;
|
||||
sAddress = new_sAddress;
|
||||
rAddress = new_rAddress;
|
||||
}
|
||||
|
||||
public EncKrbPrivPart(byte[] data) throws Asn1Exception, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public EncKrbPrivPart(byte[] data) throws Asn1Exception, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public EncKrbPrivPart(DerValue encoding) throws Asn1Exception, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
public EncKrbPrivPart(DerValue encoding) throws Asn1Exception, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an EncKrbPrivPart object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception, IOException {
|
||||
/**
|
||||
* Initializes an EncKrbPrivPart object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception, IOException {
|
||||
DerValue der, subDer;
|
||||
if (((encoding.getTag() & (byte)0x1F) != (byte)0x1C)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true))
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
if (((encoding.getTag() & (byte) 0x1F) != (byte) 0x1C)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte)0x1F) == (byte)0x00) {
|
||||
userData = subDer.getData().getOctetString();
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
timestamp = KerberosTime.parse(der.getData(), (byte)0x01, true);
|
||||
if ((der.getData().peekByte() & 0x1F) == 0x02) {
|
||||
subDer = der.getData().getDerValue();
|
||||
usec = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
else usec = null;
|
||||
if ((der.getData().peekByte() & 0x1F) == 0x03 ) {
|
||||
subDer = der.getData().getDerValue();
|
||||
seqNumber = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
}
|
||||
else seqNumber = null;
|
||||
sAddress = HostAddress.parse(der.getData(), (byte)0x04, false);
|
||||
if (der.getData().available() > 0) {
|
||||
rAddress = HostAddress.parse(der.getData(), (byte)0x05, true);
|
||||
}
|
||||
if (der.getData().available() > 0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & (byte) 0x1F) == (byte) 0x00) {
|
||||
userData = subDer.getData().getOctetString();
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
timestamp = KerberosTime.parse(der.getData(), (byte) 0x01, true);
|
||||
if ((der.getData().peekByte() & 0x1F) == 0x02) {
|
||||
subDer = der.getData().getDerValue();
|
||||
usec = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
} else {
|
||||
usec = null;
|
||||
}
|
||||
if ((der.getData().peekByte() & 0x1F) == 0x03) {
|
||||
subDer = der.getData().getDerValue();
|
||||
seqNumber = new Integer(subDer.getData().getBigInteger().intValue());
|
||||
} else {
|
||||
seqNumber = null;
|
||||
}
|
||||
sAddress = HostAddress.parse(der.getData(), (byte) 0x04, false);
|
||||
if (der.getData().available() > 0) {
|
||||
rAddress = HostAddress.parse(der.getData(), (byte) 0x05, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an EncKrbPrivPart object.
|
||||
* @return byte array of encoded EncKrbPrivPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
/**
|
||||
* Encodes an EncKrbPrivPart object.
|
||||
* @return byte array of encoded EncKrbPrivPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
|
||||
temp.putOctetString(userData);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
|
||||
if (timestamp != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), timestamp.asn1Encode());
|
||||
if (usec != null) {
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(usec.intValue()));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), temp);
|
||||
}
|
||||
if (seqNumber != null) {
|
||||
temp = new DerOutputStream();
|
||||
// encode as an unsigned integer (UInt32)
|
||||
temp.putInteger(BigInteger.valueOf(seqNumber.longValue()));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), temp);
|
||||
}
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), sAddress.asn1Encode());
|
||||
if (rAddress != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x05), rAddress.asn1Encode());
|
||||
}
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)0x1C), temp);
|
||||
return bytes.toByteArray();
|
||||
temp.putOctetString(userData);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x00), temp);
|
||||
if (timestamp != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x01), timestamp.asn1Encode());
|
||||
}
|
||||
if (usec != null) {
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(usec.intValue()));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x02), temp);
|
||||
}
|
||||
if (seqNumber != null) {
|
||||
temp = new DerOutputStream();
|
||||
// encode as an unsigned integer (UInt32)
|
||||
temp.putInteger(BigInteger.valueOf(seqNumber.longValue()));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x03), temp);
|
||||
}
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x04), sAddress.asn1Encode());
|
||||
if (rAddress != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x05), rAddress.asn1Encode());
|
||||
}
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte) 0x1C), temp);
|
||||
return bytes.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -35,55 +35,52 @@ import java.io.IOException;
|
||||
|
||||
public class EncTGSRepPart extends EncKDCRepPart {
|
||||
|
||||
public EncTGSRepPart(
|
||||
EncryptionKey new_key,
|
||||
LastReq new_lastReq,
|
||||
int new_nonce,
|
||||
KerberosTime new_keyExpiration,
|
||||
TicketFlags new_flags,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
Realm new_srealm,
|
||||
PrincipalName new_sname,
|
||||
HostAddresses new_caddr
|
||||
) {
|
||||
super(
|
||||
new_key,
|
||||
new_lastReq,
|
||||
new_nonce,
|
||||
new_keyExpiration,
|
||||
new_flags,
|
||||
new_authtime,
|
||||
new_starttime,
|
||||
new_endtime,
|
||||
new_renewTill,
|
||||
new_srealm,
|
||||
new_sname,
|
||||
new_caddr,
|
||||
Krb5.KRB_ENC_TGS_REP_PART
|
||||
);
|
||||
}
|
||||
public EncTGSRepPart(
|
||||
EncryptionKey new_key,
|
||||
LastReq new_lastReq,
|
||||
int new_nonce,
|
||||
KerberosTime new_keyExpiration,
|
||||
TicketFlags new_flags,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
Realm new_srealm,
|
||||
PrincipalName new_sname,
|
||||
HostAddresses new_caddr) {
|
||||
super(
|
||||
new_key,
|
||||
new_lastReq,
|
||||
new_nonce,
|
||||
new_keyExpiration,
|
||||
new_flags,
|
||||
new_authtime,
|
||||
new_starttime,
|
||||
new_endtime,
|
||||
new_renewTill,
|
||||
new_srealm,
|
||||
new_sname,
|
||||
new_caddr,
|
||||
Krb5.KRB_ENC_TGS_REP_PART);
|
||||
}
|
||||
|
||||
public EncTGSRepPart(byte[] data) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public EncTGSRepPart(byte[] data) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public EncTGSRepPart(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(encoding);
|
||||
}
|
||||
public EncTGSRepPart(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(encoding, Krb5.KRB_ENC_TGS_REP_PART);
|
||||
}
|
||||
|
||||
public byte[] asn1Encode() throws Asn1Exception,
|
||||
IOException {
|
||||
return asn1Encode(Krb5.KRB_ENC_TGS_REP_PART);
|
||||
}
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(encoding, Krb5.KRB_ENC_TGS_REP_PART);
|
||||
}
|
||||
|
||||
public byte[] asn1Encode() throws Asn1Exception,
|
||||
IOException {
|
||||
return asn1Encode(Krb5.KRB_ENC_TGS_REP_PART);
|
||||
}
|
||||
}
|
||||
|
@ -62,69 +62,68 @@ import java.io.*;
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
public class EncTicketPart {
|
||||
public TicketFlags flags;
|
||||
public EncryptionKey key;
|
||||
public Realm crealm;
|
||||
public PrincipalName cname;
|
||||
public TransitedEncoding transited;
|
||||
public KerberosTime authtime;
|
||||
public KerberosTime starttime; //optional
|
||||
public KerberosTime endtime;
|
||||
public KerberosTime renewTill; //optional
|
||||
public HostAddresses caddr; //optional
|
||||
public AuthorizationData authorizationData; //optional
|
||||
|
||||
public EncTicketPart(
|
||||
TicketFlags new_flags,
|
||||
EncryptionKey new_key,
|
||||
Realm new_crealm,
|
||||
PrincipalName new_cname,
|
||||
TransitedEncoding new_transited,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
HostAddresses new_caddr,
|
||||
AuthorizationData new_authorizationData
|
||||
) {
|
||||
flags = new_flags;
|
||||
key = new_key;
|
||||
crealm = new_crealm;
|
||||
cname = new_cname;
|
||||
transited = new_transited;
|
||||
authtime = new_authtime;
|
||||
starttime = new_starttime;
|
||||
endtime = new_endtime;
|
||||
renewTill = new_renewTill;
|
||||
caddr = new_caddr;
|
||||
authorizationData = new_authorizationData;
|
||||
}
|
||||
public TicketFlags flags;
|
||||
public EncryptionKey key;
|
||||
public Realm crealm;
|
||||
public PrincipalName cname;
|
||||
public TransitedEncoding transited;
|
||||
public KerberosTime authtime;
|
||||
public KerberosTime starttime; //optional
|
||||
public KerberosTime endtime;
|
||||
public KerberosTime renewTill; //optional
|
||||
public HostAddresses caddr; //optional
|
||||
public AuthorizationData authorizationData; //optional
|
||||
|
||||
public EncTicketPart(byte[] data)
|
||||
throws Asn1Exception, KrbException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
public EncTicketPart(
|
||||
TicketFlags new_flags,
|
||||
EncryptionKey new_key,
|
||||
Realm new_crealm,
|
||||
PrincipalName new_cname,
|
||||
TransitedEncoding new_transited,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
HostAddresses new_caddr,
|
||||
AuthorizationData new_authorizationData) {
|
||||
flags = new_flags;
|
||||
key = new_key;
|
||||
crealm = new_crealm;
|
||||
cname = new_cname;
|
||||
transited = new_transited;
|
||||
authtime = new_authtime;
|
||||
starttime = new_starttime;
|
||||
endtime = new_endtime;
|
||||
renewTill = new_renewTill;
|
||||
caddr = new_caddr;
|
||||
authorizationData = new_authorizationData;
|
||||
}
|
||||
|
||||
public EncTicketPart(DerValue encoding)
|
||||
throws Asn1Exception, KrbException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
public EncTicketPart(byte[] data)
|
||||
throws Asn1Exception, KrbException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an EncTicketPart object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
public EncTicketPart(DerValue encoding)
|
||||
throws Asn1Exception, KrbException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an EncTicketPart object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private static String getHexBytes(byte[] bytes, int len)
|
||||
throws IOException {
|
||||
throws IOException {
|
||||
|
||||
StringBuffer sb = new StringBuffer();
|
||||
for (int i = 0; i < len; i++) {
|
||||
|
||||
int b1 = (bytes[i]>>4) & 0x0f;
|
||||
int b1 = (bytes[i] >> 4) & 0x0f;
|
||||
int b2 = bytes[i] & 0x0f;
|
||||
|
||||
sb.append(Integer.toHexString(b1));
|
||||
@ -134,73 +133,91 @@ public class EncTicketPart {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private void init(DerValue encoding)
|
||||
throws Asn1Exception, IOException, RealmException {
|
||||
DerValue der, subDer;
|
||||
private void init(DerValue encoding)
|
||||
throws Asn1Exception, IOException, RealmException {
|
||||
DerValue der, subDer;
|
||||
|
||||
renewTill = null;
|
||||
caddr = null;
|
||||
authorizationData = null;
|
||||
if (((encoding.getTag() & (byte)0x1F) != (byte)0x03)
|
||||
renewTill = null;
|
||||
caddr = null;
|
||||
authorizationData = null;
|
||||
if (((encoding.getTag() & (byte) 0x1F) != (byte) 0x03)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true))
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
flags = TicketFlags.parse(der.getData(), (byte)0x00, false);
|
||||
key = EncryptionKey.parse(der.getData(), (byte)0x01, false);
|
||||
crealm = Realm.parse(der.getData(), (byte)0x02, false);
|
||||
cname = PrincipalName.parse(der.getData(), (byte)0x03, false);
|
||||
transited = TransitedEncoding.parse(der.getData(), (byte)0x04, false);
|
||||
authtime = KerberosTime.parse(der.getData(), (byte)0x05, false);
|
||||
starttime = KerberosTime.parse(der.getData(), (byte)0x06, true);
|
||||
endtime = KerberosTime.parse(der.getData(), (byte)0x07, false);
|
||||
if (der.getData().available() > 0) {
|
||||
renewTill = KerberosTime.parse(der.getData(), (byte)0x08, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
caddr = HostAddresses.parse(der.getData(), (byte)0x09, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
authorizationData = AuthorizationData.parse(der.getData(), (byte)0x0A, true);
|
||||
}
|
||||
if (der.getData().available() > 0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
|
||||
|| (encoding.isConstructed() != true)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
flags = TicketFlags.parse(der.getData(), (byte) 0x00, false);
|
||||
key = EncryptionKey.parse(der.getData(), (byte) 0x01, false);
|
||||
crealm = Realm.parse(der.getData(), (byte) 0x02, false);
|
||||
cname = PrincipalName.parse(der.getData(), (byte) 0x03, false);
|
||||
transited = TransitedEncoding.parse(der.getData(), (byte) 0x04, false);
|
||||
authtime = KerberosTime.parse(der.getData(), (byte) 0x05, false);
|
||||
starttime = KerberosTime.parse(der.getData(), (byte) 0x06, true);
|
||||
endtime = KerberosTime.parse(der.getData(), (byte) 0x07, false);
|
||||
if (der.getData().available() > 0) {
|
||||
renewTill = KerberosTime.parse(der.getData(), (byte) 0x08, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
caddr = HostAddresses.parse(der.getData(), (byte) 0x09, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
authorizationData = AuthorizationData.parse(der.getData(), (byte) 0x0A, true);
|
||||
}
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an EncTicketPart object.
|
||||
* @return byte array of encoded EncTicketPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
}
|
||||
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
/**
|
||||
* Encodes an EncTicketPart object.
|
||||
* @return byte array of encoded EncTicketPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), flags.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), key.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), crealm.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), cname.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), transited.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x05), authtime.asn1Encode());
|
||||
if (starttime != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x06), starttime.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x07), endtime.asn1Encode());
|
||||
|
||||
if (renewTill != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x08), renewTill.asn1Encode());
|
||||
|
||||
if (caddr != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x09), caddr.asn1Encode());
|
||||
|
||||
if (authorizationData != null)
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x0A), authorizationData.asn1Encode());
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)0x03), temp);
|
||||
return bytes.toByteArray();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x00), flags.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x01), key.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x02), crealm.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x03), cname.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x04), transited.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x05), authtime.asn1Encode());
|
||||
if (starttime != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x06), starttime.asn1Encode());
|
||||
}
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x07), endtime.asn1Encode());
|
||||
|
||||
if (renewTill != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x08), renewTill.asn1Encode());
|
||||
}
|
||||
|
||||
if (caddr != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x09), caddr.asn1Encode());
|
||||
}
|
||||
|
||||
if (authorizationData != null) {
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x0A), authorizationData.asn1Encode());
|
||||
}
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_APPLICATION,
|
||||
true, (byte) 0x03), temp);
|
||||
return bytes.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ import sun.security.util.*;
|
||||
import java.util.Vector;
|
||||
import java.io.IOException;
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Implements the ASN.1 KDC-REP type.
|
||||
*
|
||||
@ -59,163 +60,168 @@ import java.math.BigInteger;
|
||||
* <a href="http://www.ietf.org/rfc/rfc4120.txt">
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
|
||||
public class KDCRep {
|
||||
public Realm crealm;
|
||||
public PrincipalName cname;
|
||||
public Ticket ticket;
|
||||
public EncryptedData encPart;
|
||||
public EncKDCRepPart encKDCRepPart; //not part of ASN.1 encoding
|
||||
|
||||
private int pvno;
|
||||
private int msgType;
|
||||
private PAData[] pAData = null; //optional
|
||||
private boolean DEBUG = Krb5.DEBUG;
|
||||
public Realm crealm;
|
||||
public PrincipalName cname;
|
||||
public Ticket ticket;
|
||||
public EncryptedData encPart;
|
||||
public EncKDCRepPart encKDCRepPart; //not part of ASN.1 encoding
|
||||
private int pvno;
|
||||
private int msgType;
|
||||
private PAData[] pAData = null; //optional
|
||||
private boolean DEBUG = Krb5.DEBUG;
|
||||
|
||||
public KDCRep(
|
||||
PAData[] new_pAData,
|
||||
Realm new_crealm,
|
||||
PrincipalName new_cname,
|
||||
Ticket new_ticket,
|
||||
EncryptedData new_encPart,
|
||||
int req_type
|
||||
) throws IOException {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = req_type;
|
||||
if (new_pAData != null) {
|
||||
pAData = new PAData[new_pAData.length];
|
||||
for (int i = 0; i < new_pAData.length; i++) {
|
||||
if (new_pAData[i] == null) {
|
||||
throw new IOException("Cannot create a KDCRep");
|
||||
} else {
|
||||
pAData[i] = (PAData)new_pAData[i].clone();
|
||||
}
|
||||
}
|
||||
public KDCRep(
|
||||
PAData[] new_pAData,
|
||||
Realm new_crealm,
|
||||
PrincipalName new_cname,
|
||||
Ticket new_ticket,
|
||||
EncryptedData new_encPart,
|
||||
int req_type) throws IOException {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = req_type;
|
||||
if (new_pAData != null) {
|
||||
pAData = new PAData[new_pAData.length];
|
||||
for (int i = 0; i < new_pAData.length; i++) {
|
||||
if (new_pAData[i] == null) {
|
||||
throw new IOException("Cannot create a KDCRep");
|
||||
} else {
|
||||
pAData[i] = (PAData) new_pAData[i].clone();
|
||||
}
|
||||
crealm = new_crealm;
|
||||
cname = new_cname;
|
||||
ticket = new_ticket;
|
||||
encPart = new_encPart;
|
||||
}
|
||||
}
|
||||
crealm = new_crealm;
|
||||
cname = new_cname;
|
||||
ticket = new_ticket;
|
||||
encPart = new_encPart;
|
||||
}
|
||||
|
||||
public KDCRep() {
|
||||
}
|
||||
public KDCRep() {
|
||||
}
|
||||
|
||||
public KDCRep(byte[] data, int req_type) throws Asn1Exception, KrbApErrException, RealmException, IOException {
|
||||
init(new DerValue(data), req_type);
|
||||
}
|
||||
public KDCRep(byte[] data, int req_type) throws Asn1Exception,
|
||||
KrbApErrException, RealmException, IOException {
|
||||
init(new DerValue(data), req_type);
|
||||
}
|
||||
|
||||
public KDCRep(DerValue encoding, int req_type) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(encoding, req_type);
|
||||
}
|
||||
public KDCRep(DerValue encoding, int req_type) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(encoding, req_type);
|
||||
}
|
||||
|
||||
/*
|
||||
// Not used? Don't know what keyusage to use here %%%
|
||||
|
||||
public void decrypt(EncryptionKey key) throws Asn1Exception,
|
||||
IOException, KrbException, RealmException {
|
||||
encKDCRepPart = new EncKDCRepPart(encPart.decrypt(key),
|
||||
msgType);
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Initializes an KDCRep object.
|
||||
*
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @param req_type reply message type.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception RealmException if an error occurs while constructing a Realm object from DER-encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data stream does not match the pre-defined value.
|
||||
*
|
||||
*/
|
||||
protected void init(DerValue encoding, int req_type)
|
||||
public void decrypt(EncryptionKey key) throws Asn1Exception,
|
||||
IOException, KrbException, RealmException {
|
||||
encKDCRepPart = new EncKDCRepPart(encPart.decrypt(key), msgType);
|
||||
}
|
||||
*/
|
||||
/**
|
||||
* Initializes an KDCRep object.
|
||||
*
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @param req_type reply message type.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception RealmException if an error occurs while constructing
|
||||
* a Realm object from DER-encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded
|
||||
* data stream does not match the pre-defined value.
|
||||
*
|
||||
*/
|
||||
protected void init(DerValue encoding, int req_type)
|
||||
throws Asn1Exception, RealmException, IOException,
|
||||
KrbApErrException {
|
||||
DerValue der, subDer;
|
||||
if ((encoding.getTag() & 0x1F) != req_type) {
|
||||
if (DEBUG) {
|
||||
System.out.println(">>> KDCRep: init() " +
|
||||
"encoding tag is " +
|
||||
encoding.getTag() +
|
||||
" req type is " + req_type);
|
||||
}
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x00) {
|
||||
pvno = subDer.getData().getBigInteger().intValue();
|
||||
if (pvno != Krb5.PVNO)
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x01) {
|
||||
msgType = subDer.getData().getBigInteger().intValue();
|
||||
if (msgType != req_type) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
if ((der.getData().peekByte() & 0x1F) == 0x02) {
|
||||
subDer = der.getData().getDerValue();
|
||||
DerValue[] padata = subDer.getData().getSequence(1);
|
||||
pAData = new PAData[padata.length];
|
||||
for (int i = 0; i < padata.length; i++) {
|
||||
pAData[i] = new PAData(padata[i]);
|
||||
}
|
||||
} else {
|
||||
pAData = null;
|
||||
}
|
||||
crealm = Realm.parse(der.getData(), (byte)0x03, false);
|
||||
cname = PrincipalName.parse(der.getData(), (byte)0x04, false);
|
||||
ticket = Ticket.parse(der.getData(), (byte)0x05, false);
|
||||
encPart = EncryptedData.parse(der.getData(), (byte)0x06, false);
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
KrbApErrException {
|
||||
DerValue der, subDer;
|
||||
if ((encoding.getTag() & 0x1F) != req_type) {
|
||||
if (DEBUG) {
|
||||
System.out.println(">>> KDCRep: init() " +
|
||||
"encoding tag is " +
|
||||
encoding.getTag() +
|
||||
" req type is " + req_type);
|
||||
}
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Encodes this object to a byte array.
|
||||
* @return byte array of encoded APReq object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), temp);
|
||||
if (pAData != null && pAData.length > 0) {
|
||||
DerOutputStream padata_stream = new DerOutputStream();
|
||||
for (int i = 0; i < pAData.length; i++) {
|
||||
padata_stream.write(pAData[i].asn1Encode());
|
||||
}
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_SequenceOf, padata_stream);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), temp);
|
||||
}
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), crealm.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), cname.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x05), ticket.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x06), encPart.asn1Encode());
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
return temp.toByteArray();
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x00) {
|
||||
pvno = subDer.getData().getBigInteger().intValue();
|
||||
if (pvno != Krb5.PVNO) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x01) {
|
||||
msgType = subDer.getData().getBigInteger().intValue();
|
||||
if (msgType != req_type) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
if ((der.getData().peekByte() & 0x1F) == 0x02) {
|
||||
subDer = der.getData().getDerValue();
|
||||
DerValue[] padata = subDer.getData().getSequence(1);
|
||||
pAData = new PAData[padata.length];
|
||||
for (int i = 0; i < padata.length; i++) {
|
||||
pAData[i] = new PAData(padata[i]);
|
||||
}
|
||||
} else {
|
||||
pAData = null;
|
||||
}
|
||||
crealm = Realm.parse(der.getData(), (byte) 0x03, false);
|
||||
cname = PrincipalName.parse(der.getData(), (byte) 0x04, false);
|
||||
ticket = Ticket.parse(der.getData(), (byte) 0x05, false);
|
||||
encPart = EncryptedData.parse(der.getData(), (byte) 0x06, false);
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes this object to a byte array.
|
||||
* @return byte array of encoded APReq object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
|
||||
DerOutputStream bytes = new DerOutputStream();
|
||||
DerOutputStream temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x01), temp);
|
||||
if (pAData != null && pAData.length > 0) {
|
||||
DerOutputStream padata_stream = new DerOutputStream();
|
||||
for (int i = 0; i < pAData.length; i++) {
|
||||
padata_stream.write(pAData[i].asn1Encode());
|
||||
}
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_SequenceOf, padata_stream);
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x02), temp);
|
||||
}
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x03), crealm.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x04), cname.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x05), ticket.asn1Encode());
|
||||
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x06), encPart.asn1Encode());
|
||||
temp = new DerOutputStream();
|
||||
temp.write(DerValue.tag_Sequence, bytes);
|
||||
return temp.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -56,155 +56,160 @@ import java.math.BigInteger;
|
||||
* <a href="http://www.ietf.org/rfc/rfc4120.txt">
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
|
||||
public class KDCReq {
|
||||
public KDCReqBody reqBody;
|
||||
|
||||
private int pvno;
|
||||
private int msgType;
|
||||
private PAData[] pAData = null; //optional
|
||||
public KDCReqBody reqBody;
|
||||
private int pvno;
|
||||
private int msgType;
|
||||
private PAData[] pAData = null; //optional
|
||||
|
||||
public KDCReq(PAData[] new_pAData, KDCReqBody new_reqBody,
|
||||
int req_type) throws IOException {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = req_type;
|
||||
if (new_pAData != null) {
|
||||
pAData = new PAData[new_pAData.length];
|
||||
for (int i = 0; i < new_pAData.length; i++) {
|
||||
if (new_pAData[i] == null) {
|
||||
throw new IOException("Cannot create a KDCRep");
|
||||
} else {
|
||||
pAData[i] = (PAData)new_pAData[i].clone();
|
||||
}
|
||||
}
|
||||
public KDCReq(PAData[] new_pAData, KDCReqBody new_reqBody,
|
||||
int req_type) throws IOException {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = req_type;
|
||||
if (new_pAData != null) {
|
||||
pAData = new PAData[new_pAData.length];
|
||||
for (int i = 0; i < new_pAData.length; i++) {
|
||||
if (new_pAData[i] == null) {
|
||||
throw new IOException("Cannot create a KDCRep");
|
||||
} else {
|
||||
pAData[i] = (PAData) new_pAData[i].clone();
|
||||
}
|
||||
reqBody = new_reqBody;
|
||||
}
|
||||
}
|
||||
reqBody = new_reqBody;
|
||||
}
|
||||
|
||||
public KDCReq() {
|
||||
}
|
||||
public KDCReq() {
|
||||
}
|
||||
|
||||
public KDCReq(byte[] data, int req_type) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
public KDCReq(byte[] data, int req_type) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(new DerValue(data), req_type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an KDCReq object from a DerValue object and asn1 type.
|
||||
*
|
||||
* @param der a DER value of an KDCReq object.
|
||||
* @param req_type a encoded asn1 type value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exceptoin KrbErrException
|
||||
*/
|
||||
* Creates an KDCReq object from a DerValue object and asn1 type.
|
||||
*
|
||||
* @param der a DER value of an KDCReq object.
|
||||
* @param req_type a encoded asn1 type value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exceptoin KrbErrException
|
||||
*/
|
||||
public KDCReq(DerValue der, int req_type) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
init(der, req_type);
|
||||
}
|
||||
IOException, KrbException {
|
||||
init(der, req_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a KDCReq object from a DerValue. The DER encoding
|
||||
* must be in the format specified by the KRB_KDC_REQ ASN.1 notation.
|
||||
*
|
||||
* @param encoding a DER-encoded KDCReq object.
|
||||
* @param req_type an int indicating whether it's KRB_AS_REQ or KRB_TGS_REQ type
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbException if an error occurs while constructing a Realm object,
|
||||
* or a Krb object from DER-encoded data.
|
||||
*/
|
||||
/**
|
||||
* Initializes a KDCReq object from a DerValue. The DER encoding
|
||||
* must be in the format specified by the KRB_KDC_REQ ASN.1 notation.
|
||||
*
|
||||
* @param encoding a DER-encoded KDCReq object.
|
||||
* @param req_type an int indicating whether it's KRB_AS_REQ or KRB_TGS_REQ type
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbException if an error occurs while constructing a Realm object,
|
||||
* or a Krb object from DER-encoded data.
|
||||
*/
|
||||
protected void init(DerValue encoding, int req_type) throws Asn1Exception,
|
||||
IOException, KrbException {
|
||||
DerValue der, subDer;
|
||||
BigInteger bint;
|
||||
if ((encoding.getTag() & 0x1F) != req_type) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
IOException, KrbException {
|
||||
DerValue der, subDer;
|
||||
BigInteger bint;
|
||||
if ((encoding.getTag() & 0x1F) != req_type) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x01F) == 0x01) {
|
||||
bint = subDer.getData().getBigInteger();
|
||||
this.pvno = bint.intValue();
|
||||
if (this.pvno != Krb5.PVNO)
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x01F) == 0x02) {
|
||||
bint = subDer.getData().getBigInteger();
|
||||
this.msgType = bint.intValue();
|
||||
if (this.msgType != req_type)
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x01F) == 0x03) {
|
||||
DerValue subsubDer = subDer.getData().getDerValue();
|
||||
if (subsubDer.getTag() != DerValue.tag_SequenceOf) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
Vector<PAData> v = new Vector<PAData> ();
|
||||
while (subsubDer.getData().available() > 0) {
|
||||
v.addElement(new PAData(subsubDer.getData().getDerValue()));
|
||||
}
|
||||
if (v.size() > 0) {
|
||||
pAData = new PAData[v.size()];
|
||||
v.copyInto(pAData);
|
||||
}
|
||||
}
|
||||
else pAData = null;
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x01F) == 0x04) {
|
||||
DerValue subsubDer = subDer.getData().getDerValue();
|
||||
reqBody = new KDCReqBody(subsubDer, msgType);
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x01F) == 0x01) {
|
||||
bint = subDer.getData().getBigInteger();
|
||||
this.pvno = bint.intValue();
|
||||
if (this.pvno != Krb5.PVNO) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x01F) == 0x02) {
|
||||
bint = subDer.getData().getBigInteger();
|
||||
this.msgType = bint.intValue();
|
||||
if (this.msgType != req_type) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x01F) == 0x03) {
|
||||
DerValue subsubDer = subDer.getData().getDerValue();
|
||||
if (subsubDer.getTag() != DerValue.tag_SequenceOf) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
Vector<PAData> v = new Vector<PAData>();
|
||||
while (subsubDer.getData().available() > 0) {
|
||||
v.addElement(new PAData(subsubDer.getData().getDerValue()));
|
||||
}
|
||||
if (v.size() > 0) {
|
||||
pAData = new PAData[v.size()];
|
||||
v.copyInto(pAData);
|
||||
}
|
||||
} else {
|
||||
pAData = null;
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x01F) == 0x04) {
|
||||
DerValue subsubDer = subDer.getData().getDerValue();
|
||||
reqBody = new KDCReqBody(subsubDer, msgType);
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes this object to a byte array.
|
||||
*
|
||||
* @return an byte array of encoded data.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* Encodes this object to a byte array.
|
||||
*
|
||||
* @return an byte array of encoded data.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream temp, bytes, out;
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), temp);
|
||||
DerOutputStream temp, bytes, out;
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x01), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x02), temp);
|
||||
if (pAData != null && pAData.length > 0) {
|
||||
temp = new DerOutputStream();
|
||||
for (int i = 0; i < pAData.length; i++) {
|
||||
temp.write(pAData[i].asn1Encode());
|
||||
}
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.tag_SequenceOf, temp);
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), bytes);
|
||||
}
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), reqBody.asn1Encode(msgType));
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.tag_Sequence, out);
|
||||
out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)msgType), bytes);
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
public byte[] asn1EncodeReqBody() throws Asn1Exception, IOException
|
||||
{
|
||||
return reqBody.asn1Encode(msgType);
|
||||
temp = new DerOutputStream();
|
||||
for (int i = 0; i < pAData.length; i++) {
|
||||
temp.write(pAData[i].asn1Encode());
|
||||
}
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.tag_SequenceOf, temp);
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x03), bytes);
|
||||
}
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x04), reqBody.asn1Encode(msgType));
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.tag_Sequence, out);
|
||||
out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_APPLICATION,
|
||||
true, (byte) msgType), bytes);
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
public byte[] asn1EncodeReqBody() throws Asn1Exception, IOException {
|
||||
return reqBody.asn1Encode(msgType);
|
||||
}
|
||||
}
|
||||
|
@ -56,128 +56,134 @@ import java.math.BigInteger;
|
||||
* <a href="http://www.ietf.org/rfc/rfc4120.txt">
|
||||
* http://www.ietf.org/rfc/rfc4120.txt</a>.
|
||||
*/
|
||||
|
||||
public class KRBCred {
|
||||
public Ticket[] tickets = null;
|
||||
public EncryptedData encPart;
|
||||
|
||||
private int pvno;
|
||||
private int msgType;
|
||||
public Ticket[] tickets = null;
|
||||
public EncryptedData encPart;
|
||||
private int pvno;
|
||||
private int msgType;
|
||||
|
||||
public KRBCred(Ticket[] new_tickets, EncryptedData new_encPart) throws IOException {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = Krb5.KRB_CRED;
|
||||
if (new_tickets != null) {
|
||||
tickets = new Ticket[new_tickets.length];
|
||||
for (int i = 0; i < new_tickets.length; i++) {
|
||||
if (new_tickets[i] == null) {
|
||||
throw new IOException("Cannot create a KRBCred");
|
||||
} else {
|
||||
tickets[i] = (Ticket)new_tickets[i].clone();
|
||||
}
|
||||
}
|
||||
public KRBCred(Ticket[] new_tickets, EncryptedData new_encPart) throws IOException {
|
||||
pvno = Krb5.PVNO;
|
||||
msgType = Krb5.KRB_CRED;
|
||||
if (new_tickets != null) {
|
||||
tickets = new Ticket[new_tickets.length];
|
||||
for (int i = 0; i < new_tickets.length; i++) {
|
||||
if (new_tickets[i] == null) {
|
||||
throw new IOException("Cannot create a KRBCred");
|
||||
} else {
|
||||
tickets[i] = (Ticket) new_tickets[i].clone();
|
||||
}
|
||||
encPart = new_encPart;
|
||||
}
|
||||
}
|
||||
encPart = new_encPart;
|
||||
}
|
||||
|
||||
public KRBCred(byte[] data) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(new DerValue(data));
|
||||
public KRBCred(byte[] data) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(new DerValue(data));
|
||||
}
|
||||
|
||||
public KRBCred(DerValue encoding) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an KRBCred object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data
|
||||
* stream does not match the pre-defined value.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
if (((encoding.getTag() & (byte) 0x1F) != (byte) 0x16)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true)) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
|
||||
public KRBCred(DerValue encoding) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
init(encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an KRBCred object.
|
||||
* @param encoding a single DER-encoded value.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
* @exception KrbApErrException if the value read from the DER-encoded data
|
||||
* stream does not match the pre-defined value.
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
private void init(DerValue encoding) throws Asn1Exception,
|
||||
RealmException, KrbApErrException, IOException {
|
||||
if (((encoding.getTag() & (byte)0x1F) != (byte)0x16)
|
||||
|| (encoding.isApplication() != true)
|
||||
|| (encoding.isConstructed() != true))
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
DerValue der, subDer;
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x00) {
|
||||
pvno = subDer.getData().getBigInteger().intValue();
|
||||
if (pvno != Krb5.PVNO) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
}
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x01) {
|
||||
msgType = subDer.getData().getBigInteger().intValue();
|
||||
if (msgType != Krb5.KRB_CRED)
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x02) {
|
||||
DerValue subsubDer = subDer.getData().getDerValue();
|
||||
if (subsubDer.getTag() != DerValue.tag_SequenceOf) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
Vector<Ticket> v = new Vector<Ticket> ();
|
||||
while (subsubDer.getData().available() > 0) {
|
||||
v.addElement(new Ticket(subsubDer.getData().getDerValue()));
|
||||
}
|
||||
if (v.size() > 0) {
|
||||
tickets = new Ticket[v.size()];
|
||||
v.copyInto(tickets);
|
||||
}
|
||||
}
|
||||
else
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
encPart = EncryptedData.parse(der.getData(), (byte)0x03, false);
|
||||
|
||||
if (der.getData().available() > 0)
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
der = encoding.getData().getDerValue();
|
||||
if (der.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x00) {
|
||||
pvno = subDer.getData().getBigInteger().intValue();
|
||||
if (pvno != Krb5.PVNO) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x01) {
|
||||
msgType = subDer.getData().getBigInteger().intValue();
|
||||
if (msgType != Krb5.KRB_CRED) {
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_MSG_TYPE);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
subDer = der.getData().getDerValue();
|
||||
if ((subDer.getTag() & 0x1F) == 0x02) {
|
||||
DerValue subsubDer = subDer.getData().getDerValue();
|
||||
if (subsubDer.getTag() != DerValue.tag_SequenceOf) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
Vector<Ticket> v = new Vector<Ticket>();
|
||||
while (subsubDer.getData().available() > 0) {
|
||||
v.addElement(new Ticket(subsubDer.getData().getDerValue()));
|
||||
}
|
||||
if (v.size() > 0) {
|
||||
tickets = new Ticket[v.size()];
|
||||
v.copyInto(tickets);
|
||||
}
|
||||
} else {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
encPart = EncryptedData.parse(der.getData(), (byte) 0x03, false);
|
||||
|
||||
if (der.getData().available() > 0) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes an KRBCred object.
|
||||
* @return the data of encoded EncAPRepPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
/**
|
||||
* Encodes an KRBCred object.
|
||||
* @return the data of encoded EncAPRepPart object.
|
||||
* @exception Asn1Exception if an error occurs while decoding an ASN1 encoded data.
|
||||
* @exception IOException if an I/O error occurs while reading encoded data.
|
||||
*/
|
||||
public byte[] asn1Encode() throws Asn1Exception, IOException {
|
||||
DerOutputStream temp, bytes, out;
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(pvno));
|
||||
out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), temp);
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x00), temp);
|
||||
temp = new DerOutputStream();
|
||||
for (int i = 0; i < tickets.length; i++) {
|
||||
temp.write(tickets[i].asn1Encode());
|
||||
}
|
||||
temp.putInteger(BigInteger.valueOf(msgType));
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x01), temp);
|
||||
temp = new DerOutputStream();
|
||||
for (int i = 0; i < tickets.length; i++) {
|
||||
temp.write(tickets[i].asn1Encode());
|
||||
}
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.tag_SequenceOf, temp);
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), bytes);
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), encPart.asn1Encode());
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x02), bytes);
|
||||
out.write(DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
true, (byte) 0x03), encPart.asn1Encode());
|
||||
bytes = new DerOutputStream();
|
||||
bytes.write(DerValue.tag_Sequence, out);
|
||||
out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_APPLICATION, true, (byte)0x16), bytes);
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
out = new DerOutputStream();
|
||||
out.write(DerValue.createTag(DerValue.TAG_APPLICATION,
|
||||
true, (byte) 0x16), bytes);
|
||||
return out.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ public class KrbCredInfo {
|
||||
* @exception RealmException if an error occurs while parsing a Realm object.
|
||||
*/
|
||||
public KrbCredInfo(DerValue encoding)
|
||||
throws Asn1Exception, IOException, RealmException{
|
||||
throws Asn1Exception, IOException, RealmException{
|
||||
if (encoding.getTag() != DerValue.tag_Sequence) {
|
||||
throw new Asn1Exception(Krb5.ASN1_BAD_ID);
|
||||
}
|
||||
@ -160,25 +160,25 @@ public class KrbCredInfo {
|
||||
Vector<DerValue> v = new Vector<DerValue> ();
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), key.asn1Encode()));
|
||||
if (prealm != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), prealm.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), prealm.asn1Encode()));
|
||||
if (pname != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), pname.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x02), pname.asn1Encode()));
|
||||
if (flags != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), flags.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x03), flags.asn1Encode()));
|
||||
if (authtime != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), authtime.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x04), authtime.asn1Encode()));
|
||||
if (starttime != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x05), starttime.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x05), starttime.asn1Encode()));
|
||||
if (endtime != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x06), endtime.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x06), endtime.asn1Encode()));
|
||||
if (renewTill != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x07), renewTill.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x07), renewTill.asn1Encode()));
|
||||
if (srealm != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x08), srealm.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x08), srealm.asn1Encode()));
|
||||
if (sname != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x09), sname.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x09), sname.asn1Encode()));
|
||||
if (caddr != null)
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x0A), caddr.asn1Encode()));
|
||||
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x0A), caddr.asn1Encode()));
|
||||
DerValue der[] = new DerValue[v.size()];
|
||||
v.copyInto(der);
|
||||
DerOutputStream out = new DerOutputStream();
|
||||
|
@ -34,168 +34,171 @@ import sun.security.krb5.*;
|
||||
import sun.security.krb5.internal.*;
|
||||
|
||||
public class Credentials {
|
||||
PrincipalName cname;
|
||||
Realm crealm;
|
||||
|
||||
PrincipalName cname;
|
||||
Realm crealm;
|
||||
PrincipalName sname;
|
||||
Realm srealm;
|
||||
EncryptionKey key;
|
||||
KerberosTime authtime;
|
||||
KerberosTime starttime;//optional
|
||||
KerberosTime endtime;
|
||||
KerberosTime renewTill; //optional
|
||||
HostAddresses caddr; //optional; for proxied tickets only
|
||||
Realm srealm;
|
||||
EncryptionKey key;
|
||||
KerberosTime authtime;
|
||||
KerberosTime starttime;//optional
|
||||
KerberosTime endtime;
|
||||
KerberosTime renewTill; //optional
|
||||
HostAddresses caddr; //optional; for proxied tickets only
|
||||
AuthorizationData authorizationData; //optional, not being actually used
|
||||
public boolean isEncInSKey; // true if ticket is encrypted in another ticket's skey
|
||||
TicketFlags flags;
|
||||
TicketFlags flags;
|
||||
Ticket ticket;
|
||||
Ticket secondTicket; //optional
|
||||
private boolean DEBUG = Krb5.DEBUG;
|
||||
Ticket secondTicket; //optional
|
||||
private boolean DEBUG = Krb5.DEBUG;
|
||||
|
||||
public Credentials(
|
||||
PrincipalName new_cname,
|
||||
PrincipalName new_sname,
|
||||
EncryptionKey new_key,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
boolean new_isEncInSKey,
|
||||
TicketFlags new_flags,
|
||||
HostAddresses new_caddr,
|
||||
AuthorizationData new_authData,
|
||||
Ticket new_ticket,
|
||||
Ticket new_secondTicket) {
|
||||
cname = (PrincipalName)new_cname.clone();
|
||||
if (new_cname.getRealm() != null)
|
||||
crealm = (Realm)new_cname.getRealm().clone();
|
||||
|
||||
sname = (PrincipalName)new_sname.clone();
|
||||
if (new_sname.getRealm() != null)
|
||||
srealm = (Realm)new_sname.getRealm().clone();
|
||||
|
||||
key = (EncryptionKey)new_key.clone();
|
||||
|
||||
authtime = (KerberosTime)new_authtime.clone();
|
||||
starttime = (KerberosTime)new_starttime.clone();
|
||||
endtime = (KerberosTime)new_endtime.clone();
|
||||
renewTill = (KerberosTime)new_renewTill.clone();
|
||||
if (new_caddr != null)
|
||||
caddr = (HostAddresses)new_caddr.clone();
|
||||
if (new_authData != null) {
|
||||
authorizationData
|
||||
= (AuthorizationData)new_authData.clone();
|
||||
}
|
||||
|
||||
isEncInSKey = new_isEncInSKey;
|
||||
flags = (TicketFlags)new_flags.clone();
|
||||
ticket = (Ticket)(new_ticket.clone());
|
||||
if (new_secondTicket != null)
|
||||
secondTicket = (Ticket)new_secondTicket.clone();
|
||||
public Credentials(
|
||||
PrincipalName new_cname,
|
||||
PrincipalName new_sname,
|
||||
EncryptionKey new_key,
|
||||
KerberosTime new_authtime,
|
||||
KerberosTime new_starttime,
|
||||
KerberosTime new_endtime,
|
||||
KerberosTime new_renewTill,
|
||||
boolean new_isEncInSKey,
|
||||
TicketFlags new_flags,
|
||||
HostAddresses new_caddr,
|
||||
AuthorizationData new_authData,
|
||||
Ticket new_ticket,
|
||||
Ticket new_secondTicket) {
|
||||
cname = (PrincipalName) new_cname.clone();
|
||||
if (new_cname.getRealm() != null) {
|
||||
crealm = (Realm) new_cname.getRealm().clone();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Credentials(
|
||||
KDCRep kdcRep,
|
||||
Ticket new_secondTicket,
|
||||
AuthorizationData new_authorizationData,
|
||||
boolean new_isEncInSKey
|
||||
) {
|
||||
if (kdcRep.encKDCRepPart == null) //can't store while encrypted
|
||||
return;
|
||||
crealm = (Realm)kdcRep.crealm.clone();
|
||||
cname = (PrincipalName)kdcRep.cname.clone();
|
||||
ticket = (Ticket)kdcRep.ticket.clone();
|
||||
key = (EncryptionKey)kdcRep.encKDCRepPart.key.clone();
|
||||
flags = (TicketFlags)kdcRep.encKDCRepPart.flags.clone();
|
||||
authtime = (KerberosTime)kdcRep.encKDCRepPart.authtime.clone();
|
||||
starttime = (KerberosTime)kdcRep.encKDCRepPart.starttime.clone();
|
||||
endtime = (KerberosTime)kdcRep.encKDCRepPart.endtime.clone();
|
||||
renewTill = (KerberosTime)kdcRep.encKDCRepPart.renewTill.clone();
|
||||
srealm = (Realm)kdcRep.encKDCRepPart.srealm.clone();
|
||||
sname = (PrincipalName)kdcRep.encKDCRepPart.sname.clone();
|
||||
caddr = (HostAddresses)kdcRep.encKDCRepPart.caddr.clone();
|
||||
secondTicket = (Ticket)new_secondTicket.clone();
|
||||
authorizationData =
|
||||
(AuthorizationData)new_authorizationData.clone();
|
||||
isEncInSKey = new_isEncInSKey;
|
||||
sname = (PrincipalName) new_sname.clone();
|
||||
if (new_sname.getRealm() != null) {
|
||||
srealm = (Realm) new_sname.getRealm().clone();
|
||||
}
|
||||
|
||||
public Credentials(KDCRep kdcRep) {
|
||||
this(kdcRep, null);
|
||||
key = (EncryptionKey) new_key.clone();
|
||||
|
||||
authtime = (KerberosTime) new_authtime.clone();
|
||||
starttime = (KerberosTime) new_starttime.clone();
|
||||
endtime = (KerberosTime) new_endtime.clone();
|
||||
renewTill = (KerberosTime) new_renewTill.clone();
|
||||
if (new_caddr != null) {
|
||||
caddr = (HostAddresses) new_caddr.clone();
|
||||
}
|
||||
if (new_authData != null) {
|
||||
authorizationData = (AuthorizationData) new_authData.clone();
|
||||
}
|
||||
|
||||
public Credentials(KDCRep kdcRep, Ticket new_ticket) {
|
||||
sname = (PrincipalName)kdcRep.encKDCRepPart.sname.clone();
|
||||
srealm = (Realm)kdcRep.encKDCRepPart.srealm.clone();
|
||||
try {
|
||||
sname.setRealm(srealm);
|
||||
}
|
||||
catch (RealmException e) {
|
||||
}
|
||||
cname = (PrincipalName)kdcRep.cname.clone();
|
||||
crealm = (Realm)kdcRep.crealm.clone();
|
||||
try {
|
||||
cname.setRealm(crealm);
|
||||
}
|
||||
catch (RealmException e) {
|
||||
}
|
||||
key = (EncryptionKey)kdcRep.encKDCRepPart.key.clone();
|
||||
authtime = (KerberosTime)kdcRep.encKDCRepPart.authtime.clone();
|
||||
if (kdcRep.encKDCRepPart.starttime != null) {
|
||||
starttime = (KerberosTime)kdcRep.encKDCRepPart.starttime.clone();
|
||||
}
|
||||
else starttime = null;
|
||||
endtime = (KerberosTime)kdcRep.encKDCRepPart.endtime.clone();
|
||||
if (kdcRep.encKDCRepPart.renewTill != null) {
|
||||
renewTill = (KerberosTime)kdcRep.encKDCRepPart.renewTill.clone();
|
||||
}
|
||||
else renewTill = null;
|
||||
// if (kdcRep.msgType == Krb5.KRB_AS_REP) {
|
||||
// isEncInSKey = false;
|
||||
// secondTicket = null;
|
||||
// }
|
||||
flags = kdcRep.encKDCRepPart.flags;
|
||||
if (kdcRep.encKDCRepPart.caddr != null)
|
||||
caddr = (HostAddresses)kdcRep.encKDCRepPart.caddr.clone();
|
||||
else caddr = null;
|
||||
ticket = (Ticket)kdcRep.ticket.clone();
|
||||
if (new_ticket != null) {
|
||||
secondTicket = (Ticket)new_ticket.clone();
|
||||
isEncInSKey = true;
|
||||
} else {
|
||||
secondTicket = null;
|
||||
isEncInSKey = false;
|
||||
}
|
||||
isEncInSKey = new_isEncInSKey;
|
||||
flags = (TicketFlags) new_flags.clone();
|
||||
ticket = (Ticket) (new_ticket.clone());
|
||||
if (new_secondTicket != null) {
|
||||
secondTicket = (Ticket) new_secondTicket.clone();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this credential is expired
|
||||
*/
|
||||
public boolean isValid() {
|
||||
boolean valid = true;
|
||||
if (endtime.getTime() < System.currentTimeMillis()) {
|
||||
valid = false;
|
||||
}
|
||||
else if ((starttime.getTime() > System.currentTimeMillis())
|
||||
|| ((starttime == null) && (authtime.getTime() > System.currentTimeMillis())))
|
||||
{
|
||||
valid = false;
|
||||
}
|
||||
return valid;
|
||||
public Credentials(
|
||||
KDCRep kdcRep,
|
||||
Ticket new_secondTicket,
|
||||
AuthorizationData new_authorizationData,
|
||||
boolean new_isEncInSKey) {
|
||||
if (kdcRep.encKDCRepPart == null) //can't store while encrypted
|
||||
{
|
||||
return;
|
||||
}
|
||||
crealm = (Realm) kdcRep.crealm.clone();
|
||||
cname = (PrincipalName) kdcRep.cname.clone();
|
||||
ticket = (Ticket) kdcRep.ticket.clone();
|
||||
key = (EncryptionKey) kdcRep.encKDCRepPart.key.clone();
|
||||
flags = (TicketFlags) kdcRep.encKDCRepPart.flags.clone();
|
||||
authtime = (KerberosTime) kdcRep.encKDCRepPart.authtime.clone();
|
||||
starttime = (KerberosTime) kdcRep.encKDCRepPart.starttime.clone();
|
||||
endtime = (KerberosTime) kdcRep.encKDCRepPart.endtime.clone();
|
||||
renewTill = (KerberosTime) kdcRep.encKDCRepPart.renewTill.clone();
|
||||
srealm = (Realm) kdcRep.encKDCRepPart.srealm.clone();
|
||||
sname = (PrincipalName) kdcRep.encKDCRepPart.sname.clone();
|
||||
caddr = (HostAddresses) kdcRep.encKDCRepPart.caddr.clone();
|
||||
secondTicket = (Ticket) new_secondTicket.clone();
|
||||
authorizationData =
|
||||
(AuthorizationData) new_authorizationData.clone();
|
||||
isEncInSKey = new_isEncInSKey;
|
||||
}
|
||||
|
||||
public PrincipalName getServicePrincipal() throws RealmException{
|
||||
if (sname.getRealm() == null) {
|
||||
sname.setRealm(srealm);
|
||||
}
|
||||
return sname;
|
||||
}
|
||||
public Credentials(KDCRep kdcRep) {
|
||||
this(kdcRep, null);
|
||||
}
|
||||
|
||||
public sun.security.krb5.Credentials setKrbCreds() {
|
||||
return new sun.security.krb5.Credentials(ticket,
|
||||
cname, sname, key, flags, authtime, starttime, endtime, renewTill, caddr);
|
||||
public Credentials(KDCRep kdcRep, Ticket new_ticket) {
|
||||
sname = (PrincipalName) kdcRep.encKDCRepPart.sname.clone();
|
||||
srealm = (Realm) kdcRep.encKDCRepPart.srealm.clone();
|
||||
try {
|
||||
sname.setRealm(srealm);
|
||||
} catch (RealmException e) {
|
||||
}
|
||||
cname = (PrincipalName) kdcRep.cname.clone();
|
||||
crealm = (Realm) kdcRep.crealm.clone();
|
||||
try {
|
||||
cname.setRealm(crealm);
|
||||
} catch (RealmException e) {
|
||||
}
|
||||
key = (EncryptionKey) kdcRep.encKDCRepPart.key.clone();
|
||||
authtime = (KerberosTime) kdcRep.encKDCRepPart.authtime.clone();
|
||||
if (kdcRep.encKDCRepPart.starttime != null) {
|
||||
starttime = (KerberosTime) kdcRep.encKDCRepPart.starttime.clone();
|
||||
} else {
|
||||
starttime = null;
|
||||
}
|
||||
endtime = (KerberosTime) kdcRep.encKDCRepPart.endtime.clone();
|
||||
if (kdcRep.encKDCRepPart.renewTill != null) {
|
||||
renewTill = (KerberosTime) kdcRep.encKDCRepPart.renewTill.clone();
|
||||
} else {
|
||||
renewTill = null;
|
||||
}
|
||||
// if (kdcRep.msgType == Krb5.KRB_AS_REP) {
|
||||
// isEncInSKey = false;
|
||||
// secondTicket = null;
|
||||
// }
|
||||
flags = kdcRep.encKDCRepPart.flags;
|
||||
if (kdcRep.encKDCRepPart.caddr != null) {
|
||||
caddr = (HostAddresses) kdcRep.encKDCRepPart.caddr.clone();
|
||||
} else {
|
||||
caddr = null;
|
||||
}
|
||||
ticket = (Ticket) kdcRep.ticket.clone();
|
||||
if (new_ticket != null) {
|
||||
secondTicket = (Ticket) new_ticket.clone();
|
||||
isEncInSKey = true;
|
||||
} else {
|
||||
secondTicket = null;
|
||||
isEncInSKey = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this credential is expired
|
||||
*/
|
||||
public boolean isValid() {
|
||||
boolean valid = true;
|
||||
if (endtime.getTime() < System.currentTimeMillis()) {
|
||||
valid = false;
|
||||
} else if ((starttime.getTime() > System.currentTimeMillis())
|
||||
|| ((starttime == null) && (authtime.getTime() > System.currentTimeMillis()))) {
|
||||
valid = false;
|
||||
}
|
||||
return valid;
|
||||
}
|
||||
|
||||
public PrincipalName getServicePrincipal() throws RealmException {
|
||||
if (sname.getRealm() == null) {
|
||||
sname.setRealm(srealm);
|
||||
}
|
||||
return sname;
|
||||
}
|
||||
|
||||
public sun.security.krb5.Credentials setKrbCreds() {
|
||||
return new sun.security.krb5.Credentials(ticket,
|
||||
cname, sname, key, flags, authtime, starttime, endtime, renewTill, caddr);
|
||||
}
|
||||
|
||||
public KerberosTime getAuthTime() {
|
||||
return authtime;
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user