1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
package com.lowagie.bc.asn1;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* DER UTF8String object.
*/
public class DERUTF8String
extends DERObject
implements DERString
{
String string;
/**
* return an UTF8 string from the passed in object.
*
* @exception IllegalArgumentException if the object cannot be converted.
*/
public static DERUTF8String getInstance(
Object obj)
{
if (obj == null || obj instanceof DERUTF8String)
{
return (DERUTF8String)obj;
}
if (obj instanceof ASN1OctetString)
{
return new DERUTF8String(((ASN1OctetString)obj).getOctets());
}
if (obj instanceof ASN1TaggedObject)
{
return getInstance(((ASN1TaggedObject)obj).getObject());
}
throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
}
/**
* return an UTF8 String from a tagged object.
*
* @param obj the tagged object holding the object we want
* @param explicit true if the object is meant to be explicitly
* tagged false otherwise.
* @exception IllegalArgumentException if the tagged object cannot
* be converted.
*/
public static DERUTF8String getInstance(
ASN1TaggedObject obj,
boolean explicit)
{
return getInstance(obj.getObject());
}
/**
* basic constructor - byte encoded string.
*/
DERUTF8String(
byte[] string)
{
int i = 0;
int length = 0;
while (i < string.length)
{
length++;
if ((string[i] & 0xe0) == 0xe0)
{
i += 3;
}
else if ((string[i] & 0xc0) == 0xc0)
{
i += 2;
}
else
{
i += 1;
}
}
char[] cs = new char[length];
i = 0;
length = 0;
while (i < string.length)
{
char ch;
if ((string[i] & 0xe0) == 0xe0)
{
ch = (char)(((string[i] & 0x1f) << 12)
| ((string[i + 1] & 0x3f) << 6) | (string[i + 2] & 0x3f));
i += 3;
}
else if ((string[i] & 0xc0) == 0xc0)
{
ch = (char)(((string[i] & 0x3f) << 6) | (string[i + 1] & 0x3f));
i += 2;
}
else
{
ch = (char)(string[i] & 0xff);
i += 1;
}
cs[length++] = ch;
}
this.string = new String(cs);
}
/**
* basic constructor
*/
public DERUTF8String(
String string)
{
this.string = string;
}
public String getString()
{
return string;
}
public int hashCode()
{
return this.getString().hashCode();
}
public boolean equals(
Object o)
{
if (!(o instanceof DERUTF8String))
{
return false;
}
DERUTF8String s = (DERUTF8String)o;
return this.getString().equals(s.getString());
}
void encode(
DEROutputStream out)
throws IOException
{
char[] c = string.toCharArray();
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
for (int i = 0; i != c.length; i++)
{
char ch = c[i];
if (ch < 0x0080)
{
bOut.write(ch);
}
else if (ch < 0x0800)
{
bOut.write(0xc0 | (ch >> 6));
bOut.write(0x80 | (ch & 0x3f));
}
else
{
bOut.write(0xe0 | (ch >> 12));
bOut.write(0x80 | ((ch >> 6) & 0x3F));
bOut.write(0x80 | (ch & 0x3F));
}
}
out.writeEncoded(UTF8_STRING, bOut.toByteArray());
}
}
|