    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}