verify method
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;
}