/*
 * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 */

package sun.security.krb5.internal.crypto;

/**
 * Key usages used for key derivation in Kerberos.
 */
public class KeyUsage {

    private KeyUsage() {
    }

    public static final int KU_UNKNOWN = 0;                     // Cannot be 0

    // Defined in draft-yu-krb-wg-kerberos-extensions-00.txt, Appendix A
    public static final int KU_PA_ENC_TS = 1;                   // KrbAsReq
    public static final int KU_TICKET = 2;                      // KrbApReq (ticket)
    public static final int KU_ENC_AS_REP_PART = 3;             // KrbAsRep
    public static final int KU_TGS_REQ_AUTH_DATA_SESSKEY= 4;    // KrbTgsReq
    public static final int KU_TGS_REQ_AUTH_DATA_SUBKEY = 5;    // KrbTgsReq
    public static final int KU_PA_TGS_REQ_CKSUM = 6;            // KrbTgsReq
    public static final int KU_PA_TGS_REQ_AUTHENTICATOR = 7;    // KrbApReq
    public static final int KU_ENC_TGS_REP_PART_SESSKEY = 8;    // KrbTgsRep
    public static final int KU_ENC_TGS_REP_PART_SUBKEY = 9;     // KrbTgsRep
    public static final int KU_AUTHENTICATOR_CKSUM = 10;
    public static final int KU_AP_REQ_AUTHENTICATOR = 11;       // KrbApReq
    public static final int KU_ENC_AP_REP_PART = 12;            // KrbApRep
    public static final int KU_ENC_KRB_PRIV_PART = 13;          // KrbPriv
    public static final int KU_ENC_KRB_CRED_PART = 14;          // KrbCred
    public static final int KU_KRB_SAFE_CKSUM = 15;             // KrbSafe
    public static final int KU_AD_KDC_ISSUED_CKSUM = 19;

    public static final boolean isValid(int usage) {
        return usage >= 0;
    }
}
