secp256k1ScalarCondNegate static method

int secp256k1ScalarCondNegate(
  1. Secp256k1Scalar r,
  2. int flag
)

Implementation

static int secp256k1ScalarCondNegate(Secp256k1Scalar r, int flag) {
  int vflag = flag;
  BigInt mask = (-vflag).toBigInt;
  BigInt nonzero = (secp256k1ScalarIsZero(r) != 0).toBigInt - BigInt.one;
  Secp256k1Uint128 t = Secp256k1Uint128();
  secp256k1ScalarVerify(r);

  secp256k1U128FromU64(t, r[0] ^ mask);
  secp256k1U128AccumU64(t, (Secp256k1Const.secp256k1n0 + BigInt.one) & mask);
  r[0] = secp256k1U128ToU64(t) & nonzero;
  secp256k1U128Rshift(t, 64);
  secp256k1U128AccumU64(t, r[1] ^ mask);
  secp256k1U128AccumU64(t, Secp256k1Const.secp256k1n1 & mask);
  r[1] = secp256k1U128ToU64(t) & nonzero;
  secp256k1U128Rshift(t, 64);
  secp256k1U128AccumU64(t, r[2] ^ mask);
  secp256k1U128AccumU64(t, Secp256k1Const.secp256k1n2 & mask);
  r[2] = secp256k1U128ToU64(t) & nonzero;
  secp256k1U128Rshift(t, 64);
  secp256k1U128AccumU64(t, r[3] ^ mask);
  secp256k1U128AccumU64(t, Secp256k1Const.secp256k1n3 & mask);
  r[3] = secp256k1U128ToU64(t) & nonzero;

  secp256k1ScalarVerify(r);
  return 2 * (mask == BigInt.zero).toInt - 1;
}