secp256k1ECmultGenBlind static method

void secp256k1ECmultGenBlind(
  1. Secp256k1ECmultGenContext ctx,
  2. List<int>? seed32
)

generate blind context

Implementation

static void secp256k1ECmultGenBlind(
  Secp256k1ECmultGenContext ctx,
  List<int>? seed32,
) {
  Secp256k1Scalar b = Secp256k1Scalar();
  Secp256k1Scalar diff = Secp256k1Scalar();
  Secp256k1Gej gb = Secp256k1Gej();
  Secp256k1Fe f = Secp256k1Fe();
  List<int> nonce32 = List<int>.filled(32, 0);
  List<int> keydata = List<int>.filled(64, 0);

  /// Compute the (2^combBits - 1)/2 term once.
  Secp256k1.secp256k1ECmultGenScalarDiff(diff);

  if (seed32 == null) {
    /// When seed is NULL, reset the final point and blinding value.
    Secp256k1.secp256k1GeNeg(ctx.geOffset, Secp256k1Const.G);
    Secp256k1.secp256k1ScalarAdd(
      ctx.scalarOffset,
      Secp256k1Const.secp256k1ScalarOne,
      diff,
    );
    ctx.projBlind = Secp256k1Const.secp256k1FeOne.clone();
    return;
  }

  /// The prior blinding value (if not reset) is chained forward by including it in the hash.
  Secp256k1.secp256k1ScalarGetB32(keydata, ctx.scalarOffset);
  keydata.setAll(32, seed32.take(32));
  nonce32 = RFC6979.generateSecp256k1KBytes(
    secexp: keydata.sublist(0, 32),
    hashFunc: () => SHA256(),
    data: keydata.sublist(32),
  );

  /// Compute projective blinding factor (cannot be 0).
  Secp256k1.secp256k1FeSetB32Mod(f, nonce32);
  Secp256k1.secp256k1FeCmov(
    f,
    Secp256k1Const.secp256k1FeOne,
    Secp256k1.secp256k1FeNormalizesToZero(f),
  );
  ctx.projBlind = f;
  nonce32 = RFC6979.generateSecp256k1KBytes(
    secexp: keydata.sublist(0, 32),
    hashFunc: () => SHA256(),
    data: keydata.sublist(32),
    retryGn: 1,
  );
  Secp256k1.secp256k1ScalarSetB32(b, nonce32);
  Secp256k1.secp256k1ScalarCmov(
    b,
    Secp256k1Const.secp256k1ScalarOne,
    Secp256k1.secp256k1ScalarIsZero(b),
  );
  Secp256k1.secp256k1ECmultGen(ctx, gb, b);
  Secp256k1.secp256k1ScalarNegate(b, b);
  Secp256k1.secp256k1ScalarAdd(ctx.scalarOffset, b, diff);
  Secp256k1.secp256k1GeSetGej(ctx.geOffset, gb);
}