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.IOException;
022    import java.math.BigInteger;
023    
024    public class DERInteger
025        extends DERObject
026    {
027        byte[]      bytes;
028    
029        /**
030         * return an integer from the passed in object
031         *
032         * @exception IllegalArgumentException if the object cannot be converted.
033         */
034        public static DERInteger getInstance(
035            Object  obj)
036        {
037            if (obj == null || obj instanceof DERInteger)
038            {
039                return (DERInteger)obj;
040            }
041    
042            if (obj instanceof ASN1OctetString)
043            {
044                return new DERInteger(((ASN1OctetString)obj).getOctets());
045            }
046    
047            if (obj instanceof ASN1TaggedObject)
048            {
049                return getInstance(((ASN1TaggedObject)obj).getObject());
050            }
051    
052            throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
053        }
054    
055        /**
056         * return an Integer from a tagged object.
057         *
058         * @param obj the tagged object holding the object we want
059         * @param explicit true if the object is meant to be explicitly
060         *              tagged false otherwise.
061         * @exception IllegalArgumentException if the tagged object cannot
062         *               be converted.
063         */
064        public static DERInteger getInstance(
065            ASN1TaggedObject obj,
066            boolean          explicit)
067        {
068            return getInstance(obj.getObject());
069        }
070    
071        public DERInteger(
072            int         value)
073        {
074            bytes = BigInteger.valueOf(value).toByteArray();
075        }
076    
077        public DERInteger(
078            BigInteger   value)
079        {
080            bytes = value.toByteArray();
081        }
082    
083        public DERInteger(
084            byte[]   bytes)
085        {
086            this.bytes = bytes;
087        }
088    
089        public BigInteger getValue()
090        {
091            return new BigInteger(bytes);
092        }
093    
094        /**
095         * in some cases positive values get crammed into a space,
096         * that's not quite big enough...
097         */
098        public BigInteger getPositiveValue()
099        {
100            return new BigInteger(1, bytes);
101        }
102    
103        void encode(
104            DEROutputStream out)
105            throws IOException
106        {
107            out.writeEncoded(INTEGER, bytes);
108        }
109    
110        public int hashCode()
111        {
112             int     value = 0;
113    
114             for (int i = 0; i != bytes.length; i++)
115             {
116                 value ^= (bytes[i] & 0xff) << (i % 4);
117             }
118    
119             return value;
120        }
121    
122        public boolean equals(
123            Object  o)
124        {
125            if (o == null || !(o instanceof DERInteger))
126            {
127                return false;
128            }
129    
130            DERInteger other = (DERInteger)o;
131    
132            if (bytes.length != other.bytes.length)
133            {
134                return false;
135            }
136    
137            for (int i = 0; i != bytes.length; i++)
138            {
139                if (bytes[i] != other.bytes[i])
140                {
141                    return false;
142                }
143            }
144    
145            return true;
146        }
147    }