001package org.apache.commons.ssl.org.bouncycastle.asn1;
002
003import java.io.IOException;
004
005import org.bouncycastle.util.Arrays;
006import org.bouncycastle.util.Strings;
007
008public class DERGeneralString 
009    extends ASN1Primitive
010    implements ASN1String
011{
012    private byte[] string;
013
014    public static DERGeneralString getInstance(
015        Object obj) 
016    {
017        if (obj == null || obj instanceof DERGeneralString) 
018        {
019            return (DERGeneralString) obj;
020        }
021
022        if (obj instanceof byte[])
023        {
024            try
025            {
026                return (DERGeneralString)fromByteArray((byte[])obj);
027            }
028            catch (Exception e)
029            {
030                throw new IllegalArgumentException("encoding error in getInstance: " + e.toString());
031            }
032        }
033
034        throw new IllegalArgumentException("illegal object in getInstance: "
035                + obj.getClass().getName());
036    }
037
038    public static DERGeneralString getInstance(
039        ASN1TaggedObject obj, 
040        boolean explicit) 
041    {
042        ASN1Primitive o = obj.getObject();
043
044        if (explicit || o instanceof DERGeneralString)
045        {
046            return getInstance(o);
047        }
048        else
049        {
050            return new DERGeneralString(((ASN1OctetString)o).getOctets());
051        }
052    }
053
054    DERGeneralString(byte[] string)
055    {
056        this.string = string;
057    }
058
059    public DERGeneralString(String string) 
060    {
061        this.string = Strings.toByteArray(string);
062    }
063    
064    public String getString() 
065    {
066        return Strings.fromByteArray(string);
067    }
068
069    public String toString()
070    {
071        return getString();
072    }
073
074    public byte[] getOctets() 
075    {
076        return Arrays.clone(string);
077    }
078
079    boolean isConstructed()
080    {
081        return false;
082    }
083
084    int encodedLength()
085    {
086        return 1 + StreamUtil.calculateBodyLength(string.length) + string.length;
087    }
088
089    void encode(ASN1OutputStream out)
090        throws IOException 
091    {
092        out.writeEncoded(BERTags.GENERAL_STRING, string);
093    }
094    
095    public int hashCode() 
096    {
097        return Arrays.hashCode(string);
098    }
099    
100    boolean asn1Equals(ASN1Primitive o)
101    {
102        if (!(o instanceof DERGeneralString)) 
103        {
104            return false;
105        }
106        DERGeneralString s = (DERGeneralString)o;
107
108        return Arrays.areEqual(string, s.string);
109    }
110}