Skip to content

Commit

Permalink
Create rust-bidings
Browse files Browse the repository at this point in the history
Create bindings for all methods and static types in ellswift.h in
secp256k1-sys and their respective safe-rust types.

All methods are extensively commented and tested using BIP324's
test vectors
  • Loading branch information
Davidson-Souza committed Aug 22, 2023
1 parent 7922d05 commit b9862d3
Show file tree
Hide file tree
Showing 5 changed files with 744 additions and 0 deletions.
72 changes: 72 additions & 0 deletions secp256k1-sys/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,16 @@ pub type SchnorrNonceFn = Option<unsafe extern "C" fn(
data: *mut c_void,
) -> c_int>;

pub type EllswiftECDHHashFn = Option<
unsafe extern "C" fn(
output: *mut c_uchar,
x32: *const c_uchar,
ell_a64: *const c_uchar,
ell_b64: *const c_uchar,
data: *mut c_void,
) -> c_int,
>;

/// Data structure that contains additional arguments for schnorrsig_sign_custom.
#[repr(C)]
pub struct SchnorrSigExtraParams {
Expand Down Expand Up @@ -518,11 +528,41 @@ impl core::hash::Hash for KeyPair {
}
}

pub struct XOSharedSecret(pub [u8; 32]);

impl XOSharedSecret {
pub fn as_bytes(&self) -> &[u8] {
&self.0
}
pub fn as_mut_bytes(&mut self) -> &mut [u8] {
&mut self.0
}
}

impl_array_newtype!(XOSharedSecret, u8, 32);
impl_raw_debug!(XOSharedSecret);

#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ElligatorSwift([u8; 64]);

impl ElligatorSwift {
pub fn from_array(arr: [u8; 64]) -> Self {
ElligatorSwift(arr)
}
}

impl_array_newtype!(ElligatorSwift, u8, 64);
impl_raw_debug!(ElligatorSwift);

extern "C" {
/// Default ECDH hash function
#[cfg_attr(not(rust_secp_no_symbol_renaming), link_name = "rustsecp256k1_v0_8_1_ecdh_hash_function_default")]
pub static secp256k1_ecdh_hash_function_default: EcdhHashFn;

/// Default ECDH hash function for BIP324 key establishment
#[cfg_attr(not(rust_secp_no_symbol_renaming), link_name = "rustsecp256k1_v0_8_1_ellswift_xdh_hash_function_bip324")]
pub static secp256k1_ellswift_xdh_hash_function_bip324: EllswiftECDHHashFn;

#[cfg_attr(not(rust_secp_no_symbol_renaming), link_name = "rustsecp256k1_v0_8_1_nonce_function_rfc6979")]
pub static secp256k1_nonce_function_rfc6979: NonceFn;

Expand Down Expand Up @@ -601,6 +641,38 @@ extern "C" {
output_pubkey: *mut PublicKey,
keypair: *const KeyPair)
-> c_int;
// Elligator Swift
#[cfg_attr(not(rust_secp_no_symbol_renaming), link_name = "rustsecp256k1_v0_8_1_ellswift_encode")]
pub fn secp256k1_ellswift_encode(
ctx: *const Context,
ell64: *mut c_uchar,
pubkey: *const PublicKey,
rnd32: *const c_uchar,
) -> c_int;
#[cfg_attr(not(rust_secp_no_symbol_renaming), link_name = "rustsecp256k1_v0_8_1_ellswift_decode")]
pub fn secp256k1_ellswift_decode(
ctx: *const Context,
pubkey: *mut u8,
ell64: *const c_uchar,
) -> c_int;
#[cfg_attr(not(rust_secp_no_symbol_renaming), link_name = "rustsecp256k1_v0_8_1_ellswift_create")]
pub fn secp256k1_ellswift_create(
ctx: *const Context,
ell64: *mut c_uchar,
seckey32: *const c_uchar,
aux_rand32: *const c_uchar,
) -> c_int;
#[cfg_attr(not(rust_secp_no_symbol_renaming), link_name = "rustsecp256k1_v0_8_1_ellswift_xdh")]
pub fn secp256k1_ellswift_xdh(
ctx: *const Context,
output: *mut c_uchar,
ell_a64: *const c_uchar,
ell_b64: *const c_uchar,
seckey32: *const c_uchar,
party: c_int,
hashfp: EllswiftECDHHashFn,
data: *mut c_void,
) -> c_int;
}

#[cfg(not(secp256k1_fuzz))]
Expand Down
3 changes: 3 additions & 0 deletions src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ pub const SCHNORR_PUBLIC_KEY_SIZE: usize = 32;
/// The size of a key pair.
pub const KEY_PAIR_SIZE: usize = 96;

/// The size of a full ElligatorSwift encoding.
pub const ELLSWIFT_ENCODING_SIZE: usize = 64;

/// The Prime for the secp256k1 field element.
#[rustfmt::skip]
pub const FIELD_SIZE: [u8; 32] = [
Expand Down
Loading

0 comments on commit b9862d3

Please sign in to comment.