Skip to main content

Microsoft SEAL bindings for Python

Project description

Crates.io PyPI CI


seal bindings

Microsoft SEAL bindings for Rust and Python

🌟 seal

FFI bindings from the famous SEAL library for Rust and Python. The main goal of this project is to provide a simple and fast way to install SEAL for both programming languages.

Built With

The SEAL bindings are a continuation from the seal_fhe crate, with the support for the CKKS scheme and the addition of new features like tensor encoders, that allow us to overcome the size barriers of the ciphertext tensors and create AI applications easily with high-dimensional encrypted ciphertext.

Prerequisites

Currently, this crate is available only for a few architectures. Please, make sure that your operating system is compatible with any build that is working:

System Support
MacOSX aarch6 seal-w64
Linux x86_64 seal-w64

Instalation

Python

Make sure your OS is supported. If it is, just type:

pip install sealy

If the OS/Platform that you use it is not in the supported list, feel free too try to clone this project and build yourself locally.

Rust

cargo add sealy

Usage

Python

Here is a simple example of multiplying a ciphertext array to a plaintext array.

from sealy import (BFVEncoder, BfvEncryptionParametersBuilder, BFVEvaluator,
                  CoefficientModulus, Context, Decryptor, DegreeType,
                  Encryptor, KeyGenerator, PlainModulus, SecurityLevel)

params = (
    BfvEncryptionParametersBuilder()
    .with_poly_modulus_degree(DegreeType(8192))
    .with_coefficient_modulus(
        CoefficientModulus.create(DegreeType(8192), [50, 30, 30, 50, 50])
    )
    .with_plain_modulus(PlainModulus.batching(DegreeType(8192), 32))
    .build()
)

ctx = Context(params, False, SecurityLevel(128))
gen = KeyGenerator(ctx)

encoder = BFVEncoder(ctx)

public_key = gen.create_public_key()
secret_key = gen.secret_key()

encryptor = Encryptor(ctx, public_key)
decryptor = Decryptor(ctx, secret_key)
evaluator = BFVEvaluator(ctx)

plaintext = [1, 2, 3]
factor = [2, 2, 2]

encoded_plaintext = encoder.encode_int(plaintext)
encoded_factor = encoder.encode_int(factor)

ciphertext = encryptor.encrypt(encoded_plaintext)
ciphertext_result = evaluator.multiply_plain(ciphertext, encoded_factor)

decrypted = decryptor.decrypt(ciphertext_result)
decoded = encoder.decode_int(decrypted)

print(decoded[:3]) # [2, 4, 6]

Rust

Equivalent code from above's example, written in rust:

use seal::{
	BFVEncoder, BFVEvaluator, BfvEncryptionParametersBuilder, CoefficientModulus, Context,
	Decryptor, DegreeType, Encoder, Encryptor, Evaluator, KeyGenerator, PlainModulus,
	SecurityLevel,
};

fn main() -> anyhow::Result<()> {
	let params = BfvEncryptionParametersBuilder::new()
		.set_poly_modulus_degree(DegreeType::D8192)
		.set_coefficient_modulus(
			CoefficientModulus::create(DegreeType::D8192, &[50, 30, 30, 50, 50]).unwrap(),
		)
		.set_plain_modulus(PlainModulus::batching(DegreeType::D8192, 32)?)
		.build()?;

	let ctx = Context::new(&params, false, SecurityLevel::TC128)?;
	let gen = KeyGenerator::new(&ctx)?;

	let encoder = BFVEncoder::new(&ctx)?;

	let public_key = gen.create_public_key();
	let secret_key = gen.secret_key();

	let encryptor = Encryptor::with_public_key(&ctx, &public_key)?;
	let decryptor = Decryptor::new(&ctx, &secret_key)?;
	let evaluator = BFVEvaluator::new(&ctx)?;

	let plaintext: Vec<i64> = vec![1, 2, 3];
	let factor = vec![2, 2, 2];

	let encoded_plaintext = encoder.encode_u64(&plaintext)?;
	let encoded_factor = encoder.encode_u64(&factor)?;

	let ciphertext = encryptor.encrypt(&encoded_plaintext)?;
	let ciphertext_result = evaluator.multiply_plain(&ciphertext, &encoded_factor)?;

	let decrypted = decryptor.decrypt(&ciphertext_result)?;
	let decoded = encoder.decode_u64(&decrypted);

	println!("{:?}", &decoded.into_iter().take(3).collect::<Vec<_>>()); // [2, 4, 6]

	Ok(())
}

Roadmap

The project is in the early stages of development.

See the open issues for a list of issues and proposed features.

OBS: To propose new features or report bugs, check out the correct templates.

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sealy-0.3.0.tar.gz (5.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

sealy-0.3.0-cp312-cp312-manylinux_2_34_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

sealy-0.3.0-cp312-cp312-macosx_11_0_arm64.whl (817.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

sealy-0.3.0-cp311-cp311-macosx_11_0_arm64.whl (818.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

sealy-0.3.0-cp310-cp310-manylinux_2_34_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

sealy-0.3.0-cp310-cp310-macosx_11_0_arm64.whl (818.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

sealy-0.3.0-cp39-cp39-macosx_11_0_arm64.whl (820.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file sealy-0.3.0.tar.gz.

File metadata

  • Download URL: sealy-0.3.0.tar.gz
  • Upload date:
  • Size: 5.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for sealy-0.3.0.tar.gz
Algorithm Hash digest
SHA256 7bb633be774f29433cf3083acbf10fce530e7d6b779535127d311107e2b20f8d
MD5 7107d01a3ffecc7779b44d508b657ac2
BLAKE2b-256 ebe94870f7c420fa3bedcf15a9fc6c6700851dc59dc748fc57c93c37e630bdc0

See more details on using hashes here.

File details

Details for the file sealy-0.3.0-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for sealy-0.3.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f18adc29bb1b10dbe2fd74e4c036a21da8f3258fa6238da0332f1027f04bad1d
MD5 b407bb5760b754277d8fd93b7893125c
BLAKE2b-256 dba6e830a26ba9ebf7a66bc06496c1e7769574f664464de32976a862c539a9b3

See more details on using hashes here.

File details

Details for the file sealy-0.3.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sealy-0.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dd0b7d983bd5d5c2c5b1c8f0d13302914ba697e9fc3efe0b9ae3217314475aab
MD5 8df52b4555b0600e396fbe0bf488a552
BLAKE2b-256 426e5c5243b2741c1999ec1698a77397a369ebabec31013df93eb488f07ee5e2

See more details on using hashes here.

File details

Details for the file sealy-0.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sealy-0.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 93a23546e6356445eb4150cb61ee3fe6d78244793ff568d6bab5d31ee3ec60b7
MD5 2978f63a5c0e76c8439d1b63a84739a4
BLAKE2b-256 e00ebfc0b670c1615eeb7b623d9f4dae84b9e10828366477953b2238d8949ded

See more details on using hashes here.

File details

Details for the file sealy-0.3.0-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for sealy-0.3.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 872c2a4b5f2a4c042df0c15f903b4527acc45868e7be001343d9fcd0e48d9be5
MD5 db0f2f07ada27f477cb3a58a6e0bfeb7
BLAKE2b-256 a6413123374877d75fb6e26f30bf368515ce938012793a64cd181cdd5ab5e559

See more details on using hashes here.

File details

Details for the file sealy-0.3.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sealy-0.3.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a58cf90223ca0092aee36fce20561c5b69e84239c82b332647a33279fb27362d
MD5 554b39b30ffd84ffaa88d15c12e195c0
BLAKE2b-256 509688d993bbf6d203ec311c17a5e9f1c72e144305d4fbe06034994aea69a0bc

See more details on using hashes here.

File details

Details for the file sealy-0.3.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sealy-0.3.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 67d09a69ea32d03f0c6adde4fad1a01fdc394c1a2acf1334e7bd31474decb579
MD5 7e969446d95165fdc30080b365ee2648
BLAKE2b-256 04a0598d9aec298de55fe266eb7626b6f334c1ee4d0f9053a5bde5d07ac0168e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page