func (c *ConfigReceiver) Derive(adjust curve.Scalar, newChainKey []byte) (*ConfigReceiver, error) {
	if len(newChainKey) <= 0 {
		newChainKey = c.ChainKey
	}
	if len(newChainKey) != params.SecBytes {
		return nil, fmt.Errorf("expecte %d bytes for chain key, found %d", params.SecBytes, len(newChainKey))
	}
	adjustG := adjust.ActOnBase()
	return &ConfigReceiver{
		Setup:       c.Setup,
		SecretShare: c.SecretShare.Curve().NewScalar().Set(c.SecretShare).Add(adjust),
		Public:      c.Public.Add(adjustG),
	}, nil
}
Derive performs an arbitrary derivation of a related key, by adding a scalar.

This can support methods like BIP32, but is more general.

Optionally, a new chain key can be passed as well.
package keygen
import (
	"crypto/rand"
	"errors"
	"fmt"
	"github.com/taurusgroup/multi-party-sig/internal/bip32"
	"github.com/taurusgroup/multi-party-sig/internal/ot"
	"github.com/taurusgroup/multi-party-sig/internal/params"
	"github.com/taurusgroup/multi-party-sig/internal/round"
	"github.com/taurusgroup/multi-party-sig/pkg/math/curve"
	"github.com/taurusgroup/multi-party-sig/pkg/math/sample"
	"github.com/taurusgroup/multi-party-sig/pkg/party"
	"github.com/taurusgroup/multi-party-sig/pkg/pool"
	"github.com/taurusgroup/multi-party-sig/pkg/protocol"
)
type ConfigReceiver struct {
	Setup *ot.CorreOTReceiveSetup
	SecretShare curve.Scalar
	Public curve.Point
	ChainKey []byte
}
func (c *ConfigReceiver) Group() curve.Curve {
	return c.Public.Curve()
}