VestaIsoAffineNativePoint.fromBytes constructor

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

Implementation

factory VestaIsoAffineNativePoint.fromBytes(List<int> bytes) {
  if (bytes.length != 32) {
    throw ArgumentException.invalidOperationArguments(
      "VestaIsoAffineNativePoint",
      name: "bytes",
      reason: "Invalid point bytes length.",
      expecteLen: 32,
    );
  }
  final tmp = bytes.clone();
  final ySign = (tmp[31] >> 7) & 1;
  tmp[31] &= 0x7F;
  final x = VestaNativeFq.fromBytes(tmp);
  if (x.isZero() && ySign == 0) {
    return VestaIsoAffineNativePoint.identity();
  }
  final x3 = x.square() * x;
  final rhs = (x3 + PastaCurveParams.isoVestaNative.b);
  final y = rhs.sqrt();
  if (!y.isSquare) {
    throw ArgumentException.invalidOperationArguments(
      "VestaIsoAffineNativePoint",
      name: "bytes",
      reason: "Invalid point bytes.",
    );
  }

  final sign = y.result.isOdd() ? 1 : 0;

  final flip = (ySign ^ sign) == 1;
  final yFinal = flip ? -y.result : y.result;
  return VestaIsoAffineNativePoint(x: x, y: yFinal);
}