Huelse / SEAL-Python

Microsoft SEAL 4.X For Python
MIT License
324 stars 65 forks source link

Getting logs of errors from SEAL #124

Open arituerto opened 2 months ago

arituerto commented 2 months ago

Type I'm having issues when encrypting vectors that I cannot reproduce in my development machine.

Describe I have a small piece of software that used Python-SEAL. Everything works fine but when I move to a different machine software stops working, I cannot create keys nor encrypt a vector when I provide keys created in my machine. Software simply stops without any error and I cannot reproduce in my dev machine. Is there any way of enabling logs for SEAL?

Thanks in advance!

Huelse commented 2 months ago

Can you provide a code case and the system environment? This library should throw std errors like in C++.

arituerto commented 2 months ago

I have a class that controls all SEAL related stuff. There, all the seal objects are created, initialized so they can be used when needed:

params = seal.EncryptionParameters(seal_scheme_type)
params.set_poly_modulus_degree(poly_modulus_degree)
if coeff_modulus is not None:
    params.set_coeff_modulus(coeff_modulus)
else:
    params.set_coeff_modulus(
        seal.CoeffModulus.BFVDefault(poly_modulus_degree))
if plain_modulus is not None:
    params.set_plain_modulus(plain_modulus)
else:
    params.set_plain_modulus(
        seal.PlainModulus.Batching(poly_modulus_degree, plain_modulus_bit_size))
self.__context = context = seal.SEALContext(params)
logging.info("Context created and set")
self.__batch_encoder = seal.BatchEncoder(self.__context)
logging.info("BatchEncoder created")
self.__evaluator = seal.Evaluator(self.__context)
logging.info("Evaluator created")

Encryptor is initialized with a public key read from file:

self.__encryptor = seal.Encryptor(self.__context, public_key)

Process method is the one doing the encryption, it receives a vector and tries to encrypt it

def process(self, vector_id:  np.Array):
        pod_vector = [np.int64(0.) for i in range(
            int(self.__batch_encoder.slot_count() / 2))]
        for i, v in enumerate(vector_id):
            pod_vector[i] = np.int64(self.__precision * v)
        logging.debug("Pod vector computed")
        plain_vector = self.__batch_encoder.encode(pod_vector)
        logging.debug("Vector encoded")
        encrypted_vector = self.__encryptor.encrypt(plain_vector)
        logging.debug("Vector encrypted")

Last log is never reached, program stops with no message, no raised exception, nothing.

I have tested the code both in linux (ubuntu 22.04 and windows 11) and it works in both (Processor: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz 2.42 GHz). The computer where things are failing is an i7 with the same windows.

I checked SEAL code and didn't find any std error code, just throwing c++ exceptions.

arituerto commented 1 month ago

Hello. Do you have any idea about what's happening with the c++ logs or the exceptions? Something that I can try? Thanks in advance

Huelse commented 1 month ago

Sorry for the late reply, I do not observe any specific issues, how the SEALContext be created? can you impl it without the class wrapper?

arituerto commented 1 month ago

I suspect that the issue is related with the SEAL compilation failing when trying to use wheel to install in a different machine. When I recompile and reinstall SEAL-Python everything works.