From 6025b6016517c6d898d8957d1d7e03ba71431912 Mon Sep 17 00:00:00 2001 From: tknall Date: Fri, 1 Dec 2006 12:20:24 +0000 Subject: Initial import of release 2.2. git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@4 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c --- .../lowagie/bc/asn1/BERConstructedOctetString.java | 168 +++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java (limited to 'src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java') diff --git a/src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java b/src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java new file mode 100644 index 0000000..5c44187 --- /dev/null +++ b/src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java @@ -0,0 +1,168 @@ +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); + } + } +} -- cgit v1.2.3