001 package org.apache.commons.ssl.asn1;
002
003 import java.io.IOException;
004 import java.util.Enumeration;
005
006 /**
007 * BER TaggedObject - in ASN.1 nottation this is any object proceeded by
008 * a [n] where n is some number - these are assume to follow the construction
009 * rules (as with sequences).
010 */
011 public class BERTaggedObject
012 extends DERTaggedObject {
013 /**
014 * @param tagNo the tag number for this object.
015 * @param obj the tagged object.
016 */
017 public BERTaggedObject(
018 int tagNo,
019 DEREncodable obj) {
020 super(tagNo, obj);
021 }
022
023 /**
024 * @param explicit true if an explicitly tagged object.
025 * @param tagNo the tag number for this object.
026 * @param obj the tagged object.
027 */
028 public BERTaggedObject(
029 boolean explicit,
030 int tagNo,
031 DEREncodable obj) {
032 super(explicit, tagNo, obj);
033 }
034
035 /**
036 * create an implicitly tagged object that contains a zero
037 * length sequence.
038 */
039 public BERTaggedObject(
040 int tagNo) {
041 super(false, tagNo, new BERSequence());
042 }
043
044 void encode(
045 DEROutputStream out)
046 throws IOException {
047 if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) {
048 out.write(CONSTRUCTED | TAGGED | tagNo);
049 out.write(0x80);
050
051 if (!empty) {
052 if (!explicit) {
053 if (obj instanceof ASN1OctetString) {
054 Enumeration e;
055
056 if (obj instanceof BERConstructedOctetString) {
057 e = ((BERConstructedOctetString) obj).getObjects();
058 } else {
059 ASN1OctetString octs = (ASN1OctetString) obj;
060 BERConstructedOctetString berO = new BERConstructedOctetString(octs.getOctets());
061
062 e = berO.getObjects();
063 }
064
065 while (e.hasMoreElements()) {
066 out.writeObject(e.nextElement());
067 }
068 } else if (obj instanceof ASN1Sequence) {
069 Enumeration e = ((ASN1Sequence) obj).getObjects();
070
071 while (e.hasMoreElements()) {
072 out.writeObject(e.nextElement());
073 }
074 } else if (obj instanceof ASN1Set) {
075 Enumeration e = ((ASN1Set) obj).getObjects();
076
077 while (e.hasMoreElements()) {
078 out.writeObject(e.nextElement());
079 }
080 } else {
081 throw new RuntimeException("not implemented: " + obj.getClass().getName());
082 }
083 } else {
084 out.writeObject(obj);
085 }
086 }
087
088 out.write(0x00);
089 out.write(0x00);
090 } else {
091 super.encode(out);
092 }
093 }
094 }