Bls12Fp.fromBytes constructor

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

Creates a BLS12-381 field element from a byte array.

Implementation

factory Bls12Fp.fromBytes(List<int> bytes) {
  if (bytes.length != 48) {
    throw ArgumentException.invalidOperationArguments(
      "Bls12Fp",
      reason: "Invalid field bytes length.",
    );
  }
  final tmp = Bls12Fp([
    BigintUtils.fromBytes(bytes.sublist(40), byteOrder: Endian.big),
    BigintUtils.fromBytes(bytes.sublist(32, 40), byteOrder: Endian.big),
    BigintUtils.fromBytes(bytes.sublist(24, 32), byteOrder: Endian.big),
    BigintUtils.fromBytes(bytes.sublist(16, 24), byteOrder: Endian.big),
    BigintUtils.fromBytes(bytes.sublist(8, 16), byteOrder: Endian.big),
    BigintUtils.fromBytes(bytes.sublist(0, 8), byteOrder: Endian.big),
  ]);
  BigInt borrow = BigInt.zero;
  List<BigInt> temp = BigintUtils.sbb(
    tmp.limbs[0],
    Bls12FpConst.modulus.limbs[0],
    borrow,
  );
  borrow = temp[1];
  temp = BigintUtils.sbb(tmp.limbs[1], Bls12FpConst.modulus.limbs[1], borrow);
  borrow = temp[1];
  temp = BigintUtils.sbb(tmp.limbs[2], Bls12FpConst.modulus.limbs[2], borrow);
  borrow = temp[1];
  temp = BigintUtils.sbb(tmp.limbs[3], Bls12FpConst.modulus.limbs[3], borrow);
  borrow = temp[1];
  temp = BigintUtils.sbb(tmp.limbs[4], Bls12FpConst.modulus.limbs[4], borrow);
  borrow = temp[1];
  temp = BigintUtils.sbb(tmp.limbs[5], Bls12FpConst.modulus.limbs[5], borrow);
  borrow = temp[1];
  // final result = tmp * Bls12FpConst.r2;
  if ((borrow & BigInt.one) != BigInt.one) {
    throw ArgumentException.invalidOperationArguments(
      "Bls12Fp",
      reason: "Invalid field encoding bytes.",
    );
  }
  return tmp * Bls12Fp.r2();
}