verify method

bool verify(
  1. List<int> data,
  2. List<int> signature,
  3. HashFunc<HashState> hashMethod
)

Verifies a signature against the provided data using this public key.

Parameters:

  • data: The data to be verified.
  • signature: The EdDSA signature bytes to be verified.
  • hashMethod: A serializable hash function for data hashing.

Throws:

  • ArgumentException: If the signature length is invalid or if the signature is found to be invalid during the verification process.

Implementation

bool verify(List<int> data, List<int> signature, HashFunc hashMethod) {
  final n = generator.order;
  if (n == null) {
    throw ArgumentException.invalidOperationArguments(
      "verify",
      name: "generator",
      reason: "Invalid curve generator.",
    );
  }
  if (signature.length != 2 * baselen) {
    throw ArgumentException.invalidOperationArguments(
      "verify",
      name: "signature",
      reason: "Invalid signature bytes length.",
      expecteLen: baselen * 2,
    );
  }

  final R = EDPoint.fromBytes(
    curve: generator.curve,
    data: signature.sublist(0, baselen),
  );
  final S = BigintUtils.fromBytes(
    signature.sublist(baselen),
    byteOrder: Endian.little,
  );

  if (S >= n) {
    throw ArgumentException.invalidOperationArguments(
      "verify",
      name: "signature",
      reason: "Invalid signature bytes.",
    );
  }

  List<int> dom = List.empty();

  if (generator.curve == Curves.curveEd448) {
    dom = [...'SigEd448'.codeUnits, 0x00, 0x00];
  }
  final h = hashMethod();
  h.update([...dom, ...R.toBytes(), ..._encoded, ...data]);
  final k = BigintUtils.fromBytes(h.digest(), byteOrder: Endian.little);
  if (generator * S != _point * k + R) {
    return false;
  }

  return true;
}