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    }