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    }