content: package local.org.bouncycastle.asn1;
  
  import java.io.IOException;
  import java.io.OutputStream;
  
  public class BEROctetStringGenerator
      extends BERGenerator
  {
      public BEROctetStringGenerator(OutputStream out) 
          throws IOException
      {
          super(out);
          
          writeBERHeader(BERTags.CONSTRUCTED | BERTags.OCTET_STRING);
      }
  
      public BEROctetStringGenerator(
          OutputStream out,
          int tagNo,
          boolean isExplicit) 
          throws IOException
      {
          super(out, tagNo, isExplicit);
          
          writeBERHeader(BERTags.CONSTRUCTED | BERTags.OCTET_STRING);
      }
      
      public OutputStream getOctetOutputStream()
      {
          return getOctetOutputStream(new byte[1000]); // limit for CER encoding.
      }
  
      public OutputStream getOctetOutputStream(
          byte[] buf)
      {
          return new BufferedBEROctetStream(buf);
      }
     
      private class BufferedBEROctetStream
          extends OutputStream
      {
          private byte[] _buf;
          private int    _off;
          private DEROutputStream _derOut;
  
          BufferedBEROctetStream(
              byte[] buf)
          {
              _buf = buf;
              _off = 0;
              _derOut = new DEROutputStream(_out);
          }
          
          public void write(
              int b)
              throws IOException
          {
              _buf[_off++] = (byte)b;
  
              if (_off == _buf.length)
              {
                  DEROctetString.encode(_derOut, _buf);
                  _off = 0;
              }
          }
  
          public void write(byte[] b, int off, int len) throws IOException
          {
              while (len > 0)
              {
                  int numToCopy = Math.min(len, _buf.length - _off);
                  System.arraycopy(b, off, _buf, _off, numToCopy);
  
                  _off += numToCopy;
                  if (_off < _buf.length)
                  {
                      break;
                  }
  
                  DEROctetString.encode(_derOut, _buf);
                  _off = 0;
  
                  off += numToCopy;
                  len -= numToCopy;
              }
          }
  
          public void close() 
              throws IOException
          {
              if (_off != 0)
              {
                  byte[] bytes = new byte[_off];
                  System.arraycopy(_buf, 0, bytes, 0, _off);
                  
                  DEROctetString.encode(_derOut, bytes);
              }
              
               writeBEREnd();
          }
      }
  }
  