001    package org.apache.commons.ssl.asn1;
002    
003    import java.io.FilterOutputStream;
004    import java.io.IOException;
005    import java.io.OutputStream;
006    
007    public class DEROutputStream
008        extends FilterOutputStream implements DERTags {
009        public DEROutputStream(
010            OutputStream os) {
011            super(os);
012        }
013    
014        private void writeLength(
015            int length)
016            throws IOException {
017            if (length > 127) {
018                int size = 1;
019                int val = length;
020    
021                while ((val >>>= 8) != 0) {
022                    size++;
023                }
024    
025                write((byte) (size | 0x80));
026    
027                for (int i = (size - 1) * 8; i >= 0; i -= 8) {
028                    write((byte) (length >> i));
029                }
030            } else {
031                write((byte) length);
032            }
033        }
034    
035        void writeEncoded(
036            int tag,
037            byte[] bytes)
038            throws IOException {
039            write(tag);
040            writeLength(bytes.length);
041            write(bytes);
042        }
043    
044        protected void writeNull()
045            throws IOException {
046            write(NULL);
047            write(0x00);
048        }
049    
050        public void write(byte[] buf)
051            throws IOException {
052            out.write(buf, 0, buf.length);
053        }
054    
055        public void write(byte[] buf, int offSet, int len)
056            throws IOException {
057            out.write(buf, offSet, len);
058        }
059    
060        public void writeObject(
061            Object obj)
062            throws IOException {
063            if (obj == null) {
064                writeNull();
065            } else if (obj instanceof DERObject) {
066                ((DERObject) obj).encode(this);
067            } else if (obj instanceof DEREncodable) {
068                ((DEREncodable) obj).getDERObject().encode(this);
069            } else {
070                throw new IOException("object not DEREncodable");
071            }
072        }
073    }