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