// Copyright 1997 The Open Group Research Institute.  All rights reserved.

package krb5.lib;

import krb5.lib.ccache.*;

/**
 * KRB RD safe
 */
public class KrbRdSafe {

	/**
	 * User data
	 */
	byte[] userData;

	/**
	 * Class constructor
	 *
	 * @param msg is of type byte[]
	 * @param creds is of type Credentials
	 * @param subKey is of type EncryptionKey
	 * @param seqNumber is of type SeqNumber
	 * @param saddr is of type HostAddress
	 * @param raddr is of type HostAddress
	 * @param timestampRequired is of type boolean
	 * @param seqNumberRequired is of type boolean
	 * @exception KrbException an exception
	 * @see krb5.lib.Credentials
	 * @see krb5.lib.EncryptionKey
	 * @see krb5.lib.SeqNumber
	 * @see krb5.lib.HostAddress
	 * @see krb5.lib.KrbException
	 */
	public KrbRdSafe(
		byte[] msg,
		Credentials creds,
		EncryptionKey subKey,
		SeqNumber seqNumber,
		HostAddress saddr,
		HostAddress raddr,
		boolean timestampRequired,
		boolean seqNumberRequired
	)  throws KrbException {

		KRBSafe krb_safe = new KRBSafe(msg);

		EncryptionKey reqKey = null;
		if (subKey != null)
			reqKey = subKey;
		else
			reqKey = creds.key;

		userData = ApiUtil.rd_safe(
			krb_safe,
			reqKey,
			seqNumber,
			saddr,
			raddr,
			timestampRequired,
			seqNumberRequired,
			creds.cname,
			creds.crealm
		);
	}

	/**
	 * Class constructor
	 *
	 * @param msg is of type byte[]
	 * @param creds is of type KrbCreds
	 * @param subKey is of type EncryptionKey
	 * @param seqNumber is of type SeqNumber
	 * @param saddr is of type HostAddress
	 * @param raddr is of type HostAddress
	 * @param timestampRequired is of type boolean
	 * @param seqNumberRequired is of type boolean
	 * @exception KrbException an exception
	 * @see krb5.lib.KrbCreds
	 * @see krb5.lib.EncryptionKey
	 * @see krb5.lib.SeqNumber
	 * @see krb5.lib.HostAddress
	 * @see krb5.lib.KrbException
	 */
	public KrbRdSafe(
		byte[] msg,
		KrbCreds creds,
		EncryptionKey subKey,
		SeqNumber seqNumber,
		HostAddress saddr,
		HostAddress raddr,
		boolean timestampRequired,
		boolean seqNumberRequired
	)  throws KrbException {

		KRBSafe krb_safe = new KRBSafe(msg);

		EncryptionKey reqKey = null;
		if (subKey != null)
			reqKey = subKey;
		else
			reqKey = creds.key;

		userData = ApiUtil.rd_safe(
			krb_safe,
			reqKey,
			seqNumber,
			saddr,
			raddr,
			timestampRequired,
			seqNumberRequired,
			creds.client,
			creds.client.getRealm()
		);
	}

	/**
	 * Returns user data
	 *
	 * @return byte[] is a result
	 */
	public byte[] data() {
		return userData;
	}
}