diff --git a/lib/cairo.ex b/lib/cairo.ex index de64546..c6fb908 100644 --- a/lib/cairo.ex +++ b/lib/cairo.ex @@ -62,7 +62,7 @@ defmodule Cairo do list(byte()) | {:error, term()} defdelegate get_public_key(priv_key), to: Cairo.CairoProver, - as: :cairo_get_binding_sig_public_key + as: :get_public_key @spec poseidon_single(list(byte())) :: list(byte()) | {:error, term()} @@ -114,4 +114,16 @@ defmodule Cairo do ), to: Cairo.CairoProver, as: :cairo_generate_compliance_input_json + + @spec encrypt(list(list(byte())), list(byte()), list(byte()), list(byte())) :: + list(byte()) | {:error, term()} + defdelegate encrypt(messages, pk, sk, nonce), + to: Cairo.CairoProver, + as: :encrypt + + @spec decrypt(list(list(byte())), list(byte())) :: + list(byte()) | {:error, term()} + defdelegate decrypt(cihper, sk), + to: Cairo.CairoProver, + as: :decrypt end diff --git a/lib/cairo/cairo.ex b/lib/cairo/cairo.ex index 1090574..002bc55 100644 --- a/lib/cairo/cairo.ex +++ b/lib/cairo/cairo.ex @@ -35,9 +35,9 @@ defmodule Cairo.CairoProver do @spec cairo_random_felt() :: nif_result(list(byte())) def cairo_random_felt(), do: error() - @spec cairo_get_binding_sig_public_key(list(byte())) :: + @spec get_public_key(list(byte())) :: nif_result(list(byte())) - def cairo_get_binding_sig_public_key(_priv_key), do: error() + def get_public_key(_priv_key), do: error() @spec poseidon_single(list(byte())) :: nif_result(list(byte())) def poseidon_single(_input), do: error() @@ -64,6 +64,13 @@ defmodule Cairo.CairoProver do ), do: error() + @spec encrypt(list(list(byte())), list(byte()), list(byte()), list(byte())) :: + nif_result(list(byte())) + def encrypt(_messages, _pk, _sk, _nonce), do: error() + + @spec decrypt(list(list(byte())), list(byte())) :: nif_result(list(byte())) + def decrypt(_cihper, _sk), do: error() + defp error, do: :erlang.nif_error(:nif_not_loaded) end diff --git a/native/cairo_prover/src/encryption.rs b/native/cairo_prover/src/encryption.rs new file mode 100644 index 0000000..735368d --- /dev/null +++ b/native/cairo_prover/src/encryption.rs @@ -0,0 +1,183 @@ +use starknet_crypto::{poseidon_hash, poseidon_hash_many}; +use starknet_curve::curve_params::GENERATOR; +use starknet_types_core::{ + curve::{AffinePoint, ProjectivePoint}, + felt::Felt, +}; + +// The PLAINTEXT_NUM should be fixed to achieve the indistinguishability of resource logics +// Make it 10 +pub const PLAINTEXT_NUM: usize = 10; +pub const CIPHERTEXT_MAC: usize = PLAINTEXT_NUM; +pub const CIPHERTEXT_PK_X: usize = PLAINTEXT_NUM + 1; +pub const CIPHERTEXT_PK_Y: usize = PLAINTEXT_NUM + 2; +pub const CIPHERTEXT_NONCE: usize = PLAINTEXT_NUM + 3; +pub const CIPHERTEXT_NUM: usize = PLAINTEXT_NUM + 4; + +#[derive(Debug, Clone)] +pub struct Ciphertext([Felt; CIPHERTEXT_NUM]); + +#[derive(Debug, Clone)] +pub struct Plaintext([Felt; PLAINTEXT_NUM]); + +// Symmetric encryption key +#[derive(Debug, Clone)] +pub struct SecretKey(AffinePoint); + +impl Ciphertext { + pub fn inner(&self) -> &[Felt; CIPHERTEXT_NUM] { + &self.0 + } + + pub fn encrypt(messages: &[Felt], pk: &AffinePoint, sk: &Felt, encrypt_nonce: &Felt) -> Self { + // Generate the secret key + let (secret_key_x, secret_key_y) = SecretKey::from_dh_exchange(pk, sk).get_coordinates(); + + // Pad the messages + let plaintext = Plaintext::padding(messages); + + // Init poseidon state + let mut poseidon_state = poseidon_hash_many(&vec![ + secret_key_x, + secret_key_y, + *encrypt_nonce, + Felt::from(PLAINTEXT_NUM), + ]); + + // Encrypt + let mut cipher = vec![]; + plaintext.inner().iter().for_each(|f| { + poseidon_state += f; + cipher.push(poseidon_state); + poseidon_state = poseidon_hash(poseidon_state, secret_key_x); + }); + + // Add MAC + cipher.push(poseidon_state); + + // Add sender's public key + let generator = ProjectivePoint::from_affine(GENERATOR.x(), GENERATOR.y()).unwrap(); + let sender_pk = (&generator * *sk).to_affine().unwrap(); + cipher.push(sender_pk.x()); + cipher.push(sender_pk.y()); + + // Add encrypt_nonce + cipher.push(*encrypt_nonce); + + cipher.into() + } + + pub fn decrypt(&self, sk: &Felt) -> Option> { + let cipher_text = self.inner(); + let cipher_len = cipher_text.len(); + if cipher_len != CIPHERTEXT_NUM { + return None; + } + + let mac = cipher_text[CIPHERTEXT_MAC]; + let pk_x = cipher_text[CIPHERTEXT_PK_X]; + let pk_y = cipher_text[CIPHERTEXT_PK_Y]; + let encrypt_nonce = cipher_text[CIPHERTEXT_NONCE]; + + if let Ok(pk) = AffinePoint::new(pk_x, pk_y) { + // Generate the secret key + let (secret_key_x, secret_key_y) = + SecretKey::from_dh_exchange(&pk, sk).get_coordinates(); + + // Init poseidon sponge state + let mut poseidon_state = poseidon_hash_many(&vec![ + secret_key_x, + secret_key_y, + encrypt_nonce, + Felt::from(PLAINTEXT_NUM), + ]); + + // Decrypt + let mut msg = vec![]; + for cipher_element in &cipher_text[0..PLAINTEXT_NUM] { + let msg_element = *cipher_element - poseidon_state; + msg.push(msg_element); + poseidon_state = poseidon_hash(*cipher_element, secret_key_x); + } + + if mac != poseidon_state { + return None; + } + + Some(msg) + } else { + return None; + } + } +} + +impl From> for Ciphertext { + fn from(input_vec: Vec) -> Self { + Ciphertext( + input_vec + .try_into() + .expect("public input with incorrect length"), + ) + } +} + +impl Plaintext { + pub fn inner(&self) -> &[Felt; PLAINTEXT_NUM] { + &self.0 + } + + pub fn to_vec(&self) -> Vec { + self.0.to_vec() + } + + pub fn padding(msg: &[Felt]) -> Self { + let mut plaintext = msg.to_owned(); + let padding = std::iter::repeat(Felt::ZERO).take(PLAINTEXT_NUM - msg.len()); + plaintext.extend(padding); + plaintext.into() + } +} + +impl From> for Plaintext { + fn from(input_vec: Vec) -> Self { + Plaintext( + input_vec + .try_into() + .expect("public input with incorrect length"), + ) + } +} + +impl SecretKey { + pub fn from_dh_exchange(pk: &AffinePoint, sk: &Felt) -> Self { + Self( + (&ProjectivePoint::try_from(pk.clone()).unwrap() * *sk) + .to_affine() + .unwrap(), + ) + } + + pub fn get_coordinates(&self) -> (Felt, Felt) { + (self.0.x(), self.0.y()) + } +} + +#[test] +fn test_encryption() { + // Key generation + let sender_sk = Felt::ONE; + let pk = GENERATOR; + + // let key = SecretKey::from_dh_exchange(pk, random_sk); + let messages = [Felt::ONE, Felt::ZERO, Felt::ONE]; + let encrypt_nonce = Felt::ONE; + + // Encryption + let cipher = Ciphertext::encrypt(&messages, &pk, &sender_sk, &encrypt_nonce); + + // Decryption + let decryption = cipher.decrypt(&Felt::ONE).unwrap(); + + let padded_plaintext = Plaintext::padding(&messages); + assert_eq!(padded_plaintext.to_vec(), decryption); +} diff --git a/native/cairo_prover/src/errors.rs b/native/cairo_prover/src/errors.rs index 675659b..f9f55db 100644 --- a/native/cairo_prover/src/errors.rs +++ b/native/cairo_prover/src/errors.rs @@ -143,3 +143,22 @@ impl Encoder for CairoBindingSigError { self.to_string().encode(env) } } + +#[derive(Debug)] +pub enum TypeError { + DecodingError(String), +} + +impl std::fmt::Display for TypeError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + TypeError::DecodingError(msg) => write!(f, "Type error: {}", msg), + } + } +} + +impl Encoder for TypeError { + fn encode<'a>(&self, env: Env<'a>) -> Term<'a> { + self.to_string().encode(env) + } +} diff --git a/native/cairo_prover/src/lib.rs b/native/cairo_prover/src/lib.rs index f90e46a..2641f37 100644 --- a/native/cairo_prover/src/lib.rs +++ b/native/cairo_prover/src/lib.rs @@ -1,14 +1,18 @@ +#![allow(dead_code)] + mod compliance_input; +mod encryption; mod errors; mod utils; use crate::{ compliance_input::ComplianceInputJson, + encryption::Ciphertext, errors::{ CairoBindingSigError, CairoBindingSigVerifyError, CairoGetOutputError, CairoProveError, CairoSignError, CairoVerifyError, }, - utils::{felt_to_string, random_felt}, + utils::{bytes_to_affine, bytes_to_felt, bytes_to_felt_vec, felt_to_string, random_felt}, }; use cairo_platinum_prover::{ air::{generate_cairo_proof, verify_cairo_proof, PublicInputs, Segment, SegmentName}, @@ -356,7 +360,7 @@ fn cairo_random_felt() -> NifResult> { } #[rustler::nif] -fn cairo_get_binding_sig_public_key(priv_key: Vec) -> NifResult> { +fn get_public_key(priv_key: Vec) -> NifResult> { let priv_key_felt = Felt::from_bytes_be_slice(&priv_key); let generator = ProjectivePoint::from_affine(GENERATOR.x(), GENERATOR.y()) @@ -372,50 +376,26 @@ fn cairo_get_binding_sig_public_key(priv_key: Vec) -> NifResult> { Ok(ret) } fn message_digest(msg: Vec>) -> NifResult { - let felt_msg_vec: Vec = msg - .into_iter() - .map(|bytes| Felt::from_bytes_be(&bytes.try_into().expect("Slice with incorrect length"))) - .collect(); + let felt_msg_vec: Vec = bytes_to_felt_vec(msg)?; Ok(poseidon_hash_many(&felt_msg_vec)) } #[rustler::nif] fn poseidon_single(x: Vec) -> NifResult> { - let mut padded_x = x; - padded_x.resize(32, 0); - let x_bytes: [u8; 32] = padded_x - .as_slice() - .try_into() - .expect("Slice with incorrect length"); - let x_field = Felt::from_bytes_be(&x_bytes); + let x_field = bytes_to_felt(x)?; Ok(poseidon_hash_single(x_field).to_bytes_be().to_vec()) } #[rustler::nif] fn poseidon(x: Vec, y: Vec) -> NifResult> { - let x_bytes: [u8; 32] = x - .as_slice() - .try_into() - .expect("Slice with incorrect length"); - let x_field = Felt::from_bytes_be(&x_bytes); - let y_bytes: [u8; 32] = y - .as_slice() - .try_into() - .expect("Slice with incorrect length"); - let y_field = Felt::from_bytes_be(&y_bytes); + let x_field = bytes_to_felt(x)?; + let y_field = bytes_to_felt(y)?; Ok(poseidon_hash(x_field, y_field).to_bytes_be().to_vec()) } #[rustler::nif] fn poseidon_many(inputs: Vec>) -> NifResult> { - let mut vec_fe = Vec::new(); - for i in inputs { - let i_bytes: [u8; 32] = i - .as_slice() - .try_into() - .expect("Slice with incorrect length"); - vec_fe.push(Felt::from_bytes_be(&i_bytes)) - } + let vec_fe = bytes_to_felt_vec(inputs)?; let result_fe = poseidon_hash_many(&vec_fe); Ok(result_fe.to_bytes_be().to_vec()) } @@ -484,6 +464,51 @@ fn cairo_generate_compliance_input_json( ) } +#[rustler::nif] +fn encrypt( + messages: Vec>, + pk: Vec, + sk: Vec, + nonce: Vec, +) -> NifResult>> { + // Decode messages + let msgs_felt = bytes_to_felt_vec(messages)?; + + // Decode pk + let pk_affine = bytes_to_affine(pk)?; + + // Decode sk + let sk_felt = bytes_to_felt(sk)?; + + // Decode nonce + let nonce_felt = bytes_to_felt(nonce)?; + + // Encrypt + let cipher = Ciphertext::encrypt(&msgs_felt, &pk_affine, &sk_felt, &nonce_felt); + let cipher_bytes = cipher + .inner() + .iter() + .map(|x| x.to_bytes_be().to_vec()) + .collect(); + + Ok(cipher_bytes) +} + +#[rustler::nif] +fn decrypt(cihper: Vec>, sk: Vec) -> NifResult>> { + // Decode messages + let cipher_felt = bytes_to_felt_vec(cihper)?; + + // Decode sk + let sk_felt = bytes_to_felt(sk)?; + + // Encrypt + let plaintext = Ciphertext::from(cipher_felt).decrypt(&sk_felt).unwrap(); + let plaintext_bytes = plaintext.iter().map(|x| x.to_bytes_be().to_vec()).collect(); + + Ok(plaintext_bytes) +} + rustler::init!( "Elixir.Cairo.CairoProver", [ @@ -493,13 +518,15 @@ rustler::init!( cairo_binding_sig_sign, cairo_binding_sig_verify, cairo_random_felt, - cairo_get_binding_sig_public_key, + get_public_key, poseidon_single, poseidon, poseidon_many, program_hash, cairo_felt_to_string, cairo_generate_compliance_input_json, + encrypt, + decrypt, ] ); diff --git a/native/cairo_prover/src/utils.rs b/native/cairo_prover/src/utils.rs index eea74a6..d4e5cf9 100644 --- a/native/cairo_prover/src/utils.rs +++ b/native/cairo_prover/src/utils.rs @@ -1,4 +1,7 @@ +use crate::errors::TypeError; use rand::{thread_rng, RngCore}; +use rustler::{Error, NifResult}; +use starknet_types_core::curve::AffinePoint; use starknet_types_core::felt::Felt; pub fn felt_to_string(felt: &Vec) -> String { @@ -18,3 +21,46 @@ pub fn random_felt() -> Vec { let felt = Felt::from_bytes_be_slice(&felt); felt.to_bytes_be().to_vec() } + +pub fn bytes_to_felt_vec(bytes: Vec>) -> NifResult> { + let mut vec_fe = Vec::new(); + for i in bytes { + let i_bytes: [u8; 32] = i.as_slice().try_into().map_err(|_| { + Error::Term(Box::new(TypeError::DecodingError( + "invalid felt".to_string(), + ))) + })?; + vec_fe.push(Felt::from_bytes_be(&i_bytes)) + } + + Ok(vec_fe) +} + +pub fn bytes_to_felt(bytes: Vec) -> NifResult { + let felt: [u8; 32] = bytes.try_into().map_err(|_| { + Error::Term(Box::new(TypeError::DecodingError( + "invalid felt".to_string(), + ))) + })?; + + Ok(Felt::from_bytes_be(&felt)) +} + +pub fn bytes_to_affine(bytes: Vec) -> NifResult { + if bytes.len() != 64 { + return Err(Error::Term(Box::new(TypeError::DecodingError( + "invalid pk".to_string(), + )))); + } + let key_x = + Felt::from_bytes_be(&bytes[0..32].try_into().map_err(|_| { + Error::Term(Box::new(TypeError::DecodingError("invalid pk".to_string()))) + })?); + let key_y = + Felt::from_bytes_be(&bytes[32..64].try_into().map_err(|_| { + Error::Term(Box::new(TypeError::DecodingError("invalid pk".to_string()))) + })?); + + AffinePoint::new(key_x, key_y) + .map_err(|_| Error::Term(Box::new(TypeError::DecodingError("invalid pk".to_string())))) +} diff --git a/native/cairo_vm/encryption.json b/native/cairo_vm/encryption.json new file mode 100644 index 0000000..e8526ab --- /dev/null +++ b/native/cairo_vm/encryption.json @@ -0,0 +1 @@ +{"attributes":[],"builtins":["output","range_check","ec_op","poseidon"],"data":["0x40480017fff7fff","0x4","0x1104800180018000","0x4","0x10480017fff7fff","0x4b7","0x482680017ffe8000","0x1","0x481080007fff8000","0x481080007fff8000","0x481080007fff8000","0x481080007fff8000","0x481080007fff8000","0x1104800180018000","0x33f","0x480080007ffe8000","0x480080017ffd8000","0x480080027ffc8000","0x480080007ffc8000","0x480080017ffb8000","0x480080027ffa8000","0x480080037ff98000","0x480080047ff88000","0x480080057ff78000","0x480080067ff68000","0x480080077ff58000","0x480080087ff48000","0x480080097ff38000","0x4800800a7ff28000","0x4800800b7ff18000","0x4800800c7ff08000","0x4800800d7fef8000","0x208b7fff7fff7ffe","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x208b7fff7fff7ffe","0x480280027ffc8000","0x480280007ffd8000","0x4002800080007fff","0x480280017ffd8000","0x4002800180007fff","0x480280027ffd8000","0x4002800280007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff6","0x4802800380008000","0x4802800480008000","0x4802800580008000","0x480280007ffc8000","0x480280017ffc8000","0x4826800180008000","0x6","0x482480017ff88000","0x5","0x482480017ff78000","0x2","0x208b7fff7fff7ffe","0x480280017ffa8000","0x480280007ffd8000","0x4002800080007fff","0x480280017ffd8000","0x4002800180007fff","0x480280007ffb8000","0x4002800280007fff","0x480280017ffb8000","0x4002800380007fff","0x4003800480007ffc","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffde","0x4802800580008000","0x4802800680008000","0x480280007ffa8000","0x4826800180008000","0x7","0x480280027ffa8000","0x482480017ff98000","0x4","0x482480017ff88000","0x2","0x208b7fff7fff7ffe","0x10280017ffd7fff","0x4802800a7ffd8000","0x480280097ffd8000","0x480280087ffd8000","0x480280077ffd8000","0x480280067ffd8000","0x480280057ffd8000","0x480280047ffd8000","0x480280037ffd8000","0x480480017fff8000","0xa","0x480280017ffd8000","0x48307fff80007ffe","0x1107fff7fff7fff","0x48107fff7fff8000","0x48107fff7fff8000","0x48107fff7fff8000","0x48107fff7fff8000","0x48107fff7fff8000","0x48107fff7fff8000","0x48107fff7fff8000","0x48107fff7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbb","0x482480017ffe8000","0x8","0x480280017ffd8000","0x480280027ffd8000","0x480480017fff8000","0x9","0x4829801080008012","0x48297ffc80008012","0x480280007ffd8000","0x48297ffc80008010","0x482a7ffc80118000","0x10880107fff7fff","0x480880077fff8000","0x480880067fff8000","0x480880057fff8000","0x480880047fff8000","0x480880037fff8000","0x480880027fff8000","0x480880017fff8000","0x480880007fff8000","0x10880147fff7fff","0x48087ff47fff8000","0x48087ff57fff8000","0x48087ff67fff8000","0x48087ff77fff8000","0x48087ff87fff8000","0x48087ff97fff8000","0x48087ffa7fff8000","0x48087ffb7fff8000","0x4808800f7fff8000","0x208b7fff7fff7ffe","0x10280027ffd7fff","0x48087ff47fff8000","0x48087ff57fff8000","0x48087ff67fff8000","0x48087ff77fff8000","0x48087ff87fff8000","0x48087ff97fff8000","0x48087ffa7fff8000","0x48087ffb7fff8000","0x48087ffc7fff8000","0x10280017ffd7fff","0x4802800a7ffd8000","0x480280097ffd8000","0x480280087ffd8000","0x480280077ffd8000","0x480280067ffd8000","0x480280057ffd8000","0x480280047ffd8000","0x480280037ffd8000","0x10280007ffd7fff","0x1104800180018000","0x2d","0x208b7fff7fff7ffe","0x1104800180018000","0x5c","0x208b7fff7fff7ffe","0x1104800180018000","0x29e","0x208b7fff7fff7ffe","0x1104800180018000","0x2a7","0x208b7fff7fff7ffe","0x1104800180018000","0x2ad","0x208b7fff7fff7ffe","0x1104800180018000","0x2ee","0x208b7fff7fff7ffe","0x1104800180018000","0x2fc","0x208b7fff7fff7ffe","0x1104800180018000","0x325","0x208b7fff7fff7ffe","0x1104800180018000","0x340","0x208b7fff7fff7ffe","0x1104800180018000","0x350","0x208b7fff7fff7ffe","0x1104800180018000","0x399","0x208b7fff7fff7ffe","0x1104800180018000","0x3bc","0x208b7fff7fff7ffe","0x1104800180018000","0x3d1","0x208b7fff7fff7ffe","0x1104800180018000","0x3d2","0x208b7fff7fff7ffe","0x1104800180018000","0x3e5","0x208b7fff7fff7ffe","0x480280017ffb8000","0x4825800180008000","0x0","0x20580017fff8001","0x5","0x48087ffa7fff8000","0x48087ffd7fff8000","0x208b7fff7fff7ffe","0x48087ffa7fff8000","0x1104800180018000","0x3bf","0x48087ffb7fff8000","0x48087ffd7fff8000","0x48087ffc7fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x48087ff97fff8000","0x1104800180018000","0x3b6","0x48087ffb7fff8000","0x48087ffc7fff8000","0x48087ffd7fff8000","0x48087ffa7fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x48087ff87fff8000","0x48087ff97fff8000","0x48087ffb7fff8000","0x1104800180018000","0x26e","0x48087ffa7fff8000","0x48087ffc7fff8000","0x48087ffd7fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x48087ff97fff8000","0x48087ffb7fff8000","0x48087ffc7fff8000","0x48087ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff48","0x480880147fff8000","0x48087ffd7fff8000","0x480880157fff8000","0x1104800180018000","0x2a1","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff27","0x482480017ffe8000","0x3","0x48087ffc7fff8000","0x48087ffb7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff21","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ff87fff8000","0x480880047fff8000","0x48087ffa7fff8000","0x4808800b7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbd","0x48087ffa7fff8000","0x48087ffd7fff8000","0x48087ff97fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x480280007ffa8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff0c","0x482480017ffe8000","0x3","0x480480017fff8000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff06","0x482480017ffe8000","0x3","0x480480017fff8000","0x3","0x480480017fff8000","0xa","0x480880057fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffefd","0x482480017ffe8000","0x3","0x480480017fff8000","0x3","0x48087ffd7fff8000","0x4808800b7fff8000","0x480280017ffa8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef4","0x482480017ffe8000","0x3","0x480480017fff8000","0x3","0x480880177fff8000","0x480880137fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeec","0x482480017ffe8000","0x3","0x480480017fff8000","0x3","0x480880007fff8000","0x4808801c7fff8000","0x48087ff97fff8000","0x480880247fff8000","0x1104800180018000","0x355","0x480880007fff8000","0x48087ffb7fff8000","0x48087ffc7fff8000","0x48087ffd7fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x48087ff87fff8000","0x48087ffc7fff8000","0x48087ffa7fff8000","0x48087ff97fff8000","0x1104800180018000","0x2a7","0x48087ffb7fff8000","0x48087ffd7fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffece","0x482480017ffe8000","0x3","0x480480017fff8000","0x1ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca","0x480480017fff8000","0x5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec6","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x480880047fff8000","0x48087ffc7fff8000","0x4808800b7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff62","0x48087ffd7fff8000","0x48087ffb7fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x480280007ffd8000","0x102800080007fff","0x10480017fff7fff","0x1ac","0x4802800280008000","0x102800080017fff","0x10480017fff7fff","0x185","0x4802800280018000","0x102800080027fff","0x10480017fff7fff","0x15e","0x4802800280028000","0x102800080037fff","0x10480017fff7fff","0x137","0x4802800280038000","0x102800080047fff","0x10480017fff7fff","0x110","0x4802800280048000","0x102800080057fff","0x10480017fff7fff","0xe9","0x4802800280058000","0x102800080067fff","0x10480017fff7fff","0xc2","0x4802800280068000","0x102800080077fff","0x10480017fff7fff","0x9b","0x4802800280078000","0x102800080087fff","0x10480017fff7fff","0x74","0x4802800280088000","0x102800080097fff","0x10480017fff7fff","0x4d","0x4802800280098000","0x1028000800a7fff","0x10480017fff7fff","0x4","0x10480017fff7fff","0x24","0x480280017ffb8000","0x480280007ffb8000","0x480280017ffd8000","0x4802800180098000","0x4802800180088000","0x4802800180078000","0x4802800180068000","0x4802800180058000","0x4802800180048000","0x4802800180038000","0x4802800180028000","0x4802800180018000","0x4802800180008000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe78","0x482480017ffe8000","0x3","0x480880177fff8000","0x480880167fff8000","0x480880157fff8000","0x480880147fff8000","0x480880137fff8000","0x480880127fff8000","0x480880117fff8000","0x480880107fff8000","0x4808800f7fff8000","0x4808800e7fff8000","0x4808800d7fff8000","0x4808800c7fff8000","0x4808800b7fff8000","0x48087ffc7fff8000","0x48087ffa7fff8000","0x4808801c7fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe63","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x4808800f7fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe40","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x4808800e7fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe1d","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x4808800d7fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdfa","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x4808800c7fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdd7","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x4808800b7fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdb4","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x4808800a7fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd91","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x480880097fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd6e","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x480880087fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd4b","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x480880077fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd28","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x480880067fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd05","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffa7fff8000","0x480880057fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffce2","0x482480017ffe8000","0x3","0x480480017fff8000","0x1","0x48087ffc7fff8000","0x48087ffd7fff8000","0x480880047fff8000","0x1104800180018000","0x130","0x208b7fff7fff7ffe","0x48087ff87fff8000","0x48087ff97fff8000","0x48087ffa7fff8000","0x48087ffb7fff8000","0x48087ffc7fff8000","0x48087ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdaa","0x208b7fff7fff7ffe","0x480280017ffd8000","0x4825800180008000","0x0","0x20580017fff8001","0x5","0x48087ffb7fff8000","0x48087ffc7fff8000","0x208b7fff7fff7ffe","0x480280017ffc8000","0x4825800180008002","0x0","0x20580017fff8003","0x5","0x48087ffb7fff8000","0x48087ffd7fff8000","0x208b7fff7fff7ffe","0x480280007ffc8000","0x480280007ffd8000","0x4829800480008005","0x20580017fff8006","0x17","0x480280017ffc8000","0x480280017ffd8000","0x4829800780008008","0x20580017fff8009","0x7","0x48087ffb7fff8000","0x48087ffd7fff8000","0x1104800180018000","0xe2","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcae","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffb7fff8000","0x4808800e7fff8000","0x208b7fff7fff7ffe","0x480280007ffc8000","0x480280007ffd8000","0x4829800780008008","0x480280017ffc8000","0x480280017ffd8000","0x4829800a8000800b","0x484980098000800c","0x480280007ffc8000","0x480280007ffd8000","0x484a800d800d8000","0x4829800f80008010","0x4829800e80008011","0x480280017ffd8000","0x480280007ffd8000","0x4829801280008014","0x484a8015800d8000","0x4829801380008016","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc92","0x482480017ffe8000","0x3","0x480880127fff8000","0x480880177fff8000","0x48087ffb7fff8000","0x4808801c7fff8000","0x208b7fff7fff7ffe","0x480280017ffc8000","0x480480017fff8000","0x0","0x4828800080007fff","0x480280007ffc8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc84","0x482480017ffe8000","0x3","0x480880037fff8000","0x480880027fff8000","0x48087ffb7fff8000","0x480880087fff8000","0x48087ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffaf","0x208b7fff7fff7ffe","0x10280007ffb7fff","0x10480017fff7fff","0x4","0x10480017fff7fff","0x15","0x480280017ffc8000","0x480280007ffc8000","0x48087ffa7fff8000","0x480880017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8e","0x480880007fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc69","0x482480017ffe8000","0x3","0x48087ffc7fff8000","0x48087ffd7fff8000","0x48087ffb7fff8000","0x480880047fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280017ffb8000","0x48087ffa7fff8000","0x48087ffc7fff8000","0x48087ffd7fff8000","0x480880017fff8000","0x1104800180018000","0xe","0x480880007fff8000","0x48087ffd7fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x48087ffa7fff8000","0x48087ffc7fff8000","0x48087ffb7fff8000","0x48087ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd8","0x208b7fff7fff7ffe","0x480280017ffb8000","0x482a7ffd80008000","0x48087ffa7fff8000","0x48087ffc7fff8000","0x480880017fff8000","0x1104800180018000","0xd0","0x48087ffb7fff8000","0x480880017fff8000","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x480280007ffc8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc3f","0x482480017ffe8000","0x3","0x480480017fff8000","0x3","0x48087ffd7fff8000","0x480880007fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc37","0x482480017ffe8000","0x3","0x480880057fff8000","0x48087ffb7fff8000","0x48087ffa7fff8000","0x4808800d7fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc2e","0x482480017ffe8000","0x3","0x480480017fff8000","0x1","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc28","0x482480017ffe8000","0x3","0x480880047fff8000","0x48087ffd7fff8000","0x48087ffa7fff8000","0x48087ffb7fff8000","0x4808800a7fff8000","0x48087ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa7","0x208b7fff7fff7ffe","0x10280007ffc7fff","0x10480017fff7fff","0x4","0x10480017fff7fff","0x15","0x480280027ffd8000","0x480280017ffd8000","0x480280007ffd8000","0x4826800180028000","0x1","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc11","0x482480017ffe8000","0x3","0x480880037fff8000","0x480880017fff8000","0x480880007fff8000","0x48087ffb7fff8000","0x480880087fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc0c","0x4808801e7fff8000","0x4808801f7fff8000","0x208b7fff7fff7ffe","0x480280027ffc8000","0x102800080007fff","0x10480017fff7fff","0x4","0x10480017fff7fff","0x17","0x480280027ffd8000","0x480280017ffd8000","0x4826800180028000","0x1","0x480280017ffc8000","0x480280007ffd8000","0x482a800480058000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbf6","0x482480017ffe8000","0x3","0x480880067fff8000","0x480880037fff8000","0x480880017fff8000","0x48087ffb7fff8000","0x4808800b7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbf1","0x480880217fff8000","0x480880227fff8000","0x208b7fff7fff7ffe","0x4802800280008000","0x480280027ffd8000","0x4802800180008000","0x480280017ffd8000","0x482a800380048000","0x480280017ffc8000","0x480280007ffd8000","0x482a800680078000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbe0","0x482480017ffe8000","0x3","0x480880087fff8000","0x480880057fff8000","0x480880027fff8000","0x48087ffb7fff8000","0x4808800d7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbdb","0x480880237fff8000","0x480880017fff8000","0x480880247fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb8","0x208b7fff7fff7ffe","0x480280017ffd8000","0x4825800180008000","0x0","0x20580017fff8001","0x5","0x48087ffc7fff8000","0x48087ffd7fff8000","0x208b7fff7fff7ffe","0x480280017ffd8000","0x4846800180028000","0x2","0x480280007ffd8000","0x480280007ffd8000","0x4846800180058000","0x3","0x484a800480068000","0x4826800180078000","0x1","0x4849800380008008","0x480280007ffd8000","0x480280007ffd8000","0x484a800980098000","0x4829800b8000800c","0x4829800a8000800d","0x480280017ffd8000","0x480280007ffd8000","0x4829800e80008010","0x484a801180098000","0x4829800f80008012","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbb2","0x482480017ffe8000","0x3","0x4808800e7fff8000","0x480880137fff8000","0x48087ffc7fff8000","0x480880187fff8000","0x208b7fff7fff7ffe","0x10280007ffc7fff","0x10480017fff7fff","0x4","0x10480017fff7fff","0x5","0x48087ffb7fff8000","0x48087ffd7fff8000","0x208b7fff7fff7ffe","0x480280027ffc8000","0x480280017ffc8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb9f","0x482480017ffe8000","0x3","0x480480017fff8000","0x3","0x480880017fff8000","0x48087ffd7fff8000","0x48087ffb7fff8000","0x480880007fff8000","0x480880067fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec","0x208b7fff7fff7ffe","0x481080007fff8000","0x48087ffd7fff8000","0x480880007fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb8d","0x482480017ffe8000","0x3","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x480480017fff8000","0x0","0x48087ffc7fff8000","0x48087ffd7fff8000","0x480880047fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff66","0x1104800180018000","0x3","0x208b7fff7fff7ffe","0x480280007ffd8000","0x48087ffc7fff8000","0x480880007fff8000","0x208b7fff7fff7ffe","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb77","0x482480017ffe8000","0x3","0x48087ffd7fff8000","0x48087ffc7fff8000","0x480480017fff8000","0x2","0x48087ffb7fff8000","0x480880047fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb71","0x48028000801b8000","0x4808801a7fff8000","0x4808801c7fff8000","0x208b7fff7fff7ffe","0x4002800080007ff2","0x4002800180007ff3","0x4002800280007ff4","0x4002800380007ff5","0x4002800480007ff6","0x4002800580007ff7","0x4002800680007ff8","0x4002800780007ff9","0x4002800880007ffa","0x4002800980007ffb","0x4002800a80007ffc","0x4002800b80007ffd","0x4002800c80007ffe","0x4002800d80007fff","0x4826800180008000","0xe","0x48107fee7fff8000","0x48107fee7fff8000","0x48107fee7fff8000","0x10780017fff7fff","0x0"],"hints":{"10":[{"accessible_scopes":[],"code":"Input(pk_y)","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"11":[{"accessible_scopes":[],"code":"Input(pk_x)","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"1169":[{"accessible_scopes":[],"code":"RandomEcPoint","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"12":[{"accessible_scopes":[],"code":"Input(messages)","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"8":[{"accessible_scopes":[],"code":"Input(nonce)","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"9":[{"accessible_scopes":[],"code":"Input(sk)","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}]},"identifiers":{"__main__.__end__":{"pc":1230,"type":"label"},"__main__.__start__":{"pc":0,"type":"label"},"__main__.main":{"decorators":[],"pc":0,"type":"function"}},"main_scope":"__main__","prime":"0x800000000000011000000000000000000000000000000000000000000000001","reference_manager":{"references":[]}} \ No newline at end of file diff --git a/native/cairo_vm/encryption.juvix b/native/cairo_vm/encryption.juvix new file mode 100644 index 0000000..a569f58 --- /dev/null +++ b/native/cairo_vm/encryption.juvix @@ -0,0 +1,121 @@ +module encryption; + +import Stdlib.Prelude open; +import Stdlib.Cairo.Ec as Ec; +import Stdlib.Cairo.Poseidon open; +import Stdlib.Debug as Debug; + +type EncryptionResult := + mkEncryptionResult@{ + cipher_text_elem0 : Field; + cipher_text_elem1 : Field; + cipher_text_elem2 : Field; + cipher_text_elem3 : Field; + cipher_text_elem4 : Field; + cipher_text_elem5 : Field; + cipher_text_elem6 : Field; + cipher_text_elem7 : Field; + cipher_text_elem8 : Field; + cipher_text_elem9 : Field; + mac : Field; + sender_pk_x : Field; + sender_pk_y : Field; + nonce : Field + }; + +type Cipher := + mkCipher@{ + cipher_text : List Field; + cur_state : Field + }; + +update_poseidon_state (cur_msg secret_key_x : Field) (cipher : Cipher) : Cipher := + let + new_state := Cipher.cur_state cipher + cur_msg; + new_text := new_state :: Cipher.cipher_text cipher; + in mkCipher@{ + cipher_text := new_text; + cur_state := poseidonHash2 new_state secret_key_x + }; + +generate_cipher (poseidon_state : Field) (secret_key_x : Field) (plaintext : List Field) : Cipher := + let + go (cipher : Cipher) : List Field -> Cipher + | [] := cipher@Cipher{cipher_text := reverse (Cipher.cipher_text cipher)} + | (m :: ms) := go (update_poseidon_state m secret_key_x cipher) ms; + in go + mkCipher@{ + cipher_text := []; + cur_state := poseidon_state + } + plaintext; + +-- pad_messages +-- (messages : List Field) +-- : List Field := +-- let +-- n : Nat := length messages; +-- in if +-- | n < 10 := messages ++ replicate (10 - n) 0; +-- | n == 10 := messages; +-- | else := take 10 messages; + +encryption + (messages : List Field) + (pk_x : Field) + (pk_y : Field) + (sk : Field) + (nonce : Field) + : EncryptionResult := + + let + -- Generate encryption key + pk := Ec.mkPoint pk_x pk_y; + secret_key := Ec.mul sk pk; + + -- PLAINTEXT_NUM := 10; + + -- TODO: Pad the messages here or outside of the circuit? + plaintext := messages; + + -- Init poseidon state + secret_key_x := Ec.Point.x secret_key; + poseidon_state := poseidonHashList [secret_key_x; Ec.Point.y secret_key; nonce; 10]; + + -- Generate cipher + final_cipher := generate_cipher poseidon_state secret_key_x plaintext; + + -- Get MAC + mac := Cipher.cur_state final_cipher; + + -- Generate sender's pk + generator := Ec.mkPoint Ec.StarkCurve.GEN_X Ec.StarkCurve.GEN_Y; + sender_pk := Ec.mul sk generator; + + in case Cipher.cipher_text final_cipher of + | [elem0; elem1; elem2; elem3; elem4; elem5; elem6; elem7; elem8; elem9] := + mkEncryptionResult@{ + cipher_text_elem0 := elem0; + cipher_text_elem1 := elem1; + cipher_text_elem2 := elem2; + cipher_text_elem3 := elem3; + cipher_text_elem4 := elem4; + cipher_text_elem5 := elem5; + cipher_text_elem6 := elem6; + cipher_text_elem7 := elem7; + cipher_text_elem8 := elem8; + cipher_text_elem9 := elem9; + mac; + sender_pk_x := Ec.Point.x sender_pk; + sender_pk_y := Ec.Point.y sender_pk; + nonce + } + | _ := mkEncryptionResult 0 0 0 0 0 0 0 0 0 0 0 0 0 0; + +main + (messages : List Field) + (pk_x : Field) + (pk_y : Field) + (sk : Field) + (nonce : Field) + : EncryptionResult := encryption messages pk_x pk_y sk nonce; diff --git a/native/cairo_vm/encryption_input.json b/native/cairo_vm/encryption_input.json new file mode 100644 index 0000000..f611f9d --- /dev/null +++ b/native/cairo_vm/encryption_input.json @@ -0,0 +1,7 @@ +{ + "messages": [1,0,1,0,0,0,0,0,0,0], + "pk_x": "0x1ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca", + "pk_y": "0x5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f", + "sk": 1, + "nonce": 1 +} diff --git a/test/cairo_encryption.exs b/test/cairo_encryption.exs new file mode 100644 index 0000000..ffcd9e1 --- /dev/null +++ b/test/cairo_encryption.exs @@ -0,0 +1,43 @@ +defmodule NifTest do + use ExUnit.Case + + doctest Cairo.CairoProver + doctest Cairo.CairoVM + + test "cairo_encryption_test" do + # encryption circuit test + {:ok, program} = File.read("./native/cairo_vm/encryption.json") + {:ok, input} = File.read("./native/cairo_vm/encryption_input.json") + + {_output, trace, memory, vm_public_input} = + Cairo.cairo_vm_runner( + program, + input + ) + + # Prove and verify + {proof, public_input} = Cairo.prove(trace, memory, vm_public_input) + assert true = Cairo.verify(proof, public_input) + + felt_bytes_0 = :binary.bin_to_list(<<0::256>>) + felt_bytes_1 = :binary.bin_to_list(<<1::256>>) + + pk = Cairo.get_public_key(felt_bytes_1) + sk = felt_bytes_1 + nonce = felt_bytes_1 + + expected_plaintext = + [felt_bytes_1, felt_bytes_0, felt_bytes_1] ++ + List.duplicate(felt_bytes_0, 7) + + # out-of-circuit encryption + expected_cipher = Cairo.encrypt(expected_plaintext, pk, sk, nonce) + + assert Cairo.get_output(public_input) == expected_cipher + + # decryption + plaintext = Cairo.decrypt(expected_cipher, felt_bytes_1) + + assert plaintext == expected_plaintext + end +end