Code Monkey home page Code Monkey logo

cupcake's Introduction

Cupcake

Cupcake is an efficient Rust library for the (additive version of) Fan-Vercauteren homomorphic encryption scheme, offering capabilities to encrypt vectors, add/subtract two encrypted vectors, and rerandomize a ciphertext.

Requirements

Cupcake requires or works with

  • Mac OS X or Linux

Installation

Add the following line to the dependencies of your Cargo.toml:

Cupcake = "0.2.1"

Building from source

git clone https://github.com/facebookresearch/Cupcake
cd cupcake
cargo build --release

Examples

Several examples are included in examples/<name>.rs, and can be run via cargo run --example <name>

Documentation

Documentation on the API can be built from cargo doc.

Benchmarks and Tests

We have included benchmarks and tests for both homomorphic operations and underlying arithmetic operations. They can be run using cargo bench and cargo test.

Supported parameters

Currently, we provide only one set of secure parameter, namely FV::<Scalar>::default_2048();. This parameter set has an estimated security level of about 128 bits according to the homomorphic encryption security standards link. Use other parameters at your own risk! With the default parameter set, the plaintext type is vector of u8 with a fixed length 2048.

References

See the CONTRIBUTING file for how to help out.

License

Cupcake is MIT licensed, as found in the LICENSE file.

cupcake's People

Contributors

bmcase avatar haochenuw avatar shubho avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cupcake's Issues

Implement `std::ops::{Add, Sub, AddAssign, SubAssign}` for ring elements and for ciphertexts

Rust enables overloading of the +, +=, -, and -= operators for user-defined types; this could be used to enable writing something like &a + &b, where a and b are ciphertexts, or even where b is a plaintext message. For ring-ring and ciphertext-ciphertext addition, the impl is fairly straightforward, along the lines of

impl<'a, T> Add<&'a RqPoly<T>> for &'a RqPoly<T>
where
    T: Clone + ArithUtils<T> + PartialEq,
{
	type Output = RqPoly<T>;
	
	fn add(self, other: &RqPoly<T>) -> RqPoly<T> {
		let mut result = self.clone();
		result.add_inplace(other);
		result
	}
}

impl<'a, T> Add<&'a FVCiphertext<T>> for &'a FVCiphertext<T>
where
    T: Clone + ArithUtils<T> + PartialEq,
{
	type Output = FVCiphertext<T>;
	
    fn add(self, other: &FVCiphertext<T>, ct2: &FVCiphertext<T>) -> FVCiphertext<T> {
    	let mut result = self.clone();
		result.0.add_inplace(&other.0);
		result.1.add_inplace(&other.1);
		result
    }
}

For plaintext-ciphertext addition, it's a little more complicated as we need to pass in some additional data (namely, self.delta here), but if we include this data in the ciphertext or plaintext then overloading should be possible still.

Let me know if a PR for some of these changes would be appreciated!

Crate naming conventions

Hi @haochenuw,

Not sure if you're aware of this, but just as a friendly heads up, in the Rust community, usually crate names are all in lowercase; this matches the naming scheme for modules. See here and here for details. (There is some disagreement on whether to choose kebab-case or snake_case, but in both cases the name is all lowercase.)

Hence I'd like to suggest renaming the crate to cupcake to follow these conventions. Of course, feel free to close this issue if you'd like to keep the name as is.

sk and pk serialization/deserialization

Hello!
Sorry for my (maybe) naive question but I am fairly new to the Rust language.
I wanted to ask if there could be a method to serialize/deserialize the pk and the sk into a Vec.
Maybe with serde::Serialize on the RqPoly struct and an sk.to_bytes() impl.
Thanks in advance.

Question. using with serde or string

Hello.
I only know the definition of Homomorphic Encryption.
And I want to use a cupcake for my personal project.

However, there are only a few simple examples. So, I leave a question here.
I want to use a homomorphic encryption with a string or serde data.
Can you give me some examples code?

And is it right to ask here?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.