001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.crypto.asn1; 019 020 import java.io.IOException; 021 022 /** 023 * DER BMPString object. 024 */ 025 public class DERBMPString 026 extends DERObject 027 implements DERString 028 { 029 String string; 030 031 /** 032 * return a BMP String from the given object. 033 * 034 * @param obj the object we want converted. 035 * @exception IllegalArgumentException if the object cannot be converted. 036 */ 037 public static DERBMPString getInstance( 038 Object obj) 039 { 040 if (obj == null || obj instanceof DERBMPString) 041 { 042 return (DERBMPString)obj; 043 } 044 045 if (obj instanceof ASN1OctetString) 046 { 047 return new DERBMPString(((ASN1OctetString)obj).getOctets()); 048 } 049 050 if (obj instanceof ASN1TaggedObject) 051 { 052 return getInstance(((ASN1TaggedObject)obj).getObject()); 053 } 054 055 throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 056 } 057 058 /** 059 * return a BMP String from a tagged object. 060 * 061 * @param obj the tagged object holding the object we want 062 * @param explicit true if the object is meant to be explicitly 063 * tagged false otherwise. 064 * @exception IllegalArgumentException if the tagged object cannot 065 * be converted. 066 */ 067 public static DERBMPString getInstance( 068 ASN1TaggedObject obj, 069 boolean explicit) 070 { 071 return getInstance(obj.getObject()); 072 } 073 074 075 /** 076 * basic constructor - byte encoded string. 077 */ 078 public DERBMPString( 079 byte[] string) 080 { 081 char[] cs = new char[string.length / 2]; 082 083 for (int i = 0; i != cs.length; i++) 084 { 085 cs[i] = (char)((string[2 * i] << 8) | (string[2 * i + 1] & 0xff)); 086 } 087 088 this.string = new String(cs); 089 } 090 091 /** 092 * basic constructor 093 */ 094 public DERBMPString( 095 String string) 096 { 097 this.string = string; 098 } 099 100 public String getString() 101 { 102 return string; 103 } 104 105 public int hashCode() 106 { 107 return this.getString().hashCode(); 108 } 109 110 public boolean equals( 111 Object o) 112 { 113 if (!(o instanceof DERBMPString)) 114 { 115 return false; 116 } 117 118 DERBMPString s = (DERBMPString)o; 119 120 return this.getString().equals(s.getString()); 121 } 122 123 void encode( 124 DEROutputStream out) 125 throws IOException 126 { 127 char[] c = string.toCharArray(); 128 byte[] b = new byte[c.length * 2]; 129 130 for (int i = 0; i != c.length; i++) 131 { 132 b[2 * i] = (byte)(c[i] >> 8); 133 b[2 * i + 1] = (byte)c[i]; 134 } 135 136 out.writeEncoded(BMP_STRING, b); 137 } 138 }