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     * We insert one of these when we find a tag we don't recognise.
024     */
025    public class DERUnknownTag
026        extends DERObject
027    {
028        int         tag;
029        byte[]      data;
030    
031        /**
032         * @param tag the tag value.
033         * @param data the octets making up the time.
034         */
035        public DERUnknownTag(
036            int     tag,
037            byte[]  data)
038        {
039            this.tag = tag;
040            this.data = data;
041        }
042    
043        public int getTag()
044        {
045            return tag;
046        }
047    
048        public byte[] getData()
049        {
050            return data;
051        }
052    
053        void encode(
054            DEROutputStream  out)
055            throws IOException
056        {
057            out.writeEncoded(tag, data);
058        }
059    
060        public boolean equals(
061            Object o)
062        {
063            if ((o == null) || !(o instanceof DERUnknownTag))
064            {
065                return false;
066            }
067    
068            DERUnknownTag other = (DERUnknownTag)o;
069    
070            if (tag != other.tag)
071            {
072                return false;
073            }
074    
075            if (data.length != other.data.length)
076            {
077                return false;
078            }
079    
080            for (int i = 0; i < data.length; i++)
081            {
082                if(data[i] != other.data[i])
083                {
084                    return false;
085                }
086            }
087    
088            return true;
089        }
090    
091        public int hashCode()
092        {
093            byte[]  b = this.getData();
094            int     value = 0;
095    
096            for (int i = 0; i != b.length; i++)
097            {
098                value ^= (b[i] & 0xff) << (i % 4);
099            }
100    
101            return value ^ this.getTag();
102        }
103    }