Finalizes digest operation and return digest value
        Optionally hashes more data before finalizing

def digest(self, data=None):
        """
        Finalizes digest operation and return digest value
        Optionally hashes more data before finalizing
        """
        if self.digest_finalized:
            return self.digest_out.raw[:self.digest_size]
        if data is not None:
            self.update(data)
        self.digest_out = create_string_buffer(256)
        length = c_long(0)
        result = libcrypto.EVP_DigestFinal_ex(self.ctx, self.digest_out,
                                              byref(length))
        if result != 1:
            raise DigestError("Unable to finalize digest")
        self.digest_finalized = True
        return self.digest_out.raw[:self.digest_size]