JubJubFr.fromBytes constructor

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

Implementation

factory JubJubFr.fromBytes(List<int> bytes) {
  bytes = bytes.exc(
    length: 32,
    operation: "fromBytes",
    reason: "Invalid field bytes length.",
  );
  final tmp = JubJubFr([
    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;
  List<BigInt> temp = BigintUtils.sbb(
    tmp.limbs[0],
    JubJubFrConst.modulus.limbs[0],
    borrow,
  );
  borrow = temp[1];
  temp = BigintUtils.sbb(
    tmp.limbs[1],
    JubJubFrConst.modulus.limbs[1],
    borrow,
  );
  borrow = temp[1];
  temp = BigintUtils.sbb(
    tmp.limbs[2],
    JubJubFrConst.modulus.limbs[2],
    borrow,
  );
  borrow = temp[1];
  temp = BigintUtils.sbb(
    tmp.limbs[3],
    JubJubFrConst.modulus.limbs[3],
    borrow,
  );
  borrow = temp[1];
  final result = tmp * JubJubFr.r2();
  if ((borrow & BigInt.one) != BigInt.one) {
    throw ArgumentException.invalidOperationArguments(
      "JubJubFr",
      reason: "Invalid point encoding bytes.",
    );
  }
  return result;
}