You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
xmr-btc-swap/swap/src/xmr_first_protocol.rs

115 lines
2.8 KiB
Rust

use crate::protocol::CROSS_CURVE_PROOF_SYSTEM;
use curve25519_dalek::constants::ED25519_BASEPOINT_POINT;
use curve25519_dalek::edwards::EdwardsPoint;
use curve25519_dalek::scalar::Scalar;
use ecdsa_fun::fun::Point;
use hash_edwards_to_edwards::hash_point_to_point;
use rand::rngs::OsRng;
pub mod alice;
pub mod bob;
mod state_machine;
pub mod transactions;
pub struct Alice {
pub a: crate::bitcoin::SecretKey,
pub s_a: crate::monero::Scalar,
r_a: Scalar,
// private view keys
pub v_a: crate::monero::PrivateViewKey,
pub v_b: crate::monero::PrivateViewKey,
pub S_a: EdwardsPoint,
pub S_b: crate::monero::PublicKey,
pub R_a: EdwardsPoint,
pub S_prime_a: Point,
pub R_prime_a: EdwardsPoint,
pub pk_a: crate::bitcoin::PublicKey,
pub pk_b: crate::bitcoin::PublicKey,
pub K_a: crate::monero::PublicViewKey,
pub K_b: crate::monero::PublicViewKey,
}
pub struct Bob {
b: crate::bitcoin::SecretKey,
pub s_b: crate::monero::Scalar,
// private view keys
pub v_a: crate::monero::PrivateViewKey,
pub v_b: crate::monero::PrivateViewKey,
pub S_a: EdwardsPoint,
pub S_b: crate::monero::PublicKey,
pub R_a: EdwardsPoint,
pub S_prime_a: Point,
pub R_prime_a: EdwardsPoint,
pub pk_a: crate::bitcoin::PublicKey,
pub pk_b: crate::bitcoin::PublicKey,
pub K_a: crate::monero::PublicViewKey,
pub K_b: crate::monero::PublicViewKey,
}
pub fn setup() -> (Alice, Bob) {
let v_a = crate::monero::PrivateViewKey::new_random(&mut OsRng);
let v_b = crate::monero::PrivateViewKey::new_random(&mut OsRng);
let a = crate::bitcoin::SecretKey::new_random(&mut OsRng);
let b = crate::bitcoin::SecretKey::new_random(&mut OsRng);
let s_a = crate::monero::Scalar::random(&mut OsRng);
let s_b = crate::monero::Scalar::random(&mut OsRng);
let S_b = monero::PublicKey::from_private_key(&monero::PrivateKey { scalar: s_b });
let (_dleq_proof_s_a, (S_prime_a, S_a)) = CROSS_CURVE_PROOF_SYSTEM.prove(&s_a, &mut OsRng);
let (r_a, R_a, R_prime_a) = {
let r_a = Scalar::random(&mut OsRng);
let R_a = r_a * ED25519_BASEPOINT_POINT;
let pk_hashed_to_point = hash_point_to_point(S_a);
let R_prime_a = r_a * pk_hashed_to_point;
(r_a, R_a, R_prime_a)
};
let K_a = v_a.public();
let K_b = v_b.public();
let pk_a = a.public();
let pk_b = b.public();
let alice = Alice {
a,
v_a,
v_b,
s_a,
S_a,
S_b,
r_a,
R_a,
S_prime_a,
R_prime_a,
pk_a,
pk_b,
K_a,
K_b,
};
let bob = Bob {
b,
v_a,
v_b,
s_b,
S_a,
S_b,
R_a,
S_prime_a,
R_prime_a,
pk_a,
pk_b,
K_a,
K_b,
};
(alice, bob)
}