001package org.apache.commons.ssl.asn1;
002
003import java.io.ByteArrayOutputStream;
004import java.io.IOException;
005
006/** DER UniversalString object. */
007public class DERUniversalString
008    extends ASN1Object
009    implements DERString {
010    private static final char[] table = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
011    private byte[] string;
012
013    /**
014     * return a Universal String from the passed in object.
015     *
016     * @throws IllegalArgumentException if the object cannot be converted.
017     */
018    public static DERUniversalString getInstance(
019        Object obj) {
020        if (obj == null || obj instanceof DERUniversalString) {
021            return (DERUniversalString) obj;
022        }
023
024        if (obj instanceof ASN1OctetString) {
025            return new DERUniversalString(((ASN1OctetString) obj).getOctets());
026        }
027
028        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
029    }
030
031    /**
032     * return a Universal String from a tagged object.
033     *
034     * @param obj      the tagged object holding the object we want
035     * @param explicit true if the object is meant to be explicitly
036     *                 tagged false otherwise.
037     * @throws IllegalArgumentException if the tagged object cannot
038     *                                  be converted.
039     */
040    public static DERUniversalString getInstance(
041        ASN1TaggedObject obj,
042        boolean explicit) {
043        return getInstance(obj.getObject());
044    }
045
046    /** basic constructor - byte encoded string. */
047    public DERUniversalString(
048        byte[] string) {
049        this.string = string;
050    }
051
052    public String getString() {
053        StringBuffer buf = new StringBuffer("#");
054        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
055        ASN1OutputStream aOut = new ASN1OutputStream(bOut);
056
057        try {
058            aOut.writeObject(this);
059        }
060        catch (IOException e) {
061            throw new RuntimeException("internal error encoding BitString");
062        }
063
064        byte[] string = bOut.toByteArray();
065
066        for (int i = 0; i != string.length; i++) {
067            buf.append(table[(string[i] >>> 4) & 0xf]);
068            buf.append(table[string[i] & 0xf]);
069        }
070
071        return buf.toString();
072    }
073
074    public String toString() {
075        return getString();
076    }
077
078    public byte[] getOctets() {
079        return string;
080    }
081
082    void encode(
083        DEROutputStream out)
084        throws IOException {
085        out.writeEncoded(UNIVERSAL_STRING, this.getOctets());
086    }
087
088    boolean asn1Equals(
089        DERObject o) {
090        if (!(o instanceof DERUniversalString)) {
091            return false;
092        }
093
094        return this.getString().equals(((DERUniversalString) o).getString());
095    }
096
097    public int hashCode() {
098        return this.getString().hashCode();
099    }
100}