// Copyright 1997 The Open Group Research Institute.  All rights reserved.

package krb4.lib;

import java.io.*;
import java.util.*;

public class Krb4Creds {
	public byte[] sessionKey;
	public String sname;
	public String sinst;
	public String srealm;
	public long lifetime;
	public byte keyVersion;
	public byte[] encTicket;
	public Krb4Ticket ticket;
	public long timestamp;

	private Krb4Creds() {
	}

	public Krb4Creds(byte[] data, boolean littleEndian) throws Krb4Exception {
		Krb4Encode ref = new Krb4Encode(data);
		ref.setByteOrder(littleEndian);
		sessionKey = ref.getBytes(8);
		sname = ref.getString();
		sinst = ref.getString();
		srealm = ref.getString();
		lifetime = (long)ref.getUnsignedByte() * 5L * 60L * 1000L;
		keyVersion = ref.getByte();
		int encTicketLength = ref.getUnsignedByte();
		encTicket = ref.getBytes(encTicketLength);
		timestamp = (long)ref.getInt() * 1000L;
	}

	public static Krb4Creds fromFile(Krb4Encode ref)
		throws Krb4Exception {
		Krb4Creds creds = new Krb4Creds();
		creds.sname = ref.getString();
		creds.sinst = ref.getString();
		creds.srealm = ref.getString();
		creds.sessionKey = ref.getBytes(8);
		creds.lifetime = (long)ref.getInt() * 5L * 60L * 1000L;
		creds.keyVersion = (byte)ref.getInt();
		int encTicketLength = ref.getInt();
		creds.encTicket = ref.getBytes(encTicketLength);
		creds.timestamp = (long)ref.getInt() * 1000L;
		return creds;
	}

	public String toString() {
		StringBuffer str = new StringBuffer();
		Date issued = new Date(timestamp);
		Date expires = new Date(issued.getTime() + lifetime);
		str.append(issued.toString().substring(4, 19));
		str.append("  ");
		str.append(expires.toString().substring(4, 19));
		str.append("  ");
		str.append(sname);
		if (sinst != null && sinst.length() > 0) {
			str.append(".");
			str.append(sinst);
		}
		str.append("@");
		str.append(srealm);
		return str.toString();
	}

	public void print() {
		System.out.println(this);
	}

	public byte[] toBytes(boolean hostLittleEndian)
		throws Krb4Exception, IOException {
		ByteArrayOutputStream o = new ByteArrayOutputStream();
		o.write(Krb4Encode.toBytes(sname));
		o.write(Krb4Encode.toBytes(sinst));
		o.write(Krb4Encode.toBytes(srealm));
		o.write(sessionKey);
		o.write(Krb4Encode.toBytes((int)(lifetime / (1000L * 60L * 5L)),
			hostLittleEndian));
		o.write(Krb4Encode.toBytes((int)keyVersion,
			hostLittleEndian));
		o.write(Krb4Encode.toBytes((int)encTicket.length,
			hostLittleEndian));
		o.write(encTicket);
		o.write(Krb4Encode.toBytes((int)(timestamp / 1000L),
			hostLittleEndian));
		return o.toByteArray();
	}
}
