1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
/* see bouncycastle_license.txt */
package com.lowagie.bc.asn1;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
public class BERConstructedOctetString
extends DEROctetString
{
/**
* convert a vector of octet strings into a single byte string
*/
static private byte[] toBytes(
Vector octs)
{
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
for (int i = 0; i != octs.size(); i++)
{
DEROctetString o = (DEROctetString)octs.elementAt(i);
try
{
bOut.write(o.getOctets());
}
catch (IOException e)
{
throw new RuntimeException("exception converting octets " + e.toString());
}
}
return bOut.toByteArray();
}
private Vector octs;
/**
* @param string the octets making up the octet string.
*/
public BERConstructedOctetString(
byte[] string)
{
super(string);
}
public BERConstructedOctetString(
Vector octs)
{
super(toBytes(octs));
this.octs = octs;
}
public BERConstructedOctetString(
DERObject obj)
{
super(obj);
}
public BERConstructedOctetString(
DEREncodable obj)
{
super(obj.getDERObject());
}
public byte[] getOctets()
{
return string;
}
/**
* return the DER octets that make up this string.
*/
public Enumeration getObjects()
{
if (octs == null)
{
return generateOcts().elements();
}
return octs.elements();
}
private Vector generateOcts()
{
int start = 0;
int end = 0;
Vector vec = new Vector();
while ((end + 1) < string.length)
{
if (string[end] == 0 && string[end + 1] == 0)
{
byte[] nStr = new byte[end - start + 1];
System.arraycopy(string, start, nStr, 0, nStr.length);
vec.addElement(new DEROctetString(nStr));
start = end + 1;
}
end++;
}
byte[] nStr = new byte[string.length - start];
System.arraycopy(string, start, nStr, 0, nStr.length);
vec.addElement(new DEROctetString(nStr));
return vec;
}
public void encode(
DEROutputStream out)
throws IOException
{
if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
{
out.write(CONSTRUCTED | OCTET_STRING);
out.write(0x80);
//
// write out the octet array
//
if (octs != null)
{
for (int i = 0; i != octs.size(); i++)
{
out.writeObject(octs.elementAt(i));
}
}
else
{
int start = 0;
int end = 0;
while ((end + 1) < string.length)
{
if (string[end] == 0 && string[end + 1] == 0)
{
byte[] nStr = new byte[end - start + 1];
System.arraycopy(string, start, nStr, 0, nStr.length);
out.writeObject(new DEROctetString(nStr));
start = end + 1;
}
end++;
}
byte[] nStr = new byte[string.length - start];
System.arraycopy(string, start, nStr, 0, nStr.length);
out.writeObject(new DEROctetString(nStr));
}
out.write(0x00);
out.write(0x00);
}
else
{
super.encode(out);
}
}
}
|