001    package org.apache.commons.ssl.asn1;
002    
003    import java.io.IOException;
004    import java.math.BigInteger;
005    
006    public class DERInteger
007        extends ASN1Object {
008        byte[] bytes;
009    
010        /**
011         * return an integer from the passed in object
012         *
013         * @throws IllegalArgumentException if the object cannot be converted.
014         */
015        public static DERInteger getInstance(
016            Object obj) {
017            if (obj == null || obj instanceof DERInteger) {
018                return (DERInteger) obj;
019            }
020    
021            if (obj instanceof ASN1OctetString) {
022                return new DERInteger(((ASN1OctetString) obj).getOctets());
023            }
024    
025            if (obj instanceof ASN1TaggedObject) {
026                return getInstance(((ASN1TaggedObject) obj).getObject());
027            }
028    
029            throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
030        }
031    
032        /**
033         * return an Integer from a tagged object.
034         *
035         * @param obj      the tagged object holding the object we want
036         * @param explicit true if the object is meant to be explicitly
037         *                 tagged false otherwise.
038         * @throws IllegalArgumentException if the tagged object cannot
039         *                                  be converted.
040         */
041        public static DERInteger getInstance(
042            ASN1TaggedObject obj,
043            boolean explicit) {
044            return getInstance(obj.getObject());
045        }
046    
047        public DERInteger(
048            int value) {
049            bytes = BigInteger.valueOf(value).toByteArray();
050        }
051    
052        public DERInteger(
053            BigInteger value) {
054            bytes = value.toByteArray();
055        }
056    
057        public DERInteger(
058            byte[] bytes) {
059            this.bytes = bytes;
060        }
061    
062        public BigInteger getValue() {
063            return new BigInteger(bytes);
064        }
065    
066        /**
067         * in some cases positive values get crammed into a space,
068         * that's not quite big enough...
069         */
070        public BigInteger getPositiveValue() {
071            return new BigInteger(1, bytes);
072        }
073    
074        void encode(
075            DEROutputStream out)
076            throws IOException {
077            out.writeEncoded(INTEGER, bytes);
078        }
079    
080        public int hashCode() {
081            int value = 0;
082    
083            for (int i = 0; i != bytes.length; i++) {
084                value ^= (bytes[i] & 0xff) << (i % 4);
085            }
086    
087            return value;
088        }
089    
090        boolean asn1Equals(
091            DERObject o) {
092            if (!(o instanceof DERInteger)) {
093                return false;
094            }
095    
096            DERInteger other = (DERInteger) o;
097    
098            if (bytes.length != other.bytes.length) {
099                return false;
100            }
101    
102            for (int i = 0; i != bytes.length; i++) {
103                if (bytes[i] != other.bytes[i]) {
104                    return false;
105                }
106            }
107    
108            return true;
109        }
110    
111        public String toString() {
112            return getValue().toString();
113        }
114    }