VestaAffineNativePoint.fromBytes constructor

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

Implementation

factory VestaAffineNativePoint.fromBytes(List<int> bytes) {
  if (bytes.length != 32) {
    throw ArgumentException.invalidOperationArguments(
      "VestaAffineNativePoint",
      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 VestaAffineNativePoint.identity();
  }
  final x3 = x.square() * x;
  final rhs = (x3 + PastaCurveParams.vestaNative.b);
  final y = rhs.sqrt().sqrtOrNull();
  if (y == null) {
    throw ArgumentException.invalidOperationArguments(
      "VestaAffineNativePoint",
      name: "bytes",
      reason: "Invalid point bytes.",
    );
  }

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

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