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

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)]