deriveInternal method

Implementation

SaplingExtendedSpendingKey deriveInternal(SaplingExtendedSpendingKey master) {
  final fvk = master.sk.toFvk();
  final i = QuickCrypto.blake2b256Hash(
    fvk.toBytes(),
    extraBlocks: [master.keyData.dk.toBytes()],
    personalization: SaplingKeyUtils.saplingInternalPersonalization.codeUnits,
  );
  final iNsk = JubJubFr.fromBytes64(
    PrfExpand.saplingZip32InternalNsk.apply(i),
  );
  final r = PrfExpand.saplingZip32InternalDkOvk.apply(i);
  final nskInternal = iNsk + master.sk.nsk;
  final dkInternal = r.sublist(0, 32);
  final ovkInternal = r.sublist(32);
  return SaplingExtendedSpendingKey(
    sk: SaplingExpandedSpendingKey(
      ask: master.sk.ask,
      nsk: nskInternal,
      ovk: SaplingOutgoingViewingKey(ovkInternal),
    ),
    keyData: SaplingZip32KeyData(
      dk: SaplingDiversifierKey(dkInternal),
      chainCode: master.keyData.chainCode,
      depth: master.keyData.depth,
      fingerPrint: master.keyData.fingerPrint,
      index: master.keyData.index,
    ),
  );
}