Replaced legacy `*.orly` module imports with `next.orly.dev/pkg` paths across the codebase for consistency. Removed legacy `go.mod` files from sub-packages, consolidating dependency management. Added Dockerfiles and configurations for benchmarking environments.
195 lines
5.0 KiB
Go
195 lines
5.0 KiB
Go
//go:build !cgo
|
|
|
|
package btcec_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"lol.mleku.dev/chk"
|
|
"lol.mleku.dev/log"
|
|
"next.orly.dev/pkg/crypto/p256k/btcec"
|
|
"next.orly.dev/pkg/utils"
|
|
)
|
|
|
|
func TestSigner_Generate(t *testing.T) {
|
|
for _ = range 100 {
|
|
var err error
|
|
signer := &btcec.Signer{}
|
|
var skb []byte
|
|
if err = signer.Generate(); chk.E(err) {
|
|
t.Fatal(err)
|
|
}
|
|
skb = signer.Sec()
|
|
if err = signer.InitSec(skb); chk.E(err) {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
// func TestBTCECSignerVerify(t *testing.T) {
|
|
// evs := make([]*event.E, 0, 10000)
|
|
// scanner := bufio.NewScanner(bytes.NewBuffer(examples.Cache))
|
|
// buf := make([]byte, 1_000_000)
|
|
// scanner.Buffer(buf, len(buf))
|
|
// var err error
|
|
//
|
|
// // Create both btcec and p256k signers
|
|
// btcecSigner := &btcec.Signer{}
|
|
// p256kSigner := &p256k.Signer{}
|
|
//
|
|
// for scanner.Scan() {
|
|
// var valid bool
|
|
// b := scanner.Bytes()
|
|
// ev := event.New()
|
|
// if _, err = ev.Unmarshal(b); chk.E(err) {
|
|
// t.Errorf("failed to marshal\n%s", b)
|
|
// } else {
|
|
// // We know ev.Verify() works, so we'll use it as a reference
|
|
// if valid, err = ev.Verify(); chk.E(err) || !valid {
|
|
// t.Errorf("invalid signature\n%s", b)
|
|
// continue
|
|
// }
|
|
// }
|
|
//
|
|
// // Get the ID from the event
|
|
// storedID := ev.ID
|
|
// calculatedID := ev.GetIDBytes()
|
|
//
|
|
// // Check if the stored ID matches the calculated ID
|
|
// if !utils.FastEqual(storedID, calculatedID) {
|
|
// log.D.Ln("Event ID mismatch: stored ID doesn't match calculated ID")
|
|
// // Use the calculated ID for verification as ev.Verify() would do
|
|
// ev.ID = calculatedID
|
|
// }
|
|
//
|
|
// if len(ev.ID) != sha256.Size {
|
|
// t.Errorf("id should be 32 bytes, got %d", len(ev.ID))
|
|
// continue
|
|
// }
|
|
//
|
|
// // Initialize both signers with the same public key
|
|
// if err = btcecSigner.InitPub(ev.Pubkey); chk.E(err) {
|
|
// t.Errorf("failed to init btcec pub key: %s\n%0x", err, b)
|
|
// }
|
|
// if err = p256kSigner.InitPub(ev.Pubkey); chk.E(err) {
|
|
// t.Errorf("failed to init p256k pub key: %s\n%0x", err, b)
|
|
// }
|
|
//
|
|
// // First try to verify with btcec.Signer
|
|
// if valid, err = btcecSigner.Verify(ev.ID, ev.Sig); err == nil && valid {
|
|
// // If btcec.Signer verification succeeds, great!
|
|
// log.D.Ln("btcec.Signer verification succeeded")
|
|
// } else {
|
|
// // If btcec.Signer verification fails, try with p256k.Signer
|
|
// // Use chk.T(err) like ev.Verify() does
|
|
// if valid, err = p256kSigner.Verify(ev.ID, ev.Sig); chk.T(err) {
|
|
// // If there's an error, log it but don't fail the test
|
|
// log.D.Ln("p256k.Signer verification error:", err)
|
|
// } else if !valid {
|
|
// // Only fail the test if both verifications fail
|
|
// t.Errorf(
|
|
// "invalid signature for pub %0x %0x %0x", ev.Pubkey, ev.ID,
|
|
// ev.Sig,
|
|
// )
|
|
// } else {
|
|
// log.D.Ln("p256k.Signer verification succeeded where btcec.Signer failed")
|
|
// }
|
|
// }
|
|
//
|
|
// evs = append(evs, ev)
|
|
// }
|
|
// }
|
|
|
|
// func TestBTCECSignerSign(t *testing.T) {
|
|
// evs := make([]*event.E, 0, 10000)
|
|
// scanner := bufio.NewScanner(bytes.NewBuffer(examples.Cache))
|
|
// buf := make([]byte, 1_000_000)
|
|
// scanner.Buffer(buf, len(buf))
|
|
// var err error
|
|
// signer := &btcec.Signer{}
|
|
// var skb []byte
|
|
// if err = signer.Generate(); chk.E(err) {
|
|
// t.Fatal(err)
|
|
// }
|
|
// skb = signer.Sec()
|
|
// if err = signer.InitSec(skb); chk.E(err) {
|
|
// t.Fatal(err)
|
|
// }
|
|
// verifier := &btcec.Signer{}
|
|
// pkb := signer.Pub()
|
|
// if err = verifier.InitPub(pkb); chk.E(err) {
|
|
// t.Fatal(err)
|
|
// }
|
|
// counter := 0
|
|
// for scanner.Scan() {
|
|
// counter++
|
|
// if counter > 1000 {
|
|
// break
|
|
// }
|
|
// b := scanner.Bytes()
|
|
// ev := event.New()
|
|
// if _, err = ev.Unmarshal(b); chk.E(err) {
|
|
// t.Errorf("failed to marshal\n%s", b)
|
|
// }
|
|
// evs = append(evs, ev)
|
|
// }
|
|
// var valid bool
|
|
// sig := make([]byte, schnorr.SignatureSize)
|
|
// for _, ev := range evs {
|
|
// ev.Pubkey = pkb
|
|
// id := ev.GetIDBytes()
|
|
// if sig, err = signer.Sign(id); chk.E(err) {
|
|
// t.Errorf("failed to sign: %s\n%0x", err, id)
|
|
// }
|
|
// if valid, err = verifier.Verify(id, sig); chk.E(err) {
|
|
// t.Errorf("failed to verify: %s\n%0x", err, id)
|
|
// }
|
|
// if !valid {
|
|
// t.Errorf("invalid signature")
|
|
// }
|
|
// }
|
|
// signer.Zero()
|
|
// }
|
|
|
|
func TestBTCECECDH(t *testing.T) {
|
|
n := time.Now()
|
|
var err error
|
|
var counter int
|
|
const total = 50
|
|
for _ = range total {
|
|
s1 := new(btcec.Signer)
|
|
if err = s1.Generate(); chk.E(err) {
|
|
t.Fatal(err)
|
|
}
|
|
s2 := new(btcec.Signer)
|
|
if err = s2.Generate(); chk.E(err) {
|
|
t.Fatal(err)
|
|
}
|
|
for _ = range total {
|
|
var secret1, secret2 []byte
|
|
if secret1, err = s1.ECDH(s2.Pub()); chk.E(err) {
|
|
t.Fatal(err)
|
|
}
|
|
if secret2, err = s2.ECDH(s1.Pub()); chk.E(err) {
|
|
t.Fatal(err)
|
|
}
|
|
if !utils.FastEqual(secret1, secret2) {
|
|
counter++
|
|
t.Errorf(
|
|
"ECDH generation failed to work in both directions, %x %x",
|
|
secret1,
|
|
secret2,
|
|
)
|
|
}
|
|
}
|
|
}
|
|
a := time.Now()
|
|
duration := a.Sub(n)
|
|
log.I.Ln(
|
|
"errors", counter, "total", total, "time", duration, "time/op",
|
|
int(duration/total),
|
|
"ops/sec", int(time.Second)/int(duration/total),
|
|
)
|
|
}
|