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 nottation this is any object proceeded by
      8  * a [n] where n is some number - these are assume 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.write(CONSTRUCTED | TAGGED | tagNo);
     55             out.write(0x80);
     56 
     57             if (!empty)
     58             {
     59                 if (!explicit)
     60                 {
     61                     if (obj instanceof ASN1OctetString)
     62                     {
     63                         Enumeration  e;
     64 
     65                         if (obj instanceof BERConstructedOctetString)
     66                         {
     67                             e = ((BERConstructedOctetString)obj).getObjects();
     68                         }
     69                         else
     70                         {
     71                             ASN1OctetString             octs = (ASN1OctetString)obj;
     72                             BERConstructedOctetString   berO = new BERConstructedOctetString(octs.getOctets());
     73 
     74                             e = berO.getObjects();
     75                         }
     76 
     77                         while (e.hasMoreElements())
     78                         {
     79                             out.writeObject(e.nextElement());
     80                         }
     81                     }
     82                     else if (obj instanceof ASN1Sequence)
     83                     {
     84                         Enumeration  e = ((ASN1Sequence)obj).getObjects();
     85 
     86                         while (e.hasMoreElements())
     87                         {
     88                             out.writeObject(e.nextElement());
     89                         }
     90                     }
     91                     else if (obj instanceof ASN1Set)
     92                     {
     93                         Enumeration  e = ((ASN1Set)obj).getObjects();
     94 
     95                         while (e.hasMoreElements())
     96                         {
     97                             out.writeObject(e.nextElement());
     98                         }
     99                     }
    100                     else
    101                     {
    102                         throw new RuntimeException("not implemented: " + obj.getClass().getName());
    103                     }
    104                 }
    105                 else
    106                 {
    107                     out.writeObject(obj);
    108                 }
    109             }
    110 
    111             out.write(0x00);
    112             out.write(0x00);
    113         }
    114         else
    115         {
    116             super.encode(out);
    117         }
    118     }
    119 }
    120