    001package org.apache.commons.ssl.asn1;
    002
    003import java.io.IOException;
    004import java.math.BigInteger;
    005
    006public class DEREnumerated
    007    extends ASN1Object {
    008    byte[] bytes;
    009
    010    /**
    011     * return an integer from the passed in object
    012     *
    013     * @throws IllegalArgumentException if the object cannot be converted.
    014     */
    015    public static DEREnumerated getInstance(
    016        Object obj) {
    017        if (obj == null || obj instanceof DEREnumerated) {
    018            return (DEREnumerated) obj;
    019        }
    020
    021        if (obj instanceof ASN1OctetString) {
    022            return new DEREnumerated(((ASN1OctetString) obj).getOctets());
    023        }
    024
    025        if (obj instanceof ASN1TaggedObject) {
    026            return getInstance(((ASN1TaggedObject) obj).getObject());
    027        }
    028
    029        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
    030    }
    031
    032    /**
    033     * return an Enumerated from a tagged object.
    034     *
    035     * @param obj      the tagged object holding the object we want
    036     * @param explicit true if the object is meant to be explicitly
    037     *                 tagged false otherwise.
    038     * @throws IllegalArgumentException if the tagged object cannot
    039     *                                  be converted.
    040     */
    041    public static DEREnumerated getInstance(
    042        ASN1TaggedObject obj,
    043        boolean explicit) {
    044        return getInstance(obj.getObject());
    045    }
    046
    047    public DEREnumerated(
    048        int value) {
    049        bytes = BigInteger.valueOf(value).toByteArray();
    050    }
    051
    052    public DEREnumerated(
    053        BigInteger value) {
    054        bytes = value.toByteArray();
    055    }
    056
    057    public DEREnumerated(
    058        byte[] bytes) {
    059        this.bytes = bytes;
    060    }
    061
    062    public BigInteger getValue() {
    063        return new BigInteger(bytes);
    064    }
    065
    066    void encode(
    067        DEROutputStream out)
    068        throws IOException {
    069        out.writeEncoded(ENUMERATED, bytes);
    070    }
    071
    072    boolean asn1Equals(
    073        DERObject o) {
    074        if (!(o instanceof DEREnumerated)) {
    075            return false;
    076        }
    077
    078        DEREnumerated other = (DEREnumerated) o;
    079
    080        if (bytes.length != other.bytes.length) {
    081            return false;
    082        }
    083
    084        for (int i = 0; i != bytes.length; i++) {
    085            if (bytes[i] != other.bytes[i]) {
    086                return false;
    087            }
    088        }
    089
    090        return true;
    091    }
    092
    093    public int hashCode() {
    094        return this.getValue().hashCode();
    095    }
    096}