secp256k1ScalarHalf static method

void secp256k1ScalarHalf(
  1. Secp256k1Scalar r,
  2. Secp256k1Scalar a
)

Implementation

static void secp256k1ScalarHalf(Secp256k1Scalar r, Secp256k1Scalar a) {
  BigInt mask = -(a[0] & BigInt.one);
  Secp256k1Uint128 t = Secp256k1Uint128();
  secp256k1ScalarVerify(a);

  secp256k1U128FromU64(t, (a[0] >> 1) | (a[1] << 63));
  secp256k1U128AccumU64(t, (Secp256k1Const.secp256k1NH0 + BigInt.one) & mask);
  r[0] = secp256k1U128ToU64(t);
  secp256k1U128Rshift(t, 64);
  secp256k1U128AccumU64(t, (a[1] >> 1) | (a[2] << 63));
  secp256k1U128AccumU64(t, Secp256k1Const.secp256k1NH1 & mask);
  r[1] = secp256k1U128ToU64(t);
  secp256k1U128Rshift(t, 64);
  secp256k1U128AccumU64(t, (a[2] >> 1) | (a[3] << 63));
  secp256k1U128AccumU64(t, Secp256k1Const.secp256k1NH2 & mask);
  r[2] = secp256k1U128ToU64(t);
  secp256k1U128Rshift(t, 64);
  r[3] = secp256k1U128ToU64(t) +
      (a[3] >> 1) +
      (Secp256k1Const.secp256k1NH3 & mask);
}