|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.security.krb5.internal; |
|
|
|
import sun.security.util.*; |
|
import sun.security.krb5.Asn1Exception; |
|
import java.io.IOException; |
|
import sun.security.krb5.internal.util.KerberosString; |
|
|
|
/** |
|
* Implements the ASN.1 ETYPE-INFO-ENTRY type. |
|
* |
|
* ETYPE-INFO2-ENTRY ::= SEQUENCE { |
|
* etype [0] Int32, |
|
* salt [1] KerberosString OPTIONAL, |
|
* s2kparams [2] OCTET STRING OPTIONAL |
|
* } |
|
* |
|
* @author Seema Malkani |
|
*/ |
|
|
|
public class ETypeInfo2 { |
|
|
|
private int etype; |
|
private String saltStr = null; |
|
private byte[] s2kparams = null; |
|
|
|
private static final byte TAG_TYPE = 0; |
|
private static final byte TAG_VALUE1 = 1; |
|
private static final byte TAG_VALUE2 = 2; |
|
|
|
private ETypeInfo2() { |
|
} |
|
|
|
public ETypeInfo2(int etype, String salt, byte[] s2kparams) { |
|
this.etype = etype; |
|
this.saltStr = salt; |
|
if (s2kparams != null) { |
|
this.s2kparams = s2kparams.clone(); |
|
} |
|
} |
|
|
|
public Object clone() { |
|
ETypeInfo2 etypeInfo2 = new ETypeInfo2(); |
|
etypeInfo2.etype = etype; |
|
etypeInfo2.saltStr = saltStr; |
|
if (s2kparams != null) { |
|
etypeInfo2.s2kparams = new byte[s2kparams.length]; |
|
System.arraycopy(s2kparams, 0, etypeInfo2.s2kparams, |
|
0, s2kparams.length); |
|
} |
|
return etypeInfo2; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public ETypeInfo2(DerValue encoding) throws Asn1Exception, IOException { |
|
DerValue der = null; |
|
|
|
if (encoding.getTag() != DerValue.tag_Sequence) { |
|
throw new Asn1Exception(Krb5.ASN1_BAD_ID); |
|
} |
|
|
|
|
|
der = encoding.getData().getDerValue(); |
|
if ((der.getTag() & 0x1F) == 0x00) { |
|
this.etype = der.getData().getBigInteger().intValue(); |
|
} |
|
else |
|
throw new Asn1Exception(Krb5.ASN1_BAD_ID); |
|
|
|
|
|
if (encoding.getData().available() > 0) { |
|
if ((encoding.getData().peekByte() & 0x1F) == 0x01) { |
|
der = encoding.getData().getDerValue(); |
|
this.saltStr = new KerberosString( |
|
der.getData().getDerValue()).toString(); |
|
} |
|
} |
|
|
|
|
|
if (encoding.getData().available() > 0) { |
|
if ((encoding.getData().peekByte() & 0x1F) == 0x02) { |
|
der = encoding.getData().getDerValue(); |
|
this.s2kparams = der.getData().getOctetString(); |
|
} |
|
} |
|
|
|
if (encoding.getData().available() > 0) |
|
throw new Asn1Exception(Krb5.ASN1_BAD_ID); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public byte[] asn1Encode() throws Asn1Exception, IOException { |
|
|
|
DerOutputStream bytes = new DerOutputStream(); |
|
DerOutputStream temp = new DerOutputStream(); |
|
|
|
temp.putInteger(etype); |
|
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, |
|
TAG_TYPE), temp); |
|
|
|
if (saltStr != null) { |
|
temp = new DerOutputStream(); |
|
temp.putDerValue(new KerberosString(saltStr).toDerValue()); |
|
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, |
|
TAG_VALUE1), temp); |
|
} |
|
if (s2kparams != null) { |
|
temp = new DerOutputStream(); |
|
temp.putOctetString(s2kparams); |
|
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, |
|
TAG_VALUE2), temp); |
|
} |
|
|
|
temp = new DerOutputStream(); |
|
temp.write(DerValue.tag_Sequence, bytes); |
|
return temp.toByteArray(); |
|
} |
|
|
|
|
|
public int getEType() { |
|
return etype; |
|
} |
|
|
|
public String getSalt() { |
|
return saltStr; |
|
} |
|
|
|
public byte[] getParams() { |
|
return ((s2kparams == null) ? null : s2kparams.clone()); |
|
} |
|
|
|
} |