cleanup: remove farcaster-dleq (#140)

This commit is contained in:
noot
2022-07-16 19:42:54 +00:00
committed by GitHub
parent e0e627f847
commit dbdab9519b
8 changed files with 4 additions and 264 deletions

View File

@@ -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
}

View File

@@ -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)
}