001 /*
002 * Copyright (c) 2000 - 2006 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
003 *
004 * Permission is hereby granted, free of charge, to any person obtaining a copy of this
005 * software and associated documentation files (the "Software"), to deal in the Software
006 * without restriction, including without limitation the rights to use, copy, modify,
007 * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
008 * permit persons to whom the Software is furnished to do so, subject to the following
009 * conditions:
010 *
011 * The above copyright notice and this permission notice shall be included in all copies
012 * or substantial portions of the Software.
013 *
014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
015 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
016 * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
017 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
018 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
019 * DEALINGS IN THE SOFTWARE.
020 *
021 */
022
023 package org.apache.directory.shared.asn1.der;
024
025
026 import java.io.ByteArrayOutputStream;
027 import java.io.IOException;
028
029
030 /**
031 * DER TaggedObject
032 */
033 public class DERTaggedObject implements DEREncodable
034 {
035 protected int tag;
036
037 protected boolean empty = false;
038
039 protected boolean explicit = true;
040
041 protected DEREncodable obj;
042
043 private byte[] bytes;
044
045
046 /**
047 * create an implicitly tagged object that contains a zero length sequence.
048 */
049 public DERTaggedObject(int tag)
050 {
051 this( false, tag, new DERSequence() );
052 }
053
054
055 /**
056 * @param tag
057 * the tag number for this object.
058 * @param obj
059 * the tagged object.
060 */
061 public DERTaggedObject(int tag, DEREncodable obj)
062 {
063 this.explicit = true;
064 this.tag = tag;
065 this.obj = obj;
066 }
067
068
069 /**
070 * @param explicit
071 * true if an explicitly tagged object.
072 * @param tag
073 * the tag number for this object.
074 * @param obj
075 * the tagged object.
076 */
077 public DERTaggedObject(boolean explicit, int tag, DEREncodable obj)
078 {
079 this.explicit = explicit;
080 this.tag = tag;
081 this.obj = obj;
082 }
083
084
085 public DERTaggedObject(boolean explicit, int tag, DEREncodable obj, byte[] bytes)
086 {
087 this.explicit = explicit;
088 this.tag = tag;
089 this.obj = obj;
090
091 // Copy the byte array
092 this.bytes = new byte[bytes.length];
093 System.arraycopy( bytes, 0, this.bytes, 0, bytes.length );
094 }
095
096
097 public byte[] getOctets()
098 {
099 return bytes;
100 }
101
102
103 public int getTagNo()
104 {
105 return tag;
106 }
107
108
109 /**
110 * return whatever was following the tag.
111 * <p>
112 * Note: tagged objects are generally context dependent if you're trying to
113 * extract a tagged object you should be going via the appropriate
114 * getInstance method.
115 */
116 public DEREncodable getObject()
117 {
118 if ( obj != null )
119 {
120 return obj;
121 }
122
123 return null;
124 }
125
126
127 public void encode( ASN1OutputStream out ) throws IOException
128 {
129 if ( !empty )
130 {
131 ByteArrayOutputStream baos = new ByteArrayOutputStream();
132 ASN1OutputStream aos = new ASN1OutputStream( baos );
133
134 aos.writeObject( obj );
135 aos.close();
136
137 byte[] bytes = baos.toByteArray();
138
139 if ( explicit )
140 {
141 out.writeEncoded( DERObject.CONSTRUCTED | DERObject.TAGGED | tag, bytes );
142 }
143 else
144 {
145 // need to mark constructed types
146 if ( ( bytes[0] & DERObject.CONSTRUCTED ) != 0 )
147 {
148 bytes[0] = ( byte ) ( DERObject.CONSTRUCTED | DERObject.TAGGED | tag );
149 }
150 else
151 {
152 bytes[0] = ( byte ) ( DERObject.TAGGED | tag );
153 }
154
155 out.write( bytes );
156 }
157 }
158 else
159 {
160 out.writeEncoded( DERObject.CONSTRUCTED | DERObject.TAGGED | tag, new byte[0] );
161 }
162 }
163 }