001 package org.apache.commons.ssl.asn1;
002
003 import java.io.IOException;
004 import java.io.InputStream;
005 import java.io.OutputStream;
006
007 public class BERGenerator
008 extends ASN1Generator {
009 private boolean _tagged = false;
010 private boolean _isExplicit;
011 private int _tagNo;
012
013 protected BERGenerator(
014 OutputStream out) {
015 super(out);
016 }
017
018 public BERGenerator(
019 OutputStream out,
020 int tagNo,
021 boolean isExplicit) {
022 super(out);
023
024 _tagged = true;
025 _isExplicit = isExplicit;
026 _tagNo = tagNo;
027 }
028
029 public OutputStream getRawOutputStream() {
030 return _out;
031 }
032
033 private void writeHdr(
034 int tag)
035 throws IOException {
036 _out.write(tag);
037 _out.write(0x80);
038 }
039
040 protected void writeBERHeader(
041 int tag)
042 throws IOException {
043 if (_tagged) {
044 int tagNum = _tagNo | DERTags.TAGGED;
045
046 if (_isExplicit) {
047 writeHdr(tagNum | DERTags.CONSTRUCTED);
048 writeHdr(tag);
049 } else {
050 if ((tag & DERTags.CONSTRUCTED) != 0) {
051 writeHdr(tagNum | DERTags.CONSTRUCTED);
052 } else {
053 writeHdr(tagNum);
054 }
055 }
056 } else {
057 writeHdr(tag);
058 }
059 }
060
061 protected void writeBERBody(
062 InputStream contentStream)
063 throws IOException {
064 int ch;
065
066 while ((ch = contentStream.read()) >= 0) {
067 _out.write(ch);
068 }
069 }
070
071 protected void writeBEREnd()
072 throws IOException {
073 _out.write(0x00);
074 _out.write(0x00);
075
076 if (_tagged && _isExplicit) // write extra end for tag header
077 {
078 _out.write(0x00);
079 _out.write(0x00);
080 }
081 }
082 }