JubJubFq.fromBytes constructor

JubJubFq.fromBytes(
  1. List<int> bytes
)

Implementation

factory JubJubFq.fromBytes(List<int> bytes) {
  if (bytes.length != 32) {
    throw ArgumentException.invalidOperationArguments(
      "fromBytes",
      reason: "Invalid field encoding bytes length.",
    );
  }
  final tmp = JubJubFq([
    BigintUtils.fromBytes(bytes.sublist(0, 8), byteOrder: Endian.little),
    BigintUtils.fromBytes(bytes.sublist(8, 16), byteOrder: Endian.little),
    BigintUtils.fromBytes(bytes.sublist(16, 24), byteOrder: Endian.little),
    BigintUtils.fromBytes(bytes.sublist(24, 32), byteOrder: Endian.little),
  ]);

  BigInt borrow = BigInt.zero;
  var temp = BigintUtils.sbb(
    tmp.limbs[0],
    JubJubFqConst.modulus.limbs[0],
    borrow,
  );
  borrow = temp[1];
  temp = BigintUtils.sbb(
    tmp.limbs[1],
    JubJubFqConst.modulus.limbs[1],
    borrow,
  );
  borrow = temp[1];
  temp = BigintUtils.sbb(
    tmp.limbs[2],
    JubJubFqConst.modulus.limbs[2],
    borrow,
  );
  borrow = temp[1];
  temp = BigintUtils.sbb(
    tmp.limbs[3],
    JubJubFqConst.modulus.limbs[3],
    borrow,
  );
  borrow = temp[1];

  // Convert to Montgomery form: tmp = tmp * r2
  final result = tmp * JubJubFq.r2();
  if ((borrow & BigInt.one) != BigInt.one) {
    throw ArgumentException.invalidOperationArguments(
      "fromBytes",
      reason: "Invalid field encoding bytes.",
    );
  }

  return result;
}