INNER CODE UNIT · Go
DeriveScalar
taurushq-io/multi-party-sig · internal/bip32/bip32.go:22
func DeriveScalar(public *curve.Secp256k1Point, chaining []byte, i uint32) (*curve.Secp256k1Scalar, []byte, error) {
if i>>31 != 0 {
panic("DeriveScalar doesn't work with hardened keys.")
}
h := hmac.New(sha512.New, chaining)
compressed, _ := public.MarshalBinary()
_, _ = h.Write(compressed)
iBytes := make([]byte, 4)
binary.BigEndian.PutUint32(iBytes, i)
h.Write(iBytes)
out := h.Sum(nil)
scalar := new(curve.Secp256k1Scalar)
err := scalar.UnmarshalBinary(out[:32])
if err != nil || scalar.IsZero() {
return nil, nil, fmt.Errorf("bad index: %d", i)
}