Home | History | Annotate | Download | only in asn1
      1 package org.bouncycastle.asn1;
      2 
      3 import java.io.IOException;
      4 import java.util.Enumeration;
      5 
      6 /**
      7  * BER TaggedObject - in ASN.1 notation this is any object preceded by
      8  * a [n] where n is some number - these are assumed to follow the construction
      9  * rules (as with sequences).
     10  */
     11 public class BERTaggedObject
     12     extends DERTaggedObject
     13 {
     14     /**
     15      * @param tagNo the tag number for this object.
     16      * @param obj the tagged object.
     17      */
     18     public BERTaggedObject(
     19         int             tagNo,
     20         DEREncodable    obj)
     21     {
     22         super(tagNo, obj);
     23     }
     24 
     25     /**
     26      * @param explicit true if an explicitly tagged object.
     27      * @param tagNo the tag number for this object.
     28      * @param obj the tagged object.
     29      */
     30     public BERTaggedObject(
     31         boolean         explicit,
     32         int             tagNo,
     33         DEREncodable    obj)
     34     {
     35         super(explicit, tagNo, obj);
     36     }
     37 
     38     /**
     39      * create an implicitly tagged object that contains a zero
     40      * length sequence.
     41      */
     42     public BERTaggedObject(
     43         int             tagNo)
     44     {
     45         super(false, tagNo, new BERSequence());
     46     }
     47 
     48     void encode(
     49         DEROutputStream  out)
     50         throws IOException
     51     {
     52         if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
     53         {
     54             out.writeTag(CONSTRUCTED | TAGGED, tagNo);
     55             out.write(0x80);
     56 
     57             if (!empty)
     58             {
     59                 if (!explicit)
     60                 {
     61                     Enumeration e;
     62                     if (obj instanceof ASN1OctetString)
     63                     {
     64                         if (obj instanceof BERConstructedOctetString)
     65                         {
     66                             e = ((BERConstructedOctetString)obj).getObjects();
     67                         }
     68                         else
     69                         {
     70                             ASN1OctetString             octs = (ASN1OctetString)obj;
     71                             BERConstructedOctetString   berO = new BERConstructedOctetString(octs.getOctets());
     72                             e = berO.getObjects();
     73                         }
     74                     }
     75                     else if (obj instanceof ASN1Sequence)
     76                     {
     77                         e = ((ASN1Sequence)obj).getObjects();
     78                     }
     79                     else if (obj instanceof ASN1Set)
     80                     {
     81                         e = ((ASN1Set)obj).getObjects();
     82                     }
     83                     else
     84                     {
     85                         throw new RuntimeException("not implemented: " + obj.getClass().getName());
     86                     }
     87 
     88                     while (e.hasMoreElements())
     89                     {
     90                         out.writeObject(e.nextElement());
     91                     }
     92                 }
     93                 else
     94                 {
     95                     out.writeObject(obj);
     96                 }
     97             }
     98 
     99             out.write(0x00);
    100             out.write(0x00);
    101         }
    102         else
    103         {
    104             super.encode(out);
    105         }
    106     }
    107 }
    108