1package org.bouncycastle.asn1;
2
3import java.io.ByteArrayOutputStream;
4import java.io.IOException;
5import java.util.Enumeration;
6import java.util.Vector;
7
8/**
9 * @deprecated use BEROctetString
10 */
11public class BERConstructedOctetString
12    extends BEROctetString
13{
14    private static final int MAX_LENGTH = 1000;
15
16    /**
17     * convert a vector of octet strings into a single byte string
18     */
19    static private byte[] toBytes(
20        Vector  octs)
21    {
22        ByteArrayOutputStream   bOut = new ByteArrayOutputStream();
23
24        for (int i = 0; i != octs.size(); i++)
25        {
26            try
27            {
28                DEROctetString  o = (DEROctetString)octs.elementAt(i);
29
30                bOut.write(o.getOctets());
31            }
32            catch (ClassCastException e)
33            {
34                throw new IllegalArgumentException(octs.elementAt(i).getClass().getName() + " found in input should only contain DEROctetString");
35            }
36            catch (IOException e)
37            {
38                throw new IllegalArgumentException("exception converting octets " + e.toString());
39            }
40        }
41
42        return bOut.toByteArray();
43    }
44
45    private Vector  octs;
46
47    /**
48     * @param string the octets making up the octet string.
49     */
50    public BERConstructedOctetString(
51        byte[]  string)
52    {
53        super(string);
54    }
55
56    public BERConstructedOctetString(
57        Vector  octs)
58    {
59        super(toBytes(octs));
60
61        this.octs = octs;
62    }
63
64    public BERConstructedOctetString(
65        ASN1Primitive  obj)
66    {
67        super(toByteArray(obj));
68    }
69
70    private static byte[] toByteArray(ASN1Primitive obj)
71    {
72        try
73        {
74            return obj.getEncoded();
75        }
76        catch (IOException e)
77        {
78            throw new IllegalArgumentException("Unable to encode object");
79        }
80    }
81
82    public BERConstructedOctetString(
83        ASN1Encodable  obj)
84    {
85        this(obj.toASN1Primitive());
86    }
87
88    public byte[] getOctets()
89    {
90        return string;
91    }
92
93    /**
94     * return the DER octets that make up this string.
95     */
96    public Enumeration getObjects()
97    {
98        if (octs == null)
99        {
100            return generateOcts().elements();
101        }
102
103        return octs.elements();
104    }
105
106    private Vector generateOcts()
107    {
108        Vector vec = new Vector();
109        for (int i = 0; i < string.length; i += MAX_LENGTH)
110        {
111            int end;
112
113            if (i + MAX_LENGTH > string.length)
114            {
115                end = string.length;
116            }
117            else
118            {
119                end = i + MAX_LENGTH;
120            }
121
122            byte[] nStr = new byte[end - i];
123
124            System.arraycopy(string, i, nStr, 0, nStr.length);
125
126            vec.addElement(new DEROctetString(nStr));
127         }
128
129         return vec;
130    }
131
132    public static BEROctetString fromSequence(ASN1Sequence seq)
133    {
134        Vector      v = new Vector();
135        Enumeration e = seq.getObjects();
136
137        while (e.hasMoreElements())
138        {
139            v.addElement(e.nextElement());
140        }
141
142        return new BERConstructedOctetString(v);
143    }
144}
145