1    package org.bouncycastle.asn1;
2    
3    import java.io.FilterOutputStream;
4    
5    import java.io.OutputStream;
6    import java.io.IOException;
7    import java.io.EOFException;
8    
9    public class DEROutputStream
10       extends FilterOutputStream implements DERTags
11   {
12       public DEROutputStream(
13           OutputStream    os)
14       {
15           super(os);
16       }
17   
18       private void writeLength(
19           int length)
20           throws IOException
21       {
22           if (length > 127)
23           {
24               int size = 1;
25               int val = length;
26   
27               while ((val >>>= 8) != 0)
28               {
29                   size++;
30               }
31   
32               write((byte)(size | 0x80));
33   
34               for (int i = (size - 1) * 8; i >= 0; i -= 8)
35               {
36                   write((byte)(length >> i));
37               }
38           }
39           else
40           {
41               write((byte)length);
42           }
43       }
44   
45       void writeEncoded(
46           int     tag,
47           byte[]  bytes)
48           throws IOException
49       {
50           write(tag);
51           writeLength(bytes.length);
52           write(bytes);
53       }
54   
55       protected void writeNull()
56           throws IOException
57       {
58           write(NULL);
59           write(0x00);
60       }
61   
62       public void writeObject(
63           Object    obj)
64           throws IOException
65       {
66           if (obj == null)
67           {
68               writeNull();
69           }
70           else if (obj instanceof DERObject)
71           {
72               ((DERObject)obj).encode(this);
73           }
74           else if (obj instanceof DEREncodable)
75           {
76               ((DEREncodable)obj).getDERObject().encode(this);
77           }
78           else 
79           {
80               throw new IOException("object not DEREncodable");
81           }
82       }
83   }
84