// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.asn1;

import org.bouncycastle.util.Strings;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.util.Arrays;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.IOException;

public abstract class ASN1OctetString extends ASN1Primitive implements ASN1OctetStringParser
{
    static final ASN1UniversalType TYPE;
    static final byte[] EMPTY_OCTETS;
    byte[] string;
    
    public static ASN1OctetString getInstance(final ASN1TaggedObject asn1TaggedObject, final boolean b) {
        return (ASN1OctetString)ASN1OctetString.TYPE.getContextTagged(asn1TaggedObject, b);
    }
    
    public static ASN1OctetString getTagged(final ASN1TaggedObject asn1TaggedObject, final boolean b) {
        return (ASN1OctetString)ASN1OctetString.TYPE.getTagged(asn1TaggedObject, b);
    }
    
    public static ASN1OctetString getInstance(final Object o) {
        if (o == null || o instanceof ASN1OctetString) {
            return (ASN1OctetString)o;
        }
        if (o instanceof ASN1Encodable) {
            final ASN1Primitive asn1Primitive = ((ASN1Encodable)o).toASN1Primitive();
            if (asn1Primitive instanceof ASN1OctetString) {
                return (ASN1OctetString)asn1Primitive;
            }
        }
        else if (o instanceof byte[]) {
            try {
                return (ASN1OctetString)ASN1OctetString.TYPE.fromByteArray((byte[])o);
            }
            catch (final IOException ex) {
                throw new IllegalArgumentException("failed to construct OCTET STRING from byte[]: " + ex.getMessage());
            }
        }
        throw new IllegalArgumentException("illegal object in getInstance: " + o.getClass().getName());
    }
    
    public ASN1OctetString(final byte[] string) {
        if (string == null) {
            throw new NullPointerException("'string' cannot be null");
        }
        this.string = string;
    }
    
    @Override
    public InputStream getOctetStream() {
        return new ByteArrayInputStream(this.string);
    }
    
    public ASN1OctetStringParser parser() {
        return this;
    }
    
    public byte[] getOctets() {
        return this.string;
    }
    
    public int getOctetsLength() {
        return this.getOctets().length;
    }
    
    @Override
    public int hashCode() {
        return Arrays.hashCode(this.getOctets());
    }
    
    @Override
    boolean asn1Equals(final ASN1Primitive asn1Primitive) {
        return asn1Primitive instanceof ASN1OctetString && Arrays.areEqual(this.string, ((ASN1OctetString)asn1Primitive).string);
    }
    
    @Override
    public ASN1Primitive getLoadedObject() {
        return this.toASN1Primitive();
    }
    
    @Override
    ASN1Primitive toDERObject() {
        return new DEROctetString(this.string);
    }
    
    @Override
    ASN1Primitive toDLObject() {
        return new DEROctetString(this.string);
    }
    
    @Override
    public String toString() {
        return "#" + Strings.fromByteArray(Hex.encode(this.string));
    }
    
    static ASN1OctetString createPrimitive(final byte[] array) {
        return new DEROctetString(array);
    }
    
    static {
        TYPE = new ASN1UniversalType(4) {
            @Override
            ASN1Primitive fromImplicitPrimitive(final DEROctetString derOctetString) {
                return derOctetString;
            }
            
            @Override
            ASN1Primitive fromImplicitConstructed(final ASN1Sequence asn1Sequence) {
                return asn1Sequence.toASN1OctetString();
            }
        };
        EMPTY_OCTETS = new byte[0];
    }
}
