// Copyright 2025 the libevm authors. // // The libevm additions to go-ethereum are free software: you can redistribute // them and/or modify them under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // The libevm additions are distributed in the hope that they will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser // General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see // . package ethtest import ( "crypto/ecdsa" "crypto/elliptic" "math/big" "testing" "github.com/stretchr/testify/require" "github.com/ava-labs/libevm/crypto" ) // UNSAFEDeterministicPrivateKey returns a new [crypto.S256] private key, // deterministically generated from the `seed`. func UNSAFEDeterministicPrivateKey(tb testing.TB, seed []byte) *ecdsa.PrivateKey { tb.Helper() curve := crypto.S256() d := privateKeyScalar(tb, seed, curve) x, y := curve.ScalarBaseMult(d.Bytes()) return &ecdsa.PrivateKey{ D: d, PublicKey: ecdsa.PublicKey{ X: x, Y: y, Curve: curve, }, } } func privateKeyScalar(tb testing.TB, seed []byte, curve elliptic.Curve) *big.Int { tb.Helper() s := crypto.NewKeccakState() _, err := s.Write(seed) require.NoError(tb, err, "%T.Write()", s) buf := make([]byte, 32) for { _, err := s.Read(buf) require.NoError(tb, err, "%T.Read()", s) d := new(big.Int).SetBytes(buf) if isZero := d.Sign() == 0; !isZero && d.Cmp(curve.Params().N) == -1 { return d } } }