diff --git a/dleq/dleq.go b/dleq/dleq.go index cdf0ed97..9a7efb8b 100644 --- a/dleq/dleq.go +++ b/dleq/dleq.go @@ -1,16 +1,6 @@ package dleq import ( - "encoding/hex" - "errors" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strings" - "time" - "github.com/noot/atomic-swap/crypto/secp256k1" ) @@ -61,105 +51,3 @@ type VerifyResult struct { func (r *VerifyResult) Secp256k1PublicKey() *secp256k1.PublicKey { return r.secp256k1Pub } - -var ( - dleqGenBinPath = getFarcasterDLEqBinaryPath() + "dleq-gen" - dleqVerifyBinPath = getFarcasterDLEqBinaryPath() + "dleq-verify" - defaultProofPath = "/tmp/dleq_proof" -) - -// TODO: this is kinda sus, make it actually find the bin better. maybe env vars? -func getFarcasterDLEqBinaryPath() string { - bin := "./farcaster-dleq/target/release/dleq-gen" - _, err := os.Stat(bin) - if !errors.Is(err, os.ErrNotExist) { - return "./farcaster-dleq/target/release/" - } - - bin = "../farcaster-dleq/target/release/dleq-gen" - _, err = os.Stat(bin) - if !errors.Is(err, os.ErrNotExist) { - return "../farcaster-dleq/target/release/" - } - - return "../../farcaster-dleq/target/release/" -} - -// FarcasterDLEq is a wrapper around the binaries in farcaster-dleq -type FarcasterDLEq struct{} - -// Prove generates a new DLEq proof -func (d *FarcasterDLEq) Prove() (*Proof, error) { - t := time.Now().Format("2006-01-02-15:04:05.999999999") - path := fmt.Sprintf("%s-%s", defaultProofPath, t) - - cmd := exec.Command(dleqGenBinPath, path) - if err := cmd.Run(); err != nil { - return nil, err - } - - secret, err := ioutil.ReadFile(filepath.Clean(path + ".key")) - if err != nil { - return nil, err - } - - var sc [32]byte - copy(sc[:], secret) - - proof, err := ioutil.ReadFile(filepath.Clean(path)) - if err != nil { - return nil, err - } - - return &Proof{ - secret: sc, - proof: proof, - }, nil -} - -// Verify verifies a DLEq proof -func (d *FarcasterDLEq) Verify(p *Proof) (*VerifyResult, error) { - t := time.Now().Format("2006-01-02-15:04:05.999999999") - path := fmt.Sprintf("%s-verify-%s", defaultProofPath, t) - - if err := ioutil.WriteFile(path, p.proof, os.ModePerm); err != nil { - return nil, err - } - - cmd := exec.Command(dleqVerifyBinPath, path) - output, err := cmd.Output() - if err != nil { - return nil, err - } - - // slice off \n at the end of string - out := strings.Split(string(output[:len(output)-1]), " ") - if len(out) != 3 { - return nil, errors.New("invalid output from dleq-verify") - } - - ed25519Pub, err := hex.DecodeString(out[0]) - if err != nil { - return nil, err - } - - secp256k1X, err := hex.DecodeString(out[1]) - if err != nil { - return nil, err - } - - secp256k1Y, err := hex.DecodeString(out[2]) - if err != nil { - return nil, err - } - - res := &VerifyResult{} - copy(res.ed25519Pub[:], ed25519Pub) - - var x, y [32]byte - copy(x[:], secp256k1X) - copy(y[:], secp256k1Y) - res.secp256k1Pub = secp256k1.NewPublicKey(x, y) - - return res, nil -} diff --git a/dleq/dleq_test.go b/dleq/dleq_test.go deleted file mode 100644 index 009409a5..00000000 --- a/dleq/dleq_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package dleq - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/crypto/secp256k1" - mcrypto "github.com/noot/atomic-swap/crypto/monero" - "github.com/stretchr/testify/require" -) - -func TestFarcasterDLEqProof(t *testing.T) { - f := &FarcasterDLEq{} - proof, err := f.Prove() - require.NoError(t, err) - res, err := f.Verify(proof) - require.NoError(t, err) - require.NotEqual(t, [32]byte{}, res.ed25519Pub) - require.NotEqual(t, [32]byte{}, res.secp256k1Pub.X()) - require.NotEqual(t, [32]byte{}, res.secp256k1Pub.Y()) -} - -func TestFarcasterDLEqProof_invalid(t *testing.T) { - f := &FarcasterDLEq{} - proof, err := f.Prove() - require.NoError(t, err) - proof.proof[0] = 0xff - _, err = f.Verify(proof) - require.Error(t, err) -} - -func TestFarcasterDLEqProof_createKeys(t *testing.T) { - f := &FarcasterDLEq{} - proof, err := f.Prove() - require.NoError(t, err) - - sk, err := mcrypto.NewPrivateSpendKey(proof.secret[:]) - require.NoError(t, err) - - res, err := f.Verify(proof) - require.NoError(t, err) - require.Equal(t, res.ed25519Pub[:], sk.Public().Bytes()) - - curve := secp256k1.S256() - - xb := res.secp256k1Pub.X() - yb := res.secp256k1Pub.Y() - x := big.NewInt(0).SetBytes(xb[:]) - y := big.NewInt(0).SetBytes(yb[:]) - ok := curve.IsOnCurve(x, y) - require.True(t, ok) -} diff --git a/farcaster-dleq/Cargo.toml b/farcaster-dleq/Cargo.toml deleted file mode 100644 index 970dd741..00000000 --- a/farcaster-dleq/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "dleq-proof" -version = "0.1.0" -edition = "2021" - -[[bin]] -name = "dleq-gen" -path = "src/generate.rs" - -[[bin]] -name = "dleq-verify" -path = "src/verify.rs" - -[dependencies] -farcaster_core = { git = "https://github.com/Lederstrumpf/farcaster-core", branch = "pub_hack", features = ["serde"] } -ecdsa_fun = { version = "0.6", default-features = false, features = ["all"] } -secp256kfun = { version = "0.6", default-features = false, features = ["std", "serde", "libsecp_compat"] } -curve25519-dalek = "3.0.2" -rand = { version = "0.8.4" } -hex = { version = "0.4.3" } -rand_core = "0.6" diff --git a/farcaster-dleq/src/generate.rs b/farcaster-dleq/src/generate.rs deleted file mode 100644 index 25f9f74e..00000000 --- a/farcaster-dleq/src/generate.rs +++ /dev/null @@ -1,28 +0,0 @@ -use farcaster_core::consensus::CanonicalBytes; -use farcaster_core::crypto::dleq::DLEQProof; -use rand_core::{OsRng, RngCore}; -use std::env; -use std::fs; -use std::io::prelude::*; - -fn main() -> Result<(), std::io::Error> { - let args: Vec = env::args().collect(); - - let mut x = [0u8; 32]; - OsRng.fill_bytes(&mut x); - x[31] = x[31] & 0b00001111; // zero highest four bits - - let dleq = DLEQProof::generate(x); - let bytes = dleq.as_canonical_bytes(); - - let filename = args.iter().nth(1).unwrap(); - let mut file = fs::File::create(filename)?; - file.write_all(bytes.as_slice())?; - let mut file = fs::File::create(filename.to_owned() + ".key")?; - file.write_all(&x)?; - println!( - "successfully wrote dleq_proof to {:?} and key to {:?}.key", - filename, filename - ); - Ok(()) -} diff --git a/farcaster-dleq/src/verify.rs b/farcaster-dleq/src/verify.rs deleted file mode 100644 index 4f39f6e4..00000000 --- a/farcaster-dleq/src/verify.rs +++ /dev/null @@ -1,47 +0,0 @@ -use ecdsa_fun::fun::Point as secp256k1Point; -use farcaster_core::consensus::CanonicalBytes; -use farcaster_core::crypto::dleq::DLEQProof; -use hex; -use secp256kfun::{g, marker::*}; -use std::env; - -fn main() { - let args: Vec = env::args().collect(); - - use std::fs; - use std::io::prelude::*; - - let filename = args.iter().nth(1).unwrap(); - let mut f = fs::File::open(&filename).expect("no file found"); - let metadata = fs::metadata(&filename).expect("unable to read metadata"); - let mut buffer = vec![0; metadata.len() as usize]; - - f.read(&mut buffer).expect("buffer overflow"); - let dleq = DLEQProof::from_canonical_bytes(buffer.as_slice()).unwrap(); - - let commitment_agg_ed25519 = dleq.c_g.iter().sum(); - let commitment_agg_secp256k1 = dleq - .c_h - .iter() - .fold(secp256k1Point::zero(), |acc, bit_commitment| { - g!(acc + bit_commitment).mark::() - }); - - let _verification = dleq - .verify( - commitment_agg_ed25519, - commitment_agg_secp256k1.mark::().unwrap(), - ) - .unwrap(); - let ed25519_pub = *commitment_agg_ed25519.compress().as_bytes(); - let ed25519_pub_hex = hex::encode(ed25519_pub); - let secp256k1_pub = commitment_agg_secp256k1.mark::().unwrap(); - let (secp256k1_x, secp256k1_y) = secp256k1_pub.coordinates(); - let secp256k1_x_hex = hex::encode(secp256k1_x); - let secp256k1_y_hex = hex::encode(secp256k1_y); - - println!( - "{} {} {}", - ed25519_pub_hex, secp256k1_x_hex, secp256k1_y_hex - ) -} diff --git a/farcaster-dleq/target/release/dleq-gen b/farcaster-dleq/target/release/dleq-gen deleted file mode 100755 index 7b226ae2..00000000 Binary files a/farcaster-dleq/target/release/dleq-gen and /dev/null differ diff --git a/farcaster-dleq/target/release/dleq-verify b/farcaster-dleq/target/release/dleq-verify deleted file mode 100755 index c5ecb0d7..00000000 Binary files a/farcaster-dleq/target/release/dleq-verify and /dev/null differ diff --git a/swapfactory/swap_factory_test.go b/swapfactory/swap_factory_test.go index e88e501c..d40a7f1b 100644 --- a/swapfactory/swap_factory_test.go +++ b/swapfactory/swap_factory_test.go @@ -123,7 +123,7 @@ func TestSwapFactory_Claim_vec(t *testing.T) { func TestSwap_Claim_random(t *testing.T) { // generate claim secret and public key - dleq := &dleq.FarcasterDLEq{} + dleq := &dleq.CGODLEq{} proof, err := dleq.Prove() require.NoError(t, err) res, err := dleq.Verify(proof) @@ -192,7 +192,7 @@ func TestSwap_Claim_random(t *testing.T) { func TestSwap_Refund_beforeT0(t *testing.T) { // generate refund secret and public key - dleq := &dleq.FarcasterDLEq{} + dleq := &dleq.CGODLEq{} proof, err := dleq.Prove() require.NoError(t, err) res, err := dleq.Verify(proof) @@ -257,7 +257,7 @@ func TestSwap_Refund_beforeT0(t *testing.T) { func TestSwap_Refund_afterT1(t *testing.T) { // generate refund secret and public key - dleq := &dleq.FarcasterDLEq{} + dleq := &dleq.CGODLEq{} proof, err := dleq.Prove() require.NoError(t, err) res, err := dleq.Verify(proof) @@ -361,7 +361,7 @@ func TestSwap_MultipleSwaps(t *testing.T) { sc := &swapCase{} // generate claim secret and public key - dleq := &dleq.FarcasterDLEq{} + dleq := &dleq.CGODLEq{} proof, err := dleq.Prove() //nolint:govet require.NoError(t, err) res, err := dleq.Verify(proof)