public int read() throws IOException {
    if (_currentStream == null) {
      if (!_first) {
        return -1;
      }

      ASN1OctetStringParser s = (ASN1OctetStringParser) _parser.readObject();

      if (s == null) {
        return -1;
      }

      _first = false;
      _currentStream = s.getOctetStream();
    }

    for (; ; ) {
      int b = _currentStream.read();

      if (b >= 0) {
        return b;
      }

      ASN1OctetStringParser s = (ASN1OctetStringParser) _parser.readObject();

      if (s == null) {
        _currentStream = null;
        return -1;
      }

      _currentStream = s.getOctetStream();
    }
  }
  public int read(byte[] b, int off, int len) throws IOException {
    if (_currentStream == null) {
      if (!_first) {
        return -1;
      }

      ASN1OctetStringParser s = (ASN1OctetStringParser) _parser.readObject();

      if (s == null) {
        return -1;
      }

      _first = false;
      _currentStream = s.getOctetStream();
    }

    int totalRead = 0;

    for (; ; ) {
      int numRead = _currentStream.read(b, off + totalRead, len - totalRead);

      if (numRead >= 0) {
        totalRead += numRead;

        if (totalRead == len) {
          return totalRead;
        }
      } else {
        ASN1OctetStringParser aos = (ASN1OctetStringParser) _parser.readObject();

        if (aos == null) {
          _currentStream = null;
          return totalRead < 1 ? -1 : totalRead;
        }

        _currentStream = aos.getOctetStream();
      }
    }
  }