1package org.bouncycastle.asn1;
2
3import java.io.IOException;
4
5/**
6 * DER NumericString object - this is an ascii string of characters {0,1,2,3,4,5,6,7,8,9, }.
7 */
8public class DERNumericString
9    extends DERObject
10    implements DERString
11{
12    String  string;
13
14    /**
15     * return a Numeric string from the passed in object
16     *
17     * @exception IllegalArgumentException if the object cannot be converted.
18     */
19    public static DERNumericString getInstance(
20        Object  obj)
21    {
22        if (obj == null || obj instanceof DERNumericString)
23        {
24            return (DERNumericString)obj;
25        }
26
27        if (obj instanceof ASN1OctetString)
28        {
29            return new DERNumericString(((ASN1OctetString)obj).getOctets());
30        }
31
32        if (obj instanceof ASN1TaggedObject)
33        {
34            return getInstance(((ASN1TaggedObject)obj).getObject());
35        }
36
37        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
38    }
39
40    /**
41     * return an Numeric String from a tagged object.
42     *
43     * @param obj the tagged object holding the object we want
44     * @param explicit true if the object is meant to be explicitly
45     *              tagged false otherwise.
46     * @exception IllegalArgumentException if the tagged object cannot
47     *               be converted.
48     */
49    public static DERNumericString getInstance(
50        ASN1TaggedObject obj,
51        boolean          explicit)
52    {
53        return getInstance(obj.getObject());
54    }
55
56    /**
57     * basic constructor - with bytes.
58     */
59    public DERNumericString(
60        byte[]   string)
61    {
62        char[]  cs = new char[string.length];
63
64        for (int i = 0; i != cs.length; i++)
65        {
66            cs[i] = (char)(string[i] & 0xff);
67        }
68
69        this.string = new String(cs);
70    }
71
72    /**
73     * basic constructor - with string.
74     */
75    public DERNumericString(
76        String   string)
77    {
78        this.string = string;
79    }
80
81    public String getString()
82    {
83        return string;
84    }
85
86    public byte[] getOctets()
87    {
88        char[]  cs = string.toCharArray();
89        byte[]  bs = new byte[cs.length];
90
91        for (int i = 0; i != cs.length; i++)
92        {
93            bs[i] = (byte)cs[i];
94        }
95
96        return bs;
97    }
98
99    void encode(
100        DEROutputStream  out)
101        throws IOException
102    {
103        out.writeEncoded(NUMERIC_STRING, this.getOctets());
104    }
105
106    public int hashCode()
107    {
108        return this.getString().hashCode();
109    }
110
111    public boolean equals(
112        Object  o)
113    {
114        if (!(o instanceof DERNumericString))
115        {
116            return false;
117        }
118
119        DERNumericString  s = (DERNumericString)o;
120
121        return this.getString().equals(s.getString());
122    }
123}
124