Home | History | Annotate | Download | only in asn1
      1 package org.bouncycastle.asn1;
      2 
      3 import java.io.IOException;
      4 import java.math.BigInteger;
      5 
      6 import org.bouncycastle.util.Arrays;
      7 
      8 public class DERInteger
      9     extends ASN1Object
     10 {
     11     byte[]      bytes;
     12 
     13     /**
     14      * return an integer from the passed in object
     15      *
     16      * @exception IllegalArgumentException if the object cannot be converted.
     17      */
     18     public static DERInteger getInstance(
     19         Object  obj)
     20     {
     21         if (obj == null || obj instanceof DERInteger)
     22         {
     23             return (DERInteger)obj;
     24         }
     25 
     26         throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
     27     }
     28 
     29     /**
     30      * return an Integer from a tagged object.
     31      *
     32      * @param obj the tagged object holding the object we want
     33      * @param explicit true if the object is meant to be explicitly
     34      *              tagged false otherwise.
     35      * @exception IllegalArgumentException if the tagged object cannot
     36      *               be converted.
     37      */
     38     public static DERInteger getInstance(
     39         ASN1TaggedObject obj,
     40         boolean          explicit)
     41     {
     42         DERObject o = obj.getObject();
     43 
     44         if (explicit || o instanceof DERInteger)
     45         {
     46             return getInstance(o);
     47         }
     48         else
     49         {
     50             return new ASN1Integer(ASN1OctetString.getInstance(obj.getObject()).getOctets());
     51         }
     52     }
     53 
     54     public DERInteger(
     55         int         value)
     56     {
     57         bytes = BigInteger.valueOf(value).toByteArray();
     58     }
     59 
     60     public DERInteger(
     61         BigInteger   value)
     62     {
     63         bytes = value.toByteArray();
     64     }
     65 
     66     public DERInteger(
     67         byte[]   bytes)
     68     {
     69         this.bytes = bytes;
     70     }
     71 
     72     public BigInteger getValue()
     73     {
     74         return new BigInteger(bytes);
     75     }
     76 
     77     /**
     78      * in some cases positive values get crammed into a space,
     79      * that's not quite big enough...
     80      */
     81     public BigInteger getPositiveValue()
     82     {
     83         return new BigInteger(1, bytes);
     84     }
     85 
     86     void encode(
     87         DEROutputStream out)
     88         throws IOException
     89     {
     90         out.writeEncoded(INTEGER, bytes);
     91     }
     92 
     93     public int hashCode()
     94     {
     95          int     value = 0;
     96 
     97          for (int i = 0; i != bytes.length; i++)
     98          {
     99              value ^= (bytes[i] & 0xff) << (i % 4);
    100          }
    101 
    102          return value;
    103     }
    104 
    105     boolean asn1Equals(
    106         DERObject  o)
    107     {
    108         if (!(o instanceof DERInteger))
    109         {
    110             return false;
    111         }
    112 
    113         DERInteger other = (DERInteger)o;
    114 
    115         return Arrays.areEqual(bytes, other.bytes);
    116     }
    117 
    118     public String toString()
    119     {
    120       return getValue().toString();
    121     }
    122 }
    123