Skip to content

Commit

Permalink
Fix null slice processing (#1)
Browse files Browse the repository at this point in the history
* Fix null slice processing

---------

Co-authored-by: turuslan <turuslan.devbox@gmail.com>
  • Loading branch information
Harrm and turuslan committed Jul 29, 2024
1 parent 0197cad commit 97623b6
Show file tree
Hide file tree
Showing 16 changed files with 202 additions and 327 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/target
target
/build
/generated
5 changes: 5 additions & 0 deletions crates/arkworks/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/arkworks/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ license = "Apache-2.0"
edition = "2021"

[dependencies]
cpp = { path = "../cpp" }
ark-ec = { version = "0.4.2", default-features = false }
ark-bls12-377 = { version = "0.4.0", features = ["curve"], default-features = false }
ark-bls12-381 = { version = "0.4.0", features = ["curve"], default-features = false }
Expand Down
3 changes: 1 addition & 2 deletions crates/arkworks/build.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

fn main() {
build_helper::run_cbindgen();
}
}
39 changes: 25 additions & 14 deletions crates/arkworks/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ use std::os::raw::c_ulong;
use std::vec::Vec;
use utils::*;


#[repr(C)]
pub struct BytesVec {
data: *mut u8,
Expand All @@ -41,29 +40,28 @@ pub enum Result {
Err,
}

impl From <std::result::Result<Vec<u8>, ()>> for Result {
impl From<std::result::Result<Vec<u8>, ()>> for Result {
fn from(value: std::result::Result<Vec<u8>, ()>) -> Self {
match value {
Ok(mut vec) => {
let r = BytesVec{
let r = BytesVec {
data: vec.as_mut_ptr(),
size: vec.len() as _,
};
std::mem::forget(vec);
Result::Ok(r)
},
Err(_) => Result::Err
}
Err(_) => Result::Err,
}
}
}

impl BytesVec {
unsafe fn as_slice(&self) -> Vec<u8> {
std::slice::from_raw_parts_mut(self.data, self.size as usize).to_vec()
cpp::from_raw_parts_mut(self.data, self.size as usize).to_vec()
}
}


#[allow(unused_attributes)]
#[no_mangle]
pub unsafe extern "C" fn AWCR_deallocate_bytesvec(data: *mut BytesVec) {
Expand All @@ -72,7 +70,6 @@ pub unsafe extern "C" fn AWCR_deallocate_bytesvec(data: *mut BytesVec) {
drop(Box::from_raw((*data).data));
}


/// Interfaces for working with *Arkworks* elliptic curves related types from within the runtime.
///
/// All types are (de-)serialized through the wrapper types from the `ark-scale` trait,
Expand Down Expand Up @@ -283,8 +280,12 @@ pub unsafe extern "C" fn bw6_761_msm_g2(bases: BytesVec, bigints: BytesVec) -> R
/// - `scalar`: `ArkScale<&[u64]>`.
/// - Returns encoded: `ArkScaleProjective<ark_ed_on_bls12_377::EdwardsProjective>`.
#[no_mangle]
pub unsafe extern "C" fn ed_on_bls12_377_mul_projective(base: BytesVec, scalar: BytesVec) -> Result {
mul_projective_te::<ark_ed_on_bls12_377::EdwardsConfig>(base.as_slice(), scalar.as_slice()).into()
pub unsafe extern "C" fn ed_on_bls12_377_mul_projective(
base: BytesVec,
scalar: BytesVec,
) -> Result {
mul_projective_te::<ark_ed_on_bls12_377::EdwardsConfig>(base.as_slice(), scalar.as_slice())
.into()
}

/// Twisted Edwards multi scalar multiplication for Ed-on-BLS12-377.
Expand All @@ -309,7 +310,11 @@ pub unsafe extern "C" fn ed_on_bls12_381_bandersnatch_sw_mul_projective(
base: BytesVec,
scalar: BytesVec,
) -> Result {
mul_projective_sw::<ark_ed_on_bls12_381_bandersnatch::SWConfig>(base.as_slice(), scalar.as_slice()).into()
mul_projective_sw::<ark_ed_on_bls12_381_bandersnatch::SWConfig>(
base.as_slice(),
scalar.as_slice(),
)
.into()
}

/// Twisted Edwards projective multiplication for Ed-on-BLS12-381-Bandersnatch.
Expand All @@ -324,7 +329,11 @@ pub unsafe extern "C" fn ed_on_bls12_381_bandersnatch_te_mul_projective(
base: BytesVec,
scalar: BytesVec,
) -> Result {
mul_projective_te::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig>(base.as_slice(), scalar.as_slice()).into()
mul_projective_te::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig>(
base.as_slice(),
scalar.as_slice(),
)
.into()
}

/// Short Weierstrass multi scalar multiplication for Ed-on-BLS12-381-Bandersnatch.
Expand All @@ -338,7 +347,8 @@ pub unsafe extern "C" fn ed_on_bls12_381_bandersnatch_sw_msm(
bases: BytesVec,
scalars: BytesVec,
) -> Result {
msm_sw::<ark_ed_on_bls12_381_bandersnatch::SWConfig>(bases.as_slice(), scalars.as_slice()).into()
msm_sw::<ark_ed_on_bls12_381_bandersnatch::SWConfig>(bases.as_slice(), scalars.as_slice())
.into()
}

/// Twisted Edwards multi scalar multiplication for Ed-on-BLS12-381-Bandersnatch.
Expand All @@ -353,5 +363,6 @@ pub unsafe extern "C" fn ed_on_bls12_381_bandersnatch_te_msm(
bases: BytesVec,
scalars: BytesVec,
) -> Result {
msm_te::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig>(bases.as_slice(), scalars.as_slice()).into()
msm_te::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig>(bases.as_slice(), scalars.as_slice())
.into()
}
142 changes: 68 additions & 74 deletions crates/arkworks/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,109 +18,103 @@
//! Generic executions of the operations for *Arkworks* elliptic curves.

use ark_ec::{
pairing::{MillerLoopOutput, Pairing, PairingOutput},
short_weierstrass,
short_weierstrass::SWCurveConfig,
twisted_edwards,
twisted_edwards::TECurveConfig,
CurveConfig, VariableBaseMSM,
pairing::{MillerLoopOutput, Pairing, PairingOutput},
short_weierstrass,
short_weierstrass::SWCurveConfig,
twisted_edwards,
twisted_edwards::TECurveConfig,
CurveConfig, VariableBaseMSM,
};
use ark_scale::{
hazmat::ArkScaleProjective,
scale::{Decode, Encode},
hazmat::ArkScaleProjective,
scale::{Decode, Encode},
};
use std::vec::Vec;

// Scale codec type which is expected to be used by the host functions.
//
// Encoding is set to `HOST_CALL` which is a shortcut for "not-validated" and "not-compressed".
type ArkScale<T> = ark_scale::ArkScale<T, { ark_scale::HOST_CALL }>;
type ArkScale<T> = ark_scale::ArkScale<T, { ark_scale::HOST_CALL }>;
// type Input<'a> = &'a mut [u8];
type Input<'a> = Vec<u8>;
pub fn multi_miller_loop<Curve: Pairing>(g1: Input, g2: Input) -> Result<Vec<u8>, ()> {
let g1 = <ArkScale<Vec<<Curve as Pairing>::G1Affine>> as Decode>::decode(&mut g1.as_slice())
.map_err(|_| ())?;
let g2 = <ArkScale<Vec<<Curve as Pairing>::G2Affine>> as Decode>::decode(&mut g2.as_slice())
.map_err(|_| ())?;
let g1 = <ArkScale<Vec<<Curve as Pairing>::G1Affine>> as Decode>::decode(&mut g1.as_slice())
.map_err(|_| ())?;
let g2 = <ArkScale<Vec<<Curve as Pairing>::G2Affine>> as Decode>::decode(&mut g2.as_slice())
.map_err(|_| ())?;

let result = Curve::multi_miller_loop(g1.0, g2.0).0;
let result = Curve::multi_miller_loop(g1.0, g2.0).0;

let result: ArkScale<<Curve as Pairing>::TargetField> = result.into();
Ok(result.encode())
let result: ArkScale<<Curve as Pairing>::TargetField> = result.into();
Ok(result.encode())
}

pub fn final_exponentiation<Curve: Pairing>(target: Input) -> Result<Vec<u8>, ()> {
let target =
<ArkScale<<Curve as Pairing>::TargetField> as Decode>::decode(&mut target.as_slice())
.map_err(|_| ())?;
let target =
<ArkScale<<Curve as Pairing>::TargetField> as Decode>::decode(&mut target.as_slice())
.map_err(|_| ())?;

let result = Curve::final_exponentiation(MillerLoopOutput(target.0)).ok_or(())?;
let result = Curve::final_exponentiation(MillerLoopOutput(target.0)).ok_or(())?;

let result: ArkScale<PairingOutput<Curve>> = result.into();
Ok(result.encode())
let result: ArkScale<PairingOutput<Curve>> = result.into();
Ok(result.encode())
}

pub fn msm_sw<Curve: SWCurveConfig>(bases:Input , scalars:Input) -> Result<Vec<u8>, ()> {
let bases =
<ArkScale<Vec<short_weierstrass::Affine<Curve>>> as Decode>::decode(&mut bases.as_slice())
.map_err(|_| ())?;
let scalars = <ArkScale<Vec<<Curve as CurveConfig>::ScalarField>> as Decode>::decode(&mut
scalars.as_slice()
)
.map_err(|_| ())?;

let result =
<short_weierstrass::Projective<Curve> as VariableBaseMSM>::msm(&bases.0, &scalars.0)
.map_err(|_| ())?;

let result: ArkScaleProjective<short_weierstrass::Projective<Curve>> = result.into();
Ok(result.encode())
pub fn msm_sw<Curve: SWCurveConfig>(bases: Input, scalars: Input) -> Result<Vec<u8>, ()> {
let bases =
<ArkScale<Vec<short_weierstrass::Affine<Curve>>> as Decode>::decode(&mut bases.as_slice())
.map_err(|_| ())?;
let scalars = <ArkScale<Vec<<Curve as CurveConfig>::ScalarField>> as Decode>::decode(
&mut scalars.as_slice(),
)
.map_err(|_| ())?;

let result =
<short_weierstrass::Projective<Curve> as VariableBaseMSM>::msm(&bases.0, &scalars.0)
.map_err(|_| ())?;

let result: ArkScaleProjective<short_weierstrass::Projective<Curve>> = result.into();
Ok(result.encode())
}

pub fn msm_te<Curve: TECurveConfig>(bases: Input, scalars: Input) -> Result<Vec<u8>, ()> {
let bases =
<ArkScale<Vec<twisted_edwards::Affine<Curve>>> as Decode>::decode(&mut bases.as_slice())
.map_err(|_| ())?;
let scalars = <ArkScale<Vec<<Curve as CurveConfig>::ScalarField>> as Decode>::decode(&mut
scalars.as_slice()
)
.map_err(|_| ())?;

let result = <twisted_edwards::Projective<Curve> as VariableBaseMSM>::msm(&bases.0, &scalars.0)
.map_err(|_| ())?;

let result: ArkScaleProjective<twisted_edwards::Projective<Curve>> = result.into();
Ok(result.encode())
let bases =
<ArkScale<Vec<twisted_edwards::Affine<Curve>>> as Decode>::decode(&mut bases.as_slice())
.map_err(|_| ())?;
let scalars = <ArkScale<Vec<<Curve as CurveConfig>::ScalarField>> as Decode>::decode(
&mut scalars.as_slice(),
)
.map_err(|_| ())?;

let result = <twisted_edwards::Projective<Curve> as VariableBaseMSM>::msm(&bases.0, &scalars.0)
.map_err(|_| ())?;

let result: ArkScaleProjective<twisted_edwards::Projective<Curve>> = result.into();
Ok(result.encode())
}

pub fn mul_projective_sw<Group: SWCurveConfig>(
base: Input,
scalar: Input,
) -> Result<Vec<u8>, ()> {
let base = <ArkScaleProjective<short_weierstrass::Projective<Group>> as Decode>::decode(&mut
base.as_slice()
)
.map_err(|_| ())?;
let scalar = <ArkScale<Vec<u64>> as Decode>::decode(&mut scalar.as_slice()).map_err(|_| ())?;
pub fn mul_projective_sw<Group: SWCurveConfig>(base: Input, scalar: Input) -> Result<Vec<u8>, ()> {
let base = <ArkScaleProjective<short_weierstrass::Projective<Group>> as Decode>::decode(
&mut base.as_slice(),
)
.map_err(|_| ())?;
let scalar = <ArkScale<Vec<u64>> as Decode>::decode(&mut scalar.as_slice()).map_err(|_| ())?;

let result = <Group as SWCurveConfig>::mul_projective(&base.0, &scalar.0);
let result = <Group as SWCurveConfig>::mul_projective(&base.0, &scalar.0);

let result: ArkScaleProjective<short_weierstrass::Projective<Group>> = result.into();
Ok(result.encode())
let result: ArkScaleProjective<short_weierstrass::Projective<Group>> = result.into();
Ok(result.encode())
}

pub fn mul_projective_te<Group: TECurveConfig>(
base: Input,
scalar: Input,
) -> Result<Vec<u8>, ()> {
let base = <ArkScaleProjective<twisted_edwards::Projective<Group>> as Decode>::decode(&mut
base.as_slice()
)
.map_err(|_| ())?;
let scalar = <ArkScale<Vec<u64>> as Decode>::decode(&mut scalar.as_slice()).map_err(|_| ())?;
pub fn mul_projective_te<Group: TECurveConfig>(base: Input, scalar: Input) -> Result<Vec<u8>, ()> {
let base = <ArkScaleProjective<twisted_edwards::Projective<Group>> as Decode>::decode(
&mut base.as_slice(),
)
.map_err(|_| ())?;
let scalar = <ArkScale<Vec<u64>> as Decode>::decode(&mut scalar.as_slice()).map_err(|_| ())?;

let result = <Group as TECurveConfig>::mul_projective(&base.0, &scalar.0);
let result = <Group as TECurveConfig>::mul_projective(&base.0, &scalar.0);

let result: ArkScaleProjective<twisted_edwards::Projective<Group>> = result.into();
Ok(result.encode())
let result: ArkScaleProjective<twisted_edwards::Projective<Group>> = result.into();
Ok(result.encode())
}
Loading

0 comments on commit 97623b6

Please sign in to comment.