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