docs: def update(self, data):
          """
          Performs actual encrypton/decrypion
  
          @param data - part of the plain text/ciphertext to process
          @returns - part of ciphercext/plain text
  
          Passed chunk of text doesn't need to contain full ciher
          blocks. If neccessery, part of passed data would be kept
          internally until next data would be received or finish
          called
          """
          if self.cipher_finalized:
              raise CipherError("No updates allowed")
          if not isinstance(data, bintype):
              raise TypeError("A byte string is expected")
          if len(data) == 0:
              return ""
          outbuf = create_string_buffer(self.block_size+len(data))
          outlen = c_int(0)
          ret = libcrypto.EVP_CipherUpdate(self.ctx, outbuf, byref(outlen),
                                           data, len(data))
          if ret <= 0:
              self._clean_ctx()
              self.cipher_finalized = True
              raise CipherError("problem processing data")
          return outbuf.raw[:int(outlen.value)]