Skip to content

Commit 0cd1d74

Browse files
committed
Add Scalar and SharedSecret type mappings for new secp256k1 types
1 parent 423f837 commit 0cd1d74

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

c-bindings-gen/src/types.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,10 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
936936
"bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some("crate::c_types::RecoverableSignature"),
937937
"bitcoin::secp256k1::SecretKey" if is_ref => Some("*const [u8; 32]"),
938938
"bitcoin::secp256k1::SecretKey" if !is_ref => Some("crate::c_types::SecretKey"),
939+
"bitcoin::secp256k1::Scalar" if is_ref => Some("*const crate::c_types::BigEndianScalar"),
940+
"bitcoin::secp256k1::Scalar" if !is_ref => Some("crate::c_types::BigEndianScalar"),
941+
"bitcoin::secp256k1::ecdh::SharedSecret" if !is_ref => Some("crate::c_types::ThirtyTwoBytes"),
942+
939943
"bitcoin::blockdata::script::Script" if is_ref => Some("crate::c_types::u8slice"),
940944
"bitcoin::blockdata::script::Script" if !is_ref => Some("crate::c_types::derived::CVec_u8Z"),
941945
"bitcoin::blockdata::transaction::OutPoint" => Some("crate::lightning::chain::transaction::OutPoint"),
@@ -1021,6 +1025,9 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
10211025
"bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some(""),
10221026
"bitcoin::secp256k1::SecretKey" if is_ref => Some("&::bitcoin::secp256k1::SecretKey::from_slice(&unsafe { *"),
10231027
"bitcoin::secp256k1::SecretKey" if !is_ref => Some(""),
1028+
"bitcoin::secp256k1::Scalar" if !is_ref => Some(""),
1029+
"bitcoin::secp256k1::ecdh::SharedSecret" if !is_ref => Some("::bitcoin::secp256k1::ecdh::SharedSecret::from_bytes("),
1030+
10241031
"bitcoin::blockdata::script::Script" if is_ref => Some("&::bitcoin::blockdata::script::Script::from(Vec::from("),
10251032
"bitcoin::blockdata::script::Script" if !is_ref => Some("::bitcoin::blockdata::script::Script::from("),
10261033
"bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" if is_ref => Some("&"),
@@ -1104,6 +1111,9 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
11041111
"bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some(".into_rust()"),
11051112
"bitcoin::secp256k1::SecretKey" if !is_ref => Some(".into_rust()"),
11061113
"bitcoin::secp256k1::SecretKey" if is_ref => Some("}[..]).unwrap()"),
1114+
"bitcoin::secp256k1::Scalar" if !is_ref => Some(".into_rust()"),
1115+
"bitcoin::secp256k1::ecdh::SharedSecret" if !is_ref => Some(".data)"),
1116+
11071117
"bitcoin::blockdata::script::Script" if is_ref => Some(".to_slice()))"),
11081118
"bitcoin::blockdata::script::Script" if !is_ref => Some(".into_rust())"),
11091119
"bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" => Some(".into_bitcoin()"),
@@ -1196,6 +1206,9 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
11961206
"bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some("crate::c_types::RecoverableSignature::from_rust(&"),
11971207
"bitcoin::secp256k1::SecretKey" if is_ref => Some(""),
11981208
"bitcoin::secp256k1::SecretKey" if !is_ref => Some("crate::c_types::SecretKey::from_rust("),
1209+
"bitcoin::secp256k1::Scalar" if !is_ref => Some("crate::c_types::BigEndianScalar::from_rust("),
1210+
"bitcoin::secp256k1::ecdh::SharedSecret" if !is_ref => Some("crate::c_types::ThirtyTwoBytes { data: "),
1211+
11991212
"bitcoin::blockdata::script::Script" if is_ref => Some("crate::c_types::u8slice::from_slice(&"),
12001213
"bitcoin::blockdata::script::Script" if !is_ref => Some(""),
12011214
"bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" if is_ref => Some("crate::c_types::Transaction::from_bitcoin("),
@@ -1273,6 +1286,9 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
12731286
"bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some(")"),
12741287
"bitcoin::secp256k1::SecretKey" if !is_ref => Some(")"),
12751288
"bitcoin::secp256k1::SecretKey" if is_ref => Some(".as_ref()"),
1289+
"bitcoin::secp256k1::Scalar" if !is_ref => Some(")"),
1290+
"bitcoin::secp256k1::ecdh::SharedSecret" if !is_ref => Some(".secret_bytes() }"),
1291+
12761292
"bitcoin::blockdata::script::Script" if is_ref => Some("[..])"),
12771293
"bitcoin::blockdata::script::Script" if !is_ref => Some(".into_bytes().into()"),
12781294
"bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" => Some(")"),

lightning-c-bindings/src/c_types/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use bitcoin::secp256k1::ecdsa::Signature as SecpSignature;
1111
use bitcoin::secp256k1::Error as SecpError;
1212
use bitcoin::secp256k1::ecdsa::RecoveryId;
1313
use bitcoin::secp256k1::ecdsa::RecoverableSignature as SecpRecoverableSignature;
14+
use bitcoin::secp256k1::Scalar as SecpScalar;
1415
use bitcoin::bech32;
1516
use bitcoin::util::address;
1617

@@ -149,6 +150,22 @@ impl RecoverableSignature {
149150
}
150151
}
151152

153+
#[repr(C)]
154+
#[derive(Clone)]
155+
/// Represents a scalar value between zero and the secp256k1 curve order, in big endian.
156+
pub struct BigEndianScalar {
157+
/// The bytes of the scalar value.
158+
pub big_endian_bytes: [u8; 32],
159+
}
160+
impl BigEndianScalar {
161+
pub(crate) fn from_rust(scalar: &SecpScalar) -> Self {
162+
Self { big_endian_bytes: scalar.to_be_bytes() }
163+
}
164+
pub(crate) fn into_rust(&self) -> SecpScalar {
165+
SecpScalar::from_be_bytes(self.big_endian_bytes).expect("Scalar greater than the curve order")
166+
}
167+
}
168+
152169
#[repr(C)]
153170
#[derive(Copy, Clone)]
154171
/// Represents an error returned from libsecp256k1 during validation of some secp256k1 data

0 commit comments

Comments
 (0)