deriveExtendedPublicChildKey function

ExtendedPublicKey deriveExtendedPublicChildKey(
  1. ExtendedPublicKey parent,
  2. int childNumber
)

CKDpub in the specification

Implementation

ExtendedPublicKey deriveExtendedPublicChildKey(
    ExtendedPublicKey parent, int childNumber) {
  if (childNumber >= firstHardenedChild) {
    throw InvalidChildNumber();
  }

  var message = _derivePublicMessage(parent, childNumber);
  var hash = hmacSha512(parent.chainCode!, message);

  var leftSide = utils.decodeBigIntWithSign(1, _leftFrom(hash));
  if (leftSide >= curve.n) {
    throw KeyBiggerThanOrder();
  }

  var childPublicKey = publicKeyFor(leftSide) + parent.q;
  if (childPublicKey!.isInfinity) {
    throw KeyInfinite();
  }

  return ExtendedPublicKey(
    q: childPublicKey,
    chainCode: _rightFrom(hash),
    childNumber: childNumber,
    depth: parent.depth! + 1,
    parentFingerprint: parent.fingerprint,
  );
}