001/*
002 * jPOS Project [http://jpos.org]
003 * Copyright (C) 2000-2026 jPOS Software SRL
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017 */
018
019package org.jpos.tlv;
020
021/**
022 * BER-TLV tag class encoded in bits 7–8 of the first tag byte.
023 */
024public enum TLVClass {
025    /** Class bits {@code 00} — universally defined tag. */
026    UNIVERSAL(0),
027    /** Class bits {@code 01} — application-specific tag. */
028    APPLICATION(1 << 6),
029    /** Class bits {@code 10} — context-specific tag (most EMV tags). */
030    CONTEXT_SPECIFIC(2 << 6),
031    /** Class bits {@code 11} — private-use tag. */
032    PRIVATE(3 << 6);
033
034    int value;
035
036    TLVClass(int value) {
037        this.value = value;
038    }
039
040    /**
041     * Resolves the {@link TLVClass} encoded in the top two bits of {@code firstByte}.
042     *
043     * @param firstByte the first byte of a BER-TLV tag
044     * @return the matching class, defaulting to {@link #UNIVERSAL}
045     */
046    public static TLVClass valueOf (byte firstByte) {
047        int i = (int) firstByte & 0xC0;
048        for (TLVClass c : values()) {
049            if (c.value == i)
050                return c;
051        }
052        return UNIVERSAL;
053    }
054}