001 package org.apache.commons.ssl.asn1;
002
003 import java.io.ByteArrayOutputStream;
004 import java.io.IOException;
005
006 /** DER UniversalString object. */
007 public 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 }