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

View source record →

📰 Research Paper
Loading…
⏳ Fetching content…