001package org.apache.commons.ssl.asn1;
002
003import java.io.FilterOutputStream;
004import java.io.IOException;
005import java.io.OutputStream;
006
007public 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}