docs: def read(self, length=None):
          """
          Reads data from readble BIO. For test purposes.
          @param length - if specifed, limits amount of data read.
          If not BIO is read until end of buffer
          """
          if not length is None:
              if not isinstance(length, inttype) :
                  raise TypeError("length to read should be number")
              buf = create_string_buffer(length)
              readbytes = libcrypto.BIO_read(self.bio, buf, length)
              if readbytes == -2:
                  raise NotImplementedError("Function is not supported by" +
                                            "this BIO")
              if readbytes == -1:
                  raise IOError
              if readbytes == 0:
                  return b""
              return buf.raw[:readbytes]
          else:
              buf = create_string_buffer(1024)
              out = b""
              readbytes = 1
              while readbytes > 0:
                  readbytes = libcrypto.BIO_read(self.bio, buf, 1024)
                  if readbytes == -2:
                      raise NotImplementedError("Function is not supported by " +
                                                "this BIO")
                  if readbytes == -1:
                      raise IOError
                  if readbytes > 0:
                      out += buf.raw[:readbytes]
              return out