| package org.bouncycastle.asn1; |
| |
| import java.io.FilterOutputStream; |
| import java.io.IOException; |
| import java.io.OutputStream; |
| |
| public class DEROutputStream |
| extends FilterOutputStream implements DERTags |
| { |
| public DEROutputStream( |
| OutputStream os) |
| { |
| super(os); |
| } |
| |
| private void writeLength( |
| int length) |
| throws IOException |
| { |
| if (length > 127) |
| { |
| int size = 1; |
| int val = length; |
| |
| while ((val >>>= 8) != 0) |
| { |
| size++; |
| } |
| |
| write((byte)(size | 0x80)); |
| |
| for (int i = (size - 1) * 8; i >= 0; i -= 8) |
| { |
| write((byte)(length >> i)); |
| } |
| } |
| else |
| { |
| write((byte)length); |
| } |
| } |
| |
| void writeEncoded( |
| int tag, |
| byte[] bytes) |
| throws IOException |
| { |
| write(tag); |
| writeLength(bytes.length); |
| write(bytes); |
| } |
| |
| void writeTag(int flags, int tagNo) |
| throws IOException |
| { |
| if (tagNo < 31) |
| { |
| write(flags | tagNo); |
| } |
| else |
| { |
| write(flags | 0x1f); |
| if (tagNo < 128) |
| { |
| write(tagNo); |
| } |
| else |
| { |
| byte[] stack = new byte[5]; |
| int pos = stack.length; |
| |
| stack[--pos] = (byte)(tagNo & 0x7F); |
| |
| do |
| { |
| tagNo >>= 7; |
| stack[--pos] = (byte)(tagNo & 0x7F | 0x80); |
| } |
| while (tagNo > 127); |
| |
| write(stack, pos, stack.length - pos); |
| } |
| } |
| } |
| |
| void writeEncoded(int flags, int tagNo, byte[] bytes) |
| throws IOException |
| { |
| writeTag(flags, tagNo); |
| writeLength(bytes.length); |
| write(bytes); |
| } |
| |
| protected void writeNull() |
| throws IOException |
| { |
| write(NULL); |
| write(0x00); |
| } |
| |
| public void write(byte[] buf) |
| throws IOException |
| { |
| out.write(buf, 0, buf.length); |
| } |
| |
| public void write(byte[] buf, int offSet, int len) |
| throws IOException |
| { |
| out.write(buf, offSet, len); |
| } |
| |
| public void writeObject( |
| Object obj) |
| throws IOException |
| { |
| if (obj == null) |
| { |
| writeNull(); |
| } |
| else if (obj instanceof DERObject) |
| { |
| ((DERObject)obj).encode(this); |
| } |
| else if (obj instanceof DEREncodable) |
| { |
| ((DEREncodable)obj).getDERObject().encode(this); |
| } |
| else |
| { |
| throw new IOException("object not DEREncodable"); |
| } |
| } |
| } |