001 package org.apache.commons.ssl.asn1; 002 003 import java.io.ByteArrayOutputStream; 004 import java.io.IOException; 005 006 /** 007 * DER 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 DERTaggedObject 012 extends ASN1TaggedObject { 013 /** 014 * @param tagNo the tag number for this object. 015 * @param obj the tagged object. 016 */ 017 public DERTaggedObject( 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 DERTaggedObject( 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 DERTaggedObject( 040 int tagNo) { 041 super(false, tagNo, new DERSequence()); 042 } 043 044 void encode( 045 DEROutputStream out) 046 throws IOException { 047 if (!empty) { 048 ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 049 DEROutputStream dOut = new DEROutputStream(bOut); 050 051 dOut.writeObject(obj); 052 dOut.close(); 053 054 byte[] bytes = bOut.toByteArray(); 055 056 if (explicit) { 057 out.writeEncoded(CONSTRUCTED | TAGGED | tagNo, bytes); 058 } else { 059 // 060 // need to mark constructed types... 061 // 062 if ((bytes[0] & CONSTRUCTED) != 0) { 063 bytes[0] = (byte) (CONSTRUCTED | TAGGED | tagNo); 064 } else { 065 bytes[0] = (byte) (TAGGED | tagNo); 066 } 067 068 out.write(bytes); 069 } 070 } else { 071 out.writeEncoded(CONSTRUCTED | TAGGED | tagNo, new byte[0]); 072 } 073 } 074 }