ed25519Verify function
Verifies a 64-byte Ed25519 signature64 over message under publicKey32.
Implementation
bool ed25519Verify(
Uint8List publicKey32,
Uint8List message,
Uint8List signature64,
) {
if (publicKey32.length != 32) return false;
if (signature64.length != 64) return false;
final rEnc = Uint8List.fromList(signature64.sublist(0, 32));
final sEnc = Uint8List.fromList(signature64.sublist(32, 64));
final sScalar = edBytesToBigInt(sEnc);
// Reject non-canonical S (S must be < L).
if (sScalar >= ed25519L) return false;
EdPoint aPoint;
EdPoint rPoint;
try {
aPoint = edBytesToPoint(publicKey32);
rPoint = edBytesToPoint(rEnc);
} on ArgumentError {
return false;
}
// k = SHA-512(Renc || A || msg) reduced mod L.
final k = _hashToScalar(sha512(_concat([rEnc, publicKey32, message])));
// Check [S]B == R + [k]A.
final lhs = edScalarMult(sScalar, ed25519G);
final rhs = edPointAdd(rPoint, edScalarMult(k, aPoint));
return _bytesEqual(edPointToBytes(lhs), edPointToBytes(rhs));
}