|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
/* |
|
* (C) Copyright IBM Corp. 1999 All Rights Reserved. |
|
* Copyright 1997 The Open Group Research Institute. All rights reserved. |
|
*/ |
|
|
|
package sun.security.krb5.internal; |
|
|
|
import sun.security.krb5.*; |
|
import sun.security.util.*; |
|
import java.util.Vector; |
|
import java.io.IOException; |
|
import java.math.BigInteger; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class Authenticator { |
|
|
|
public int authenticator_vno; |
|
public PrincipalName cname; |
|
Checksum cksum; |
|
public int cusec; |
|
public KerberosTime ctime; |
|
EncryptionKey subKey; |
|
Integer seqNumber; |
|
public AuthorizationData authorizationData; |
|
|
|
public Authenticator( |
|
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; |
|
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(DerValue encoding) |
|
throws Asn1Exception, IOException, KrbApErrException, RealmException { |
|
init(encoding); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
private void init(DerValue encoding) |
|
throws Asn1Exception, IOException, KrbApErrException, RealmException { |
|
DerValue der, subDer; |
|
//may not be the correct error code for a tag |
|
|
|
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) { |
|
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) { |
|
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADVERSION); |
|
} |
|
Realm crealm = Realm.parse(der.getData(), (byte) 0x01, false); |
|
cname = PrincipalName.parse(der.getData(), (byte) 0x02, false, crealm); |
|
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) == (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); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public byte[] asn1Encode() throws Asn1Exception, IOException { |
|
Vector<DerValue> v = new Vector<>(); |
|
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), cname.getRealm().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(); |
|
|
|
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; |
|
} |
|
|
|
public final Integer getSeqNumber() { |
|
return seqNumber; |
|
} |
|
|
|
public final EncryptionKey getSubKey() { |
|
return subKey; |
|
} |
|
} |