001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package org.apache.geronimo.util.asn1; 020 021 import java.io.ByteArrayOutputStream; 022 import java.io.IOException; 023 024 /** 025 * DER UTF8String object. 026 */ 027 public class DERUTF8String 028 extends DERObject 029 implements DERString 030 { 031 String string; 032 033 /** 034 * return an UTF8 string from the passed in object. 035 * 036 * @exception IllegalArgumentException if the object cannot be converted. 037 */ 038 public static DERUTF8String getInstance( 039 Object obj) 040 { 041 if (obj == null || obj instanceof DERUTF8String) 042 { 043 return (DERUTF8String)obj; 044 } 045 046 if (obj instanceof ASN1OctetString) 047 { 048 return new DERUTF8String(((ASN1OctetString)obj).getOctets()); 049 } 050 051 if (obj instanceof ASN1TaggedObject) 052 { 053 return getInstance(((ASN1TaggedObject)obj).getObject()); 054 } 055 056 throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 057 } 058 059 /** 060 * return an UTF8 String from a tagged object. 061 * 062 * @param obj the tagged object holding the object we want 063 * @param explicit true if the object is meant to be explicitly 064 * tagged false otherwise. 065 * @exception IllegalArgumentException if the tagged object cannot 066 * be converted. 067 */ 068 public static DERUTF8String getInstance( 069 ASN1TaggedObject obj, 070 boolean explicit) 071 { 072 return getInstance(obj.getObject()); 073 } 074 075 /** 076 * basic constructor - byte encoded string. 077 */ 078 DERUTF8String( 079 byte[] string) 080 { 081 int i = 0; 082 int length = 0; 083 084 while (i < string.length) 085 { 086 length++; 087 if ((string[i] & 0xe0) == 0xe0) 088 { 089 i += 3; 090 } 091 else if ((string[i] & 0xc0) == 0xc0) 092 { 093 i += 2; 094 } 095 else 096 { 097 i += 1; 098 } 099 } 100 101 char[] cs = new char[length]; 102 103 i = 0; 104 length = 0; 105 106 while (i < string.length) 107 { 108 char ch; 109 110 if ((string[i] & 0xe0) == 0xe0) 111 { 112 ch = (char)(((string[i] & 0x1f) << 12) 113 | ((string[i + 1] & 0x3f) << 6) | (string[i + 2] & 0x3f)); 114 i += 3; 115 } 116 else if ((string[i] & 0xc0) == 0xc0) 117 { 118 ch = (char)(((string[i] & 0x3f) << 6) | (string[i + 1] & 0x3f)); 119 i += 2; 120 } 121 else 122 { 123 ch = (char)(string[i] & 0xff); 124 i += 1; 125 } 126 127 cs[length++] = ch; 128 } 129 130 this.string = new String(cs); 131 } 132 133 /** 134 * basic constructor 135 */ 136 public DERUTF8String( 137 String string) 138 { 139 this.string = string; 140 } 141 142 public String getString() 143 { 144 return string; 145 } 146 147 public int hashCode() 148 { 149 return this.getString().hashCode(); 150 } 151 152 public boolean equals( 153 Object o) 154 { 155 if (!(o instanceof DERUTF8String)) 156 { 157 return false; 158 } 159 160 DERUTF8String s = (DERUTF8String)o; 161 162 return this.getString().equals(s.getString()); 163 } 164 165 void encode( 166 DEROutputStream out) 167 throws IOException 168 { 169 char[] c = string.toCharArray(); 170 ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 171 172 for (int i = 0; i != c.length; i++) 173 { 174 char ch = c[i]; 175 176 if (ch < 0x0080) 177 { 178 bOut.write(ch); 179 } 180 else if (ch < 0x0800) 181 { 182 bOut.write(0xc0 | (ch >> 6)); 183 bOut.write(0x80 | (ch & 0x3f)); 184 } 185 else 186 { 187 bOut.write(0xe0 | (ch >> 12)); 188 bOut.write(0x80 | ((ch >> 6) & 0x3F)); 189 bOut.write(0x80 | (ch & 0x3F)); 190 } 191 } 192 193 out.writeEncoded(UTF8_STRING, bOut.toByteArray()); 194 } 195 }