Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 26 additions & 20 deletions bn254/src/addition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,19 +119,22 @@ pub fn alt_bn128_g1_addition_be(input: &[u8]) -> Result<Vec<u8>, AltBn128Error>
if input.len() > ALT_BN128_ADDITION_INPUT_SIZE {
return Err(AltBn128Error::InvalidInputData);
}
let mut result_buffer = [0; ALT_BN128_ADDITION_OUTPUT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_group_op(
// SAFETY: This is sound as sol_alt_bn128_group_op addition always fills all 32 bytes of our buffer
let mut result_buffer = Vec::with_capacity(ALT_BN128_ADDITION_OUTPUT_SIZE);
unsafe {
let result = syscalls::sol_alt_bn128_group_op(
ALT_BN128_G1_ADD_BE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer.to_vec()),
_ => Err(AltBn128Error::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => {
result_buffer.set_len(ALT_BN128_ADDITION_OUTPUT_SIZE);
Ok(result_buffer)
}
_ => Err(AltBn128Error::UnexpectedError),
}
}
}
}
Expand All @@ -155,19 +158,22 @@ pub fn alt_bn128_g1_addition_le(
}
#[cfg(target_os = "solana")]
{
let mut result_buffer = [0; ALT_BN128_ADDITION_OUTPUT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_group_op(
// SAFETY: This is sound as sol_alt_bn128_group_op addition always fills all 32 bytes of our buffer
let mut result_buffer = Vec::with_capacity(ALT_BN128_ADDITION_OUTPUT_SIZE);
unsafe {
let result = syscalls::sol_alt_bn128_group_op(
ALT_BN128_G1_ADD_LE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer.to_vec()),
_ => Err(AltBn128Error::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => {
result_buffer.set_len(ALT_BN128_ADDITION_OUTPUT_SIZE);
Ok(result_buffer)
}
_ => Err(AltBn128Error::UnexpectedError),
}
}
}
}
162 changes: 83 additions & 79 deletions bn254/src/compression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -345,152 +345,156 @@ mod target_arch {
pub fn alt_bn128_g1_compress(
input: &[u8],
) -> Result<[u8; ALT_BN128_G1_COMPRESSED_POINT_SIZE], AltBn128CompressionError> {
let mut result_buffer = [0; ALT_BN128_G1_COMPRESSED_POINT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_compression(
// SAFETY: This is sound as sol_alt_bn128_group_op compression always fills all 32 bytes of our buffer
let mut result_buffer =
core::mem::MaybeUninit::<[u8; ALT_BN128_G1_COMPRESSED_POINT_SIZE]>::uninit();
unsafe {
let result = syscalls::sol_alt_bn128_compression(
ALT_BN128_G1_COMPRESS_BE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer),
_ => Err(AltBn128CompressionError::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => Ok(result_buffer.assume_init()),
_ => Err(AltBn128CompressionError::UnexpectedError),
}
}
}

pub fn alt_bn128_g1_compress_le(
input: &[u8; ALT_BN128_G1_POINT_SIZE],
) -> Result<[u8; ALT_BN128_G1_COMPRESSED_POINT_SIZE], AltBn128CompressionError> {
let mut result_buffer = [0; ALT_BN128_G1_COMPRESSED_POINT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_compression(
// SAFETY: This is sound as sol_alt_bn128_group_op compression always fills all 32 bytes of our buffer
let mut result_buffer =
core::mem::MaybeUninit::<[u8; ALT_BN128_G1_COMPRESSED_POINT_SIZE]>::uninit();
unsafe {
let result = syscalls::sol_alt_bn128_compression(
ALT_BN128_G1_COMPRESS_LE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer),
_ => Err(AltBn128CompressionError::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => Ok(result_buffer.assume_init()),
_ => Err(AltBn128CompressionError::UnexpectedError),
}
}
}

pub fn alt_bn128_g1_decompress(
input: &[u8],
) -> Result<[u8; ALT_BN128_G1_POINT_SIZE], AltBn128CompressionError> {
let mut result_buffer = [0; ALT_BN128_G1_POINT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_compression(
// SAFETY: This is sound as sol_alt_bn128_group_op decompression always fills all 64 bytes of our buffer
let mut result_buffer = core::mem::MaybeUninit::<[u8; ALT_BN128_G1_POINT_SIZE]>::uninit();
unsafe {
let result = syscalls::sol_alt_bn128_compression(
ALT_BN128_G1_DECOMPRESS_BE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer),
_ => Err(AltBn128CompressionError::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => Ok(result_buffer.assume_init()),
_ => Err(AltBn128CompressionError::UnexpectedError),
}
}
}

pub fn alt_bn128_g1_decompress_le(
input: &[u8; ALT_BN128_G1_COMPRESSED_POINT_SIZE],
) -> Result<[u8; ALT_BN128_G1_POINT_SIZE], AltBn128CompressionError> {
let mut result_buffer = [0; ALT_BN128_G1_POINT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_compression(
// SAFETY: This is sound as sol_alt_bn128_group_op decompression always fills all 64 bytes of our buffer
let mut result_buffer = core::mem::MaybeUninit::<[u8; ALT_BN128_G1_POINT_SIZE]>::uninit();
unsafe {
let result = syscalls::sol_alt_bn128_compression(
ALT_BN128_G1_DECOMPRESS_LE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer),
_ => Err(AltBn128CompressionError::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => Ok(result_buffer.assume_init()),
_ => Err(AltBn128CompressionError::UnexpectedError),
}
}
}

pub fn alt_bn128_g2_compress(
input: &[u8],
) -> Result<[u8; ALT_BN128_G2_COMPRESSED_POINT_SIZE], AltBn128CompressionError> {
let mut result_buffer = [0; ALT_BN128_G2_COMPRESSED_POINT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_compression(
// SAFETY: This is sound as sol_alt_bn128_group_op compression always fills all 64 bytes of our buffer
let mut result_buffer =
core::mem::MaybeUninit::<[u8; ALT_BN128_G2_COMPRESSED_POINT_SIZE]>::uninit();
unsafe {
let result = syscalls::sol_alt_bn128_compression(
ALT_BN128_G2_COMPRESS_BE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer),
_ => Err(AltBn128CompressionError::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => Ok(result_buffer.assume_init()),
_ => Err(AltBn128CompressionError::UnexpectedError),
}
}
}

pub fn alt_bn128_g2_compress_le(
input: &[u8; ALT_BN128_G2_POINT_SIZE],
) -> Result<[u8; ALT_BN128_G2_COMPRESSED_POINT_SIZE], AltBn128CompressionError> {
let mut result_buffer = [0; ALT_BN128_G2_COMPRESSED_POINT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_compression(
// SAFETY: This is sound as sol_alt_bn128_group_op compression always fills all 64 bytes of our buffer
let mut result_buffer =
core::mem::MaybeUninit::<[u8; ALT_BN128_G2_COMPRESSED_POINT_SIZE]>::uninit();
unsafe {
let result = syscalls::sol_alt_bn128_compression(
ALT_BN128_G2_COMPRESS_LE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer),
_ => Err(AltBn128CompressionError::UnexpectedError),
);
match result {
0 => Ok(result_buffer.assume_init()),
_ => Err(AltBn128CompressionError::UnexpectedError),
}
}
}

pub fn alt_bn128_g2_decompress(
input: &[u8; ALT_BN128_G2_COMPRESSED_POINT_SIZE],
) -> Result<[u8; ALT_BN128_G2_POINT_SIZE], AltBn128CompressionError> {
let mut result_buffer = [0; ALT_BN128_G2_POINT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_compression(
// SAFETY: This is sound as sol_alt_bn128_group_op decompression always fills all 128 bytes of our buffer
let mut result_buffer = core::mem::MaybeUninit::<[u8; ALT_BN128_G2_POINT_SIZE]>::uninit();
unsafe {
let result = syscalls::sol_alt_bn128_compression(
ALT_BN128_G2_DECOMPRESS_BE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer),
_ => Err(AltBn128CompressionError::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => Ok(result_buffer.assume_init()),
_ => Err(AltBn128CompressionError::UnexpectedError),
}
}
}

pub fn alt_bn128_g2_decompress_le(
input: &[u8; ALT_BN128_G2_COMPRESSED_POINT_SIZE],
) -> Result<[u8; ALT_BN128_G2_POINT_SIZE], AltBn128CompressionError> {
let mut result_buffer = [0; ALT_BN128_G2_POINT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_compression(
// SAFETY: This is sound as sol_alt_bn128_group_op decompression always fills all 128 bytes of our buffer
let mut result_buffer = core::mem::MaybeUninit::<[u8; ALT_BN128_G2_POINT_SIZE]>::uninit();
unsafe {
let result = syscalls::sol_alt_bn128_compression(
ALT_BN128_G2_DECOMPRESS_LE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer),
_ => Err(AltBn128CompressionError::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => Ok(result_buffer.assume_init()),
_ => Err(AltBn128CompressionError::UnexpectedError),
}
}
}
}
Expand Down
46 changes: 26 additions & 20 deletions bn254/src/multiplication.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,19 +133,22 @@ pub fn alt_bn128_g1_multiplication_be(input: &[u8]) -> Result<Vec<u8>, AltBn128E
if input.len() > ALT_BN128_MULTIPLICATION_INPUT_SIZE {
return Err(AltBn128Error::InvalidInputData);
}
let mut result_buffer = [0u8; ALT_BN128_MULTIPLICATION_OUTPUT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_group_op(
// SAFETY: This is sound as sol_alt_bn128_group_op multiplication always fills all 64 bytes of our buffer
let mut result_buffer = Vec::with_capacity(ALT_BN128_MULTIPLICATION_OUTPUT_SIZE);
unsafe {
let result = syscalls::sol_alt_bn128_group_op(
ALT_BN128_G1_MUL_BE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer.to_vec()),
_ => Err(AltBn128Error::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => {
result_buffer.set_len(ALT_BN128_MULTIPLICATION_OUTPUT_SIZE);
Ok(result_buffer)
}
_ => Err(AltBn128Error::UnexpectedError),
}
}
}
}
Expand All @@ -169,19 +172,22 @@ pub fn alt_bn128_g1_multiplication_le(
}
#[cfg(target_os = "solana")]
{
let mut result_buffer = [0u8; ALT_BN128_MULTIPLICATION_OUTPUT_SIZE];
let result = unsafe {
syscalls::sol_alt_bn128_group_op(
// SAFETY: This is sound as sol_alt_bn128_group_op multiplication always fills all 64 bytes of our buffer
let mut result_buffer = Vec::with_capacity(ALT_BN128_MULTIPLICATION_OUTPUT_SIZE);
unsafe {
let result = syscalls::sol_alt_bn128_group_op(
ALT_BN128_G1_MUL_LE,
input as *const _ as *const u8,
input.len() as u64,
&mut result_buffer as *mut _ as *mut u8,
)
};

match result {
0 => Ok(result_buffer.to_vec()),
_ => Err(AltBn128Error::UnexpectedError),
result_buffer.as_mut_ptr() as *mut u8,
);
match result {
0 => {
result_buffer.set_len(ALT_BN128_MULTIPLICATION_OUTPUT_SIZE);
Ok(result_buffer)
}
_ => Err(AltBn128Error::UnexpectedError),
}
}
}
}
Expand Down
Loading