package org.apache.kerberos.kerb.codec; import org.apache.haox.asn1.LimitedByteBuffer; import org.apache.haox.asn1.type.AbstractAsn1Type; import org.apache.haox.asn1.type.Asn1Type; import org.apache.kerberos.kerb.KrbException; import org.apache.kerberos.kerb.spec.ap.ApReq; import org.apache.kerberos.kerb.spec.common.KrbMessage; import org.apache.kerberos.kerb.spec.common.KrbMessageType; import org.apache.kerberos.kerb.spec.kdc.AsRep; import org.apache.kerberos.kerb.spec.kdc.AsReq; import org.apache.kerberos.kerb.spec.kdc.TgsRep; import org.apache.kerberos.kerb.spec.kdc.TgsReq; import java.io.IOException; import java.nio.ByteBuffer; public class KrbCodec { public static byte[] encode(Asn1Type krbObj) throws KrbException { return krbObj.encode(); } public static <T extends Asn1Type> T decode(byte[] content, Class<T> krbType) throws KrbException { return decode(ByteBuffer.wrap(content), krbType); } public static <T extends Asn1Type> T decode(ByteBuffer content, Class<T> krbType) throws KrbException { Asn1Type implObj = null; try { implObj = krbType.newInstance(); } catch (Exception e) { throw new KrbException("Decoding failed", e); } try { implObj.decode(content); } catch (IOException e) { throw new KrbException("Decoding failed", e); } return (T) implObj; } public static KrbMessage decodeMessage(ByteBuffer byteBuffer) throws IOException { LimitedByteBuffer limitedBuffer = new LimitedByteBuffer(byteBuffer); int tag = AbstractAsn1Type.readTag(limitedBuffer); int tagNo = AbstractAsn1Type.readTagNo(limitedBuffer, tag); int length = AbstractAsn1Type.readLength(limitedBuffer); LimitedByteBuffer valueBuffer = new LimitedByteBuffer(limitedBuffer, length); KrbMessage msg = null; KrbMessageType msgType = KrbMessageType.fromValue(tagNo); if (msgType == KrbMessageType.TGS_REQ) { msg = new TgsReq(); } else if (msgType == KrbMessageType.AS_REP) { msg = new AsRep(); } else if (msgType == KrbMessageType.AS_REQ) { msg = new AsReq(); } else if (msgType == KrbMessageType.TGS_REP) { msg = new TgsRep(); } else if (msgType == KrbMessageType.AP_REQ) { msg = new ApReq(); } else if (msgType == KrbMessageType.AP_REP) { msg = new ApReq(); } else { throw new IOException("To be supported krb message type with tag: " + tag); } msg.decode(tag, tagNo, valueBuffer); return msg; } }